My GetHttp works with HTTP, but HTTPS returns invalid data

my GetHttp works with HTTP, but HTTPS returns invalid data, this is a testing procedure:

GetHTTP (' https: // localhost / ', '', temp, true); temp.SaveToFile ('C: \ temp.txt');

How to fix any ideas?

function GetHTTP(AUrl, APostStr:ansistring; AStream:TStream; noncached :boolean =false): integer; var Retry: Boolean; hSession, hConnect, hRequest: hInternet; RequestMethod, Header: ansistring; Buf:array[0..1023] of Char; ReadCount:Cardinal; dwError, dwErrorCode: DWORD; ptNil: Pointer; UrlInfo: TUrlInfo; flags : DWORD ; procedure SetTimeOut; var TimeOut: integer; begin TimeOut := 5 * 1000; InternetSetOption(hSession, INTERNET_OPTION_RECEIVE_TIMEOUT, @TimeOut, SizeOf(TimeOut)); end; procedure GetHttpStatus; //StatusCode var Len, Reserved: DWORD; begin Reserved := 0; Len := SizeOf(Result); HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, @Result, Len, Reserved) ; end; begin flags := 0; if noncached = true then flags := INTERNET_FLAG_RELOAD; // flags := INTERNET_FLAG_SECURE; THIS DID NOT HELP ??!!! output was blank with it Result := 0; if not GetUrlInfo(AUrl, UrlInfo) then Exit; hSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); try SetTimeOut; hConnect := InternetConnect(hSession, pchar(UrlInfo.hostname),urlinfo.port,nil,nil,INTERNET_SERVICE_HTTP,INTERNET_FLAG_EXISTING_CONNECT ,0); try if APostStr = '' then RequestMethod := 'GET' else RequestMethod := 'POST'; hRequest := HttpOpenRequest(hConnect, PChar(RequestMethod),Pchar(urlinfo.urlpath), 'HTTP/1.0', nil, nil,flags, 0); try if APostStr = '' then Header := '' else Header := 'Content-type: application/x-www-form-urlencoded'; Retry:=True; while Retry do begin if HttpSendRequest(hRequest, PChar(Header),Length(Header), PChar(APostStr), Length(APostStr)) then dwErrorCode:=ERROR_SUCCESS else dwErrorCode:=GetLastError; dwError:=InternetErrorDlg(application.Handle, hRequest, dwErrorCode, FLAGS_ERROR_UI_FILTER_FOR_ERRORS or FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS or FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, ptNil); Retry:=(dwError=ERROR_INTERNET_FORCE_RETRY); end; //HttpSendRequest(hRequest, PChar(Header),Length(Header), PChar(APostStr), Length(APostStr)); GetHttpStatus; if Result <> HTTP_STATUS_OK then Exit; while True do begin if not InternetReadFile(hRequest, @Buf, SizeOf(Buf), ReadCount) then Break; //res := GetLastError(); if ReadCount = 0 then Break else AStream.Write(Buf, ReadCount); end; finally InternetCloseHandle(hRequest); end; finally InternetCloseHandle(hConnect); end; finally InternetCloseHandle(hSession); end; end; 
+4
source share
3 answers

I only did this in Indy, which uses OpenSSL and requires a few extra DLLs. You also need to explicitly create an I / O handler for SSL. The following is a simplified code example.

 MyHTTP := GetIdHTTP(True); MyHTTP.Get(SomeSecureURL, MyStream); 

...

 function GetIdHTTP(aSecure: Boolean = False): TIdHTTP; var lSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL; begin Result := TIdHTTP.Create(nil); if aSecure then begin lSSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create; Result.IOHandler := lSSLIOHandler; end; end; 
+2
source

Besides Indy, you can also use the Delphi component THTTPReqResp (or see how it handles HTTPS, it uses WinInet). Here is your GetHTTP written using the component for GET:

 function GetHTTP(AUrl, APostStr: String; AStream:TStream; noncached :boolean =false): Boolean; var ReqResp: THTTPReqResp; begin Result := False; ReqResp := THTTPReqResp.Create(nil); try { Get Case } if AUrl <> '' then begin ReqResp.URL := AUrl; ReqResp.Get(AStream); Result := True; end; finally ReqResp.Free; end; end; 
+2
source

https runs on a different port, and you need to say that winsock makes a secure connection.

check that urlinfo.port set to 443.
you must set the INTERNET_FLAG_SECURE flag for https requests.

0
source

All Articles