Почему отправка данных из нескольких частей с использованием SSL и POCO возвращает статус 411? - PullRequest
0 голосов
/ 12 декабря 2018

Я написал интерфейс для использования API службы поддержки JIRA.Один из реализованных мной вызовов REST API выполняет HTTP POST multipart / form-data.Это работает нормально, когда я использую HTTP, однако, когда я использую HTTPS, я получаю ответ 411 Length Required.

Команда вызова REST API отлично работает по HTTPS, когда я использую curl или почтальон.

Isчто-то мне не хватает при использовании HTTPS?

мой почтовый индекс выглядит следующим образом:

// generic form send
RESTClient::Error RESTClient::HTTPFormSend(
    const std::string & method,
    const std::string & command,
    const Params & headerParams,
    Poco::Net::HTMLForm & form,
    HTTPRequestSetup requestFunc
)
{
    Error ret = Error::None;

    try
    {
        Poco::Net::HTTPRequest request;

        Poco::SharedPtr<Poco::Net::HTTPClientSession> pSession(PrepareSession(method, command, headerParams, request));

        Poco::Net::HTTPResponse httpResponse;

        // authenticate
        m_credentials.authenticate(request);

        // custom request setup    
        if (requestFunc)
            requestFunc(request);

        if (!DoFormRequest(pSession, request, httpResponse, form))
        {
            m_credentials.authenticate(request);

            if (!DoFormRequest(pSession, request, httpResponse, form))
            {
                m_logger.error("Invalid username or password");
            }
        }
    }
    catch (const Poco::Exception &ex)
    {
        m_logger.error(ex.displayText());
        ret = Error::Internal;
    }

    return ret;
}

// send form
bool RESTClient::DoFormRequest(
    Poco::Net::HTTPClientSession *pSession,
    Poco::Net::HTTPRequest & request,
    Poco::Net::HTTPResponse & response,
    Poco::Net::HTMLForm &form
)
{
    Poco::LogStream logStream(m_logger);

    form.prepareSubmit(request);

    pSession->setTimeout(Poco::Timespan(20, 0));

    form.write(pSession->sendRequest(request));

    return ProcessResponse(pSession, response);
}

1 Ответ

0 голосов
/ 12 декабря 2018

Poco::Net::HTMLForm::prepareSubmit() обычно использует Chunked Transfer-Encoding при отправке многочастных форм, поэтому заголовок Content-Length не будет установлен.В качестве обходного пути вы можете попытаться установить HTTP-версию запроса на 1.0, прежде чем вызывать prepareSubmit().Это заставит prepareSubmit() вычислить длину и установить заголовок Content-Length вместо использования Chunked Transfer Encoding.После вызова prepareSubmit() вы можете сбросить версию HTTP до 1.1.

request.setVersion(Poco::Net::HTTPMessage::HTTP_1_0);
form.prepareSubmit(request);
request.setVersion(Poco::Net::HTTPMessage::HTTP_1_1);
...