Poco :: HttpClientSession.receiveResponse () генерирует исключение NoMessageException без видимой причины - PullRequest
4 голосов
/ 24 января 2012

Я написал HTTP-сервер на Java и клиент на C ++ с Poco . Это часть клиентского кода C ++:

URI uri("http://127.0.0.1:4444");
HTTPClientSession session(uri.getHost(), uri.getPort());

HTTPRequest req(HTTPRequest::HTTP_POST,
                "/pages/page",
                HTTPMessage::HTTP_1_1);

session.sendRequest(req);
HTTPResponse res;
std::istream &is = session.receiveResponse(res);

В последней строке я получаю следующую ошибку:

terminate called after throwing an instance of 'Poco::Net::NoMessageException'
  what():  No message received

Но я не понимаю почему. Соединение было успешно установлено, и запрашиваемая страница существует. Я попробовал тот же код на известных веб-сайтах (например, в Википедии), и он работает без каких-либо исключений.

Я также попытался сделать точно такой же запрос с помощью cURL (к моему серверу) в командной строке, и он показывает ответ сервера, поэтому сервер выглядит нормально.

Это оригинальный ответ сервера в виде строки:

"HTTP/1.1 200 OK\r\n" +
"Server: [server name]\r\n" +
"Content-Type: text/xml; charset=utf-8\r\n" +
"Content-Length:" + bodyBytes.length + "\r\n" +
"Resource: " + job.resId + "\r\n\r\n" + 
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><JobRequest><InputRepresentation id=\"0\"/>    <effectsList><cvtColor><code> CV_RGB2GRAY </code></cvtColor><resize><scaleFactorX> 0.5 </scaleFactorX><scaleFactorY> 0.5 </scaleFactorY><interpolation> INTER_LINEAR </interpolation></resize><GaussianBlur><kSize> 3 </kSize><sigmaX> 2 </sigmaX><sigmaY> 2 </sigmaY><borderType> BORDER_REPLICATE </borderType></GaussianBlur></effectsList></JobRequest>"

Я написал простой HTTP-сервер, который отвечает фиксированным ответом на каждый запрос, чтобы проверить, что не так. это код:

public class Test {
    public static void main(String[] args) {    
        try {
            ServerSocket serverSocket = new ServerSocket(4449);
            Socket clientSocket = serverSocket.accept();

            String body = "ab";
            byte[] bodyBytes = body.getBytes("UTF-8");

            String headers = "HTTP/1.1 200 OK\r\n" + 
                             "Server: Foo\r\n" +
                             "Content-Type: text/plain\r\n" +
                             "Content-Length: " + bodyBytes.length + "\r\n\r\n";

            byte[] headerBytes = headers.getBytes("UTF-8");

            byte[] responseBytes = new byte[headerBytes.length + bodyBytes.length];

            /* Fill responseBytes with the header and body bytes */
            int i = 0;
            for (int j = 0; j < headerBytes.length; ++j) {
                responseBytes[i] = headerBytes[j];
                ++i;
            }
            for (int j = 0; j < bodyBytes.length; ++j) {
                responseBytes[i] = bodyBytes[j];
                ++i;
            }
            clientSocket.getOutputStream().write(responseBytes);

        } catch (IOException e) {}
    }
}

Я получаю такое же исключение даже с этим сервером. Так что здесь не так?

Ответы [ 2 ]

2 голосов
/ 23 ноября 2015

Основываясь на экспериментах, я обнаружил, что необходимо включить заголовок Content-Length, если вы делаете пустой запрос POST.Т.е.

req.add("Content-Length", "0");
0 голосов
/ 14 августа 2018

Мне пришлось использовать следующую последовательность в коде моего обработчика, чтобы получить минимальный ответ без ошибки No message received:

resp.setStatus( Poco::Net::HTTPResponse::HTTP_OK );
resp.setContentType( "text/json" );
ostream &out = resp.send();
out << "[]";
out.flush();
...