Delphi XE2 정식버젼을 사용하고 있습니다.
IdHTTP.Version을 확인해 보면 "10.5.8.0" 이라고 나옵니다.
OS는 Win7 64Bit와 Win8.1 64Bit 양쪽에서 모두 동일한 증상이 나타납니다.
http://xxxxxxx.com/에 로그인 한 후에
http://xxxxxxx.com/data 페이지의 HTML소스를 가져오는 소스코드입니다.
로그인 해더를 분석해 보면 아래와 같습니다.
https://xxxxxxx.com/LogIn
POST /LogIn HTTP/1.1
Host: xxxxxxxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer:
http://xxxxxxxx.com/
Cookie: A2SK=..........
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
id=xxxxxx&pw=xxxxxxxx
로그인에 성공하면 리턴되는 문자열 안에 ID가 포함되어 있으니
ID가 포함되어 있는지 여부로 로그인 성공 여부를 확인할 수 있습니다.
에러 증상은 그때 그때 마다 다른데요.
첫번째 에러는 아주 가끔이지만
https://xxxxxxx.com/LogIn에 POST할때 에러가 발생합니다.
에러메세지는 "EidSockError 10038" 이라고 나오구요.
하지만 이 증상은 아주 가끔나오니 크게 문제되지는 않습니다.
두번째 에러가 계속 발생하는데요.
https://xxxxxxx.com/LogIn에 POST할때는 이상이 없습니다.
로그인도 잘 되구요.
하지만 로그인 한 후에
http://xxxxxxxx.com/data의 페이지를 가져오려 하면 ReadTimeout이 나옵니다.
에러메세지는 첨부파일과 같구요.
에러코드는 에러메세지는 "EidSockError 10060" 이라고 나올때가 있고
에러메세지는 "EidSockError 10056" 이라고 나올때가 있습니다.
에러가 나지 않는 경우는 없구요.
하지만 이 에러가 처음 부터 발생한 것은 아닙니다.
타회사 서버이므로 서버에서 어떤 작업을 했는지 몰라도 어느날 부터 갑자기 이런 증상이 나타나기 시작하더니
그 이후로 계속 나타나는데요.
참고로 로그인을 하지 않고
http://xxxxxxx.com/data페이지를 가져와 보면
비록 필요한 데이터는 가져오지 못하지만 페이지를 가져오는데는 문제가 없습니다.
하도 답답해서 JAVA와 VB로 동일한 프로그램을 만들어 보면
물론 첫번째 문제나 두번째 문제 어느 증상도 나타나는 경우가 없습니다.
유난히 델파이에서만 이런 증상이 나타납니다.
Function GetHTML(ID: String; PWD: String) : Striing;
Begin
Result := '';
idHttp := TidHttp.Create(NIL);
idHttp.ConnectTimeout := 1000;
idHttp.ReadTimeout := 1000;
IdHTTP.HandleRedirects := True; // HTTP/1.1
idHttp.Request.Connection := 'keep-alive';
idHttp.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0';
idHttp.Request.Referer := 'http://xxxxxxx.com/';
idSSL := TIdSSLIOHandlerSocketOpenSSL.Create(NIL);
idHttp.IOHandler := idSSL;
POSTData := TStringList.Create;
//================================== Form ======================================
POSTData.Values[id'] := ID;
POSTData.Values[pw'] := PWD;
//================================= Submit =====================================
URL := 'https://xxxxxxx.com/LogIn';
TRY
HTMLStr := IdHTTP.Post(URL, POSTData, TEncoding.UTF8);
Except
POSTData.Free;
POSTData := Nil;
idSSL.Free;
idSSL := Nil;
idhttp.Free;
idhttp := Nil;
Exit;
END;
POSTData.Free;
POSTData := Nil;
//============================== 로그인 확인 ======================================
IF POS(ID, HTMLStr) < 0 then // 로그인 ID가 포함된 문자열이 리턴되면 로그인 성공
Begin
idSSL.Free;
idSSL := Nil;
idhttp.Free;
idhttp := Nil;
Exit;
End;
//===============================================================================
//===============================================================================
Response := TStringStream.Create('');
HTMLStr := '';
//================================= Get ==========================================
URL := 'http://xxxxxx.com/data';
TRY
IdHTTP.Get(URL, Response);
Except
Response.Free;
Response := Nil;
idSSL.Free;
idSSL := Nil;
idhttp.Free;
idhttp := Nil;
Exit;
END;
HTMLStr := TEncoding.UTF8.GetString(Response.Bytes, 0, Response.Size);
Response.Free;
Response := Nil;
idSSL.Free;
idSSL := Nil;
idhttp.Free;
idhttp := Nil;
Result = HTMLStr;
End;