음...분명 인디 http 컴포넌트을 많은 분들은 잘 사용하고 있습니다.
문제는 오류를 3자가 재현을 해볼 수 있으면 문제해결을 위한 답변을 더 빨리 얻으실 수도 있습니다.
https 면 델마당도 로그인시에 https 를 사용합니다.
그런 사이트들을 상대로 오류를 재현해보세요. 그러면 질문을 보시는 많은 분들도 재현을 해볼 수 있을테고 답변 얻기도 훨씬 수월할겁니다.
또한 인디와 더불어 ICS(
http://www.overbyte.be/) 라는 컴포넌트도 많이 사용하는 검증된 컴포넌트입니다.
해당 컴포넌트도 검토해보세요.
첫눈 님이 쓰신 글 :
: 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;
:
: