首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

是否IDHTTP的BUG

2013-01-09 
是不是IDHTTP的BUG?用INDY 10.2.3,当Request中cookie值的长度大于512字节时,会在中间插入回车换行符,导致

是不是IDHTTP的BUG?
用INDY 10.2.3,当Request中cookie值的长度大于512字节时,会在中间插入回车换行符,导致服务器认为数据错误,返回错误的信息。不知道是不是要设置indy中的哪一项。
想在Request中自定义添加的方法临时解决,在GET的时候抓包,发现没用,以下是添加头部的语句:
ih->CookieManager = NULL;
ih->Request->RawHeaders->Add(Memo2->Text);
Memo1->Lines->Add(ih->Request->RawHeaders->Text); // 这一行是看能不能添加成功,结果可以添加
ih->Get("http://XXXX"); // 从抓包看,添加的东西根本就没随数据包发送

是不是我的这种方法不行?
麻烦各位高手帮我想想办法。

[解决办法]
一、idhttp的自动维护cookie功能。

  idhttp的AllowCookies属性默认是true,意思是自动维护cookie,所以,打算用idhttp登陆网站、发贴等操作,只需要设置此属性为true就行了。

   二、提交自定义cookie。

  如其它帖子所说,设置idhttp的cookie有多种说法,经我测试,以下两条有用:

  1:http1.Request.CustomHeaders.Values['Cookie']:='fdsa';

  2:http1.Request.CustomHeaders.text:='Cookie: fdsa';

  一般情况下,使用第一条最佳。

  需要注意的是:我们在提交一些表单之前,要先获取表单所在页面,取得一些表单数据,整理数据后,再post到服务器。若这两个步骤使用同一个idhttp,且AllowCookies为True,此时将不能修改cookie,

(不能删除和修改,可以增加一行cookie,如:

  已有cookie为“Cookie: user=aaa; pwd=bbb”,在程序中使用http1.Request.CustomHeaders.Values['Cookie']:='fdsa'或者http1.Request.CustomHeaders.text:='Cookie: fdsa';都不会生效,而:http1.Request.CustomHeaders.Add('Cookie: fdsa')会发生如下情况(抓包可知):

 Cookie: user=aaa; pwd=bbb

 Cookie: fdsa

 这样,实际是自定义的COOKIE是没有生效的。 



  若使用不同的idhttp,则需要手动维护cookie,最简单的维护方法如下:

procedure MyWorkEnd(Sender:TObject; AWorkMode:TWorkMode);

var

  tmp,cookie:string;

  i:integer;

begin

  cookie := '';

  for i := 0 to http.Response.RawHeaders.Count - 1 do

  begin

       tmp := http.Response.RawHeaders[i];

      if pos('set-cookie: ', LowerCase(tmp)) = 0 then Continue;

    tmp := Trim(Copy(tmp, Pos('Set-cookie: ', tmp) + Length('Set-cookie: '), Length(tmp)));

    tmp := Trim(Copy(tmp, 0, Pos(';', tmp) - 1));

      if cookie = '' then cookie := tmp else cookie := cookie + '; ' + tmp;

  end;

  if cookie <> '' then

  begin

     http.Request.CustomHeaders.Values['Cookie']:=cookie;

  end;

end;

  请注意区分多个idhttp。


  若在同一idhttp,且AllowCookies为False,只需要用

  1:http1.Request.CustomHeaders.Values['Cookie']:='fdsa';

  2:http1.Request.CustomHeaders.text:='Cookie: fdsa';

总结,一般情况下是不用提交自定cookie的,需要的时候,把allowCookies设置为false(重点)。

热点排行