2010-01-17 4 views
0

Я использую пользовательский NSURLCache для перехвата вызовов для определенных веб-страниц, чтобы их динамически изменять. Внутри cachedResponseForRequest: я изменяю запрос, а затем отправляю его с помощью sendSynchronousRequest. Это работает очень хорошо, пока вы не попытаетесь отправить форму. Если есть данные, они терпят неудачу.NSURLConnection sendSynchronousRequest: сбой при использовании POST

Если я удалю HTTPBody и задаю запрос GET, он будет успешным. Но мне нужно, чтобы он работал с POST. Если я отправлю запрос асинхронно, он также работает, поэтому я не могу понять, почему синхронный запрос терпит неудачу.

Вот мой трассировки стека:

Дата/время: 2010-01-17 12: 37: 55,416 -0800
Версия ОС: iPhone OS 3.1.2 (7D11)
Версия отчета: 104

Тип исключения: EXC_BAD_ACCESS (SIGBUS)
Исключительные коды: KERN_PROTECTION_FAILURE в 0x0000001c
Разбился тема: 2

тема 2 Разбился:
0 CFNetwork 0x0000b4e4 HTTPMessage :: copyHeaderFieldValue (__ CFString сопз *) + 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 сопз *) + 216
6 CFNetwork 0x0000c77c URLConnectionLoader :: loaderScheduleLoad (_CFURLRequest сопз *) + 280
7 CFNetwork 0x0000c5e6 URLConnectionLoader :: LoaderConnectionEventQueue :: processAllEventsAndConsumePayload (XConnectionEventInfo , длинный) + 134
8 CFNetwork 0x0000c53a URLConnectionLoader :: processEvents() + 60
9 CFNetwork 0x0000a892 URLConnection :: multiplexerClientPerform (RunLoopMultiplexer
) + 30
10 CFNetwork 0x0000a812 MultiplexerSource :: выполнить() + 86
11 CFNetwork 0x0000a7b2 MultiplexerSource :: _ выполнения (недействительными *) + 2
12 CoreFoundation 0x000573a0 CFRunLoopRunSpecific + +1908
13 CoreFoundation 0x00056c18 CFRunLoopRunInMode + 44
14 Фонд 0x0005a998 + [NSURLConnection (NSURLConnectionReallyInternal) _resourceLoadLoop:] + 172
15 Фонд 0x00053ac6 - [NSThread главную] + 42
16 Фонд 0x00001d0e __NSThread__main__ + 852
17 libSystem.B.dylib 0x0002b7b0 _pthread_body + 20

Как вы можете видеть, copyHeaderFieldValue вызывает сбой. Я не понимаю, почему.

ответ

0

EXC_BAD_ACCESS - это ссылка на плохую версию где-то ... поместите удержание везде, чтобы увидеть, работает ли оно.

0

Вы в конечном итоге решили это?

Проблема заключается в том, что cachedResponseForRequest возвращает новый экземпляр NSCachedURLResponse. Глядя на ваш other question, даже попытка имитировать NSHTTPURLResponse, похоже, не решает проблему сбоя.

Решение заключается не в создании собственного ответа, а в возврате одного из объекта, созданного в storeCachedResponse. Посмотрите, как SDURLCache делает это путем сериализации/десериализации этого объекта.

+0

Да, я решил ... Мне нужно посмотреть, что я сделал, и отчитываться, как я сейчас забыл. –

+0

Да, если у вас есть шанс проверить это, это будет потрясающе. – Pooya

+0

В делете делегата UIWebView 'shouldStartLoadWithRequest:' отправленный запрос фактически изменен. Просто добавьте его в NSMutableURLRequest, и вы можете его изменить. Добавить любые данные post, используя 'setHTTPBody:', но не забудьте установить метод GET, поскольку по какой-либо причине POST не работает с веб-просмотром. Затем в вашем настраиваемом URL-адресе проверьте свой модифицированный URLRequest. Создайте новый NSMutableURLRequest и установите все его свойства для соответствия запросу, за исключением того, что метод POST установлен. –