Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Indy IdHttp, SSL and Proxy in Delphi
#1
[/url]

I use Indy 10.6.2 with Delphi 7.
I must connect to a https server. I use this code :
Code:
FIdHTTP := TIdHTTP.Create(nil);
FIdHTTP.HandleRedirects := True;
FIdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
FIdSSL.SSLOptions.Mode := sslmClient;
FIdSSL.SSLOptions.SSLVersions := [sslvTLSv1_1,sslvTLSv1_2];
FIdHTTP.IOHandler := FIdSSL;

FIdHTTP.Request.Clear;
FIdHTTP.Request.ContentType := 'application/json';
FIdHTTP.Response.ContentType := 'application/json';
FIdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Basic xxxxxxx==';
FIdHTTP.Post(zURL, zJsonStreamIn, zJsonStreamOut);
finally
  zJSon := zJsonStreamOut.DataString;
end;
we have a proxy on lan : [url=http://proxy-client.xxxxx.fr]http://proxy-client.xxxxx.fr
(Port : 8080)

I use proxyparams :

Code:
FIdHTTP.ProxyParams.ProxyServer := 'http://proxy-client.in.ac-grenoble.fr';
FIdHTTP.ProxyParams.ProxyPort := 8080;
FIdHTTP.ProxyParams.BasicAuthentication := False;
Then I have error 10001 (host not found) but when I dont't use proxyparams,, I have 10060.

Do you have any idea please ?

Thank you in advance.

Laurent.
Reply
#2
I already answered your same question on StackOverflow:

Indy IdHttp, SSL and Proxy in Delphi

I am including my answer below for reference purposes:

Quote:The TIdHTTP.ProxyParams.ProxyServer property expects just a hostname, not a full URL. Change this line:

Code:
FIdHTTP.ProxyParams.ProxyServer := 'http://proxy-client.in.ac-grenoble.fr';

To this instead:

Code:
FIdHTTP.ProxyParams.ProxyServer := 'proxy-client.in.ac-grenoble.fr'

---

On a side note:

You don't need the following lines, so you should remove them completely:

Code:
FIdHTTP.Request.Clear;
FIdHTTP.Response.ContentType := 'application/json';
FIdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Basic xxxxxxx==';

TIdHTTP has builtin support for Basic authentication. Simply set the TIdHTTP.Request.Username and TIdHTTP.Request.Password properties as needed, and set the TIdHTTP.Request.BasicAuthorization property to True.

Also, if you want the response data as a string, TIdHTTP.Post() has an overload for that purpose:

Code:
zJson := IdHTTP.Post(zURL, zJsonStreamIn);

But either way, putting the call to TIdHTTP.Post() in a try..finally is good for cleanup, but if an HTTP error occurs, your zJson won't receive any data by default. If you need the response body for HTTP errors, you will need to either:
  • catch the resulting EIdHTTPProtocolException and assign its ErrorMessage property to your zJson variable.
  • enable the hoNoProtocolErrorException and hoWantProtocolErrorContent flags in the TIdHTTP.HTTPOptions property, then zJson will receive both success and failure response bodies equally.

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)