[ASP] 원격 웹서버에 파일이 존재하는지 체크하는 함수 HttpFileExists

지정 URL에 해당하는 파일이 존재하는지 체크하는 HttpFileExists 함수를 만들어 봤다. 파일이 존재하는 경우 파일의 내용을 모두 가지고 오는 방법은 파일의 용량이 큰 경우 성능에 문제가 된다. 성능향상을 위해서 If-Modified-Since 헤더를 이용, 존재 여부만 파악하는 방법을 썼다.

<%
Option Explicit

If HttpFileExist("http://www.ecplaza.net/images/1pixel.gif") Then
    Response.Write "File exists"
Else
    Response.Write "File doesn't exist"
End If

Function HttpFileExist(sUrl)
    Dim oHttp

    set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
    oHttp.Open "GET", sUrl, False

    oHttp.setRequestHeader "If-Modified-Since", DateToHTTPDate(DateAdd("h", -1, Now))
    oHttp.Send ""

    If oHttp.status < 400 Then
        HttpFileExist = True
    Else
        HttpFileExist = False
    End If

    Set oHttp = Nothing
End Function

''
' Converts date (19991022 11:08:38)
' to http form (Fri, 22 Oct 1999 12:08:38 GMT)
Function DateToHTTPDate(ByVal OleDATE)
    Const GMTdiff = #09:00:00#
    OleDATE = OleDATE - GMTdiff
    DateToHTTPDate = engWeekDayName(OleDATE) & _
        ", " & Right("0" & Day(OleDATE),2) & " " & engMonthName(OleDATE) & _
        " " & Year(OleDATE) & " " & Right("0" & Hour(OleDATE),2) & _
        ":" & Right("0" & Minute(OleDATE),2) & ":" & Right("0" & Second(OleDATE),2) & " GMT"
End Function

Function engWeekDayName(dt)
    Dim Out
    Select Case WeekDay(dt,1)
        Case 1:Out="Sun"
        Case 2:Out="Mon"
        Case 3:Out="Tue"
        Case 4:Out="Wed"
        Case 5:Out="Thu"
        Case 6:Out="Fri"
        Case 7:Out="Sat"
    End Select
    engWeekDayName = Out
End Function

Function engMonthName(dt)
    Dim Out
    Select Case Month(dt)
        Case 1:Out="Jan"
        Case 2:Out="Feb"
        Case 3:Out="Mar"
        Case 4:Out="Apr"
        Case 5:Out="May"
        Case 6:Out="Jun"
        Case 7:Out="Jul"
        Case 8:Out="Aug"
        Case 9:Out="Sep"
        Case 10:Out="Oct"
        Case 11:Out="Nov"
        Case 12:Out="Dec"
    End Select
    engMonthName = Out
End Function

%>

관련글 : ASP에서 MSXML2.ServerXMLHTTP 사용하여 원격 웹서버 내용 갖고 오기

[PHP] Proxy 서버를 이용해서 원격 웹서버 내용 갖고 오기

이씨플라자는 중문으로 서비스되는 이씨플라자 중문 사이트가 따로 있고, 대부분의 사용자는 중국업체들이다. 서버는 현재 국내 KTNET IDC에 있다. 요즘 알 수 없는 이유(?)로 중국에서 이씨플라자 중문 사이트에 접속하는데 장애가 많이 발생해서, 이를 탐지하는 프로그램을 만들어야만 했다. 중국사용자 환경에서 접속을 테스트해야 하니깐 중국내 공개된 proxy 서버를 이용하기로 했다.

전에 올린 “MSXML2.ServerXMLHTTP 사용하여 원격 웹서버 내용 갖고 오기” 포스트에서 사용한 MSXML2.ServerXMLHTTP 컴포넌트를 사용하려고 했는데 허걱.. 이 컴포넌트는 Proxy 서버를 지정할 수 있는 방법을 제공하지 않는 것이다. 별 수 없이 막강한 함수를 갖고 있는 php를 좀 뒤져봤다. 역시 여기에는 해결책이 있었다.

Proxy 서버를 이용해서 http 통신을 하는 get_contents 라는 함수를 하나 만들어서 사용했다. 혹시나 Proxy 서버를 사용할 필요가 있으신 분들은 참고하시기를.

function get_contents($url, $proxy = "") {
    //이 부분은 반드시 필요하지는 않지만,
    //User-Agent를 체크하는 사이트가 있다면 필요함.
    $header = "User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+SV1;)";

    if (empty($proxy)) {
        // proxy를 사용하지 않음
        $opts = array(
            'http' => array(
                'request_fulluri' => true,
                'header' => $header
            ),
        );
    } else {
        // proxy를 사용함
        $opts = array(
            'http' => array(
                'proxy' => 'tcp://'.$proxy,
                'request_fulluri' => true,
                'header' => $header
            ),
        );
    }

    $context = stream_context_create($opts);
    $html = file_get_contents($url, false, $context);
    $html;
}

ASP: MSXML2.ServerXMLHTTP 사용하여 원격 웹서버 내용 갖고 오기

HTTP를 구현해 놓은 여러 컴포넌트들이 있지만 윈도우2000부터 기본으로 설치되는 MSXML2.ServerXMLHTTP 컴포넌트를 이용하여 원격 웹서버의 내용을 갖고 올수 있다.

가장 기본적인 방법은 다음과 같다.

<%  
sUrl = "http://www.ecplaza.net/"  
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")  
oHttp.Open "GET", sUrl, False  
oHttp.Send ""  
Response.Write oHttp.ResponseText  
Set oHttp = Nothing  
%>  

GET 방법으로 갖고 온 HTML을 화면에 출력하는 루틴이다. POST 방법으로도 요청할 수 있다.

<%  
sUrl = "http://river.ecplaza.net/form.asp"  
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")  
oHttp.Open "POST", sUrl, False  
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"  
oHttp.Send "subject=test&contents=message+body"  
Response.Write oHttp.ResponseText  
Set oHttp = Nothing  
%>  

오류 처리는 Send 메쏘드를 호출하기 전에  On Error Resume Next를 적어주고 오류발생 여부를 체크하면 된다.

<%  
sUrl = "http://river.ecplaza.net/form.asp"  
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")  
oHttp.Open "POST", sUrl, False  
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

On Error Resume Next

oHttp.Send "subject=test&contents=message+body"  
If Err Then  
Response.Write "Error:" & oHttp.ParseError.URL & "<br>" & _  
oHttp.ParseError.Reason  
Else  
Response.Write oHttp.ResponseText  
End If  
Set oHttp = Nothing  
%>