Delphi - Indy (IDHTTP) Keep Session
delphi, indy, proxy, session
Solution
I don't see where you instantiate `CookieManager`, but that's where you should keep track of the session. The server will send some cookie that represents the current session, and all further requests that you send to the server should include that cookie so the server knows which session to use.
You'll have to either keep the cookie-manager object around for the duration of the session, or you'll have to save its data somewhere else and then re-load it each time you create a new cookie-manager object. I'd prefer the former. In fact, you might consider keeping the entire HTTP object around.
Problem
Ok, I have Idhttp created dynamically like the following ``` procedure TForm1.Button1Click(Sender: TObject); Var Resp : String; begin Resp := webSession('https://www.website.com'); // HTTPS site requires session to keep alive if Length(Resp)>0 then MessageDlg('Got the body ok',mtInformation,[mbOk],0); end; function TForm1.webSession(sURL : ansistring) : ansistring; var SStream : Tstringstream; HTTPCon : TIdHTTP; AntiFreeze : TIdAntiFreeze; CompressorZLib: TIdCompressorZLib; ConnectionIntercept: TIdConnectionIntercept; SSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL; CookieManager: TIdCookieManager; begin CompressorZLib := TIdCompressorZLib.Create; ConnectionIntercept :=TIdConnectionIntercept.Create; SSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create; Result := ''; if Length(SettingsForm.edtProxyServer.text) >= 7 then // 0.0.0.0 Try SStream := NIL; AntiFreeze := NIL; HTTPCon := NIL; Try SStream := tstringstream.Create(''); { Create & Set IdHTTP properties } HTTPCon := TIdHTTP.create; HTTPCon.AllowCookies:=true; HTTPCon.CookieManager :=CookieManager; HTTPCon.Compressor := CompressorZLib; HTTPCon.Intercept := ConnectionIntercept; HTTPCon.IOHandler := SSLIOHandlerSocketOpenSSL; HTTPCon.HandleRedirects := true; { Check Proxy } if checkproxy('http://www.google.com') then Begin HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text; HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text); HTTPCon.ProxyParams.BasicAuthentication := True; HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text; HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text; End; { Create another AntiFreeze - only 1/app } AntiFreeze := TIdAntiFreeze.Create(nil); AntiFreeze.Active := true; HTTPCon.Get(sURL,SStream); Result := UTF8ToWideString(SStream.DataString); Finally If Assigned(HTTPCon) then FreeAndNil(HTTPCon); If Assigned(AntiFreeze) then FreeAndNil(AntiFreeze); If Assigned(SStream) then FreeAndNil(SStream); If Assigned(CookieManager) then FreeAndNil (CookieManager ); If Assigned(CompressorZLib) then FreeAndNil (CompressorZLib ); If Assigned(ConnectionIntercept) then FreeAndNil (ConnectionIntercept ); If Assigned(SSLIOHandlerSocketOpenSSL) then FreeAndNil (SSLIOHandlerSocketOpenSSL); End; Except { Handle exceptions } On E:Exception do MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0); End; end; function TForm1.checkproxy(sURL : ansistring) : boolean; var HTTPCon : TIdHTTP; AntiFreeze : TIdAntiFreeze; begin Result := False; Try { Inti vars } AntiFreeze := NIL; HTTPCon := NIL; Try { AntiFreeze } AntiFreeze := TIdAntiFreeze.Create(NIL); AntiFreeze.Active := true; { Create & Set IdHTTP properties } HTTPCon := TIdHTTP.Create(NIL); HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text; HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text); HTTPCon.ProxyParams.BasicAuthentication := True; HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text; HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text; HTTPCon.HandleRedirects := true; HTTPCon.ConnectTimeout := 1000; HTTPCon.Request.Connection := 'close'; HTTPCon.Head(sURL); Finally { Cleanup } if Assigned(HTTPCon) then Begin { Return Success/Failure } Result := HTTPCon.ResponseCode = 200; If HTTPCon.Connected then HTTPCon.Disconnect; FreeAndNil(HTTPCon); End; if Assigned(AntiFreeze) then FreeAndNil(AntiFreeze); End; Except On E:EIdException do ; { Handle exceptions } On E:Exception do MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0); End; end; ``` I've got a website that requires me to keep a session alive. How would I do this? With similar code to above. If I create a visual component for everything, and use it everything is great, but when I dynamically create the component (which I REALLY want to leave it this way) it fails to keep the session alive. Any help is appreciated.