[fpc-pascal] CustHttpApp again, error: "Missing HTTP protocol version in request"

silvioprog silvioprog at gmail.com
Fri Apr 25 16:14:31 CEST 2014


2014-04-25 11:11 GMT-03:00 Michael Van Canneyt <michael at freepascal.org>:
>
>  On Fri, 25 Apr 2014, silvioprog wrote:
>
>> 2014-04-25 10:24 GMT-03:00 Michael Van Canneyt <michael at freepascal.org>:
>>       On Fri, 25 Apr 2014, silvioprog wrote:
>>             2014-04-25 3:39 GMT-03:00 Michael Van Canneyt <
>> michael at freepascal.org>:
>>             [...]
>>                   Damn windows returning 0 on read... Can you please test
>> with the following change:
>>
>>                      Procedure FillBuffer;
>>
>>                      Var
>>                        R : Integer;
>>
>>                      begin
>>                        SetLength(FBuffer,ReadBufLen);
>>                  Repeat
>>                    r:=FSocket.Read(FBuffer[1],ReadBufLen);
>>                    If r<0 then
>>                      Raise EHTTPServer.Create(SErrReadingSocket);
>>                    if R=0 then
>>                      Sleep(10);
>>                  Until (R<>0);
>>                  if (R<ReadBuflen) then
>>                    SetLength(FBuffer,r);
>>                end;
>>
>>
>>             After apply this change, now when read returns 0, it freezes
>> the app., because the "sleep(10)" command is infinitely called. :/
>>
>>
>> OK, what we can do is add a timeout:
>>
>> Procedure FillBuffer;
>>
>> Const
>>   MaxReadRetries = 150;
>>
>> Var
>>   R,C : Integer;
>>
>> begin
>>   C:=0;
>>   SetLength(FBuffer,ReadBufLen);
>>   Repeat
>>     r:=FSocket.Read(FBuffer[1],ReadBufLen);
>>     If r<0 then
>>       Raise EHTTPServer.Create(SErrReadingSocket);
>>     if R=0 then
>>       begin
>>       Sleep(10);
>>       Inc(C);
>>       end;
>>   Until (R<>0) or (C>MaxReadRetries);
>>   if (R<ReadBuflen) then
>>     SetLength(FBuffer,r);
>> end;
>>
>> It will then try 150 times, and then error out.
>>
>> BUT, reading this:
>>
>> http://msdn.microsoft.com/en-us/library/windows/desktop/
>> ms740121%28v=vs.85%29.aspx
>>
>> "If the connection has been gracefully closed, the return value is zero."
>>
>> So, this means then thay the original implementation is correct. You just
>> need to catch the error using the OnRequestError handler...
>>
>> Sorry for my ignorance, but, would not it be better to read the HTTP data
>> only if the client is still connected or if read bytes > 0?
>>
>
> Yes and no. Yes in the sense that you have a more 'clean' experience.
> No, because it IS an error condition (client went away unexpectedly) and
> you should be aware of it.
>
> I will make it a property that is settable: 'IgnoreLostConnections' or so.


The 'IgnoreLostConnections' is a nice solution! :)

-- 
Silvio Clécio
My public projects - github.com/silvioprog
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20140425/d026d4ec/attachment-0001.html>


More information about the fpc-pascal mailing list