2015-02-03 3 views
1

Ms http server api v2 (동기 모드)를 사용하는 웹 서버를 구현 중이며 웹 브라우저에서 테스트하려고합니다.HttpSendHttpResponse 데이터가 전송되지 않았습니다.

브라우저에서 GET 요청을 http://localhost:50000/uri/으로 보내면 응용 프로그램이 올바르게 수신합니다. 그런 다음 HttpSendHttpResponse을 사용하여 일부 데이터 (HTTP_DATA_CHUNK)를 보내면 131 바이트가 전송됩니다. 그러나 브라우저에 데이터가 수신되지 않습니다. 동일한 결과가있는 wininet 고객과 테스트를 거쳤습니다.

이 내 보내기 응답 코드 (스몰 토크)입니다 :

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 기능의 성공과는 n 바이트가 전송되었음을 표시하는 경우 이유에 대해 어떤 생각, 데이터를 수신하지 않는 클라이언트?

덕분에, 세바스찬

+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

나는이 문제를 알아 낸. 일부 필드가 8 바이트로 정렬되어 있으므로 데이터 포인터가 잘못된 오프셋에 있었기 때문에 HTTP_DATA_CHUNK 구조의 정렬에 오류가있었습니다. 이 문제를 해결하기 위해 다시 HttpSendHttpResponse으로 시도해 보았습니다. 그리고 나서 헤더를 HttpSendHttpResponse, 데이터를 HttpSendHttpResponseEntityBody 두 가지 모두를 사용하면 작동합니다. MSDN sample이 오래된 것일 수 있습니다. 거기에서 데이터는 HttpSendHttpResponse에 대한 단일 호출로 응답과 함께 전송됩니다.

당신이로 (네트워크 관리자의 외부) 브라우저에서 볼 않을 것인지하지 못하는 경우, 매우 세바스찬