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

Reply via email to