2010-03-04 18 views
5

Tengo un problema que no sé cómo resolverlo.Servidor http Delphi indy10 y formulario ExtJS enviar

Tengo un servidor HTTP Indy10. He utilizado los servidores HTTP Indy9 e Indy10 en muchas aplicaciones y nunca tuve ningún problema. Pero ahora estoy usando el servidor HTTP Indy10 con el framework de JavaScript de ExtJS.

El problema es cuando envío datos que contienen caracteres no ansi. Por ejemplo, cuando presento la letra "č" que es una letra en la página de códigos 1250 (esloveno, croata ...) obtengo lo siguiente en Indy en "params sin analizar" -> "% C4% 8D". Esta es la representación hexadecimal correcta de la letra "č" en la codificación utf-8. Todas mis páginas son utf-8 y nunca tuve problemas para enviar datos de formulario a Indy. Depuré el código y vi que obtengo una secuencia de bytes como esta: [37, 67, 52, 37, 56, 68]. Esta es la representación de bytes de la cadena "% C4% 8D". Pero, por supuesto, Indy no puede codificar esto correctamente en UTF-16. Entonces como un ejemplo. El campo de formulario actual:

FirstName=črt 

sale así cuando has votado:

FirstName=%C4%8Drt 

no sé cómo resolver esto. Miré en los foros de ExtJS, pero no hay nada sobre este tema. ¿Alguien sabe algo sobre este tipo de problema?

EDITAR:

Si puedo codificar los parámetros de anuncio JSON que llegan correctamente. También intenté decodificar URL de los parámetros, pero el resultado no es correcto. Tal vez me perdí algo. Voy a ver esto de nuevo. Y sí, parece que ExtJS URL codifica los parametros

Edit2:

Ok, he descubierto más. Comparé el contenido real de los datos de la publicación. Es así:

Delphi 2006 (Indy10): FirstName=%C4%8D 
Delphi 2010 (Indy10): FirstName=%C4%8D 

En ambos casos, los parámetros no analizados son idénticos. Tengo ParseParams activado y en BDS2006 están correctamente analizados, pero en 2010 no lo son. Esto es Indy10 lleno de delphi. ¿Hay algún error en esta versión o estoy haciendo algo mal?

Edit3:

He descargado la última versión de todas las noches desde Indy10. Todavía el mismo problema.

EDIT4:

me veo obligado a aceptar mi propia respuesta.

Respuesta

4

Para responder sobre este tema.

Esto definitivamente no funciona como debería en Unicode. Indy usa cadenas unicode internamente. El problema es cuando los parámetros se decodifican a TStringList. El problema es la línea:

Params.Add(TIdURI.URLDecode(s)); 

encontrado en los "TIdHTTPRequestInfo.DecodeAndSetParams". No decodifica params correctamente, probablemente porque funciona con cadenas Unicode.

La solución alternativa que encontré es usar "HTTPDecode" de "HTTPApp.pas".

Params := TStringList.Create; 
try 
    Params.StrictDelimiter := True; 
    Params.Delimiter := '&'; 

    // parse the parameters and store them into temporary string list 
    Params.DelimitedText := UTF8ToString(HTTPDecode(UTF8String(Request.UnparsedParams))); 
    // do something with params... 
finally 
    Params.Free; 
end; 

Pero no puedo creer que una tarea tan común no esté funcionando correctamente. ¿Alguien puede confirmar que esto es realmente un error o simplemente estoy haciendo algo mal?

+2

Las capacidades de decodificación de TIdHTTPServer, incluso en versiones Ansi de VCL, tienen problemas conocidos que aún no se han solucionado. –

+0

Gracias por la información. Estaba preocupado de estar haciendo algo mal :) – Runner

1

Parece que la cadena está codificada URL, por lo que utilizar el siguiente código para descifrar:

uses 
    idURI; 

value := TIdURI.URLDecode(value); 

edición

Parece que hay un caso en el que el decodificador no decodifica correctamente el doble bytes como un solo caracter. Mirando la fuente, parece que se decodificará correctamente si el carácter está codificado como% UC48D pero en mi prueba esto todavía no se decodifica correctamente. Lo que es interesante es que el TidURI.La función ParamsEncode genera la codificación adecuada, pero esta codificación no es reversible utilizando las rutinas adecuadas en la última versión de Indy 10.

+0

Sí, las cadenas tienen codificación URL. Lo intentaré de inmediato. Intenté enviar params como JSON y ellos llegaron correctamente, así que probablemente estés en lo correcto. – Runner

+0

De la documentación esto debería funcionar. Pero no es así Hm, ¿qué me estoy perdiendo? – Runner

+0

Parece que hay un error en Indy con decodificación de caracteres de doble byte. Este problema también emerge con Synapse. – skamradt

1

estoy usando Delphi 7 y migrar a Indy 10. He encontrado probable problema con caracteres portugués y resolver esta cambiando la fuente a continuación:

procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String); 
    ... 
    //Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose 
    Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked 
    ... 

final;