Пересылка http пакета в Java - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь написать HTTP прокси-сервер в Java. Мое приложение получает запрос GET от браузера и перенаправляет его по назначению. Я хотел бы прочитать заголовки пакета ответа, а затем переслать его обратно в браузер. Это прекрасно работает для меня с text / html-контентом, если он не закодирован в gzip. Я пробовал несколько способов сделать это, и в настоящее время я использую DataInputStream и DataOutputStream, но браузер показывает только странные символы.

Вот упрощенная версия кода:

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();

Этот код обрабатывает только данные, которые не являются простым текстом, но, похоже, не работают. Должен ли я использовать другой метод, или я просто делаю что-то не так?

1 Ответ

0 голосов
/ 10 февраля 2012

Я думаю, вы можете немного усложнить ситуацию.Ваш прокси просто перенаправляет запрос в другой пункт назначения.У него нет причин заботиться о том, пересылает ли он текстовые или двоичные данные.Это не должно иметь никакого значения.

Также нет причин читать и писать заголовки по отдельности.Все, что вам нужно сделать, это скопировать все тело запроса в новый поток вывода.

Как насчет чего-то вроде:

//...
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);
    } 
}
...