首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Http协议内容-长度

Http协议内容-长度
EN

Stack Overflow用户
提问于 2009-04-05 04:53:12
回答 3查看 6K关注 0票数 4

我正在编写一个简单的下载应用程序。在请求以下文件时,firefox和我的应用程序都没有获得内容长度字段。但是,如果我使用wget服务器发出请求,就会发送内容长度字段。我确实更改了wget用户代理字符串来测试,它仍然有内容长度字段。

知道为什么会这样吗?

wget请求

代码语言:javascript
复制
---request begin---
GET /dc-13/video/2005_Defcon_V2-P_Zimmerman-Unveiling_My_Next_Big_Project.mp4 HTTP/1.0
User-Agent: test
Accept: */*
Host: media.defcon.org
Connection: Keep-Alive

---request end---
HTTP request sent, awaiting response... 
---response begin---
HTTP/1.0 200 OK
Server: lighttpd
Date: Sun, 05 Apr 2009 04:40:08 GMT
Last-Modified: Tue, 23 May 2006 22:18:19 GMT
Content-Type: video/mp4
Content-Length: 104223909
Connection: keep-alive

firefox请求

代码语言:javascript
复制
GET /dc-13/video/2005_Defcon_V2-P_Zimmerman-Unveiling_My_Next_Big_Project.mp4 HTTP/1.1
Host: media.defcon.org
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.0.8) Gecko/2009032608 Firefox/3.0.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.defcon.org/html/links/defcon-media-archives.html
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.x 200 OK
Server: lighttpd
Date: Sun, 05 Apr 2009 05:20:12 GMT
Last-Modified: Tue, 23 May 2006 22:18:19 GMT
Content-Type: video/mp4
Transfer-Encoding: chunked

更新:

我是否可以发送一个标头,告诉Lighthttpd不要使用块的encoding.My,最初的问题是我正在使用urlConnection来获取我的java应用程序中的文件,它会自动发送HTTP1.1请求。

我想知道文件的大小,这样我就可以更新我的百分比了。

EN

回答 3

Stack Overflow用户

发布于 2009-04-05 05:01:39

/dc-13/video/2005_Defcon_V2-P_Zimmerman-Unveiling_My_Next_Big_Project.mp4 HTTP/1.1

Firefox正在执行HTTP1.1GET请求。Lighthttpd理解客户端将支持分组传输编码,并以块的形式返回内容,每个块都报告自己的长度。

/dc-13/video/2005_Defcon_V2-P_Zimmerman-Unveiling_My_Next_Big_Project.mp4

HTTP/1.0

另一方面,Wget执行HTTP1.0GET请求。Lighthttpd了解到客户端不支持HTTP1.1(因此是分块传输编码),因此返回一个块中的内容,并在响应头中报告长度。

票数 13
EN

Stack Overflow用户

发布于 2009-04-05 05:00:33

看来是因为chunked transfer encoding

代码语言:javascript
复制
Transfer-Encoding: chunked

这将发送视频块,每一个都有自己的大小。这是在HTTP1.1中定义的,火狐使用的是HTTP1.0,而wget使用的是HTTP1.0,它不支持分组传输编码,因此服务器必须同时发送整个文件。

票数 4
EN

Stack Overflow用户

发布于 2013-12-16 20:46:26

我遇到了同样的问题,并找到了一个解决方案,而不管哪个HTTP版本:

  1. 首先对服务器使用HEAD请求,该请求只使用header而不使用任何内容进行正确响应。此标头正确地包含文件到download.
  2. Proceed的所需Content-Length:字节大小,以及下载该文件的GET请求( GET响应中的头部未能包含Content-length).

)。

一个目标-C语言示例:

代码语言:javascript
复制
NSString *zipURL = @"http://1.bp.blogspot.com/_6-cw84gcURw/TRNb3PDWneI/AAAAAAAAAYM/YFCZP1foTiM/s1600/paragliding1.jpg";

NSURL *url = [NSURL URLWithString:zipURL];

// Configure the HTTP request for HEAD header fetch
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
urlRequest.HTTPMethod = @"HEAD";  // Default is "GET"

// Define response class
__autoreleasing NSHTTPURLResponse *response;

// Send HEAD request to server
NSData *contentsData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil];

// Header response field
NSDictionary *headerDeserialized = response.allHeaderFields;

// The contents length
int contents_length = [(NSString*)headerDeserialized[@"Content-Length"] intValue];

//printf("HEAD Response header: %s\n",headerDeserialized.description.UTF8String);
printf("HEAD:\ncontentsData.length: %d\n",contentsData.length);
printf("contents_length = %d\n\n",contents_length);

urlRequest.HTTPMethod = @"GET";

// Send "GET" to download file
contentsData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil];

// Header response field
headerDeserialized = response.allHeaderFields;

// The contents length
contents_length = [(NSString*)headerDeserialized[@"Content-Length"] intValue];

printf("GET Response header: %s\n",headerDeserialized.description.UTF8String);
printf("GET:\ncontentsData.length: %d\n",contentsData.length);
printf("contents_length = %d\n",contents_length);

return;

以及产出:

代码语言:javascript
复制
HEAD:
contentsData.length: 0
contents_length = 146216

GET:
contentsData.length: 146216
contents_length = 146216

(注意:这个示例URL确实正确地提供了来自GET响应的标题内容长度,但是如果它失败了,则显示它的想法)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/718361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档