2012-02-09 20 views
0

私はHTTPプロキシサーバーをJavaに書き込もうとしています。私のアプリケーションは、ブラウザからGETリクエストを受け取り、その宛先に転送します。私は応答パッケージのヘッダーを読んで、それをブラウザに戻したいと思います。これは、gzipでエンコードされていないものに比べ、text/html-contentの方が優れています。私はこれを行うには複数の方法を試して、私は現在DataInputStreamDataOutputStreamを使用していますが、ブラウザには奇妙なシンボルしか表示されません。このコードは、プレーンテキストのみをイマイチそれが働いているように見えるdoes notのデータを扱うjavaでhttpパッケージを転送する

ArrayList<String> headerlist = new ArrayList<String>(); 
InputStream input = clientsocket.getInputStream(); 
dis = new DataInputStream(input); 
serverinputstream = new InputStreamReader(input); 
bufferreader = new BufferedReader(serverinputstream); 

while(!(line = bufferedreader.readLine()).equals("")) {   
     headerlist.add(line); 
    } 

PrintWriter pw = new PrintWriter(serveroutputstream, false); 
DataOutputStream out = new DataOutputStream(serveroutputstream); 

for (int i = 0; i < headerlist.size(); i++) { 
    pw.println(headerlist.get(i)); 
}  
pw.println(); 

int bit; 
while((bit = dis.read()) != -1) { 
    out.writeByte(bit); 
} 
out.flush(); 
dis.close(); 
out.close(); 

:ここ

は、コードの簡易版です。私は別の方法を使うべきですか、何か間違っていますか?

答えて

0

あなたは少し複雑すぎるかもしれないと思います。プロキシは別の宛先にリクエストを転送するだけです。それがテキストまたはバイナリデータを転送しているかどうかを気にする必要はありません。違いはありません。

ヘッダーを個別に読み書きする理由もありません。必要なのは、要求本体全体を新しい出力ストリームにコピーするだけです。

//... 
InputStream input = clientsocket.getInputStream(); 
streamCopy(input, serveroutputstream); 

//... 


public void streamCopy(InputStream in, OutputStream out) throws IOException { 
    int read = 0; 
    byte[] buffer = new byte[4096]; 
    while ((read = in.read(buffer)) != -1) { 
     out.write(buffer, 0, read); 
    } 
} 
+0

私はそのプレーンテキスト場合は、データをフィルタリングすることができるようにしたいので、invididuallyヘッダを読みたい:のようなものについては何

。私はすでにあなたの例のようなバッファを使ってみましたが、同じ結果を得ました。 – Knickedixen

関連する問題