⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch14.htm

📁 CGI programming is the hottest stuff to look out for in this book
💻 HTM
📖 第 1 页 / 共 5 页
字号:
Global CGI_ContentLength As Long<BR>
'<BR>
' ------------------<BR>
' HTTP Header Arrays<BR>
' ------------------<BR>
'<BR>
Global CGI_AcceptTypes(MAX_AccTYPE) As Tuple&nbsp;&nbsp;&nbsp;&nbsp;'
Accept: types<BR>
Global CGI_NumAcceptTypes As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
# of live entries in array<BR>
Global CGI_ExtraHeaders(MAX_XHDR) As Tuple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
&quot;Extra&quot; headers<BR>
Global CGI_NumExtraHeaders As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' # of live entries in array<BR>
'<BR>
' --------------<BR>
' POST Form Data<BR>
' --------------<BR>
'<BR>
Global CGI_FormTuples(MAX_FORM_TUPLES) As Tuple ' POST form key=value
pairs<BR>
Global CGI_NumFormTuples As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' # of live entries in array<BR>
Global CGI_HugeTuples(MAX_HUGE_TUPLES) As HugeTuple ' Form &quot;huge
tuples<BR>
Global CGI_NumHugeTuples As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' # of live entries in array<BR>
Global CGI_FileTuples(MAX_FILE_TUPLES) As FileTuple ' File upload
tuples<BR>
Global CGI_NumFileTuples As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' # of live entries in array<BR>
'<BR>
' ----------------<BR>
' System Variables<BR>
' ----------------<BR>
'<BR>
Global CGI_GMTOffset As Variant&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
GMT offset (time serial)<BR>
Global CGI_ContentFile As String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Content/Input file pathname<BR>
Global CGI_OutputFile As String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Output file pathname<BR>
Global CGI_DebugMode As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Script Tracing flag from server<BR>
'<BR>
'<BR>
' ========================<BR>
' Windows API Declarations<BR>
' ========================<BR>
'<BR>
' NOTE: Declaration of GetPrivateProfileString is specially done
to<BR>
' permit enumeration of keys by passing NULL key value. See GetProfile().
<BR>
' Both the 16-bit and 32-bit flavors are given below. We DO NOT
<BR>
' recommend using 16-bit VB4 with WebSite!<BR>
'<BR>
#If Win32 Then<BR>
Declare Function GetPrivateProfileString Lib &quot;kernel32&quot;
_<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Alias &quot;GetPrivateProfileStringA&quot;
_<BR>
&nbsp;&nbsp;&nbsp;(ByVal lpApplicationName As String, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpKeyName As Any, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpDefault As String, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpReturnedString As String, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal nSize As Long, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpFileName As String) As Long<BR>
#Else<BR>
Declare Function GetPrivateProfileString Lib &quot;Kernel&quot;
_<BR>
&nbsp;&nbsp;&nbsp;(ByVal lpSection As String, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpKeyName As Any, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpDefault As String, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpReturnedString As String, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal nSize As Integer, _<BR>
&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpFileName As String) As Integer
<BR>
#End If<BR>
'<BR>
'<BR>
' ===============<BR>
' Local Variables<BR>
' ===============<BR>
'<BR>
Dim CGI_ProfileFile As String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Profile file pathname<BR>
Dim CGI_OutputFN As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Output file number<BR>
Dim ErrorString As String<BR>
<BR>
'----------------------------------------------------------------------
<BR>
'<BR>
' Return True/False depending on whether a form field is present.
<BR>
' Typically used to detect if a checkbox in a form is checked
or<BR>
' not. Unchecked checkboxes are omitted from the form content.
<BR>
'<BR>
'----------------------------------------------------------------------
<BR>
Function FieldPresent(key As String) As Integer<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Dim i As Integer<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;FieldPresent = False&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Assume failure<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;For i = 0 To (CGI_NumFormTuples - 1)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If CGI_FormTuples(i).key
= key Then<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FieldPresent
= True&nbsp;&nbsp;&nbsp;&nbsp; ' Found it<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit
Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' ** DONE **<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Next i<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Exit with FieldPresent still False<BR>
End Function<BR>
<BR>
<BR>
<BR>
'--------------------------------------------------------------------------
<BR>
'<BR>
'&nbsp;&nbsp;&nbsp;ErrorHandler() - Global error handler<BR>
'<BR>
' If a VB runtime error occurs dusing execution of the program,
this<BR>
' procedure generates an HTTP/1.0 HTML-formatted error message
into<BR>
' the output file, then exits the program.<BR>
'<BR>
' This should be armed immediately on entry to the program's main()
<BR>
' procedure. Any errors that occur in the program are caught,
and<BR>
' an HTTP/1.0 error messsage is generated into the output file.
The<BR>
' presence of the HTTP/1.0 on the first line of the output file
causes<BR>
' ncSA httpd for WIndows to send the output file to the client
with no<BR>
' interpretation or other header parsing.<BR>
'--------------------------------------------------------------------------
<BR>
Sub ErrorHandler(code As Integer)<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Seek #CGI_OutputFN, 1&nbsp;&nbsp;&nbsp;&nbsp;'
Rewind output file just in case<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;HTTP/1.0 500 Internal Error&quot;)
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;Server: &quot; + CGI_ServerSoftware)
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;Date: &quot; + WebDate(Now))
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;Content-type: text/html&quot;)
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;HTML&gt;&lt;HEAD&gt;&quot;)
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;TITLE&gt;Error in &quot;
+ CGI_ExecutablePath + &quot;&lt;/TITLE&gt;&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;/HEAD&gt;&lt;BODY&gt;&quot;)
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;H1&gt;Error in &quot;
+ CGI_ExecutablePath + &quot;&lt;/H1&gt;&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;An internal Visual Basic error
has occurred in &quot; + CGI_ExecutablePath + &quot;.&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;PRE&gt;&quot; + ErrorString
+ &quot;&lt;/PRE&gt;&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;I&gt;Please&lt;/I&gt;
note what you were doing when this problem occurred,&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;so we can identify and correct
it. Write down the Web page you were using,&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;any data you may have entered
into a form or search box, and&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;anything else that may help
us duplicate the problem. Then contact the&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;administrator of this service:
&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;A HREF=&quot;&quot;mailto:&quot;
&amp; CGI_ServerAdmin &amp; &quot;&quot;&quot;&gt;&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;ADDRESS&gt;&amp;lt;&quot;
+ CGI_ServerAdmin + &quot;&amp;gt;&lt;/ADDRESS&gt;&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Send (&quot;&lt;/A&gt;&lt;/BODY&gt;&lt;/HTML&gt;&quot;)
<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Close #CGI_OutputFN<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;'======<BR>
&nbsp;&nbsp;&nbsp;&nbsp; End&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Terminate the program<BR>
&nbsp;&nbsp;&nbsp;&nbsp;'======<BR>
End Sub<BR>
<BR>
'--------------------------------------------------------------------------
<BR>
'<BR>
'&nbsp;&nbsp;&nbsp;GetAcceptTypes() - Create the array of accept
type structs<BR>
'<BR>
' Enumerate the keys in the [Accept] section of the profile file,
<BR>
' then get the value for each of the keys.<BR>
'--------------------------------------------------------------------------
<BR>
Private Sub GetAcceptTypes()<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Dim sList As String<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Dim i As Integer, j As Integer, l As Integer,
n As Integer<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;sList = GetProfile(&quot;Accept&quot;,
&quot;&quot;) ' Get key list<BR>
&nbsp;&nbsp;&nbsp;&nbsp;l = Len(sList)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Length incl. trailing null<BR>
&nbsp;&nbsp;&nbsp;&nbsp;i = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Start at 1st character<BR>
&nbsp;&nbsp;&nbsp;&nbsp;n = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Index in array<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Do While ((i &lt; l) And (n &lt; MAX_AccTYPE))
' Safety stop here<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = InStr(i, sList,
Chr$(0))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' J -&gt;
next null<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGI_AcceptTypes(n).key
= Mid$(sList, i, j - i) ' Get Key, then value<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGI_AcceptTypes(n).value
= GetProfile(&quot;Accept&quot;, CGI_AcceptTypes(n).key)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = j + 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Bump pointer<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n = n + 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Bump array index<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Loop<BR>
&nbsp;&nbsp;&nbsp;&nbsp;CGI_NumAcceptTypes = n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Fill in global count<BR>
<BR>
End Sub<BR>
<BR>
'--------------------------------------------------------------------------
<BR>
'<BR>
'&nbsp;&nbsp;&nbsp;GetArgs() - Parse the command line<BR>
'<BR>
' Chop up the command line, fill in the argument vector, return
the<BR>
' argument count (similar to the Unix/C argc/argv handling)<BR>
'--------------------------------------------------------------------------
<BR>
Private Function GetArgs(argv() As String) As Integer<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Dim buf As String<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Dim i As Integer, j As Integer, l As Integer,
n As Integer<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;buf = Trim$(Command$)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Get command line<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;l = Len(buf)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Length of command line<BR>
&nbsp;&nbsp;&nbsp;&nbsp;If l = 0 Then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
If empty<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetArgs = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Return argc = 0<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;End If<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;i = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Start at 1st character<BR>
&nbsp;&nbsp;&nbsp;&nbsp;n = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
' Index in argvec<BR>
&nbsp;&nbsp;&nbsp;&nbsp;Do While ((i &lt; l) And (n &lt; MAX_CMDARGS))
' Safety stop here<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = InStr(i, buf,
&quot; &quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
J -&gt; next space<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If j = 0 Then
Exit Do&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
Exit loop on last arg<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argv(n) = Trim$(Mid$(buf,
i, j - i)) ' Get this token, trim it<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = j + 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -