2010-05-13 5 views
1

J'essaye de télécharger un fichier sur mon serveur personnel.Comment gérer correctement l'authentification HTTP Digest sur iPhone

J'ai écrit une petite page php qui fonctionne flawlessy jusqu'à présent.

La petite chose étrange est que je génère tout le corps du message HTTP que je vais envoyer (disons que cela équivaut à ~ 4 Mo) et j'envoie la requête à mon serveur.

Le serveur, puis, demande un défi HTTP et ma connexion de délégué: didReceiveAuthenticationChallenge: défi répond au serveur avec les informations d'identification appropriées et les données.

Mais, que s'est-il passé? Les données ont été envoyées deux fois!

En fait, j'ai remarqué que lorsque j'ai ajouté la barre de progression .. les applications envoie les données (4mb), le serveur demande l'authentification, les applications ré-envoie les données avec l'authentification (4mb). Donc, à la fin, j'ai envoyé 8mb. C'est faux.

j'ai commencé à googler et la recherche d'une solution, mais je ne peux pas comprendre comment résoudre ce problème.

Les scénarios cas sont deux (je pense):

  • Partager le domaine pour toute la session (une requête HTTP minimale, puis remettent en cause, alors les données)
  • Utilisez la manière synchronisée pour effectuer une requête HTTP connexion (choses que je ne veux pas faire, car il semble un moyen laid pour gérer ce genre de choses me)

Merci

Répondre

3

vous avez rencontré un défaut dans le protocole http: vous devez envoyer toutes les données avant d'obtenir la réponse avec le défi auth (lorsque vous envoyez une requête sans informations d'identification). Vous pouvez essayer de faire un petit aller-retour comme première demande dans la même session (comme vous l'avez mentionné), comme une demande HEAD, alors les futures demandes partageront le même nonce.

+0

Existe-t-il un moyen de le faire en utilisant les fonctionnalités NS fournies par iPhone SDK? J'ai réussi à atteindre l'objectif en utilisant ASIHTTPRequest et en faisant deux connexions (la première synchronisée, avec nom d'utilisateur et mot de passe) et la seconde asynchronisée remplie uniquement avec les données. C'est juste une question de curiosité, mais j'aimerais creuser là-dedans. –

+0

Ne pouvez-vous pas utiliser NSUrlConnection? Sinon, vous pourriez être bloqué avec CFNetwork directement, ou (comme vous l'avez déjà utilisé) ASIHttpRequest. (Je ne suis pas un programmeur iPhone, donc je vous donne des conseils basés sur mon expérience Mac, aussi ancienne soit-elle.) – Kylar

+0

J'ai réussi à le résoudre en utilisant ASIHTTPRequest. La première fois que j'utilise une requête synchronisée avec des informations d'identification (et je crée une session). La deuxième connexion que j'ouvre est déjà authentifiée si le premier a réussi. :) –

2

Trop tard pour répondre au demandeur d'origine, mais dans le temps si quelqu'un d'autre lire ceci. TL: DR: Section 8.2.3 of RFC 2616 décrit le statut 100 Continue qui correspond à tout ce dont vous avez besoin (dans ce cas). Voir également les sections 10.1.1 et 14.20.

Le client envoie une requête avec un « Attendez-vous à: 100 continuer » en-tête, arrêtant la demande avant d'envoyer le corps. Le serveur utilise les en-têtes déjà reçus pour décider si cette requête peut être acceptée ou non (si l'entité -le corps-à recevoir n'est pas trop grande, si les références de l'utilisateur sont correctes ...). Si la demande est acceptable pour le serveur, il répond avec un code d'état "100 Continue", le client envoie le corps et le serveur répond avec le code d'état final pour cette requête. Au contraire, si la requête n'est pas acceptable, le serveur répond avec un code d'état 4xx ("413 Request Entity Too Large" si la taille du corps fournie est trop grande ou un "401 non autorisé" + l'authentification WWW : header) et le client n'envoie pas le corps. En réponse à un code d'état 401 et à l'information WWW-Authenticate: correspondante, le client peut à nouveau exécuter la demande et fournir ses informations d'identification.

Questions connexes