2009-04-05 5 views
3

Ich arbeite an einer einfachen Download-Anwendung. Während eine Anfrage für die folgende Datei sowohl firefox und meine Anwendung erhalten nicht das Feld content-length. Aber wenn ich die Anfrage über den wget-Server mache, sende ich das content-length-Feld. Ich habe wgets User-Agent-String zu testen geändert und es hat immer noch das Feld content-length.Http-Protokoll Inhalt-Länge

Irgendwelche Ideen, warum das passiert?

wget Anfrage

---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 Anfrage

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 

Update:

Gibt es einen Header, den ich, dass Light erzählen senden kann nicht encoding.My Original chunked zu verwenden Problem ist, dass ich urlConnection verwende, um die Datei in meiner Java-Anwendung zu holen, die automatisch sen ds HTTP 1.1 Anfrage.

Ich möchte die Größe der Datei wissen, damit ich meinen Prozentsatz aktualisieren kann.

+0

Wenn Sie HTTP 1.1 unterstützen, * müssen * Sie unterstützt Chunked Encoding. –

Antwort

4

Sieht aus wie es wegen des chunked transfer encoding ist:

Transfer-Encoding: chunked 

Dadurch wird das Video unten in Stücken, jedes mit seiner eigenen Größe senden. Dies ist in HTTP 1.1 definiert, welches Firefox verwendet, während wget HTTP 1.0 verwendet, das chunked Transfer Encoding nicht unterstützt, also muss der Server die gesamte Datei auf einmal senden.

12

GET /dc-13/video/2005_Defcon_V2-P_Zimmerman-Unveiling_My_Next_Big_Project.mp4 HTTP/1,1

Firefox ist die Durchführung einer HTTP 1.1 GET-Anfrage. Lighthttpd versteht, dass der Client die Chunked-Transfer-Codierung unterstützt und den Inhalt in Chunks zurückgibt, wobei jeder Chunk seine eigene Länge meldet.

GET /dc-13/video/2005_Defcon_V2-P_Zimmerman-Unveiling_My_Next_Big_Project.mp4 HTTP/1,0

Wget auf der anderen Seite führt eine HTTP-GET-Anforderung 1.0. Lighthttpd, das versteht, dass der Client HTTP 1.1 (und damit Chunked-Transfer-Encoding) nicht unterstützt, gibt den Inhalt in einem einzelnen Chunk zurück, wobei die Länge im Response-Header angegeben wird.

+0

gibt es eine Kopfzeile, die ich senden kann, die Lighthttpd mitteilen wird, chunked encoding nicht zu verwenden. Mein ursprüngliches Problem ist, dass ich UrlConnection verwende, um die Datei in meiner Java-Anwendung zu grapschen, die automatisch HTTP 1.1 Anfrage sendet. Ich möchte die Größe der Datei wissen, also kann ich meinen Prozentsatz aktualisieren. thx. –

+1

Was Sie suchen, ist kein Anforderungsheader, sondern eine Möglichkeit, die von Ihrem Client verwendete Protokollversion zu ändern. Sie benötigen den Client, um eine 1.0-Anfrage zu stellen. Welche HTTP-Client-Bibliothek verwenden Sie? –

1

ich das gleiche Problem hatte und eine Lösung unabhängig davon, welche HTTP-Version gefunden:

  1. Zuerst verwenden, um eine HEAD Anfrage an den Server, die nur mit dem HTTP-Header richtig reagiert und keine Inhalte. Dieser Header enthält korrekt die gewünschte Content-Length: Bytes Größe für die Datei zum Download.
  2. Fahren Sie mit der Anforderung GET fort, um die Datei herunterzuladen (der Header der GET-Antwort kann keine Inhaltslänge enthalten).

Eine Objective-C-Sprache Beispiel:

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; 

Und die Ausgabe:

HEAD: 
contentsData.length: 0 
contents_length = 146216 

GET: 
contentsData.length: 146216 
contents_length = 146216 

(Hinweis: Dieses Beispiel URL tut liefert korrekt den Header Content-Length von der GET-Antwort, aber zeigt die Idee, wenn es gescheitert ist)

+0

Die Antwort auf die HEAD-Anfrage enthält keine Entität, daher ist es nicht erforderlich, Content-Length-Header einzufügen. –