在pascal中保持HTTP-Connection?

时间:2015-07-08 10:56:35

标签: freepascal lazarus httpconnection synapse

我想让程序自动访问此网站http://ringzer0team.com/ 我需要的一切(用户,通行证,csfr)我有,但如何保持HTTP - 连接在pascal?我使用http://posttestserver.com/来测试方法帖子。 这是我的代码。当我检查login.html文件时。它说HTTP_CONNECTION = close 所以我想知道如何保持它。

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,StdCtrls, httpsend,synacode; 



procedure TForm1.Button2Click(Sender: TObject);
  var
    URL: string;
    Params: string;
    Response: TMemoryStream;
    i:longint;
    S:ansistring;
    cs:string;
  begin
    httpClient:= THTTPSend.Create;
    if httpClient.HTTPMethod('GET', 'http://ringzer0team.com/login') then
    httpClient.Document.SaveToFile('1.txt');
    httpClient.Free;
    system.assign(fi,'1.txt');
    reset(fi);
    for i:=1 to 62 do readln(fi,S);
    cs:=copy(S,21,32);
    system.close(fi);
    Response := TMemoryStream.Create;
    try
        URL := 'http://posttestserver.com/post.php?dump&html';
        Params := 'username=' + EncodeURLElement('user') + '&' + 'password=' + EncodeURLElement('pass') + '&' + 'csrf=' + EncodeURLElement(cs);
        system.assign(fi,'text');
        if HttpPostURL(URL, Params, Response) then Response.SaveToFile('login.html');
    finally
    Response.Free;
    end;
   end;

1 个答案:

答案 0 :(得分:0)

我可以建议你使用更简单的方法。看: 首先,复制我的"解析器" -function:http://pastebin.com/u7C2xM67

其次,您不必将服务器答案作为文件保存到您的电脑上,因为它可以这样做: 复制我的功能" GetHTTPStr"来自http://pastebin.com/dxHLYERq并将其用作

someStringVariable := GetHttpStr(httpClient)

使用函数"解析器"你也可以获得csrf-token。这就像

//我使用" res"变量为"响应" string,只需要生成res:string变量并使用res:= GetHttpStr(httpClient)

cs := parser(res, "var _", ";");

//现在cs看起来像6a5b8e94 =' token_here' 并从自己获得令牌

cs := parser(cs, #39, #39); //#39 is a code of symbol '

所以我们从'解析到'获得我们需要的令牌

要将数据发布到服务器,您可以使用httpClient.HTTPMethod函数。 首先,您需要将您的帖子数据放入请求正文中,您可以使用

进行
var params:string; //your post data, it must have view like param1=value1&param2=value2 
httpClient.Document.Write(Pointer(params)^, Length(params)); //it adds your data into request body

现在,您可以使用httpClient.HTTPMethod('POST','ringzer.com/login');

发送请求

每次发送POST请求时都不要忘记更改请求content-type标头。可以使用httpClient.mimeType := 'application/x-www-form-urlencoded';来完成 如果您执行了POST请求并且希望将来使用httpsend-object来生成get-request,则应将其更改回text/html

回答您的问题,如果您想要发出非关闭请求,可以向httpsend-object添加标题:

httpClient.Headers.Add('Connection: keep-alive'); //Headers has a tstringlist type

请勿忘记在使用httpClient.clear;

的每个请求后清除httpsend-object