[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의 print_r 함수를 ASP로 구현해보자.

PHP에는 변수의 내용을 쉽게 볼 수 있는 print_r 이란 함수가 있다. 변수형태와 상관없이 변수명만 인자로 넘겨주면 변수에 저장된 내용을 재귀적으로 표시해 줘서 디버깅시 특히 요긴하게 쓸 수 있다. ASP에서는 안타깝게도 유사한 함수가 없어서 비슷한 기능을 하는 함수를 만들어 봤다.

<%  
Sub print_r(var)  
    Dim myPrint  

    Set myPrint = New clsPrint  
    myPrint.print var, 0  
End Sub  

Class clsPrint  
    Public Sub print(var, nIndent)  
        Dim nType, sTypeName  
          
        'Response.Write TypeName(var)  

        nType = VarType(var)  
        Select Case nType  
        Case 0:  
            Response.Write "(vbEmpty)"  
        Case 1:  
            Response.Write "(vbNull)"  
        Case 2:  
            Response.Write var & "(vbIngerger)"  
        Case 3:  
            Response.Write var & "(vbLong)"  
        Case 4,5:  
            Response.Write var & "(vbSingle)"  
        Case 6:  
            Response.Write var & "(vbCurrency)"  
        Case 7:  
            Response.Write var & "(vbDate)"  
        Case 8:  
            Response.Write var & "(vbString)"  
        Case 9:'vbObject  
            sTypeName = TypeName(var)  
            Select Case sTypeName  
            Case "ISessionObject": 'Session  
                print_session var, nIndent  
            Case "IRequest": 'Request  
                print_request var, nIndent  
            Case "IApplicationObject": 'Application  
                print_application var, nIndent  
            Case Else  
                Response.Write "Unimpleneted TypeName:" & sTypeName  
            End Select  
        Case 10:  
            Response.Write "(vbError)"  
        Case 11:  
            Response.Write var & "(vbBoolean)"  
        Case 12:  
            Response.Write "(vbDataObject)"  
        Case 13:  
            Response.Write "(vbDecimal)"  
        Case 14:  
            Response.Write "(vbByte)"  
        Case 8192,8204:  
            print_array var, nIndent + 1  
        Case Else:  
            Response.Write "VarType:" & nType  
        End Select  

        Response.Write vbCrLf  
    End Sub  

    Sub print_array(var, nIndent)  
        print_list "Array", var, nIndent  
    End Sub  

    Sub print_request(var, nIndent)  
        print_name "Request", nIndent  
        print_openbrace nIndent  

        print_dict "Request.Form", var.Form, nIndent + 1  
        print_dict "Request.QueryString", var.QueryString, nIndent + 1  
        print_dict "Request.Cookies", var.Cookies, nIndent + 1  
        print_dict "Request.ServerVariables", var.ServerVariables, nIndent + 1  

        print_closebrace nIndent  
    End Sub  

    Sub print_application(var, nIndent)  
        print_name "Application", nIndent  
        print_openbrace nIndent  

        print_dict "Application.StaticObjects", var.StaticObjects, nIndent + 1  
        print_dict "Application.Contents", var.Contents, nIndent + 1  

        print_closebrace nIndent  
    End Sub  

    Sub print_session(var, nIndent)  
        print_name "Session", nIndent  
        print_openbrace nIndent  

        print_dict "Session.StaticObjects", var.StaticObjects, nIndent + 1  
        print_dict "Session.Contents", var.Contents, nIndent + 1  

        print_closebrace nIndent  
    End Sub  

    Sub print_dict(sTypeName, var, nIndent)  
        Dim sKey  

        print_name sTypeName, nIndent  
        print_openbrace nIndent  

        For Each sKey In var  
            print_key sKey, nIndent + 1  
            print var(sKey), nIndent + 1  
        Next  

        print_closebrace nIndent  
    End Sub  

    Sub print_list(sTypeName, var, nIndent)  
        Dim vValue, nIndex  

        Response.Write sTypeName & vbCrLf  
        print_openbrace nIndent  

        nIndex = 0  
        For Each vValue In var  
            print_key nIndex, nIndent + 1  
            print vValue, nIndent + 1  
            nIndex = nIndex + 1  
        Next  

        print_closebrace nIndent  
    End Sub  

    Private Sub print_name(sName, nIndent)  
        print_indent nIndent  
        Response.Write sName & vbCrLf  
    End Sub  

    Private Sub print_key(sKey, nIndent)  
        print_indent nIndent  
        Response.Write "[" & sKey & "] => "  
    End Sub  

    Private Sub print_openbrace(nIndent)  
        print_indent nIndent  
        Response.Write "(" & vbCrLf  
    End Sub  

    Private Sub print_closebrace(nIndent)  
        print_indent nIndent  
        Response.Write ")" & vbCrLf  
    End Sub  

    Private Sub print_indent(nIndent)  
        Response.Write String(nIndent * 4, " ")  
    End Sub  
End Class  


a = "123"  
b = Split("1 2 3 4 5", " ")  
print_r a  
print_r b  
print_r Session  
'print_r Application  
'print_r Request  
%>   

위를 브라우져에서 실행해서 소스보기를 하면 다음의 결과를 얻을 수 있다.

123(vbString)
Array
    (
        [0] => 1(vbString)
        [1] => 2(vbString)
        [2] => 3(vbString)
        [3] => 4(vbString)
        [4] => 5(vbString)
    )

Session
(
    Session.StaticObjects
    (
    )
    Session.Contents
    (
    )
)

배열도 지원하고, Application, Session, Request 객체의 내용도 볼 수 있다. 자체적으로 쓰는 객체는 “Unimpleneted TypeName”이란 결과가 나올텐데, 이는 소스에다 해당 객체를 출력하는 부분을 추가해 주면 된다.

VBScript: URLEncode, URLDecode 함수

ASP에 URL을 인코딩하려면 Server 객체의 URLEncode 메쏘드를 사용하면 된다. 그럼 디코딩은 어떻게 하지? ASP환경이 아닌 환경- 예를 들면 도스창에서 VBScript로 스크립트를 짤 때 – 에서는 Server 객체가 제공이 안되는데 이곳에서는 인코딩이나 디코딩을 어떻게 해야 하는가?

여기에 대한 대안으로 사용할 수 있는 함수인 URLEncode, URLDecode를 소개한다.

Function URLEncode(sStr)  
    Dim i, acode

    URLEncode = sStr

    For i = Len(URLEncode) To 1 Step -1  
        acode = Asc(Mid(URLEncode, i, 1))  
        If (aCode >=48 And aCode <=57) Or (aCode >= 65 And aCode <=90) Or (aCode >= 97 And aCode <=122) Then  
        ' don't touch alphanumeric chars  
        Else  
            Select Case acode  
            Case 32  
                ' replace space with "+"  
                URLEncode = Left(URLEncode, i - 1) & "+" & Mid(URLEncode, i + 1)  
            Case Else  
                ' replace punctuation chars with "%hex"  
                URLEncode = Left(URLEncode, i - 1) & "%" & Hex(acode) & Mid(URLEncode, i + 1)  
            End Select  
        End If  
    Next  
End Function

Function URLDecode(sStr)  
    Dim sTemp, sChar, nLen  
    Dim nPos, sResult, sHex

    On Error Resume Next

    nLen = Len(sStr)

    sTemp = Replace(sStr, "+", " ")  
    For nPos = 1 To nLen  
        sChar = Mid(sTemp, nPos, 1)  
        If sChar = "%" Then  
            If nPos + 2 <= nLen Then  
                sHex = Mid(sTemp, nPos+1, 2)  
                If IsHexaString(sHex) Then  
                    sResult = sResult & Chr(CLng("&H" & sHex))  
                    nPos = nPos + 2  
                Else  
                    sResult = sResult & sChar  
                End If  
            Else  
                sResult = sResult & sChar  
            End If  
            Else  
            sResult = sResult & sChar  
        End If  
    Next

    If Err Then  
        LogError "URLDecode(" & sStr & "). " & Err.description  
    End If

    On Error GoTo 0

    URLDecode = sResult  
End Function

''  
' 문자열이 모두 16진수 문자열로 구성되어 있는지 점검  
' @param sStr 검사할 문자열  
' @return 모두 HEX String으로 이루어져 있으면 true, 아니면 false  
Function IsHexaString( sStr )  
    Dim nPos  
    Dim sChar  
    Dim bReturn

    bReturn = True  
    If sStr <> "" Then  
        For nPos = 1 To Len(sStr)  
            sChar = Mid( sStr, nPos, 1 )  
            If ( sChar < "a" OR sChar > "f" ) And ( sChar < "A" OR sChar > "F") And ( sChar < "0" OR sChar > "9") Then  
                bReturn = False  
            End If  
        Next  
    Else  
        bReturn = False  
    End If

    IsHexaString = bReturn  
End Function