Your sample has the same broken logic that the first sample you sent to me had ! You haven't properly read or understood what I told you before. If you had correctly parsed the reply, you would immediately have found your problem.

Anyway, Replace your OnDataAvailable event handler by this one:

procedure TForm1.WSocket1DataAvailable(
   Sender: TObject; ErrCode: Word);
var
   S, Status: String;
   StatusCode: Integer;
begin
 if ErrCode <> 0 then
     Exit;
 S := WSocket1.ReceiveStr();
 Log(S);
 WSocket1.CloseDelayed();  // Shutdown(1) is even better.
 if SameText(Copy(S, 1, 6), 'HTTP/1') then
     Label1.Caption := IntToStr(GetHTTPReponseStatusCode(S));
end;

No data is received twice.

--
[EMAIL PROTECTED]
http://www.overbyte.be

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


Hello Francois,

I've uploaded the project here:
http://chatsvr.no-ip.org/download/ProxyTester.zip

It was created with Delphi 2005. I could build it with D5
after deleting the Variant unit from uses clause.

If you build it as is, you'll see this (long) line twice:

6/2/2005 10:39:36 AM <html><body><font size="5" color="#FF0000"><br><b>Access denied due to Proxy+'s Security settings!</b></font><hr>
<b>Description:</b> REJECTED - by default (no rule allowed the access)
<br><b>Request details:</b> HTTPS; 65.110.147.196:4351 -> 192.168.2.36:4480 <hr><font size="2"><font color="#FF0000">Proxy</font><font color="#0000FF">+</font> 3.00 (Build #246), Date: Thu, 02 Jun 2005 10:40:24 GMT</font>

If you comment out the StrToInt() line in the source code,
it'll appear only once.

--
Best regards,
Jack

Thursday, June 2, 2005, 9:13:44 AM, you wrote:

No attachement here. But you can provide and URL on some server so that anyone willing to have a look at your code can. If you don't have any server, emailing it will be good also, for me alone.
--
[EMAIL PROTECTED]
http://www.overbyte.be

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


Hello Francois,

Thanks for the quick reply. You are right. I should check in
the code. But in this particular test environment, I am receiving
HTTP/1.x. This I checked from the log.

I looked at the httpcli code briefly yesterday but failed to
find the part that parses the http headers (I know it should be there.)

I have been displaying the logs in a TMemo and yes, I do receive
a part of the string twice as shown in the log. I didn't call any
of the functions you mentioned in your earlier emails about what
could mess up the message pump.

I have further stripped the test project - very simple now.
I will email it to you. Please take a look when you have time.

BTW, are attachments allowed here, or should I send you a private mail?

--
Best regards,
Jack

Thursday, June 2, 2005, 6:43:30 AM, you wrote:

> 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





--
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