HTTP Proxy - Aufbau/Funktionsweise



  • Hey,

    ich möchte einen kleinen HTTP Proxy (in Java) schreiben. Hab mich auch schon ein wenig umgeschaut und folgendes gefunden:

    Loop
    	Wait for connection from the browser.
    	When browser conncets, receive what it has to say.
    	Change the HTTP header of the browser's message. (The browser's header is different
    	when talking to a proxy than a web server).
    	Send the header to the web server.
    
    	Loop
    		Now, either the browser or the web server is going to talk now. Find out which.
    		If the browser wants to talk, receive it's message and pass it on to the web server.
    		If the browser is finished talking, leave the loop.
    
    		If the web server wants to talk, receive it's message.
    		Parse the header out of the message, but don't do anyting with it.
    		Send the header (and the message) to the browser.
    		If the web server is finished talking, break out of the loop.
    	End Loop
    End Loop
    

    Stimmt das Prinzip so? Hauptsächlich meine ich jetzt die zweite Loop.

    Kennt noch jemand vielleicht Informationen über die Funktionsweise und vorallem den Aufbau von HTML Proxies? Ich brauch kein Caching, Filtering oder sonst was; es soll nur ein simpler transparenter Weiterleiter sein.

    Vielen Dank!



  • xindon schrieb:

    ... es soll nur ein simpler transparenter Weiterleiter sein.

    dann brauchste ja nur zwei sockets. was der eine empfängt sendet er zum anderen und umgekehrt.

    loop1:
      socket1.accept()
      socket2.connect()
         loop2:
            socket1.send (socket2.receive())
            socket2.send (socket1.receive())
            if (socket1.closed())
               socket2.close()
               exit loop2
    


  • net schrieb:

    dann brauchste ja nur zwei sockets. was der eine empfängt sendet er zum anderen und umgekehrt.

    Aber der Browser sendet doch einen anderen Header, wenn er an einen Proxy schreibt. Den muss man doch ändern und weitersenden.

    Mehr nicht ?

    Vorallem die andere Richtung: Kann ich einfach alles weiterleiten, was vom Webserver kommt oder muss das auch irgendwie auseinandergenommen werden?



  • Das kommt drauf an, ob du das jetzt wirklich als Proxy aufziehen willst, oder einfach nur als eine Art "Repeater" oder Tunnel. Der Ansatz von net funktioniert halt dann, wenn sich dein Proxy eben als Webserver ausgibt, aber in Wirklichkeit die Requests wo anders bearbeiten lässt.



  • jemand. schrieb:

    Das kommt drauf an, ob du das jetzt wirklich als Proxy aufziehen willst, oder einfach nur als eine Art "Repeater" oder Tunnel. Der Ansatz von net funktioniert halt dann, wenn sich dein Proxy eben als Webserver ausgibt, aber in Wirklichkeit die Requests wo anders bearbeiten lässt.

    Ich stelle im Browser in den Verbindungsoptionen meine Anwendung als Proxy ein. Also der Browser weiß, dass es nur ein Proxy ist und dementsprechend bekomme ich einen anderen Header.

    Beispiel:

    Normalerweise sieht der Header wenn ihn der Browser sendet so aus:

    GET / HTTP/1.1
    Host: google.de
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    

    Habe ich aber den Proxy eingetragen, sendet der Browser das:

    GET http://google.de/ HTTP/1.1
    Host: google.de
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Proxy-Connection: keep-alive
    

    Das Umwandeln ist gar kein Problem, das hab ich schon implementiert, darum gehts mir auch gar nicht.

    Ich wollte damit nur sagen, dass der Browser weiß, dass es einen Proxy gibt und er nicht direkt mit dem Webserver redet.

    Kleine Frage: Wie kann ich dem Browser denn vorgaukeln, dass er direkt mit dem Webserver redet, es in Wirklichkeit aber über den Proxy läuft? Das würde die Implementierung ja erheblich vereinfachen.



  • antwortet! 🙂



  • xindon schrieb:

    antwortet! 🙂

    sir, yes, sir!

    xindon schrieb:

    Kleine Frage: Wie kann ich dem Browser denn vorgaukeln, dass er direkt mit dem Webserver redet, es in Wirklichkeit aber über den Proxy läuft? Das würde die Implementierung ja erheblich vereinfachen.

    verbinde dich direkt mit dem proxy, also nicht so dass du beim browser eine umleitung einstellst. nachteil: der proxy weiss dann nicht, wohin der dich weiterverbinden soll. dass musste dann irgendwie anders regeln


Anmelden zum Antworten