Indy HTTP Server URL编码的请求

时间:2014-07-21 09:32:18

标签: http encoding indy

当Indy HTTP服务器收到url请求时,如/ a?location =%D1%82%D0%B5%D1%81%D1%82(utf-8 url-encoded value),“location”字段位于requestinfo的Params具有不可读的值ÑÐμÑÑ。

如何获得可读的价值? Indy HTTPServer ver 10.6.0.4975

1 个答案:

答案 0 :(得分:1)

TIdHTTPServer当前使用Content-Type请求标头中指定的字符集解析输入参数,如果没有指定字符集,则使用Indy的8位编码。这是TIdHTTPServer的已知限制,因为目前没有选项告诉它使用用户定义的字符集解码参数。因此,您必须手动解析ARequestInfo.QueryParams和/或ARequestInfo.UnparsedParams属性,例如直接使用TIdURI.URLDecode()参数中的UTF-8编码调用AByteEncoding,例如:

procedure MyDecodeAndSetParams(ARequestInfo: TIdHTTPRequestInfo);
var
  i, j : Integer;
  value: s: string;
  LEncoding: IIdTextEncoding;
begin
  if IsHeaderMediaType(ARequestInfo.ContentType, 'application/x-www-form-urlencoded') then
  begin
    value := ARequestInfo.FormParams;
    LEncoding := CharsetToEncoding(ARequestInfo.CharSet);
  end else
  begin
    value := ARequestInfo.QueryParams;
    LEncoding := IndyTextEncoding_UTF8;
  end;

  ARequestInfo.Params.BeginUpdate;
  try
    ARequestInfo.Params.Clear;
    i := 1;
    while i <= Length(value) do
    begin
      j := i;
      while (j <= Length(value)) and (value[j] <> '&') do
      begin
        Inc(j);
      end;
      s := StringReplace(Copy(value, i, j-i), '+', ' ', [rfReplaceAll]);
      ARequestInfo.Params.Add(TIdURI.URLDecode(s, LEncoding));
      i := j + 1;
    end;
  finally
    ARequestInfo.Params.EndUpdate;
  end;
end;

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  MyDecodeAndSetParams(ARequestInfo);
  ...
end;