[fpc-pascal] CustHttpApp again, error: "Missing HTTP protocol version in request"
Michael Van Canneyt
michael at freepascal.org
Fri Apr 25 16:11:09 CEST 2014
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.
Michael.
More information about the fpc-pascal
mailing list