Java HTTP Snooper (Proxy) не пересылает ответ сервера - PullRequest
0 голосов
/ 05 февраля 2009

Я пишу что-то вроде прокси-программы на Java. Вот как это работает:

  1. Браузер будет подключен к программе.
  2. Любые запросы браузера будут сначала распечатаны на стандартный, а затем перенаправлены на сервер.
  3. Затем сервер возвращает ответ, который также распечатывается на стандартный вывод, а затем пересылается обратно в браузер.

Моя проблема в том, что шаг 1 работает, шаг два работает, но шаг 3 не выполняется. Программа может получить ответ, и его распечатка стандартно распечатывается, но браузер не может его получить. Я изменил программу, чтобы изолировать проблему.

Все, что здесь происходит, - это распечатка ответа прямо в браузере:

 ServerSocket client = null;
 try {
      client = new ServerSocket(snoopPort);
 } catch (IOException e) {
      System.out.println("ERROR: Could not listen on port: " + snoopPort);
      System.exit(-1);
 }

 Socket clientSocket = null;
 try {
      clientSocket = client.accept();
 } catch (IOException e) {
      System.out.println("ERROR: Accept failed on port: " + snoopPort);
      System.exit(-1);
 }

 PrintWriter snoopOut = new PrintWriter(clientSocket.getOutputStream(), true);

 snoopOut.print("HTTP/1.1 200 OK\r\n");
 snoopOut.print("Date: Thu, 05 Feb 2009 06:37:28 GMT\r\n");
 snoopOut.print("Server: Apache\r\n");
 snoopOut.print("Set-Cookie: Apache=99.245.58.244.1233815848703045; path=/\r\n");
 snoopOut.print("Accept-Ranges: bytes\r\n");
 snoopOut.print("Transfer-Encoding: chunked\r\n");
 snoopOut.print("Content-Type: text/html\r\n");
 snoopOut.print("\r\n");
 snoopOut.print("<html><head><title>test</head><body>hello world!</body></html>\r\n");

 snoopOut.close();

 clientSocket.close();
 client.close();

Ответы [ 7 ]

0 голосов
/ 05 февраля 2009

В вашем пересмотренном описании, я полагаю, у вас проблема с сообщением http. Это правильно: "Transfer-Encoding: chunked"? (не выглядело крошечным)

0 голосов
/ 05 февраля 2009

Хорошо. Я наполовину разобрался в проблеме. Код? Это идеально. Все работает. Это была среда, в которой я работал.

Я тестировал его на компьютере Vista, и, несмотря на отключение всех антивирусных программ и брандмауэров, он не позволил мне подключиться к порту. Когда я вернул его на работу, это было безупречно. Зачем? Я все еще должен понять это. Но спасибо всем за помощь!

0 голосов
/ 05 февраля 2009

Возможно, это потому, что println () добавляет только один перевод строки (LF) к выводу, тогда как спецификация HTTP ожидает, что каждая строка заканчивается CRLF?

0 голосов
/ 05 февраля 2009

Вот одна из теорий: вы подключаетесь к серверу с прокси, когда программа запускается? Многие веб-серверы сбрасывают соединение, если оно не получает никаких данных из сокета в течение нескольких секунд (среди прочего, чтобы избежать атак DOS). Если это так, возможно, отложите подключение к серверу, пока клиент не подключится, и вы не прочитаете запрос от клиента.

0 голосов
/ 05 февраля 2009

Вы пытались закрыть clientSocket?

0 голосов
/ 05 февраля 2009

Попробуйте изменить:

snoopOut.write(svrRead);

до

snoopOut.println(svrRead);
0 голосов
/ 05 февраля 2009

Попробуйте выполнить сброс после записи в snoopOut.

...