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:
( 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
liegt.
Ich bitte euch, dass ihr mir helft
Tino
/Edit 1:
Firefox gibt mir den Fehler
aus. Ich denke, dass liegt an diesen Sonderzeichen
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();
}
}
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-FehlerDie 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