2010-01-17 13 views
0

J'utilise un NSURLCache personnalisé pour intercepter les appels de certaines pages Web afin de les modifier dynamiquement. Inside cachedResponseForRequest: Je modifie la requête, puis l'envoie en utilisant sendSynchronousRequest. Cela fonctionne très bien jusqu'à ce que vous essayiez de soumettre un formulaire. S'il y a des données de publication, cela échoue.NSURLConnection sendSynchronousRequest: échoue lors de l'utilisation de POST

Si je supprime le HTTPBody et définissez la demande à GET, il réussit. Mais j'en ai besoin pour travailler avec POST. Si j'envoie la requête de manière asynchrone, cela fonctionne aussi, c'est pourquoi je n'arrive pas à comprendre pourquoi la requête synchrone échoue.

Voici mon trace de la pile:

Date/Heure: 2010-01-17 12: 37: 55,416 -0800
OS Version: iPhone OS 3.1.2 (7D11)
Version du rapport: 104

type d'exception: EXC_BAD_ACCESS (SIGBUS)
codes d'exception: KERN_PROTECTION_FAILURE à 0x0000001c
Crashed discussion: 2

discussion 2 Crashed:
0 CFNetwork 0x0000b4e4 HttpMessage :: copyHeaderFieldValue (__ CFString const *) + 18
1 CFNetwork 0x0000b4c8 CFHTTPMessageCopyHeaderFieldValue + 16
2 CFNetwork 0x0000e022 httpProtocol :: createStream() + 328
3 CFNetwork 0x0000de8a httpProtocol :: createAndOpenStream() + 458
4 CFNetwork 0x0000cba2 httpProtocol :: startLoad() + 278
5 CFNetwork 0x0000c8da URLConnectionLoader :: loaderScheduleOriginLoad (_CFURLRequest const *) + 216
6 CFNetwork 0x0000c77c URLConnectionLoader :: loaderScheduleLoad (_CFURLRequest const *) + 280
7 CFNetwork 0x0000c5e6 URLConnectionLoader :: :: LoaderConnectionEventQueue processAllEventsAndConsumePayload (XConnectionEventInfo , long) + 134
8 CFNetwork 0x0000c53a URLConnectionLoader :: processEvents() + 60
9 CFNetwork 0x0000a892 URLConnection :: multiplexerClientPerform (RunLoopMultiplexer
) + 30
10 CFNetwork 0x0000a812 MultiplexerSource :: exécuter() + 86
11 CFNetwork 0x0000a7b2 MultiplexerSource :: _ effectuer (void *) + 2
12 CoreFoundation 0x000573a0 CFRunLoopRunSpecific + 1908
13 CoreFoundation 0x00056c18 CFRunLoopRunInMode + 44
14 Fondation 0x0005a998 + [NSURLConnection (NSURLConnectionReallyInternal) _resourceLoadLoop:] + 172
15 Fondation 0x00053ac6 - [NSThread principale] + 42
16 Fondation 0x00001d0e __NSThread__main__ + 852
17 libSystem.B.dylib 0x0002b7b0 _pthread_body + 20

Comme vous pouvez le voir, copyHeaderFieldValue provoque le plantage. Ce que je ne comprends pas c'est pourquoi.

Répondre

0

EXC_BAD_ACCESS est un lien vers une mauvaise version quelque part ... mettre conserver partout juste pour voir si cela fonctionne.

0

Avez-vous déjà résolu ce problème?

Le problème semble être lorsque cachedResponseForRequest renvoie une nouvelle instance de NSCachedURLResponse. En regardant votre other question, même en essayant d'imiter NSHTTPURLResponse ne semble pas résoudre le problème d'accident.

Une solution à n'est pas de créer votre propre réponse, mais plutôt d'en renvoyer une d'un objet créé dans storeCachedResponse. Jetez un coup d'œil à la façon dont SDURLCache le fait en sérialisant/désérialisant cet objet.

+0

Oui je l'ai résolu ... Je vais devoir regarder ce que j'ai fait et rapporter comme j'ai maintenant oublié. –

+0

Ouais, si vous avez l'occasion de jeter un coup d'œil, ce serait génial. – Pooya

+0

Dans 'shouldStartLoadWithRequest 'du délégué UIWebView:' la requête envoyée est en fait mutable. Jetez-le simplement à NSMutableURLRequest et vous pouvez le modifier. Ajoutez des données de publication à l'aide de 'setHTTPBody:', mais assurez-vous de définir la méthode sur GET lorsque POST échoue avec la vue Web pour une raison quelconque. Puis, dans votre URLCache personnalisé, vérifiez votre URLRequest modifié. Effectuez un nouveau NSMutableURLRequest et définissez toutes ses propriétés pour correspondre à la requête avec la seule exception de définir la méthode sur POST. –