2010-03-04 4 views
5

У меня проблема, я не знаю, как ее решить.Delphi indy10 http server and ExtJS form submit

У меня есть HTTP-сервер Indy10. Я использовал HTTP-серверы Indy9 и Indy10 во многих приложениях и никогда не испытывал никаких проблем. Но теперь я использую HTTP-сервер Indy10 с инфраструктурой RAI ExtJS javascript.

Проблема заключается в том, когда я отправляю данные, содержащие символы, отличные от ansi. Например, когда я отправляю письмо «č», которое является письмом в кодировке 1250 (словенский, хорватский ...), я получаю следующее в Indy в разделе «unparsed params» -> «% C4% 8D». Это правильное шестнадцатеричное представление буквы «č» в кодировке utf-8. Все мои страницы - utf-8, и у меня никогда не было проблем с отправкой данных формы в Indy. Я отлаживал код и видел, что на самом деле я получаю последовательность байтов: [37, 67, 52, 37, 56, 68]. Это байтовое представление строки «% C4% 8D». Но, конечно, Indy не может корректно кодировать UTF-16. Итак, пример. Действительное поле формы:

FirstName=črt 

выходит как это, когда занесена:

FirstName=%C4%8Drt 

Я не знаю, как решить эту проблему. Я смотрел на форумах ExtJS, но в этой теме ничего нет. Кто-нибудь знает что-нибудь об этой проблеме?

EDIT:

Если закодировать PARAMS объявление JSON они правильно приехать. Я также пытался URL-расшифровать параметры, но результат неверен. Может, я что-то пропустил. Я снова посмотрю на это. И да, кажется, что URL ExtJS кодирует PARAMS

EDIT2:

Ok, я обнаружил больше. Я сравнил фактическое содержание данных сообщения. Это выглядит так:

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

В обоих случаях непараметрированные параметры идентичны. У меня включен ParseParams, и в BDS2006 они правильно разобраны, но в 2010 году они не являются. Это Indy10, наполненный delphi. Есть ли ошибка в этой версии, или я делаю что-то неправильно?

EDIT3:

Я скачал последнюю ночную сборку од Indy10. Еще одна проблема.

EDIT4:

Я вынужден принять свой ответ.

ответ

4

Чтобы ответить на эту тему.

Это определенно не работает, как должно быть в юникоде. Indy использует строки unicode внутри. Проблема заключается в том, что параметры декодируются в TStringList. Проблема заключается в линии:

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

найдено в "TIdHTTPRequestInfo.DecodeAndSetParams". Он неправильно декодирует параметры, вероятно, потому, что он работает над строками unicode.

Обходной путь, который я нашел, - использовать «HTTPDecode» из «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; 

Но я не могу поверить, что такая общая задача работает неправильно. Может кто-то подтвердить, что это действительно ошибка, или я просто делаю что-то неправильно?

+2

Возможности декодирования TIdHTTPServer, даже в версиях VCL от Ansi, имеют известные проблемы, которые еще не были рассмотрены. –

+0

Спасибо за информацию. Я волновался, что делаю что-то не так :) – Runner

1

Он появляется строка является URL закодированы, поэтому можно использовать следующий код для декодирования:

uses 
    idURI; 

value := TIdURI.URLDecode(value); 

редактировать

Оказывается, есть случай, когда декодер не правильно декодировать двойной байты как один символ. Глядя на источник, кажется, что он правильно декодирует, если символ закодирован как% UC48D, но в моем тестировании это все еще неправильно декодируется. Интересно, что TidURI.Функция ParamsEncode генерирует правильное кодирование, но эта кодировка не является обратимой, используя правильные подпрограммы в последней версии Indy 10.

+0

Да, строки закодированы в URL. Я попробую это сразу. Я пытался отправить параметры как JSON, и они поступают правильно, поэтому вы, вероятно, правы. – Runner

+0

Из документации это должно работать. Но это не так. Хм, что мне не хватает? – Runner

+0

Похоже, что в Indy есть ошибка с декодированием символов с двумя байтами. Эта проблема также связана с Synapse. – skamradt

1

I'm с помощью Delphi 7 и мигрировать в Indy 10. Я нашел вероятную проблему с португальскими персонажами и решить эту проблему изменения ниже источника:

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

конец;