AFNetworking + CocoaSPDY отправляет запросы, не получая ответа

Я пытаюсь настроить SPDY через AFNetworking, но не могу понять, почему у меня тайм-ауты.

Я уже проверил свой сервер на проверке SPDY, и все в порядке.

Я поместил эту строку кода в свой метод initWithBaseURL:(NSURL *)url

NSString *origin = [NSString stringWithFormat:@"%@:443",kAPIClientBaseURLString];
[SPDYURLConnectionProtocol registerOrigin:origin];

Я получаю журналы отладки, которые выглядят нормально

2013-12-23 15:26:37.889 Proj[42859:70b] SPDY [INFO] register origin: <SPDYOrigin: 0x19156fa0>
2013-12-23 15:26:37.890 Proj[42859:420f] SPDY [DEBUG] origin registered: <SPDYOrigin: 0x19156fa0>
2013-12-23 15:26:37.892 Proj[42859:441b] SPDY [INFO] start loading https://api.proj.mx:443/2/ursers/launching_info?param1=1&param2=2

Затем, после нескольких секунд ожидания, я получаю

2013-12-23 15:28:07.994 Proj[42859:441b] SPDY [INFO] stop loading https://api.proj.mx:443/2/dr/drs?param1=1
2013-12-23 15:28:07.996 Proj[42859:441b] SPDY [WARNING] session connection error: Error Domain=SPDYSocketErrorDomain Code=6 "Unexpected end of stream." UserInfo=0x13e52710 {NSLocalizedDescription=Unexpected end of stream.}

И если я печатаю ошибку, она отображается как тайм-аут.

Если я уберу интеграцию SPDY (две строки, которые я написал выше), то все пойдет как надо.

Я действительно не знаю, что происходит, буду признателен за любую помощь и комментарии.

Спасибо.

Я изменил URL, чтобы избежать проблем с конфиденциальностью и безопасностью.


person RoHiguera    schedule 23.12.2013    source источник
comment
есть хорошие новости по этому поводу?   -  person xialin    schedule 07.03.2014


Ответы (2)


Библиотеке CocoaSPDY требуется сервер, который либо говорит SPDY через выделенный порт, либо способен динамически переключаться на конвейер SPDY, когда он получает кадр SETTINGS через вновь установленное соединение.

Насколько мне известно, в настоящее время GFE не выполняет ни одну из этих функций, а это означает, что, к сожалению, в настоящее время библиотека CocoaSPDY не будет поддерживаться на конечных точках API Google.

Вы управляете своим собственным сервером? Если это так, вполне возможно, что по умолчанию он полагается на NPN для установления протокола, и вместо этого вы захотите настроить его так, чтобы он просто говорил SPDY, когда ваше приложение подключается к нему.

person Mike Schore    schedule 26.12.2013
comment
Привет, Майк! Я проверил здесь и здесь, поэтому я думаю, что он действительно поддерживает SPDY. Думаю проблема где-то внутри фреймворка или может я что-то не так делаю, но не знаю что. Спасибо за ваше время - person RoHiguera; 27.12.2013
comment
Привет @RoHiguera - я не могу знать наверняка, не зная больше о сервере, к которому вы пытаетесь подключиться, но мое первое предположение по-прежнему заключается в том, что NPN используется для согласования протокола. Это текущий стандартный механизм, который сервер будет автоматически использовать, чтобы решить, поддерживает ли браузер SPDY при установлении соединения TLS. Библиотека CocoaSPDY пропускает этот шаг (поскольку Apple Secure Transport в настоящее время не поддерживает NPN) и просто начинает отправлять SPDY по сети. Вам нужно будет использовать сервер, настроенный для поддержки этого. - person Mike Schore; 30.12.2013

Ваш сервер поддерживает SPDY?

Попробуйте установить точку останова в методе делегата socket:willDisconnectWithError:. Вы можете проверить [socket unreadData], чтобы увидеть любые непрочитанные данные.

Если это не дает вам никакой полезной информации, попробуйте реализовать (и зарегистрировать) другие методы делегата.

person Aaron Brager    schedule 24.12.2013
comment
Я попробую эти методы делегирования и дам вам знать, как это происходит. Спасибо! - person RoHiguera; 26.12.2013