2009-04-05 5 views
3

Je travaille sur une application de téléchargement simple. En faisant une requête pour le fichier suivant, firefox et mon application n'obtiennent pas le champ content-length. Mais si je fais la demande en utilisant le serveur wget envoie le champ de longueur de contenu. J'ai changé la chaîne de l'agent d'utilisateur de wgets pour examiner et il a encore obtenu le champ de longueur de contenu.Http protocol content-length

Des idées pour lesquelles cela se passe?

wget demande

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

demande firefox

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 

Mise à jour:

Y at-il un en-tête que je peux envoyer qui révèleront lighthttpd ne pas utiliser chunked originale encoding.My problème est que j'utilise urlConnection pour récupérer le fichier dans mon application Java qui automatiquement ds Requête HTTP 1.1.

Je voudrais connaître la taille du fichier afin que je puisse mettre à jour mon pourcentage.

+0

Si vous soutenez le HTTP 1.1, vous * devez * soutenir le codage de morceau. –

Répondre

4

On dirait qu'il est à cause de la chunked transfer encoding:

Transfer-Encoding: chunked 

Cela envoyer la vidéo vers le bas en morceaux, chacun avec sa propre taille. Ceci est défini dans HTTP 1.1, qui est ce que Firefox utilise, tandis que wget utilise HTTP 1.0, qui ne prend pas en charge le codage par transfert de blocs, de sorte que le serveur doit envoyer le fichier entier en une seule fois.

12

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

Firefox effectue une requête GET HTTP 1.1. Lighthttpd comprend que le client supportera le codage par transfert de code et retournera le contenu en morceaux, chaque segment rapportant sa propre longueur.

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

Wget d'autre part, effectue une requête GET HTTP 1.0. Lighthttpd, comprenant que le client ne prend pas en charge le protocole HTTP 1.1 (et donc le codage par transfert de blocs), renvoie le contenu dans un seul bloc, avec la longueur indiquée dans l'en-tête de la réponse.

+0

y at-il un en-tête que je peux envoyer qui dira à Lighthttpd de ne pas utiliser l'encodage en segments. mon problème original est que j'utilise urlConnection pour graper le fichier dans mon application java qui envoie automatiquement la requête HTTP 1.1. Je voudrais connaître la taille du fichier afin que je puisse mettre à jour mon pourcentage. thx. –

+1

Ce que vous cherchez n'est pas un en-tête de requête mais un moyen de changer la version du protocole utilisée par votre client. Vous avez besoin du client pour faire une requête 1.0. Quelle bibliothèque client HTTP utilisez-vous? –

1

je le même problème et a trouvé une solution quelle que soit la version HTTP:

  1. d'abord utiliser une HEAD requête au serveur qui répond correctement avec juste l'en-tête HTTP et aucun contenu. Cet en-tête inclut correctement la taille d'octet Content-Length: souhaitée pour le fichier à télécharger.
  2. Poursuivez avec la demande GET pour télécharger le fichier (l'en-tête de la réponse GET n'inclut pas Content-length).

Un exemple de langage Objective-C:

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; 

Et la sortie:

HEAD: 
contentsData.length: 0 
contents_length = 146216 

GET: 
contentsData.length: 146216 
contents_length = 146216 

(Note: Cet exemple URL fait correctement fournit l'en-tête Content-Length de la réponse GET, mais montre l'idée si elle échoue à)

+0

La réponse à la demande HEAD n'inclut pas l'entité, il n'est donc pas nécessaire d'inclure l'en-tête Content-Length. –