使用HTTPSendRequest上传

时间:2012-09-05 08:39:52

标签: delphi proxy ntlm wininet

我必须使用delphi将文件发送到php脚本。 我最终选择使用Wininet功能,因为我必须通过NTLM身份验证代理。

当我发送文件时,我的内容请求的每个字符之间都有空字符(00):

POST /upload.php HTTP/1.1
User-Agent: MYUSERAGENT
Host: 127.0.0.1
Cookie: ELSSESSID=k6ood2su2fbgrh805vs74fvmk5
Pragma: no-cache
Content-Length: 5

T.E.S

这是我的Delphi代码:

pSession := InternetOpen('MYUSERAGENT', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
pConnection := InternetConnect(pSession, PChar('127.0.0.1'), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
pRequest := HTTPOpenRequest(pConnection, PChar('POST'), PChar('/upload.php'), 'HTTP/1.0', nil, nil, INTERNET_SERVICE_HTTP, 0);
HTTPSendRequest(pRequest, nil, 0, Pchar('TESTR'), Length('TESTR'));

有关正在发生的事情的任何想法?

2 个答案:

答案 0 :(得分:7)

从Delphi 2009开始,您没有考虑到Delphi字符串切换为UTF-16编码的Unicode。当您通过PChar('TESTR')时,实际上您传递的是PWideChar,而不是PAnsiChar就像你期待的那样。字符串的字符长度为5个字符,但字节长度为10个字节。 HTTPSendRequest()对字节进行操作,而不是字符。所以你真的发送5个字节,其中每个第二个字节为空,因为这是ASCII字符以UTF-16编码的方式。

将最后一行改为:

var
  S: AnsiString;
...
S := 'TESTR';
HTTPSendRequest(pRequest, nil, 0, PAnsiChar(S), Length(S)); 

您不需要对正在调用的其他函数执行此操作,因为它们确实将Unicode字符作为输入,因此没有不匹配。

答案 1 :(得分:2)

您使用的是Delphi 2009或更高版本吗?如果是这样,那么你的字符串将是unicode。尝试为您的TESTR字符串使用ANSIstring变量