2013-02-26 3 views
1

Я использую сервлет прокси-сервера Jetty для маршрутизации запросов от внешнего клиента к базе данных Couch. Помимо проксирования, я добавляю дополнительные данные к входящему запросу, который используется CouchDB. Запрос HTTP изменяется путем расширения HTTPServletRequestWrapper. Когда я переопределяю метод getContentLength и пересчитываю размер inputStream, только содержимое размера исходного запроса отправляется в CouchDB, а поскольку входной JSON недействителен, Couch DB выдает код Bad Request (400 HTTP). В Журнале Jetty я вижу сообщение contentWritten != contentLength. Как только я удаляю заголовок Content-Length вообще, Jetty отправляет запрос, как ожидалось, копирование всего содержимого в прокси-запрос. Даже если этот подход работает, мне интересно, что действительно заставляет Jetty не отправлять модифицированный контент запроса, даже когда правильная длина контента задается путем переопределения метода getContentLength от ServletInputStream.Jetty Proxy servlet не отправляет все измененное содержимое

Я использую версию Jetty 8.1.3, и все запросы - запросы и ответы JSON. Я также подклассифицировал класс ServletInputStream и метод read(), поэтому я не думаю, что с этим возникли проблемы.

ответ

0

Это исправленная ошибка кодирования, исправленная недавно в Jetty 7.6.10-SNAPSHOT и 8.1.10-SNAPSHOT. https://bugs.eclipse.org/bugs/show_bug.cgi?id=401382

Исправлено в Jetty-7 (а затем объединены в Jetty-8)

Вы можете использовать Jetty 7.6.10-Фотоснимок или 8.1.10 -SNAPSHOT от oss.sonatype.org SNAPSHOTS repository.

7.6.10 и 8.1.10-релизы, вероятно, будет происходить в первую неделю марта 2013 года

Да, Причал-7 и Jetty-8 являются такими же кодовая, развивались параллельно, и даже выпущенный параллельно, с той лишь разницей, что спецификация сервлета поддерживается каждым. (Jetty-7 - Servlet 2.5, Jetty-8 - Servlet 3.0)

+0

Запрос, полученный Couch DB, имеет только первую часть запроса, а другой контент потерян. Как я понял в [bug] https://bugs.eclipse.org/bugs/show_bug.cgi?id=401382 Jetty должен отправить только последний фрагмент запроса. В моем случае отправляются только первые несколько сегментов. Это правильно? – Bunti

+0

Его немного сложнее, чем это. Когда ответ в нисходящем потоке является HTTP-каналом (только с HTTP-ответами), а затем получен в ProxyServlet асинхронным способом, ProxyServlet пытается сохранить chunking, но не делает этого в 100% случаев. В некоторых ситуациях асинхронные фрагменты могут перезаписывать друг друга. Об этом сообщается ошибка, а исправление в коде исправлено. –

Смежные вопросы