To avoid difficulties, you should first correctly write your 
GetHTTPReponseStatusCode function to
correctly parse the answer. You should not simply remove "HTTP/1.1" but 
actually check you really
have that string. I'm sure you think you receive data twice while you aren't. 
You think you receive
it twice because you don't parse it correctly and you overlooked the mechanism 
that makes TCP stream
split into several packets and OnDataAvailable events.

You can have look at the HTTP client component source code (if you don't want 
to use it, look at the
code and copy what you need to reinvent your wheel).

Use OutputDebugString to display what you receive in your OnDataAvailable 
event. You'll see that you
never receive data twice, unless you mess up with the message pump.

--
[EMAIL PROTECTED]
Auteur du freeware ICS - Internet Component Suite
Auteur du freeware MidWare - Multi-tiers framework
http://www.overbyte.be



----- Original Message ----- 
From: "Jack" <[EMAIL PROTECTED]>
To: "ICS support mailing" <twsocket@elists.org>
Sent: Thursday, June 02, 2005 12:39 AM
Subject: Re: [twsocket] Receive result of the first ReceiveStr() call twice-not 
resolved


> This problem is still bugging me. I did some further testing
> and find some strange things. In the OnDataAvailable event
> handler, I call the function below to get HTTP status code.
> The HttpReply is the string variable I get from ReceiveStr() call.
> I find that as long as I call this function, I get a part of
> the HTTP reply twice from ReceiveStr() call. Further testing
> shows that this line is teh culprit:
>
>   Result := StrToInt(s);
>
> If I comment out this line, I don't have a problem (then I don't
> get a result from the function either.)
>
> Any ideas? (Below is the whole function.)
>
> function GetHTTPReponseStatusCode(const HttpReply: String): Integer;
> var i: Integer; s: String;
> begin
>   Result := -1;
>   i := Pos(' ', HttpReply);
>   if i > 0 then
>   begin
>     s := Copy(HttpReply, i + 1, Length(HttpReply)); // Remove "HTTP/1.1 " at 
> the beginning
>     i := Pos(' ', s); // Remove the trailing text
>     if i > 0 then
>     begin
>       s := Copy(s, 1, i - 1);
>       Result := StrToInt(s);
>     end;
>   end;
> end;
>
> -- 
> Best regards,
> Jack
>
> >> I celebrated a little too early. I am getting this problem again
> >> in further testing after I changed Close() to CloseDelayed();
> >> The difference is, I'm not getting result of the first ReceiveStr()
> >> twice. Instead, I get the result of the second ReceiveStr() twice.
> >> I think this is because CloseDelayed() delayed the Close().
> >> What I don't understand is why the buffer isn't cleared after
> >> ReceiveStr() in both scenarios of Close() and CloseDelayed().
> >>
> >> I reason I thought it was fixed is because I tested from
> >> an allowed IP earlier and got a very short response back from
> >> the proxy server. The whole message was retrieved in the first
> >> ReceiveStr() call so I didn't get a chance to call ReceiveStr()
> >> twice. I then run the same app on a blocked IP. The proxy sends
> >> a longer message (the error message) and it is retrieved in
> >> two ReceiveStr() calls. Then I found that the second ReceiveStr()
> >> result was duplicated.
> >>
> >> -- 
> >> Best regards,
> >> Jack
> >>
> >> Thursday, May 19, 2005, 10:53:49 AM, you wrote:
> >>
> >> J> Francois, thanks! This fixed the problem! It's actually in the FAQ:
> >>
> >> J> - CloseDelayed
> >>
> >> J> Is in most cases the preferred way. It will post a message to
> >> J> itself to close the TWSocket. This means that the socket closure
> >> J> is done outside the code that calls the CloseDelayed, meaning a
> >> J> while later. The message handler will call Close.
> >>
> >> J> - Close
> >>
> >> J> Attempt to gracefully close the socket. If there is still some
> >> J> data waiting in the buffers it will try to send it. ***Do not use
> >> J> Close from within any TWSocket events, instead use CloseDelayed.***
> >>
> >>
> >> J> Thursday, May 19, 2005, 2:46:47 AM, you wrote:
> >>
> >> FP>> Use CloseDelayed instead of Close.
> >>
> >> >>> Hello Wilfried,
> >> >>>
> >> >>> Sure. Below is my event handler code. Hope I'm doing something
> >> >>> wrong, otherwise, it's really strange. TProxyChecker is the owner
> >> >>> object of the TProxySocket object array. TProxySocket is derived
> >> >>> from TWSocket.
> >> >>>
> >> >>> procedure TProxyChecker.WSocketDataAvailable(Sender: TObject; ErrCode: 
> >> >>> Word);
> >> >>> var s: String;
> >> >>> begin
> >> >>>   if ErrCode = 0 then
> >> >>>     with TProxySocket(Sender) do
> >> >>>     begin
> >> >>>       s := ReceiveStr();
> >> >>>       Log(s);
> >> >>>       Close();
> >> >>>     end;
> >> >>> end;
> >> >>>
> >> >>> The destination server is a commercial http proxy server.
> >> >>> I tried using #13#10 and #13#10#13#10, I different strings
> >> >>> read back from ReceiveStr. But the second string includes
> >> >>> the first string in both cases. So it shouldn't be the server
> >> >>> sending the string twice.
> >> >>>
> >> >>> BTW, I'm using the latest ICS.
> >> >>>
> >> >>> -- 
> >> >>> Best regards,
> >> >>> Jack
> >> >>>
> >> >>> Wednesday, May 18, 2005, 3:31:32 PM, you wrote:
> >> >>>
> >> >>> WM> Hello Jack,
> >> >>>
> >> >>> WM> Can you show your OnDataAvailable handler ?
> >> >>> WM> Eventually download SocketSpy from 'user made' page and 'hang' it
> >> >>> WM> between client and server. Then you see exacly what is sent by 
> >> >>> server.
> >> >>>
> >> >>> WM> ---
> >> >>> WM> Rgds, Wilfried
> >> >>> WM> http://www.mestdagh.biz
> >> >>>
> >> >>> WM> Wednesday, May 18, 2005, 20:48, Jack wrote:
> >> >>>
> >> >>> >> Hello Francois and all,
> >> >>>
> >> >>> >> I'm using a TWSocket client in LineMode with LineEnd set to #13#10.
> >> >>> >> I connect to a HTTP proxy server using CONNECT command. I then get
> >> >>> >> a reply back from the HTTP proxy from ReceiveStr()
> >> >>>
> >> >>> >> Things look OK except that I am receiving the data from the first
> >> >>> >> ReceiveStr() call twice. I get two WSocketDataAvailable messages for
> >> >>> >> 3 lines in the HTTP response:
> >> >>>
> >> >>> >>   Line 1: HTTP/1.0 200 Connection established
> >> >>> >>   Line 2: Proxy-agent: Proxy+ 3.00
> >> >>> >>   Line 3: (Blank line)
> >> >>>
> >> >>> >> However, I'm getting the first ReceiveStr() result twice, see below:
> >> >>> >> I'm getting "HTTP/1.0 200 Connection established" twice:
> >> >>>
> >> >>> >> 5/18/2005 2:36:43 PM WSocketDataAvailable idx=0 addr=127.0.0.1:4480 
> >> >>> >> ErrCode=0
> >> >>> >> 5/18/2005 2:36:43 PM HTTP/1.0 200 Connection established
> >> >>> >> 5/18/2005 2:36:43 PM
> >> >>> >> 5/18/2005 2:36:43 PM
> >> >>> >> 5/18/2005 2:36:43 PM WSocketDataAvailable idx=0 addr=127.0.0.1:4480 
> >> >>> >> ErrCode=0
> >> >>> >> 5/18/2005 2:36:43 PM HTTP/1.0 200 Connection established
> >> >>> >> Proxy-agent: Proxy+ 3.00
> >> >>>
> >> >>>
> >> >>> >> I then changed LineEnd to #13#10#13#10, I still get the result of
> >> >>> >> the first ReceiveStr() twice, this time the result is two lines:
> >> >>>
> >> >>> >>   HTTP/1.0 200 Connection established
> >> >>> >>   Proxy-agent: Proxy+ 3.00
> >> >>> >>   (Blank line)
> >> >>>
> >> >>> >> 5/18/2005 2:40:11 PM WSocketDataAvailable idx=0 addr=127.0.0.1:4480 
> >> >>> >> ErrCode=0
> >> >>> >> 5/18/2005 2:40:11 PM HTTP/1.0 200 Connection established
> >> >>> >> Proxy-agent: Proxy+ 3.00
> >> >>>
> >> >>>
> >> >>> >> 5/18/2005 2:40:11 PM
> >> >>> >> 5/18/2005 2:40:11 PM
> >> >>> >> 5/18/2005 2:40:11 PM WSocketDataAvailable idx=0 addr=127.0.0.1:4480 
> >> >>> >> ErrCode=0
> >> >>> >> 5/18/2005 2:40:11 PM HTTP/1.0 200 Connection established
> >> >>> >> Proxy-agent: Proxy+ 3.00
> >> >>>
> >> >>>
> >> >>> >> It seems that, somehow the first ReceiveStr() didn't remove the data
> >> >>> >> from the buffer. Or am I missing anything?
> >> >>>
> >> >>>
> >> >>> >> -- 
> >> >>> >> Best regards,
> >> >>> >> Jack
>
>
>
> -- 
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
>


-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to