I'm already on line with Stanislav. He made some changes to my old proxy
unit (I sent him a latest non-public revision - under NDA so don't ask him
for it, please) and he merged most of the changes. The result is not working
yet, as I haven't yet have time to look at the merged version...

Primoz

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> On Behalf Of Francois PIETTE
> Sent: Sunday, September 28, 2008 10:02 AM
> To: ICS support mailing
> Subject: Re: [twsocket] GpHTTPProxy doesn't work correctly
> 
> I would suggest you contact Primoz which seem to not read the mailing
> list
> curently.
> His email is primoz at gabrijelcic dot org
> 
> --
> [EMAIL PROTECTED]
> The author of the freeware multi-tier middleware MidWare
> The author of the freeware Internet Component Suite (ICS)
> http://www.overbyte.be
> 
> 
> ----- Original Message -----
> From: "Stéphane CHADEYRON" <[EMAIL PROTECTED]>
> To: "ICS support mailing" <[email protected]>
> Sent: Saturday, September 27, 2008 11:41 PM
> Subject: Re: [twsocket] GpHTTPProxy doesn't work correctly
> 
> 
> Hi,
> I tried the code of Primoz, but without succes.
> 
> I think that it is notably because my GPHTTPPROXY.PAS is not adapted
> and
> some functions misses me.
> 
> Problem is that there is 1 years, I had a programme using this proxy.
> 
> Is necessary me put him in the garbage can, or think of you that it is
> repairable avec my level (low :P)?
> 
> Best regards
> 
> 
> 
> STéphane
> 
> 
> ----- Original Message -----
> From: "S.Korotky" <[EMAIL PROTECTED]>
> To: "ICS support mailing" <[email protected]>
> Sent: Monday, September 22, 2008 10:34 AM
> Subject: Re: [twsocket] GpHTTPProxy doesn't work correctly
> 
> 
> 
> Hello, Primoz!
> 
> I think the modified code can not solve the problem on its own, without
> further
> modifications. The reason for this is that ProcessHeader procedure is
> called
> from
> ReceivedFromClient if and only if Client.GotHeader is false, but it is
> set
> to
> true after the very first invocation of the ProcessHeader, so it will
> not be
> called for all subsequent requests in a given connection.
> 
> Best wishes,
> Stanislav Korotky.
> 
> ----- Original Message -----
> From: "Primož Gabrijelčič" <[EMAIL PROTECTED]>
> To: "'ICS support mailing'" <[email protected]>
> Sent: Monday, September 22, 2008 10:06 AM
> Subject: Re: [twsocket] GpHTTPProxy doesn't work correctly
> 
> 
> Oh, it is that bug :((
> 
> Sorry for not including in the debate sooner, but I lost contact with
> GpHttpProxy years ago when I started to work on a custom version for
> one of
> my customers. Now I had no idea which of the problems I fixed years ago
> this
> was (yes, I was not using source control at the time :( ).
> 
> The trick was to destroy remote socket and recreate it if host or port
> changed.
> 
> I think this are the two most important parts:
> 
> procedure TGpHttpProxy.ProcessHeader(Client: TGpHttpProxyClient);
> var
>   ahost        : string;
>   aport        : string;
>   header       : string;
>   returnContent: string;
>   resetSocket  : boolean;
> begin
>   resetSocket := false;
>   returnContent := '';
>   header := Client.Received;
>   if SameText(FirstEl(header,' ',-1),'CONNECT') then begin
>     // TCP Tunnel proxy request
>     HttpData(Client).ProxyType := ptTCPTunnel;
>     if not IPSec.IsAllowed(Client.PeerAddr) then
>       returnContent := Response.sTCPTunnelIPForbidden.Text
>     else if not (ptTCPTunnel in EnabledTypes) then
>       returnContent := Response.sTCPTunnelClosed.Text
>     else if not
> ProcessTCPTunnelHeader(Client,header,ahost,aport,returnContent) then
>       returnContent := Response.sTCPTunnelBadRequest.Text;
>   end
>   else begin
>     // HTTP proxy request
>     HttpData(Client).ProxyType := ptHTTP;
>     if not IPSec.IsAllowed(Client.PeerAddr) then
>       returnContent := Response.sHTTPIPForbidden.Text
>     else if not (ptHTTP in EnabledTypes) then
>       returnContent := Response.sHTTPClosed.Text
>     else if not
> ProcessHTTPHeader(Client,header,ahost,aport,returnContent,resetSocket)
> then
>       returnContent := Response.sHTTPBadRequest.Text;
>   end; //else SameText()
>   // Header parsed, create remote socket.
>   if returnContent = '' then begin
>     if resetSocket then begin
>       {$IFDEF LogHttpFlow}
>       LogFlow(Client, 'Destroyed connection to %s:%s due to host/port
> change',
>         [Client.RemoteHost, Client.RemoteSocket.Port]);
>       {$ENDIF LogHttpFlow}
>       Client.DestroyRemoteSocket;
>       Client.NumRequests := 1;
>     end;
>     if not assigned(Client.RemoteSocket) then with Client do begin
>       {$IFDEF LogHttpFlow}
>       LogFlow(Client, 'Opening connection to %s:%s', [ahost, aport]);
>       {$ENDIF LogHttpFlow}
>       CreateRemoteSocket;
>       RemoteHost            := ahost;
>       RemoteSocket.Port     := aport;
>       RemoteSocket.LineMode := false;
>       HookRemoteEvents(RemoteSocket);
>       RemoteSocket.DnsLookup(ahost);
>       DoRemoteSocketPrepared(Client);
>     end //with/if
>     else begin
>       {$IFDEF LogHttpFlow}
>       LogFlow(Client, 'Reusing connection to %s:%s',
> [Client.RemoteHost,
>         Client.RemoteSocket.Port]);
>       {$ENDIF LogHttpFlow}
>     end;
>     {$IFDEF LogHttpFlow}
>     LogFlow(Client, 'Request: %s', [FirstEl(header, #13, -1)]);
>     {$ENDIF LogHttpFlow}
>     Client.Received := header;
>   end
>   else begin
>     Client.DestroyRemoteSocket;
>     Client.RemoteContent := returnContent;
>   end;
>   Client.GotHeader := true;
> end; { TGpHttpProxy.ProcessHeader }
> 
> function TGpHttpProxy.ProcessHTTPHeader(Client: TGpHttpProxyClient; var
> header, ahost,
>   aport, returnContent: string; var socketResetRequired: boolean):
> boolean;
> 
>   function MakeUrl(aproto, auser, apass, ahost, aport, apath: string):
> string;
>   begin
>     Result := aproto;
>     if Last(Result,1) = ':' then
>       Result := Result + '//'
>     else if Last(Result,1) <> '/' then
>       Result := Result + '://';
>     if auser <> '' then begin
>       Result := Result + auser;
>       if apass <> '' then
>         Result := Result + ':' + apass;
>       Result := Result + '@';
>     end;
>     Result := Result + ahost;
>     if (aport <> '') and (aport <> '80') then
>       Result := Result + ':' + aport;
>     Result := Result + apath;
>   end; { MakeUrl }
> 
> var
>   apass             : string;
>   apath             : string;
>   aproto            : string;
>   auser             : string;
>   command           : string;
>   hdrHost           : string;
>   ignoreNextHopProxy: boolean;
>   p1                : integer;
>   p2                : integer;
>   s                 : string;
>   url               : string;
> 
> begin { TGpHttpProxy.ProcessHTTPHeader }
>   Result := false;
>   socketResetRequired := false;
>   // extract url from GET/POST header
>   s := header;
>   p1 := Pos(' ',s);
>   if p1 > 0 then begin
>     command := First(s,p1-1);
>     Delete(s,1,p1);
>     s := TrimLeft(s);
>     p2 := Pos(' ',s);
>     if p2 > 0 then begin
>       url := Copy(s,1,p2-1);
>       ParseURL(url,aproto,auser,apass,ahost,aport,apath);
>       if aport = '' then
>         aport := '80';
>       hdrHost := ExtractHeader(header,'Host');
>       returnContent := '';
>       ignoreNextHopProxy := false;
> 
> DoClientHeaderAvailable(Client,url,header,aproto,auser,apass,ahost,apor
> t,
>         apath,hdrHost,ignoreNextHopProxy,returnContent);
>       if (NextHopHTTP.Address <> '') and (not ignoreNextHopProxy) and
>          (returnContent = '') then //replace host information with
> proxy
>       begin
>         Delete(header,p1+1,p2-1);
> 
> Insert(MakeUrl(aproto,auser,apass,ahost,aport,apath),header,p1+1);
>         if NextHopHTTP.Username <> '' then begin
>           // Insert 'Proxy-Authorization' header
>           p1 := Pos(CRLF+CRLF,header);
>           Insert(CRLF+'Proxy-Authorization: Basic '+
>             EncodeStr(encBase64,
> NextHopHTTP.Username+':'+NextHopHTTP.Password),
>             header,p1);
>         end;
>         ReplaceHeader(header,'Host',hdrHost);
>         aport := IntToStr(FNextHopProxy[ptHTTP].Port);
>         ahost := FNextHopProxy[ptHTTP].Address;
>         Client.UsingNextHop := true;
>       end
>       else if SameText(command,'OPTIONS') and (ahost = '*') then
>         Exit
>       else begin
>         socketResetRequired :=
>           assigned(Client.RemoteSocket) and
>           ((not SameText(Client.RemoteHost, ahost)) or
>            (Client.RemoteSocket.Port <> aport));
>         // Any of the URL parts may have changed in the event handler -
> modify the header.
>         Delete(header,p1+1,p2-1);
>         if SameText(command,'OPTIONS') then
>           Insert('*', header, p1+1)
>         else if ((Client.NumRequests <= 1) and (Pos('HTTP/1.0',
> FirstEl(header, #13, -1)) > 0)) or socketResetRequired then
>           Insert(apath, header, p1+1)
>         else
> 
> Insert(aproto+'://'+ahost+IFF(aport<>'80',':'+aport,'')+apath,
> header, p1+1);
>         ReplaceHeader(header, 'Host', hdrHost);
>         if auser <> '' then begin
>           // Insert 'Authorization' header
>           p1 := Pos(CRLF+CRLF,header);
>           Insert(CRLF+'Authorization: Basic '+EncodeStr(encBase64,
> auser+
> ':'+apass),
>             header,p1);
>         end;
>         Client.ProxyConnection := ExtractHeader(header, 'Proxy-
> connection');
>         Client.UsingNextHop := false;
>       end;
>       Result := true;
>     end; //else p2 > 0
>   end; //else p1 > 0
> end; { TGpHttpProxy.ProcessHTTPHeader }
> 
> Hope that helps.
> 
> Primoz
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> On
> Behalf Of S.Korotky
> Sent: Sunday, September 21, 2008 9:56 PM
> To: ICS support mailing
> Subject: Re: [twsocket] GpHTTPProxy doesn't work correctly
> 
> Hello Stephane,
> 
> Yes, I've managed to locate the place where the problems are
> "initiated",
> this
> is ProcessHeader procedure. It processes only the very first http-
> header in
> an established connection and bypasses all the others. So, if a browser
> keeps the connections and uses them to request pages from different
> sites,
> 404 errors are produced or incorrect content is shown. I don't think
> it will be easy to write a quick patch without proper processing of
> http 1.1
> data on per-document basis. Perhaps, if it'll be possible to make a
> browser
> believe, that it is _not_ connected to a proxy, it will not re-use the
> same
> connection for different sites, but will establish new ones. I don't
> remember if a http-header exists which allows for doing so, if included
> in
> http response header to the browser (this is not the thing the
> Proxy-Connection does).
> 
> Best wishes
> Stanislav Korotky
> 
> ----- Original Message -----
> From: "Stéphane CHADEYRON" <[EMAIL PROTECTED]>
> To: "ICS support mailing" <[email protected]>
> Sent: Saturday, September 20, 2008 10:03 PM
> Subject: Re: [twsocket] GpHTTPProxy doesn't work correctly
> 
> 
> > Hello Stanislav,
> >
> > I have a user case: with the web-site :www.youtube.com
> > Impossible display this web site correct.
> >
> > Other case but not systematic:
> > 1. write in the address bar in your navigator (with the proxy) the
> url:
> > www.google.com
> > 2. write in the address bar in your navigator (with the proxy) the
> url:
> > www.clubic.com
> > 3. write again in the address bar in your navigator (with the proxy)
> the
> > url: www.clubic.com
> > > result: there is a other page... google or smartserver or error...
> >
> > Thank you for your help.
> >
> > Best regards,
> >
> > Stephan
> >
> > --
> > To unsubscribe or change your settings for TWSocket mailing list
> > please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> > Visit our website at http://www.overbyte.be
> >
> 
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
> 
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
> 
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
> 
> 
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
> 
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be

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

Reply via email to