J2ME 客户端使用分块传输编码发送 HTTP POST 请求。
当 ASP.NET(在 IIS6 和 WebDev.exe.server 中)尝试读取请求时,它会将 Content-Length 设置为 0。我想这没问题,因为加载请求时 Content-length 是未知的。
但是,当我将 Request.InputStream 读到最后时,它返回 0。
这是我用来读取输入流的代码。
using (var reader = new StreamReader(httpRequestBodyStream, BodyTextEncoding)) {
string readString = reader.ReadToEnd();
Console.WriteLine("CharSize:" + readString.Length);
return BodyTextEncoding.GetBytes(readString);
}
Run Code Online (Sandbox Code Playgroud)
我可以用 Fiddler 模拟客户端的行为,例如
网址 http://localhost:15148/page.aspx
标头: 用户代理:Fiddler 传输编码:分块主机:somesite.com:15148
体 兔兔兔兔。谢谢光临,很有用!
我从上面的身体阅读器将返回一个零长度字节数组......跛脚......
有谁知道如何在 IIS 和 ASP.NET 开发服务器 (cassini) 上启用分块编码?
我为 IIS找到了这个脚本,但它不起作用。
我有一个Windows/Apache2/PHP应用程序,使用分块编码接收文件.原因是上传的文件是动态的,并且在传输之前它的长度是未知的.这一直都很好用.
现在我需要将应用程序移植到IIS7/PHP.问题是IIS无法接收分块文件:上传文件时,服务器根本没有响应.我该如何解决这个问题?
请注意,在我的测试中,我甚至不使用PHP.我只是有一个.php扩展名,因为IIS拒绝.htm文件上的POST(这是有意义的).
正如rupello在这个答案中所建议的那样,我用cURL进行了测试,以确保我的客户端没有被破坏.cURL也没有得到答案,尽管如果转移没有分块,一切正常.
我做了以下测试:
test.php的:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<form method="post" enctype="multipart/form-data">
File: <input type="file" name="upfile" />
<input type="submit" value="go"/>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
此命令不返回(等待答案卡住)
curl.exe http://serveur/test.php --form "upfile=@text.txt"
-H "Transfer-Encoding: chunked" -H "Expect:"
Run Code Online (Sandbox Code Playgroud)
注意:-H "Expect:"是压制Expect 100-Continuecurl发出的.没有这个标题的结果是相同的,execpt当然是额外的往返.发送:
POST http://serveur/test.php HTTP/1.1
User-Agent: curl/7.15.3 (i586-pc-mingw32msvc) libcurl/7.15.3 zlib/1.2.2
Host: serveur
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=----------------------------310dbcc6761b
8c
------------------------------310dbcc6761b
Content-Disposition: form-data; name="upfile"; filename="text.txt"
Content-Type: text/plain
5
hello …Run Code Online (Sandbox Code Playgroud) 现代网络服务器是否支持Content-Length 超过 2GB或4GB的HTTP ?
HTTP分块传输编码中的块怎么样?单个 HTTP 块的长度可以超过2GB吗?
我需要知道在我的代码中使用32-bit integersor 64-bit integers。
我正在将客户的应用程序迁移到 Tomcat 6。在测试过程中,我们发现他们的一些客户希望响应始终被分块,即传输编码:分块。但是,Tomcat 并不总是使用分块编码,有时会使用 Content-Length,我认为是因为响应大小足够小,以至于它在发送标头时知道整个长度。
我已经看到了大量有关如何禁用分块编码的问题/答案,但我遇到了相反的问题。我知道在每个响应中强制分块编码并不理想,并且客户端应该与 http1.1 规范完全兼容并接受任一编码,但我只是想找出是否有任何简单的配置可以执行所需的行为。
我单独使用 Tomcat 和标准 http 连接器。我查看了连接器属性并尝试了 bufferSize 和 socketBuffer,但没有成功。
我能做些什么来强制分块响应吗?
我有一个算法,它等待近 5 秒来生成响应,我想在用户发送请求后立即向用户发送一个 ack(http 200),告诉他他的请求已收到并等待 5 秒。
发电机功能:
def chunked_res():
yield "Chunk 1"
stop = time.time() + 5 # wait for 5 seconds
while time.time() < stop:
pass
yield "Chunk 2"
Run Code Online (Sandbox Code Playgroud)
在某些方面:
response = HttpResponse ( chunked_res() )
response['Connection'] = 'close'
response['Transfer-Encoding'] = 'chunked'
response['status'] = 200
return response
Run Code Online (Sandbox Code Playgroud)
浏览器中的响应:
"传输编码:分块\n状态:200\n连接:关闭\n内容类型:文本/html;字符集=utf-8\n\nChunk 1Chunk 2"
问题: 我得到了要求的响应(Chunk 1,Chunk 2),但在 5 秒后。我想先发送“Chunk 1”,然后在 5 秒后发送“Chunk 2”(更新响应)。是否有任何特定的设置/更改来实现这一点?
更新:
Django = 1.4 蟒蛇 = 2.7
我需要使用分块传输编码,并且我正在处理生成内容期间可能出现的错误问题。如果在处理我发送的内容过程中发生一些错误,我需要使已经发送的(部分)内容无效。在IE10 中,我能够强制浏览器使用尾随标题执行此操作
Refresh: 0; url=http://
Run Code Online (Sandbox Code Playgroud)
但在Chrome 中,我找不到任何解决方案,因为此浏览器中似乎未实现尾随标头。
我有哪些选择?如何通知浏览器和/或用户下载的文件无效(因此不应打开或保存)?
我目前正在编写一个 HTTP 客户端来对返回 HTTP 响应的 URL 执行 HTTP POST。
但是,对于错误消息代码 400 和 500,它发送回非分块 HTTP 响应,对于成功消息 201,它发送分块响应。
在请求中,我设置了内容长度,所以我不确定为什么它仍然向我们发送分块传输编码。我可以在请求中设置任何其他标头,它会告诉 HTTP 服务器不要发送分块编码吗?
headerList.append("POST /v2/charges HTTP/1.1")
headerList.append("Content-Type: application/json")
headerList.append("host: xxxxxxxxx")
headerList.append("request-id: ABCD001123")
headerList.append("Content-length: %d" %len(Msg))
hostReqHeader = "\r\n".join(headerList)
reqData = hostReqHeader + '\r\n\r\n' + qbPosMsg
Run Code Online (Sandbox Code Playgroud)
我使用套接字来发送这些 HTTP 消息,而不是使用 httplib 或请求库。
我正在使用 HTTP 请求工具(类似于 cURL)并且遇到服务器响应问题。或者我对 HTTP 1.1 和分块数据的 RFC 的理解。
我所看到的是分块数据应采用以下格式:
4\r\n
Wiki\r\n
5\r\n
pedia\r\n
e\r\n
in\r\n\r\nchunks.\r\n
0\r\n
\r\n
Run Code Online (Sandbox Code Playgroud)
我实际看到的是以下内容:
4\r\n
Wiki\r\n
5\r\n
pedia\r\n
e\r\n
in\r\n\r\nchunks.\r\n
0
Run Code Online (Sandbox Code Playgroud)
换句话说,我测试过的少数服务器在 0.. 之后不再发送数据。不是 CRLF,更不用说 CRLFCRLF。
如果没有正确的分块标签格式,我们怎么知道这是分块数据的结尾?超时发生在 0 之后寻找 CRLF,这还不够。
我对使用分块编码时如何处理“连接”标头有点困惑。是否应不添加“Connection”标头(或设置为 keep-alive,这与我们谈论的 HTTP 1.1 相同),或者是否授权将其设置为 Connection:close 发送空块,意味着结束传输,但这是否意味着连接的结束?我认为当我的目的是在发送空块后关闭连接时,我需要添加 Connection:close ,如果我不添加 Connection 标头,它将保持打开状态
谢谢
我对 HTTP 协议的细微差别有点生疏,我想知道它是否可以直接支持发布/订阅?
HTTP 是一种请求响应协议。所以客户端发送请求,服务器发回响应。在 HTTP 1.0 中,为每个请求建立了一个新连接。现在 HTTP 1.1 改进了 HTTP 1.0,允许客户端保持连接打开并发出多个请求。
我意识到您可以将 HTTP 连接升级到 websocket 以进行快速的 2 路通信。我很好奇的是这是否是绝对必要的?
例如,如果我请求资源“ http://somewhere.com/fetch/me/slowly ”
服务器有空直接回复两次吗?例如首先接受 202,然后在内容准备好后不久接受内容,但没有客户端先发送额外的请求?
IE
Client: GET http://somewhere.com/fetch/me/slowly
Server: 202 "please wait..."
Server: 200 "here's your document"
Run Code Online (Sandbox Code Playgroud)
以这种方式实现发布/订阅服务是否正确?例如:
Client: http://somewhere.com/subscribe
Server: item 1
...
Server: item 2
Run Code Online (Sandbox Code Playgroud)
我的印象是这“可能”有效,因为客户端通常会有一个事件循环来监视连接,但在技术上是错误的(因为不需要以这种方式实现遵循协议的客户端)。
但是,如果您使用分块传输编码,这将起作用。
HTTP/2 似乎也允许这样做,但我不清楚是否进行了更改以使其成为可能。
我还没有看到太多关于 pub/sub 的讨论,所以如果使用带有或不带有分块编码的普通 HTTP/1.1 有什么问题怎么办?
如果这有效,为什么你需要像 RSS 或 ATOM 这样的东西?
chunked-encoding ×10
http ×7
http-chunked ×2
http-headers ×2
python ×2
asp.net ×1
asp.net-mvc ×1
browser ×1
chunked ×1
django ×1
iis ×1
iis-7 ×1
php ×1
tomcat6 ×1