Search code examples
httpdelphiindyhttpcookie

Add Cookie field to header of post request


I would like to send post request like following by program is written in delphi. Reuquest of web browser There is a cookie field in request header (in red rectangle). I wrote following source code.

procedure TForm1.Button2Click(Sender: TObject);
var
    uri : TIdURI;
    cookie : TIdCookieManager;
    HTTP : TIdHTTP;
    vals: TStringList;
    url : String;
    response : TStringStream;
begin
    HTTP := TIdHTTP.Create();
    HTTP.AllowCookies := True;
    HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    HTTP.HandleRedirects := True;
    cookie := TIdCookieManager.Create();
    uri := TIdURI.Create('www.hoge.com');
    cookie.AddServerCookie('ASP.NET_SessionId=test', uri);
    HTTP.CookieManager := cookie;
    vals := TStringList.Create;
    response :=  TStringStream.Create('');
    vals.Add('__EVENTTARGET=');
    vals.Add('__EVENTARGUMENT=');
    vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A=');
    vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C');
    vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg==');
    vals.Add('ddlLanguage=ja-JP');
    vals.Add('tbUserId=myid');
    vals.Add('tbPassword=hoge');
    vals.Add('btnLogin=login');

    url :=  TIdURI.ParamsEncode('ReturnUrl=/GssNet/main/default.aspx');
    url := TIdURI.URLEncode('www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx');
    try
        HTTP.Post('http://www.hoge.com/GssNet/login,aspx', vals, response);
    Except
        on EIdHTTPProtocolException do
        begin
          ShowMessage(Memo1.TextHint);
        end;
    end;
end;

But cookie field is not included in request header. Following is result of packet capture. when I execute my program. Please teach me the way to add cookie field to request header.

Rquest of my program


Solution

  • As @smooty86 said in comments, you need to include the http:// portion of the URL when adding a cookie manually. You also need to include the full path to the resource that is being requested, otherwise the cookie will only be valid for requests to the root / path.

    Also, your calls to TIdURI.ParamsEncode() and TIdURI.URLEncode() are useless since you are not using the encoded url variable. If you are going to take the time to encode a URL than make sure to actually use it.

    You are also leaking all of your objects.

    Try this instead:

    procedure TForm1.Button2Click(Sender: TObject);
    var
      uri : TIdURI;
      HTTP : TIdHTTP;
      vals : TStringList;
      url : String;
      response : TStringStream;
    begin
      try
        response := TStringStream.Create('');
        try
          vals := TStringList.Create;
          try
            vals.Add('__EVENTTARGET=');
            vals.Add('__EVENTARGUMENT=');
            vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A=');
            vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C');
            vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg==');
            vals.Add('ddlLanguage=ja-JP');
            vals.Add('tbUserId=myid');
            vals.Add('tbPassword=hoge');
            vals.Add('btnLogin=login');
    
            HTTP := TIdHTTP.Create;
            try
              HTTP.HandleRedirects := True;
              HTTP.AllowCookies := True;
              HTTP.CookieManager := TIdCookieManager.Create(HTTP);
    
              uri := TIdURI.Create('http://www.hoge.com/GssNet/login,aspx');
              try
                HTTP.CookieManager.AddServerCookie('ASP.NET_SessionId=test', uri);
              finally
                uri.Free;
              end;
    
              url := TIdURI.URLEncode('http://www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx');
    
              HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
              HTTP.Post(url, vals, response);
            finally
              HTTP.Free;
            end;
          finally
            vals.Free;
          end;
    
          // use response as needed...
        finally
          response.Free;
        end;
      except
        on EIdHTTPProtocolException do
        begin
          ShowMessage(Memo1.TextHint);
        end;
      end;
    end;
    

    Lastly, why are you sending a request to login,aspx? The correct name is login.aspx instead. login,aspx does not exist on the server.