본문 바로가기

프로그래밍/Delphi

[Delphi/Tip] 웹페이지 URL 유효성 검토

[Delphi/Tip] 웹페이지 URL 유효성 검토

    [개발 실전에서 바로 쓸 수 있는 라이브 코드 프로젝트]


웹페이지의 유효성(올바른 URL인지 여부 판단)을 체크해 보자.




때로는 웹사이트에서 이미지 또는 파일을 다운로드 받도록 프로그래밍 된 프로젝트에서 수많은 컨텐츠 중에 삭제 되거나 변경되어 다운로드 받지 못하는 경우가 발생할 수 있다. 해당 URL을 오픈해 보고 404등 HTTP프로토콜 오류에 대해 처리할 수 있으나 빠른 접근 법으로 해당 페이지 URL이 유효한지 체크해 볼 수 있다.


이를 위해 Indy 컴포넌트를 사용해서 해결 할 수도 있으나 어쩐지 무거운 감이 드는게 사실이다. 따라서 윈도우 시스템에서 제공하는 API를 랩핑하여 델파이에서 기본 제공하는 Winiet Delphi Runtime Library를 사용해서 해결 해 보자


다음 모듈을 그대로 가져다 사용하면 될 것이지만

여기서 한 가지 해당 API 호출 시에 웹서버의 리턴을 받지 못해 프로그램이 얼어 버리는 경우(응답없음) 상태가 발생할 수 있으니 타임아웃을 반드시 지정해 주면 좋겠다.



uses
  wininet;

{$R *.dfm}

// 웹서버에 해당 URL이 유효한지 체크한다
// 전체페이지를 다운로드 받아보지 않아도 된다.
function IsUrlValid(const url: string; ATimeoutMSec : Integer = 0): boolean;
var
  hInet: HINTERNET;
  hConnect: HINTERNET;
  infoBuffer: array [0..512] of char;
  dummy: DWORD;
  bufLen: DWORD;
  okay: LongBool;
  reply: String;
begin
  if pos('://-', url) >0 then
  begin
    result := false;
    exit;
  end;

  hInet := InternetOpen(PChar('EYECOMA'),
    INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,nil,nil,0);

  //타임아웃을 지정할 수 있음
  //간혹 지정하지 않는 경우 무한루프에 빠질 수도 있으니 지정하기를 권장
  //적어도 1~2초 이내에는 반환 하는 것이 정상이므로 2초 정도 권장
  if ATimeoutMSec>0 then
    InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT,
                    @ATimeoutMSec, SizeOf(ATimeoutMSec));

  //연결해 본다..
  hConnect := InternetOpenUrl(hInet,PChar(url),nil,0,
    INTERNET_FLAG_NO_UI,0);

  if not Assigned(hConnect) then
    // URL이 잘못된 경우 연결을 Open할 수 없다
    result := false
  else
  begin
    // Wininet을 이용해 호출할 URL 정보를 만든다.
    dummy := 0;
    bufLen := Length(infoBuffer);
    okay := HttpQueryInfo(hConnect,HTTP_QUERY_STATUS_CODE,
      @infoBuffer[0],bufLen,dummy);
    if not okay then
      // 인터넷 연결이 안되있는 경우.
      result := False
    else
    begin
      reply := infoBuffer;
      if reply = '200' then
        // 네비게이션 웹페이지가 존재 한다
        result := True
      else if reply = '401' then
        // 대부분 페이지는 존재하지만 인증 문제가 있다.
        // 어떤 인증문제인지는 체크 불가함
        result := True
      else if reply = '404' then
        // 호출 대상 파일을 찾을 수 없다.
        result := False
      else if reply = '500' then
        // 대부분 웹서버 내부 오류
        result := False
      else
        {TODO:HTTP프로토콜의 다른 응답 코드에 대해 이 부분에서 추가 처리할것}
        result := False;
    end;
    InternetCloseHandle(hConnect);
  end;
  InternetCloseHandle(hInet);
end;

도움이 되셨다면 광고 한 번 클릭해주는 매너손^^


데모 프로젝트 파일 다운로드 : CheckValidURL.zip