2012-04-16 14 views
9

Comencé a utilizar ASIHTTPRequest en mi proyecto iOS para ejecutar llamadas al método de servidor REST y hasta ahora he tenido mucho éxito. Solo tengo un extraño problema intermitente. Muy de vez en cuando me da la siguiente respuesta de usar [ASIHTTPRequest startAsynchronous]:Objetivo C - Respuesta HTTP/0.9 de GET usando ASIHTTPRequest

HTTP/0.9 200 OK

Cuando esto ocurre a mi método de servidor no recibe llamados. Normalmente, todas las llamadas a métodos retornan con una respuesta que comienza con 'HTTP/1.1'. Estoy usando HTTPS con un certificado GeoTrust/RapidSSL para asegurar la conexión. Curiosamente, he encontrado que obtengo la misma respuesta 'HTTP/0.9 200 OK' si trato de conectarme al puerto SSL (443) pero especificando 'http' como el protocolo.

Solo para agregar más información: el problema se produce principalmente después de que la aplicación se ha dejado inactiva durante un período de tiempo. P.ej. la solicitud se completa con éxito, luego deja la aplicación inactiva por un tiempo, luego en la siguiente solicitud el problema ocurre y la aplicación continúa funcionando bien.

¿Alguien puede arrojar algo de luz sobre lo que podría estar ocurriendo?

Muchas gracias, Jonathan

ACTUALIZACIÓN: He pegado debajo de una cierta salida de información de depuración por ASIHTTPRequest cuando ocurrió el problema:

2012-07-12 09:35:49.376 mytestapp[3038:18f07] [CONNECTION] Closing connection #13 because it has expired 
2012-07-12 09:35:49.377 mytestapp[3038:18f07] [CONNECTION] Closing connection #14 because it has expired 
2012-07-12 09:35:49.378 mytestapp[3038:18f07] [CONNECTION] Closing connection #15 because it has expired 
2012-07-12 09:35:49.380 mytestapp[3038:18f07] [CONNECTION] Request #39 will use connection #16 
2012-07-12 09:35:49.381 mytestapp[3038:18f07] [CONNECTION] Request #40 will use connection #17 
2012-07-12 09:35:49.382 mytestapp[3038:18f07] [CONNECTION] Request #41 will use connection #18 
2012-07-12 09:35:49.529 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a1e00> finished downloading data (0 bytes) 
2012-07-12 09:35:49.529 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a1e00> received response headers 
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [AUTH] Request <ASIHTTPRequest: 0x88a1e00> has passed Basic authentication 
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [CONNECTION] Got no keep-alive header, will keep this connection open for 60.000000 seconds 
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [CONNECTION] Request #41 finished using connection #18 
2012-07-12 09:35:49.531 mytestapp[3038:18f07] [STATUS] Request finished: <ASIHTTPRequest: 0x88a1e00> 
2012-07-12 09:35:49.531 mytestapp[3038:15803] responseHeaders={ 
} 
2012-07-12 09:35:49.531 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a1e00> 
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a0200> 
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a0200>: Cancelled 
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [CONNECTION] Request #39 failed and will invalidate connection #16 
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a0a00> 
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a0a00>: Cancelled 
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [CONNECTION] Request #40 failed and will invalidate connection #17 
+2

¿Cuál es su lado del servidor? ¿Ha excluido categóricamente, al 100%, categóricamente que el servidor se está comportando mal al verificar el flujo de datos de la red real con un detector de paquetes como Wireshark? – pmdj

+0

¿Alguna posibilidad de que su ISP esté usando un proxy? – Lefteris

+0

¿Ha intentado configurar "validatesSecureCertificate = NO;" – endy

Respuesta

2

Inseguro sobre aspectos específicos del IOS en este caso, pero HTTP 0.9 es completamente abandonado. Hay una razón clara para esto: no es compatible con el encabezado "Host:". Esto significa que una sola IP no puede tener hosts virtuales en absoluto. Tales cosas se volvieron obsoletas al final de los 90-s.

Tal respuesta nunca debería ocurrir en la vida real. Si aún sucede, algún cliente realizó una solicitud como "GET/HTTP/0.9". Pero estos clientes han desaparecido hace 15 años.

SSL es algo de lo que HTTP no está muy pendiente. Entonces creo que esto no está relacionado. El túnel SSL está configurado y luego se ejecuta el HTTP simple.

Como conclusión, diría que usted o alguien posiblemente haya activado un método obsoleto. Y es posible que IOS no tenga idea de qué hacer con él. Tal vez el método IOS es un método limitado con el nombre de host incluido y, por lo tanto, no se desencadena. De todos modos, no deberías preocuparte si el cliente realmente habla 0.9 porque de todos modos no obtiene las respuestas correctas de la mayoría de los sitios. Si el cliente habla 1.1 y responde 0.9, entonces posiblemente la solicitud se malinterprete de alguna manera y se produzca un mecanismo de repliegue a la versión HTTP más baja posible. Tal vez se olvidó de configurar el nombre de host para la solicitud o cometió un error de sintaxis.

1

Hay algunas menciones acerca de este problema en la web, y básicamente está relacionado con las conexiones persistentes, y cuando algo falla con un encabezado Content-length y un contenido que algunos servidores defectuosos devuelven. Podría arruinar los navegadores y el marco de iOS, y en realidad no notan los encabezados.

Aquí está el one of the possible explanations.

Intente deshabilitar las conexiones persistentes, debería ayudar. Este advice provino de los desarrolladores de ASIHTTPRequest (situación bastante similar).

[httpRequest setShouldAttemptPersistentConnection:NO]; 
+0

Hola, gracias por la respuesta. Intenté deshabilitar las conexiones persistentes, la persistencia de cookies, la persistencia del llavero, la persistencia de la sesión, el almacenamiento en caché, etc., y el problema todavía está sucediendo. –

0

HTTP/0.9 200 OK es un encabezado de mensaje inexistente. HTTP/0.9 se define como la solicitud: GET <Request-URI> HTTP/0.9 <CRLF>, cuya respuesta es [Entity-Body], sin líneas de estado ni encabezado. (< urn: ietf: rfc: 1945 >)

Hay un error en el software en algún lugar. Supongo que la solicitud ha fallado o aún no se ha recibido.