2010-10-04 20 views
5

Tengo problemas para escribir un cliente SOAP Obhone de iPhone/IOS que habla con una aplicación con una interfaz SOAP WS. La aplicación utiliza un servidor web NuSOAP php y codifica cualquier carga útil por encima de un cierto tamaño utilizando gzip/deflate, cualquiera que sea el que habilite el cliente.NSURLConnection: la respuesta SOAP codificada gzip se corrompe

Entiendo que NSURLConnection descomprime transparentemente cualquier respuesta codificada gzip y presenta la respuesta descomprimida, pero la respuesta bruta que se recibe en este caso parece estar dañada. Dejé la carga útil de SOAP en un archivo y la descomprimí usando gunzip, se queja de un "final inesperado de archivo". Revisé el servidor web y descargué la respuesta gzip que está enviando a un archivo, esta se descomprime sin ningún error usando gunzip. Parece que la respuesta se corrompe al recibirla.

Intenté usar tanto NSURLConnection como ASIHTTPRequest. Con NSURLConnection, hay una diferencia de exactamente 15 bytes cada vez, entre la longitud de los datos de respuesta y la longitud mencionada en el encabezado HTTP de la respuesta. Con ASIHTTPRequest, el número de bytes recibidos y la duración de la respuesta en el encabezado HTTP coinciden, pero lamentablemente la respuesta sigue estando dañada y no responde amablemente a la descompresión de gzip.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    NSLog(@"Headers :%@",[(NSHTTPURLResponse*)response allHeaderFields]); 
     [self.receivedData setLength:0]; 
    self.receivedData = [[NSMutableData dataWithCapacity:1024*1024] retain]; 
    } 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)value { 
    NSString *dataRec = [[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding]; 
    NSLog(@"didReceiveData :%@",dataRec); 
    [self.receivedData appendData:value]; 
} 

2010-10-04 13: 37: 15.310 SugarSoap [848: 207] Headers: { "Cache-Control" = "no-tienda, no-cache, debe-revalidate, post-check = 0, pre-check = 0 "; Conexión = "Keep-Alive"; "Content-Encoding" = gzip; "Content-Length" = 1683; "Content-Type" = "text/xml; charset = UTF-8"; Date = "Lun, 04 Oct 2010 08:07:14 GMT"; Expires = "Jue, 19 de noviembre de 1981 08:52:00 GMT"; "Keep-Alive" = "tiempo de espera = 15, máximo = 100"; Pragma = "no-caché"; Servidor = "Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8g DAV/2 PHP/5.2.5"; "Set-Cookie" = "PHPSESSID = udsgtttvts90ijuhsvuqop6ja6; ruta = /"; Variar = "Aceptar-Codificar"; "X-Powered-By" = "PHP/5.2.5"; "X-Soap-Server" = "NuSOAP/0.7.2()"; } 2010-10-04 13: 37: 15.311 SugarSoap [848: 207]

didReceiveData: (null) 2010-10-04 13: 37: 15.311 SugarSoap [848: 207] connectionFinsihed! Longitud: 1668

-(void)requestFinished:(ASIHTTPRequest *)request { 
    if([request isResponseCompressed]){ 
     NSLog(@"Response Compressed."); 
    } 
    NSData *compressedResponse = [request rawResponseData]; 
    NSData *responseData = [request responseData]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]; 
    NSLog(@"Length before decompression:%d Length after decompression:%d", compressedResponse length],[responseData length]); 
    NSLog(@"Response :%@",responseString); 
} 

2010-10-04 14: 11: 20.687 Hello_SOAP [1033: 207] Respuesta comprimido.

2010-10-04 14: 11: 20.687 Hello_SOAP [1033: 207] Longitud antes de la descompresión: 2165 Longitud después de la descompresión: 0

2010-10-04 14: 11: 20.687 Hello_SOAP [1033: 207] Respuesta:

Respuesta

0

Una vez tuve un problema cuando un archivo ligeramente dañado se descomprimiría sin ningún problema en mi Mac, pero en el iPhone no lo haría. Supongo que zlib en iPhone tiene menos tolerancia a los errores.

0

¿Estás seguro de que -connection:didReceiveData: no se está llamando al menos una vez antes de -connection:didReceiveResponse:? Parece que podría estar truncando algunos de los datos que vienen en el primer paquete con los encabezados.

+0

Sí, es llamado en la secuencia correcta. Y estoy registrando todos los datos recibidos, supongo que los datos deberían aparecer incluso si se llama fuera de secuencia. También tenga en cuenta que la llamada SOAP funciona perfectamente si deshabilito la codificación gzip en el lado del servidor WS. – Bala

0

¿Estás seguro de que tus datos son UTF8? Pruebe con otras codificaciones y vea si su error desaparece.

+0

Sí, la codificación de datos es UTF8. La decodificación UTF8 funciona perfectamente si la misma carga útil del mensaje no tiene gzip. Y probé otras codificaciones también, sin mucho éxito. – Bala

Cuestiones relacionadas