# Proxy funktioniert nicht so wie gewünscht!



## Dann07 (8. Okt 2019)

Guten Tag/Abend!
Mein Problem ist folgendes:
Ich habe versucht ein Proxy zu programmieren.
Das Prinzip ist mir klar.
Nur weiß ich nicht wie ich das in meinem Programm schreiben soll.
Den hauptteil habe ich ja schon.

Hier der Code (Bitte auch die Kommentare im Code durchlesen!):

```
import java.io.*;
import java.net.*;

public class Main {

    public static void main(String[] args) {
        try {
            int proxyPort = 8080;
            String host = "http://www.google.com";
            ServerSocket ss = new ServerSocket(proxyPort);
            
            while(true) {
                Socket s = ss.accept();
                URLConnection hostConnection = new URL(host).openConnection();
                
                hostConnection.setDoInput(true);
                hostConnection.setDoOutput(true);
                hostConnection.connect();
                
                //Hier weiß ich nicht was ich hier tun soll.
                //Ich kann die Anfragen an den Host weiterleiten.
                //Ich kann nur nicht die Anfragen vom Host an den Client entgegen nehmen.
                //Folgendes Beispiel zum entgegennehmen der Anfragen vom Client:
                
                DataInputStream clientDis = new DataInputStream(s.getInputStream());
                DataOutputStream hostDos = new DataOutputStream(hostConnection.getOutputStream());
                String line = "";
                
                while((line = clientDis.readLine()) != null) {
                    hostDos.writeUTF(line);
                }
                
                //Das nächste Beispiel soll die Anfragen vom Host entgegennehmen.
                
                DataOutputStream clientDos = new DataOutputStream(s.getOutputStream());
                DataInputStream hostDis = new DataInputStream(hostConnection.getInputStream());
                String line = "";
                
                while((line = hostDis.readLine()) != null) {
                    clientDos.writeUTF(line);
                }
                
                //Dies funktioniert aber nicht da ich ein 405 Error kriege.
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}
```

Bei allen anderen Versuchen kriege ich ein Fehler/Error in meinem Browser.

Vielen Dank im Voraus!


----------



## Xyz1 (8. Okt 2019)

Ist der host denn statisch?


----------



## Dann07 (8. Okt 2019)

Tobias-nrw hat gesagt.:


> Ist der host denn statisch?



Wie ist das gemeint?
Kannst du mir das genauer definieren ich hab die Begriffe noch nicht so drauf.


----------



## Xyz1 (8. Okt 2019)

Mit host ist die Zieladresse gemeint, in diesem Fall google.de. Mit statisch ist gemeint, dass sich diese Zieladresse gar nicht ändert... Eigentlich müsste die Anfrage ja so schauen:
Host: www.java-forum.org
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: text/css,*/*;q=0.1
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: keep-alive


----------



## Dann07 (8. Okt 2019)

Tobias-nrw hat gesagt.:


> Mit host ist die Zieladresse gemeint, in diesem Fall google.de. Mit statisch ist gemeint, dass sich diese Zieladresse gar nicht ändert... Eigentlich müsste die Anfrage ja so schauen:
> Host: www.java-forum.org
> User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
> Accept: text/css,*/*;q=0.1
> ...



Achso. Danke!
Das gleiche kommt bei mir auch raus aber das löst leider noch nicht mein eigentliches Problem. 
Wenn ich versuche mich zu verbinden dann lädt mein Browser entweder ewig lange oder er bricht sofort mit einem Fehler ab.


----------



## VfL_Freak (8. Okt 2019)

Moin,


Dann07 hat gesagt.:


> er bricht sofort mit einem Fehler ab


Aha ... und wir sollen jetzt raten welchen ?? 

VG Klaus


----------



## Xyz1 (8. Okt 2019)

Vielleicht kann @VfL_Freak mir da weiterhelfen, aber ein Proxy gibt doch eigentlich nur 1:1 die Anfrage weiter - oder?


----------



## Dann07 (8. Okt 2019)

VfL_Freak hat gesagt.:


> Aha ... und wir sollen jetzt raten welchen ??



Hatte ich nicht eigentlich den Fehler oben rein geschrieben?
Deswegen stand ja da auch die Kommentare im Code durchlesen.
Kleiner Hinweis!  (405 Error)


----------



## mrBrown (8. Okt 2019)

In jedem Fall dürfte der HOST-Header falsch sein - der Browser wird den (korrigiert mich) auf localhost setze, der Google-Server wird mit localhost aber nicht viel anfangen können. Der Proxy wird das mit dem passenden Host ersetzen müssen.


----------



## VfL_Freak (9. Okt 2019)

Moin,


Tobias-nrw hat gesagt.:


> Vielleicht kann @VfL_Freak mir da weiterhelfen, aber ein Proxy gibt doch eigentlich nur 1:1 die Anfrage weiter - oder?


Würde ich so sehen ... ProxyServer



Dann07 hat gesagt.:


> Hatte ich nicht eigentlich den Fehler oben rein geschrieben?


Wo genau tritt der Fehler auf?
Am Ende der äußeren Schleife klingt für mich seltsam!
VG klaus


----------



## Dann07 (10. Okt 2019)

VfL_Freak hat gesagt.:


> Wo genau tritt der Fehler auf?



Der Fehler tritt dann auf wenn ich versuche den DataInputStream von der URL zu nehmen.


```
DataInputStream hostDis = new DataInputStream(hostConnection.getInputStream());
```


----------



## mrBrown (10. Okt 2019)

Moment - gibt es eine Exception mit Stacktace und allem drum und dran oder gibt es einen HTTP 405-Error?


----------



## Dann07 (10. Okt 2019)

mrBrown hat gesagt.:


> Moment - gibt es eine Exception mit Stacktace und allem drum und dran oder gibt es einen HTTP 405-Error?



Eigentlich beides würde ich sagen aber ich kann zur Sicherheit auch nochmal nachgucken.


----------



## mrBrown (10. Okt 2019)

Und wie genau sieht die Exception aus?


----------



## Dann07 (10. Okt 2019)

java.io.IOException: Server returned HTTP response code: 405 for URL: http://www.google.com
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at Main.main(Main.java:21)


----------



## mrBrown (10. Okt 2019)

Ahh...du darfst natürlich keine HttpConnection zum Host aufmachen, sondern auch einfach nur ein Socket. Du willst ja die Anfragen des Browsers einfach nur durchreichen, und nicht eine eigene davon völlig unabhängige Verbindung aufbauen.


----------



## Dann07 (10. Okt 2019)

Ich habe es jetzt mal mit einem Socket probiert es gibt jetzt auch keine Exception aber mein Browser lädt ewigkeiten und ich kriege auch von dem Host keine Antwort.


----------



## mrBrown (10. Okt 2019)

Lass dir mal ausgeben, was vom Browser und vom Server alles so kommt


----------



## Dann07 (10. Okt 2019)

Browser:
CONNECT www.google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: www.google.com:443

Vom Server kommt nichts das ist das Problem.


----------

