LINUX.ORG.RU

Опять про написание proxy-сервера


0

0

   Продолжаю писать Proxy-сервер. Читаю RFC 2616 ( HTTP 1.1 ).
   Не совсем понятно, что делать, когда URI в первой строке
   приходит в виде, отличном от absoluteURI.

   В разделе 5.1.2 RFC 2616( http://www.ietf.org/rfc/rfc2616.txt )
   указано, что Request-URI может быть четырех видов:

       Request-URI    = "*" | absoluteURI | abs_path | authority

   Там же написано следующее:

   The absoluteURI form is REQUIRED when the request is being made to a
   proxy. The proxy is requested to forward the request or service it
   from a valid cache, and return the response. Note that the proxy MAY
   forward the request on to another proxy or directly to the server
   specified by the absoluteURI. In order to avoid request loops, a
   proxy MUST be able to recognize all of its server names, including
   any aliases, local variations, and the numeric IP address. An example
   Request-Line would be:

       GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

   Таким образом от клиентов, соответствующих HTTP/1.1 я должен
   получать только запросы в виде absoluteURI, такие, как приведенный
   выше.

   Интересна ситуация с несоответствующими спецификации клиентами.
   Теоретически, я могу получить запрос вида

   GET /rfc/rfc2616.txt HTTP/1.1
   Host: www.ietf.org
   ...

   Что нужно делать в таком случае? Генерировать ошибку, преобразовывать
   в виде absoluteURI (в случае перенаправления на другой proxy нужно
   преобразовывать, но я хочу сразу доставлять запрос на целевой
   сервер) или передавать на сервер в таком виде?

   При этом в разделе 5.2 указаны правила для origin server(то есть
   того сервера, кому предназначается запрос). Там написано, что в
   случае, когда запрос идет не по absoluteURL, определять виртуальный
   хост нужно по заголовку "Host: ". Цитата:
   
   2. If the Request-URI is not an absoluteURI, and the request includes
     a Host header field, the host is determined by the Host header
     field value.

   В разделе 14.23 написано, что Host позволяет серверу и шлюзу (gateway)
   определять, к какому конкретно виртуальному хосту принадлежит URL:
   
   This allows the origin server or gateway to differentiate between
   internally-ambiguous URLs, such as the root "/" URL of a server for
   multiple host names on a single IP address.
   
   Видимо, поле Host не предназначено для proxy. Сказано лишь, что proxy
   должны проверять наличие этого поля и выдавать 400 ( Bad Request) в
   случае отсутствия.
   
   Прошу помочь найти описание поведения proxy в такой ситуации. Также
   хотелось бы знать, можно ли выдавать ошибку, если поведение не
   описано спецификацией.
anonymous

Берём ближайший squid и спрашивем. У меня 400 Bad Request не зависимо от Host.

anonymous
()

Лол, ну возьми любой сквид и погляди, кидает ли он 400 при неабсолютных урлах. Если сильно сомневаешься - сделай настройку в конфиге, да и усё.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо. Privoxy у меня тоже выдает 400. Конкретные реализации, конечно, не показатель, но видимо кроме выдачи ошибки (как все и делают) и вытаскивания адреса из Host (что является извращением) сделать ничего нельзя. Тоже буду тогда 400 выдавать.

anonymous
()

а можно не скромный вопрос?... а зачем этот велосипед?

Deleted
()

> Продолжаю писать Proxy-сервер.

ух ты, дай посмотреть. Хочется посмотреть 1. как реализовано (или будет) offline mode, чтобы работало как-то наподобие WWWoffle. В смысле, если пропадает внешняя сеть (или ping до DNS), выдавать не страницу с ошибкой, а последнюю скачанную версию страницы. (А при закачке новой страницы делать новую версию, если есть старая. Делать архив версий, кольцевой буфер какой-то макс. глубины). 2. Штуку в прокси вроде общесистемного плагина Scrapbook в Firefox'е, для всех браузеров. Плагин сохраняет страницу в архив на ФС, с тегами и категориями. Если сделать расширение протокола для прокси (новый заголовок или протокол) -- можно сделать прозрачный Scrapbook для всех браузеров в системе.

> Что нужно делать в таком случае? Генерировать ошибку, преобразовывать в виде absoluteURI (в случае перенаправления на другой proxy нужно преобразовывать, но я хочу сразу доставлять запрос на целевой сервер) или передавать на сервер в таком виде?

по-моему, передавать в таком же виде, как есть.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.