Я использую сервлет прокси-сервера 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()
, поэтому я не думаю, что с этим возникли проблемы.
Запрос, полученный Couch DB, имеет только первую часть запроса, а другой контент потерян. Как я понял в [bug] https://bugs.eclipse.org/bugs/show_bug.cgi?id=401382 Jetty должен отправить только последний фрагмент запроса. В моем случае отправляются только первые несколько сегментов. Это правильно? – Bunti
Его немного сложнее, чем это. Когда ответ в нисходящем потоке является HTTP-каналом (только с HTTP-ответами), а затем получен в ProxyServlet асинхронным способом, ProxyServlet пытается сохранить chunking, но не делает этого в 100% случаев. В некоторых ситуациях асинхронные фрагменты могут перезаписывать друг друга. Об этом сообщается ошибка, а исправление в коде исправлено. –