我正在寻找一个支持良好的多线程Python HTTP服务器,它支持分块编码回复.(即响应中的"转移编码:分块").为此目的,最好的HTTP服务器基础是什么?
我在使用我的一个数据源服务时遇到了一些问题.正如它在HTTP响应头中所说,它在Apache-Coyote/1.1上运行.服务器使用Transfer-Encoding给出响应:chunked,这里是示例响应:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Date: Tue, 30 Mar 2010 06:13:52 GMT
Run Code Online (Sandbox Code Playgroud)
问题是当我请求服务器发送gzipped请求时,它经常发送不完整的响应.我收到回应,看到最后一块收到了,但是在解开后我看到回复是偏的.我从未在请求标头中关闭gzip这样的行为.
所以我的问题是:它是常见的tomcat问题吗?也许其中一个mod正在进行压缩?或者也许它可能是某种代理问题?我不知道tomcat的版本或者他们使用的是什么gzip mod,但随便问一下,我会试着询问我的服务提供商.
谢谢.
我正在解码http数据包.我遇到了一个问题,就是问题.当我得到一个http数据包时,它有一个标题和正文.当transefer编码被分块时我不知道该怎么办?
是否有一个有用的API或类来解除JAVA中的数据?
如果有人,经验丰富的http解码,请告诉我如何做到这一点?
基本上我的响应标头包含
编码传输分块=,
预告片= [我要发送的一些预告片说例如"SomeTrailer"]
一旦我完成了将数据写入Servlet输出流,我正在编写预告片"SomeTrailer:[value]",但这并没有被httpclient正确解析.httpclient将整个输入流(包括预告片)视为单个块.我已经尝试在将数据写入输出流后在响应头中编写预告片,但没有成功.
请帮忙
我没有找到任何好的消息来源.
我以分块传输编码格式向客户端发送大量数据.
我应该如何处理出现的任何错误中途响应的写作过程中?
我想知道是否有任何HTTP规范建议的做法,以便客户知道确实响应不是一个成功的但服务器遇到了一些问题.
我知道curl可以将数据发布到URL:
$ curl -X POST http://httpbin.org/post -d "hello"
{
"args": {},
"data": "",
"files": {},
"form": {
"hello": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "5",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.50.1"
},
"json": null,
"origin": "64.238.132.14",
"url": "http://httpbin.org/post"
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过管道传递curl来实现同样的事情:
$ echo "hello" | curl -X POST http://httpbin.org/post -d @-
{
"args": {},
"data": "",
"files": {},
"form": {
"hello": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "5",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.50.1"
},
"json": null,
"origin": "64.238.132.14", …Run Code Online (Sandbox Code Playgroud) 我有一个Undertow服务器,我正在运行默认值.我试图发送一个分块请求,当服务器接收块时,输入流服务器端永远不会达到-1状态并挂起.
我已经使用了Undertow服务器的默认值(我曾尝试增加线程数但仍然没有运气).
Undertow server = Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Hello World");
}
})
.setHandler(Handlers.routing().post("/xml", blockingHandler))
.build();
server.start();
Run Code Online (Sandbox Code Playgroud)
起初我试图使用普通的httpHandler,但是却引发了错误.
java.lang.IllegalStateException: UT000035: Cannot get stream as startBlocking has not been invoked
Run Code Online (Sandbox Code Playgroud)
经过一些研究后,我使用了Blockoverflow上的建议,然后使用了BlockingHandler.我不再收到上面的错误,但现在处理程序挂起.
这是处理程序的代码(为了清楚起见,我删除了异常处理):
HttpHandler httpHandler = new HttpHandler() {
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
StringBuilder builder = new StringBuilder( );
try(InputStream inputStream = exchange.getInputStream()){
int line;
while( ( line = inputStream.read() ) != -1 ) { …Run Code Online (Sandbox Code Playgroud) 我正在ChunkedEncodingError(e)使用Python请求.我正在使用以下内容来删除JSON:
r = requests.get(url, headers=auth, stream=True)
Run Code Online (Sandbox Code Playgroud)
并使用回车作为分隔符迭代每一行,这就是此API区分不同JSON事件的方式.
for d in r.iter_lines(delimiter="\n"):
d += "\n"
sock.send(d)
Run Code Online (Sandbox Code Playgroud)
我正在对回车进行分界,然后将其添加回作为端点我正在推动日志实际上期望在每个事件结束时回车.这似乎适用于大约100k日志文件.当我尝试拨打更大的电话时,我会抛出以下内容:
for d in r.iter_lines(delimiter="\n"):
logs_1 | File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 783, in iter_lines
logs_1 | for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
logs_1 | File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 742, in generate
logs_1 | raise ChunkedEncodingError(e)
logs_1 | requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
Run Code Online (Sandbox Code Playgroud)
更新:我发现API NoneType也在某个时刻发回.那么如何在响应中的某处解释这个空字节而不会破坏一切?每个单独的事件都以a结束\n,我需要能够单独检查每个事件.我应该把内容分块而不是iter_lines?然后确保NoneType块中没有?这样我就不会试图iter_lines超过它NoneType并且它会爆炸?
我正在使用 Ktor HttpClient(CIO) 向 HTTP API 发出请求,该 API 的响应使用分块传输编码。
在调用使用分块传输编码的 API 时,是否可以使用 Ktor HttpClient(CIO) 来访问 HttpResponse 中的各个 Http 块?
chunked-encoding ×10
http ×6
java ×3
http-chunked ×2
httpclient ×2
python ×2
curl ×1
gzip ×1
http-headers ×1
kotlin ×1
ktor ×1
post ×1
servlets ×1
tomcat ×1
undertow ×1
wildfly ×1