2015-02-03 1 views
1

Я реализую веб-сервер с использованием Ms http server api v2 (в синхронном режиме), и я пытаюсь проверить его из веб-браузера.HttpSendHttpResponse не отправлено данных

Я отправляю запрос GET из браузера в http://localhost:50000/uri/, и мое приложение получает его правильно. Затем я отправляю ответ с некоторыми данными в (HTTP_DATA_CHUNK) с использованием HttpSendHttpResponse, и я получаю 131 байт. Однако браузер не получает никаких данных. Я также проверил его с клиентом wininet с тем же результатом.

Это мой отправить код ответа (Smalltalk):

sendResponse: aString 
    | data response sent id return | 
    data := HTTP_DATA_CHUNK external 
    data 
     DataChunkType: 0; 
     pBuffer: aString copyToExternalMemory; 
     BufferLength: aString size. 
    response := HTTP_RESPONSE_V2 external. 
    response 
     version1; 
     StatusCode: HTTP_STATUS_OK; 
     reason: 'Ok'; 
     ContentType: 'text/html'; 
     EntityChunkCount: 1; 
     dataChunk: data. 
    sent := ExternalLong external. 
    return := HttpServerDLL current 
     HttpSendHttpResponse: handle 
     RequestId: request id 
     Flags: 0 
     pHttpResponse: response asParameter 
     pCachePolicy: 0 
     pBytesSent: sent asParameter 
     pReserved2: 0 
     Reserved3: 0 
     pOverlapped: 0 
     pLogData: 0. 
    return = 0 ifFalse: [^self osError: return]. 
    ^sent asInteger 

Любая идея о том, почему, если успех функция HttpSendHttpResponse и указывает на то, что п байт был послан, клиент не получает данные?

Спасибо, Sebastian

+3

В случае, если вы не знаете, вы не увидите этого в браузере (за пределами сети инспектора) как 'HttpSendHttpResponse' для HTTP-заголовков,' HttpSendResponseEntityBody' для данных –

+0

Благодарности @AlexK., Я понимаю, что 'HttpSendHttpResponse' также может отправлять данные за один вызов. Я следую примеру MSDN [https://msdn.microsoft.com/en-us/library/windows/desktop/aa364640(v=vs.85).aspx], и там некоторый текст отправляется как ответ в буфера данных с использованием 'HttpSendHttpResponse'. Во всяком случае, я попробую, позвонив «HttpSendResponseEntityBody». –

+2

Я не знал, что это возможно, [MSDN «Замечания»] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364499%28v=vs.85%29.aspx) говорит * «Функция HttpSendHttpResponse используется для создания и отправки заголовка ответа, а функция HttpSendResponseEntityBody может использоваться для отправки данных сущности-тела по мере необходимости». * –

ответ

1

я понял, проблема. У меня была ошибка в выравнивании структуры HTTP_DATA_CHUNK, так как некоторые поля выровнены по 8 байт, поэтому указатель данных находился в плохом смещении. С этим исправленным, я попробовал еще раз с HttpSendHttpResponse без успеха, а затем с использованием обоих, HttpSendHttpResponse для заголовков и HttpSendHttpResponseEntityBody для данных, и он работает! Возможно, MSDN sample устарел. Там данные отправляются с ответом за один вызов до HttpSendHttpResponse.

Большое спасибо, Себастьян