Socket Java HTTP-Proxy

Tion

Mitglied
Guten Abend,

Wie ich euch leider berichten muss, führt mich ein Problem zu euch ...
Ich hwäre euch sehr dankbar, würdet ihr mir helfen können:

Ich habe ( rein aus langeweile ) einen HTTP-Proxy geschrieben ( habe mir Hilfe aus dem Internet geholt, da ich ja nicht weiß wie ein Proxy funktioniert ).
Der öffnet auf dem lokalem Rechner einen Port ( ich glaube es war 9900 ) und leitet die "Socket-ID" an einen Thread weiter. Der Thread sieht folgendermaßen aus:
Java:
package de.tionsys.proxy.client;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.ConnectException;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.Iterator;
import java.util.LinkedList;

public class ProxyClient extends Thread implements Runnable
{
	Socket Client = null;
	BufferedInputStream clientIn = null;
	PrintStream clientOut = null;
	
	String query = null;
	String request = null;
	
	String domain = null;
	int serverport = 80;

	// OS-Unabhängig
	final String LineFeed = new String(""+((char) 13)+((char) 10));
	
	public ProxyClient(Socket client) throws IOException
	{
		Client = client;
		System.out.println("Proxy: Eine neue Verbindung von Client "+ Client);
	}
	
	public void run()
	{
		try
		{
			ClientLoop();
		}
		catch(Exception e)
		{
			
		}
	}
	
	private void ClientLoop() throws IOException
	{
		// Streams definieren
		clientIn = new BufferedInputStream(Client.getInputStream());
		clientOut = new PrintStream(Client.getOutputStream(), true);
		// Temporär zum Trennen host:port
		int in1 = 0;
		// Die Headers
		LinkedList<String> requestStrings	= new LinkedList<String>();
		// Und ab "in die Loop" :D
		while(true)
		{
			// Den Request lesen
			query = readLine(clientIn);
			
			// Ressource extrahieren
			request = query.substring(0, query.indexOf(" ")+1) + query.substring(query.indexOf("/", query.indexOf("//") + 2));
			
			// Domain und Port extrahieren
			domain = query.substring(query.indexOf("//") + 2);
			domain = domain.substring(0, domain.indexOf("/"));
			if ((in1 = domain.indexOf((int)':')) > -1)
			{
				serverport = Integer.parseInt(domain.substring(in1 + 1));
				domain = domain.substring(0, in1);
			}
			else
			{
				serverport = 80;
			}
			
			// Die restlichen Header holen
			requestStrings.clear();
			do {
				query = readLine(clientIn);
				requestStrings.add(query);
			} while (!query.equals(LineFeed));
			
			// Noch einmal zum debuggen
			System.out.println("Proxy: Client '"+ Client +"' startet Request an Server "+ domain +":"+ serverport +".");
			
			// Und ab an den Server mit dem Request:
			
			Socket server = new Socket(domain, serverport);
			server.setSoTimeout(2500);
			BufferedInputStream serverIn = new BufferedInputStream(server.getInputStream());
			PrintStream serverOut = new PrintStream(server.getOutputStream(), true);
			serverOut.print(request);
			// ( Noch mal schnell die Header "optimieren" )
			String header = null;
			Iterator<String> iter = requestStrings.iterator();
			while (iter.hasNext())
			{
				header = (String) iter.next();
				System.out.println("Proxy: Client '"+ Client +"' sendet Header: "+ header);
				if(header.startsWith("Proxy-Connection"))
				{
					serverOut.print("Connection: close"+ LineFeed);
				}
				else if(header.startsWith("Transfer-Encoding"))
				{
					serverOut.print("Transfer-Encoding: identity"+ LineFeed);
				}
				else if(header.startsWith("Accept-Encoding"))
				{
					
					header = header.substring(0,(header.length()-2)).concat(",identity"+ LineFeed);
					serverOut.print(header);
				}
				else if(!(header.startsWith("X-Forwarded-For")))
				{
					serverOut.print(header);
				}
			}
			
			// Jetzt holen wir uns die Antwort vom Server
			try
			{				
				// Server auslesen und weitermachen
				request = readLine(serverIn);
				int linefeeds = 0;
				
				while(linefeeds < 2)
				{
					System.out.println("Proxy: Client '"+ Client +"' bekommt Antwort: "+ request);
					clientOut.print(request);
					request = readLine(serverIn);
					if(request.equals(LineFeed))
						linefeeds++;
					continue;
				}
				
				System.out.println("Proxy: Client '"+ Client +"' hat die Antwort von "+ domain +":"+ serverport +" erhalten.");
				// Verbindung werden nach catches geschlossen
			}
			catch (SocketTimeoutException ste)
			{
				System.out.println("Proxy: Connection Timeout");
				clientOut.print("HTTP/1.0 500\nContent Type: text/plain\n\nServertimeout bei der Verbindung zu "+domain+"<br />"+ ste.getMessage() +"\n");	
			}		
			catch (ConnectException ce)
			{
				System.out.println("Proxy: Connection Timeout");
				clientOut.print("HTTP/1.0 500\nContent Type: text/plain\n\nFehler bei der Verbindung zu "+domain+"<br />"+ ce.getMessage() +"\n");				
			}	
			
			// Verbindung zum anderen Server schließen
			serverIn.close();
			serverOut.close();
			server.close();
			
			// Die Verbindung zu unserem Server schließen
			Client.close();
		} // end while
	}
	
	// altes Proxysystem
	public void reply(int code, String text)
	{
		return;
	}

	public String readLine(InputStream in) throws IOException
	{
		StringBuffer lineBuffer = new StringBuffer(600);
		int i;
		lineBuffer.setLength(0);
		
		while (((i = in.read()) > 0) && (i != 13)){
			lineBuffer.append((char) i);
		}
		
	
		// Bei HTTP 1.1 bestanden die Zeilenenden aus #13#10
		if (i == 13) {
			
			lineBuffer.append((char) 13);
			in.mark(1);

			if (in.read() != 10)
				in.reset();
			else
				lineBuffer.append((char) 10);
		}
		
		return lineBuffer.toString();
	}
}
( Ich hoffe, er ist nicht zu lang :O )

Sieht alles nett aus, funktiniert leider nur bei den Headern >.<
Danach werden entweder "Leerstrings" oder total unlesbare ASCII-Zeichen, die dem Inhalt der JAR-Datei, wenn man sie mit dem Texteditor öffnet, gleichen, übermittelt.

Mein Tipp ist, dass der Fehler bei

Java:
while(linefeeds < 2)
{
	System.out.println("Proxy: Client '"+ Client +"' bekommt Antwort: "+ request);
	clientOut.print(request);
	request = readLine(serverIn);
	if(request.equals(LineFeed))
		linefeeds++;
	continue; // <= Nur zur Deko, sieht sonst hässlich aus
}

liegt.

Ich bitte euch, dass ihr mir helft ;)

Tino

/Edit 1:

Firefox gibt mir den Fehler

Content-Encoding-Fehler
Die Webseite, die Sie öffnen möchten, kann nicht angezeigt werden, da sie eine ungültige oder unbekannte Form der Kompression verwendet.

aus. Ich denke, dass liegt an diesen Sonderzeichen ;)
 
I

irgendjemand

Gast
FALSCH

es liegt daran das du einen binär-daten über einen string-reader laufen lässt was zwangsläufig zu encoding fehlern führt ... und das in beide richtungen *z.b. wenn du binär-daten hochladen willst*

baue deinen proxy einfach so um das er mit byte-streams *also dierekt Input/OutputStream* arbeitet anstatt mit string-readern/-writern ...
 

Tion

Mitglied
Guten Abend,

FALSCH

es liegt daran das du einen binär-daten über einen string-reader laufen lässt was zwangsläufig zu encoding fehlern führt ... und das in beide richtungen *z.b. wenn du binär-daten hochladen willst*

baue deinen proxy einfach so um das er mit byte-streams *also dierekt Input/OutputStream* arbeitet anstatt mit string-readern/-writern ...

Das geht direkt ?
Könntest du ( oder jemand anderes ) mir dafür ein Beispiel geben ?
Ich kenne es nur über Buffered-Reader / Mir wurde es nur über Buffered-Reader beigebracht :O

Tion
 

Tion

Mitglied
Guten Abend noch einmal,

nachdem ich nun während ich auf eine Antwort gewartet habe ( selbstständig ) nach einer Antwort gesucht habe, bin ich zu folgenden Code gekommen:
Java:
	// Header auslesen und weitergeben
	do
	{
		request = readLine(serverIn);
		System.out.println("Proxy: Client '"+ Client +"' bekommt Header: "+ request);
		clientOut.print(request);
	} while(!request.equals(LineFeed));

	System.out.println("Proxy: Client '"+ Client +"' wird nun der Inhalt gesendet");

	// Nun wird der Body gesendet
	in1 = 0;
	buffer = null;
	while((in1 = serverIn.read(buffer)) > 0)
	{
		System.out.println(buffer, 0, in1);						
		clientOut.write(buffer, 0, in1);
	}
		
	System.out.println("Proxy: Client '"+ Client +"' hat die Antwort von "+ domain +":"+ serverport +" erhalten.");
Noch vor dem
[JAVA=5]System.out.println("Proxy: Client '"+ Client +"' bekommt Header: "+ request);[/code]
kommt ein "Connection-Timeout", das sieht in etwa so aus:
Proxy: Client 'Socket[addr=/0:0:0:0:0:0:0:1,port=49841,localport=9900]' sendet Header: Cache-Control: no-cache
Proxy: Client 'Socket[addr=/0:0:0:0:0:0:0:1,port=49841,localport=9900]' sendet Header:
Proxy: Connection Timeout
Der Code steht im ersten Beitrag, jedoch kann ich diesesmal nicht tippen, woran das liegt...
Ich hoffe, ihr könnt mir wiederum helfen,

Tion

/E1: Zu früh "Enter" gedrückt ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
S HTTP-Requeste von Browser mit Java sniffen? Netzwerkprogrammierung 9
E HTTP java.lang.IllegalArgumentException: protocol = http host = null Netzwerkprogrammierung 1
D HTTP Java HTTP Kommunikation Netzwerkprogrammierung 9
L Java HTTP Request Netzwerkprogrammierung 3
M HTTP Requests verarbeiten und Response senden mit Java Netzwerkprogrammierung 14
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
M Ein HTTP-request aus Java heraus senden Netzwerkprogrammierung 3
S MySQL, PHP, Perl Support in einem Java HTTP Server? Netzwerkprogrammierung 7
D HTTP Apache-HttpClient/UNAVAILABLE (java 1.4) Netzwerkprogrammierung 18
M JAX-WS unter Java 17 plötzlich nicht mehr möglich Netzwerkprogrammierung 5
K Java RMI bricht ab wenn Remote eine Methode ausgeführt werden soll Netzwerkprogrammierung 5
M HTTP Let's Encrypt und Java Trust-Store Netzwerkprogrammierung 6
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
D path-Variablen in eine URL hinzufügen mit Java 1.8 Netzwerkprogrammierung 2
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
x46 Java SSLContext erstellen mit SSL-Zertifikat Netzwerkprogrammierung 1
P Jenkins Login per Java Download Manager Netzwerkprogrammierung 15
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
V Browsergame mit Java(WebSocketServer) als Backend? Netzwerkprogrammierung 5
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Fragen zu Java Webservice mit Axis2 Netzwerkprogrammierung 0
M Mit Java Mail Mails an Webmailer schicken Netzwerkprogrammierung 1
mor16Euro HTTP Php website mit Java aktualisiern Netzwerkprogrammierung 6
T HTTP JAVA Browser Konsolenanfrage(JavaScript) Netzwerkprogrammierung 7
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
M Socket peer to peer Verbindung zwischen Java und Matlab Netzwerkprogrammierung 0
L Remote Desktop per Java steuern Netzwerkprogrammierung 4
F Server für Java Applikationen Netzwerkprogrammierung 16
J Webserver mit Java schreiben? Netzwerkprogrammierung 4
D JAVA RMI Netzwerkprogrammierung 1
K HTTP Mit Java HTML Codeauslesen um damit zu arbeiten Netzwerkprogrammierung 7
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
A Bestimmter URL/Certificate per Java immer vertrauen (Trustmanager/HostnameVerifier) Netzwerkprogrammierung 1
T VPN-Verbindung über Java Netzwerkprogrammierung 4
M HTTP PATCH Request mit Java ausführen Netzwerkprogrammierung 2
Niggo_ Probleme mit Java Mail Netzwerkprogrammierung 14
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
L FTP Java Interpreter unterbindet SSL Handshake Netzwerkprogrammierung 2
C IFrame mit java auslesen Netzwerkprogrammierung 1
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
C Datensammlung mit Java RMI Netzwerkprogrammierung 0
K Java Jsoup : OnLoad Netzwerkprogrammierung 0
S Java Chat Server Netzwerkprogrammierung 8
Carres HTTP Vorhandenen Session-ID Cookie von Firefox, Chrome oder IE in Java verwenden Netzwerkprogrammierung 2
B Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen Netzwerkprogrammierung 1
Z HTTP HTML Element auslesen in Java Netzwerkprogrammierung 1
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
P Chat in Java Netzwerkprogrammierung 3
C java.net.ConnectException: Operation timed out? Netzwerkprogrammierung 2
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
T curl request in java umwandeln Netzwerkprogrammierung 4
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
L Java RMI Objekt konsistenz Netzwerkprogrammierung 1
H Portforwarding umgehen in Java? Netzwerkprogrammierung 5
D Response in Java Servlet erzeugen Netzwerkprogrammierung 0
X Mit Java eine Applikation auf einem anderen Windows Rechner (Windows Server 2008) starten Netzwerkprogrammierung 1
E HttpUrlConnectionExample cannot be resolved to a type / Java 8 Netzwerkprogrammierung 1
F Socket Java Server mit Android App, Antwort vom Server an App Netzwerkprogrammierung 5
M Java-Programm aus dem Web laden Netzwerkprogrammierung 3
J access denied (“java.net.SocketPermission”…) mit Java 8 Netzwerkprogrammierung 1
N CURL requests in Java Netzwerkprogrammierung 6
P Kritische Java-Anwendung und Citrix veröffentlichen Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
1 Netty NIO oder Java IO Netzwerkprogrammierung 2
1 Via Java mit WLAN Netzwerken verbinden Netzwerkprogrammierung 5
J Java Service Wrapper Netzwerkprogrammierung 1
K Mit Java ASPX Webseite fern steuern Netzwerkprogrammierung 2
H Socket Java | Server sendet Nachricht nur wenn vorher eine JOptionPane-Nachricht ausgegeben wurde. Netzwerkprogrammierung 2
K Emailsenden via Java Applikation Netzwerkprogrammierung 5
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
C Java Chat Admin Kenzeichnung Netzwerkprogrammierung 14
P PHP Script per Java ausführen Netzwerkprogrammierung 2
P PPTP Protokoll für JAVA Netzwerkprogrammierung 14
T php/java-bridge Netzwerkprogrammierung 16
D Webseite(mit JavaScript-Element) mit Java auslesen Netzwerkprogrammierung 0
G Multiple Clients and one Server --> java.lang.NullPointerException Netzwerkprogrammierung 1
E Java Server übers Internet erreichen Netzwerkprogrammierung 4
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
windl AirPlay mittels Java Netzwerkprogrammierung 0
R Email mit Java API Netzwerkprogrammierung 1
P Java Deauth / Deauthentication request Netzwerkprogrammierung 10
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
R Java - Socketprogrammierung Netzwerkprogrammierung 10

Ähnliche Java Themen

Neue Themen


Oben