我有一个Tomcat 7,Spring 4.2 'RestController'实现REST API,它似乎'ERR_INVALID_CHUNKED_ENCODING'在返回JSON响应时产生少量API调用.
它是创建一个相同的代码ResponseEntity.但是对于少数API调用,"Content-Length"设置正确,其他调用"Transfer-Encoding"设置为Chunked.
private CacheControl cacheControl = CacheControl.noStore().mustRevalidate();
protected <T> ResponseEntity<TNRestResponse<T>> createEntity(TNRestResponse<T> res) {
return ResponseEntity.ok().cacheControl(cacheControl).body(res);
}
Run Code Online (Sandbox Code Playgroud)
奇怪的部分是创建的相同API调用的响应ERR_INVALID_CHUNKED_ENCODING似乎在另一个环境中正常工作.唯一的区别是客户端和服务在有问题的场景中在同一台服务器上运行.
已经尝试的解决方案是设置Content-Length手动,这似乎导致客户端上的文件过早结束.JSON长度只有大约468个字符,但客户端只接收409个字符,即使服务器日志显示已发送完整响应连接已关闭.
我们在这个问题的解决方案中迷失了,因为它是在不同环境中奇怪地运行的相同代码.我试图在tomcat上检查server.xml中的压缩设置.但是一切看起来都很好.
还禁用了IE和chrome中的代理设置.
任何有用的输入或见解都会非常好吗?提前致谢.
我在使用我的一个数据源服务时遇到了一些问题.正如它在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 标准没有涵盖这种可能性,但也许我只是忽略了它。
我想在我的Web服务器上禁用分块传输编码,以避免此错误:http: //support.microsoft.com/kb/871205.不幸的是,我需要在Win2k上支持IE6,因此他们无法安装补丁.
我找到了将AspEnableChunkedEncoding设置为FALSE的说明,但这似乎并没有解决我的问题.我相信这是因为我们还使用gzip压缩,根据这篇文章(http://www.eggheadcafe.com/conversation.aspx?messageid=31045986&threadid=31045970),压缩编码需要压缩动态内容.因此,所有动态压缩的内容都被"分块"传输,因为它是由gzip过滤器压缩的,而不是ASP.NET.
我知道IIS可以无内容地提供这些内容,因为我尝试在请求中使用http 1.0(它不支持transfer-encoding:chunked),并且响应正确到达并压缩.
如何在使用ScriptManager时禁用分块编码,这需要动态压缩生成的".axd"文件?
iis gzip scriptmanager transfer-encoding internet-explorer-6
我有一个带有 Transfer-Encoding: chunked 的服务器响应
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Mon, 18 Feb 2013 08:22:49 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
c7
{<some json data>}
0
Run Code Online (Sandbox Code Playgroud)
在 json 数据之前查看 c7 块大小。
如何在 Windows Phone 中使用 读取没有块的原始响应流HttpWebResponse?
提示:要使服务器禁用分块输出,我只需要指定 HTTP/1.0 协议版本。但我不知道该怎么做,因为Windows Phone 或 Silverlight 中没有类中的ProtocolVersion属性HttpWebRequest
c# silverlight httpwebrequest transfer-encoding windows-phone-7
我使用以下python代码下载html页面:
response = urllib2.urlopen(current_URL)
msg = response.read()
print msg
Run Code Online (Sandbox Code Playgroud)
对于像这样的页面,它会打开网址而不会出现错误,但只打印部分html页面!
在以下行中,您可以找到html页面的http标头.我认为这个问题是由于"Transfer-Encoding:chunked"造成的.
似乎urllib2只返回第一个块!我在阅读其余的块时遇到了困难.我怎么能读剩下的块?
Server: nginx/1.0.5
Date: Wed, 27 Feb 2013 14:41:28 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Set-Cookie: route=c65b16937621878dd49065d7d58047b2; Path=/
Set-Cookie: JSESSIONID=EE18E813EE464664EA64086D5AE9A290.tpdjo13v_3; Path=/
Pragma: No-cache
Cache-Control: no-cache,no-store,max-age=0
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Vary: Accept-Encoding
Content-Language: fr
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些数据发送到需要“传输编码:分块”标头的 Web 服务。它适用于普通的 POST 请求。但是一旦我添加标题,我总是得到:
由于以下情况,无法传送内容:收到来自客户端的无效请求
这是发送请求的部分:
std::vector<std::wstring> m_headers;
m_headers.push_back(TEXT("Transfer-encoding: chunked"));
std::wstring m_verb(TEXT("POST"));
std::vector<unsigned __int8> m_payload;
HINTERNET m_connectionHandle = WinHttpConnect(m_http->getSessionHandle(), hostName.c_str(), m_urlParts.nPort, 0);
if (!m_connectionHandle) {
std::cout << "InternetConnect failed: " << GetLastError() << std::endl;
return;
}
__int32 requestFlags = WINHTTP_FLAG_SECURE | WINHTTP_FLAG_REFRESH;
HINTERNET m_requestHandle = WinHttpOpenRequest(m_connectionHandle, m_verb.c_str(), (path + extra).c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, requestFlags);
if(!m_requestHandle) {
std::cout << "HttpOpenRequest failed: " << GetLastError() << std::endl;
return;
}
for(auto header : m_headers) {
if(!WinHttpAddRequestHeaders(m_requestHandle, (header + TEXT("\r\n")).c_str(), -1, WINHTTP_ADDREQ_FLAG_ADD)) { …Run Code Online (Sandbox Code Playgroud) 我已就此主题进行了大量谷歌搜索,但未能找到任何内容(除了确认AppEngine忽略对'resp.setHeader("transfer-encoding",xxxx)'的调用.
我的问题是我有一个服务器进程需要一点时间才能完成(~3秒avg),但是会产生连续流的结果(即第一个数据对象在10ms之后就绪).
目前,服务器缓冲响应,然后将整批内容向下发送到客户端以供显示.虽然这是有效的,但它不是一个出色的用户体验,因为用户必须等待整个过程完成才能看到第一个结果......
我相信使用分块传输可以解决这个问题,因为我可以立即向客户端发送第一个响应(并在可用时立即传输后续数据),从而更好地了解进度等.
我的问题是我无法弄清楚如何启用分块传输.
谷歌搜索分块传输和应用程序引擎主要是从想要禁用 blobstore中的分块传输的人发布帖子,或者发布默认情况下启用分块传输的帖子.但是,到目前为止,我的测试表明,至少在我的应用中,这不是真的.
同样,非应用程序引擎的引用谈论设置"传送编码"内容标题 - 但这是在AppEngine上明确忽视(至少,它是根据Python文档 - 找不到在Java端东西,宣称它明确地,但是当我测试它时它没有工作).
最后,我已经尝试刷新respose对象,获取响应编写器和刷新,获取响应输出流和刷新等没有任何区别.
所以 - 我的问题是: 如何启用分块传输?
我正在开发一个需要解析Chunked类型HTTP传输的客户端.我试着用下面的方法弄清楚错误,并且如果有人能够更快地捕捉到我的错误,我会很感激.总结一下这个问题:似乎客户端没有收到所有的块,从而搞砸了剩下的进程.提前致谢!
while(cflag){
pfile_chunk = malloc(CHUNK_SIZE+1);
memset(pfile_chunk, 0, CHUNK_SIZE);
cPtr = pfile_chunk;
cPtr2 = NULL;
k=0;
while(*(cPtr-1) != '\n'){
k++;
recv(sock, cPtr, 1, 0);
cPtr = pfile_chunk+k;
}
cPtr2 = strchr(pfile_chunk, '\r');
*cPtr2 = '\0';
sscanf(pfile_chunk, "%x", &l);
if(l == 0)
break;
printf("\nServer wants to deliver %ld bytes.\n", l);
pfile_chunk = realloc(pfile_chunk, l+1);
memset(pfile_chunk, 0, l);
recv(sock, pfile_chunk, l, 0);
fputs(pfile_chunk, f);
printf("GOT THIS, SIZE %ld:\n%s\n", strlen(pfile_chunk), pfile_chunk);
//get next \r\n bytes.
recv(sock, NULL, 2, 0);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 HttpClient(System.Net.Http,版本=4.2.1.0)将包含多部分表单数据的 HTTP 请求 POST 到 Web API。表单数据包括字符串参数 ( ) 和包含在 中的benchmark文件 ( ) 。API 调用返回一个我想要保存到磁盘的 CSV 文件。addressFilestream
响应包含标头Transfer-Encoding: chunked,其中包含的数据responseBytes 包括块标头。我希望HttpClient库删除这些标头,它们是实际内容的元数据。相反,它只是将标题行包含在Content.
处理这些块头的正确方法是什么?
我当然可以自己编写一个方法来处理标头,但我发现很难相信 HttpClient 库还没有在某个地方内置此功能。
using (var client = new HttpClient())
{
var content = new MultipartFormDataContent();
content.Add(new StringContent("Public_AR_Current"), "benchmark");
content.Add(new ByteArrayContent(stream.ToArray()), "addressFile", "addressFile.csv");
var response = await client.PostAsync("https://geocoding.geo.census.gov/geocoder/locations/addressbatch", content);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
saveResponse(responseBytes);
var geocodedItems = ParseGeocodeResponse(responseBytes);
var parsedItems = …Run Code Online (Sandbox Code Playgroud) c# ×2
chunked ×2
gzip ×2
http ×2
java ×2
.net-core ×1
c ×1
c++ ×1
http-chunked ×1
http-headers ×1
httpclient ×1
iis ×1
python ×1
rest ×1
silverlight ×1
spring ×1
tomcat ×1
urllib2 ×1
winhttp ×1