J'utilise NSURLConnection pour effectuer un POST HTTPS asynchrone sur notre service web pour télécharger un fichier .jpg. Cela fonctionne très bien la plupart du temps.HTTPS POST à partir de l'iPhone en utilisant NSURLConnection se bloque pour certaines plages de fichiers
Mais lorsque le corps du message est compris entre 196609 et 196868 octets (inclus), la connexion se bloque une fois que le fichier a été téléchargé à 100% (didSendBodyData indique qu'il est envoyé à 100%). Ensuite, après 5 minutes, la connexion expire avec le message "La connexion réseau a été perdue". Les filesizes plus grandes et plus petites fonctionnent. J'ai testé cela en plafonnant la taille du fichier que j'ajoute au corps du message.
La longueur du contenu est définie correctement. Voir le code ci-dessous.
Le téléchargement semble très bien lorsque je télécharge sur netcat via HTTP. Le corps entier du message passe à travers. Mais je soupçonne que quelque chose ne va pas en raison du cryptage SSL, comme s'il s'agissait d'un cadre de bloc crypté SSL.
Y a-t-il un bogue dans le code SSL de l'iPhone qui empêche le téléchargement de tout le corps du message, même si c'est un rapport, ou quelque chose d'autre?
Voici la section dans laquelle je définis la longueur du contenu et j'ajoute le fichier au corps POST multi-parties. Vous pouvez voir que je plafonne la taille du fichier manuellement, pour tester.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsurl];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:1];
[request addValue:@"close" forHTTPHeaderField: @"Connection"];
// Add headers and POST information
NSLog(@"Posting file.");
NSString *stringBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *postBody = [NSMutableData data];
...
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"uploadFile\"; filename=\"upload.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Type: image/jpg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"file size...%d", [uploadFile length]);
//[postBody appendData:uploadFile];
[postBody appendData:[NSData dataWithBytes: [uploadFile bytes] length: 196099]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];
[request setValue:[NSString stringWithFormat:@"%d", [postBody length]] forHTTPHeaderField:@"Content-Length"];
NSLog(@"Uploaded POST size: %d", [postBody length]);
Je pensais que mon code ne serait jamais pendu non plus. La plupart des photos fonctionnent. Mais ensuite j'ai pris une photo qui s'est coincée. Je n'ai jamais eu de réponse quand la photo était de cette taille. Alors j'ai testé la taille de haut en bas, et j'ai trouvé ces limites. Je n'ai trouvé aucune autre région à l'origine de ce problème. Oui, il semble que notre serveur attende la demande complète avant de donner quoi que ce soit, et pense qu'il ne reçoit pas la demande complète. C'est vraiment étrange. – tom
Eh bien, une condition est que la limite incluant les tirets (-) et les caractères de nouvelle ligne, doit être unique et ne doit pas apparaître à l'intérieur des données. –