Здравствуйте! Пытаюсь создать свой http прокси сервер. Что то создал но работает как то криво моментами. Кажется проблема в том как устанавливаются заголовки ответа. Когда я использую конструкцию new OutputStreamWriter(conn.getOutputStream()) она возвращает только тело ответа. В связи с этим вопрос можно ли в HttpURLConnection получить входящий поток с сервера в который включены сразу заголовки вместе с телом ответа. Для ясности привожу код который использую Класс слушающий порт Код | package proxy;
import java.io.*;
import java.net.*;
public class Listener {
/** Creates a new instance of TestURLCon */ public Listener() { createSocket(); }
public static void main(String[] args) { new Listener();
} public void createSocket(){ System.out.println("Listener started on 2000"); ServerSocket serverSocket = null; boolean listening = true; try { serverSocket = new ServerSocket(2000); } catch (IOException e) { System.err.println("Could not listen on port: 2000."); System.exit(-1); } try{ while (listening) new proxy.Proxier(serverSocket.accept()).start(); serverSocket.close(); } catch(Exception e){e.printStackTrace();} }
}
|
и класс обрабатывающий запросы-ответы Код | package proxy;
import java.io.*; import java.net.*; import java.util.*;
public class Proxier extends Thread { Socket socket; public Proxier(Socket socket){ this.socket=socket; } public void run(){run2();} public void run2(){ InputStreamReader in; OutputStream out; OutputStreamWriter outserver; BufferedInputStream bf; String request=""; try{ in = new InputStreamReader(socket .getInputStream()); out=socket.getOutputStream(); int b=0; int lastB=0; //вытаскиваем url для запроса************** String sb=new String(); boolean is=true; this.sleep(50); while(in.ready()&((char)b!='\n')) { b=in.read(); sb=sb+(char)b; } //получаю тип запроса POST или GET int i=sb.indexOf(" "); String type=sb.substring(0,i); request=sb.substring(i+1); i=request.indexOf(" "); request=request.substring(0,i); URL server=new URL(request); Properties systemProperties = System.getProperties(); systemProperties.setProperty("http.proxyHost","proxy"); systemProperties.setProperty("http.proxyPort","8080"); HttpURLConnection conn = (HttpURLConnection) server.openConnection(); conn.setDoInput(true); int j,k; //считываю и устанавливаю заголовки запроса while(is&in.ready()){ sb=""; do{ b=in.read(); sb=sb+(char)b; } while((char)b!='\n'); i = sb.indexOf("\r\n"); if(i==0){ is=false; }else{ j=sb.indexOf(":"); conn.setRequestProperty((sb.substring(0,j)).trim(),(sb.substring(j+1,i)).trim()); } } //устанавливаю соединение исходя из типа запроса if(type.equals("GET")){ conn.setDoOutput(false); //System.out.println(request+" GET"); conn.connect(); } if(type.equals("POST")) { conn.setDoOutput(true); outserver = new OutputStreamWriter(conn.getOutputStream()); while(in.ready()){ b=in.read(); outserver.write(b); } outserver.flush(); outserver.close();// } //проверяю статус ответа сервера try{bf=new BufferedInputStream(conn.getInputStream(),200);} catch(Exception e){ bf=new BufferedInputStream(conn.getErrorStream()); } /*if(conn.getResponseCode() != HttpURLConnection.HTTP_OK){ //System.err.println("HTTP ERROR " + conn.getResponseCode()); //System.err.println(conn.getResponseMessage()); bf=new BufferedInputStream(conn.getErrorStream()); // }else {bf=new BufferedInputStream(conn.getInputStream(),200);}*/ //BufferedInputStream bf=new BufferedInputStream( serversocket.getInputStream(),200); //System.out.println(conn.getHeaderField(0)); //устанавливаю статус и заголовки ответа out.write((conn.getHeaderField(0)+"\r\n").getBytes()); Map m=conn.getHeaderFields(); for(int l=1;l<m.size();l++) { //System.out.println(conn.getHeaderFieldKey(l)+": "+conn.getHeaderField(l)); out.write((conn.getHeaderFieldKey(l).trim()+": "+conn.getHeaderField(l).trim()+"\r\n").getBytes());} //System.out.println("\r\n"); out.write(("\r\n").getBytes()); //перенаправляю тело ответа while((b=bf.read())!=-1){ //System.out.print((char)b); out.write(b); } out.flush(); in.close(); bf.close(); out.close(); conn.disconnect(); } catch(Exception e){ System.err.println("Error " + request); e.printStackTrace(); try{ } catch(Exception ex){} } }
}
|
Это сообщение отредактировал(а) NetLord - 20.6.2008, 13:36
|