在我们的CGI程序能解释脚本之前,我们对control.exe进行升级,验证一下可行性:
1,对请求的路径进行验证检查,并给出不同响应
2,对POST和GET请求做出不同的响应
代码如下,已编译通过:
程序代码:
服务器上并没有sample1.fpx,所以IIS返回如下:
1,对请求的路径进行验证检查,并给出不同响应
2,对POST和GET请求做出不同的响应
代码如下,已编译通过:
程序代码:
* CGI处理示例
* 定义 Windows API 常量
#DEFINE STD_INPUT_HANDLE -10
#DEFINE STD_OUTPUT_HANDLE -11
* 声明 Windows API
DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
DECLARE INTEGER GetStdHandle IN kernel32 INTEGER nStdHandle
DECLARE INTEGER ReadFile IN kernel32 ;
INTEGER hFile, ;
STRING @lpBuffer, ;
INTEGER nNumberOfBytesToRead, ;
INTEGER @lpNumberOfBytesRead, ;
INTEGER lpOverlapped
DECLARE INTEGER WriteFile IN kernel32 ;
INTEGER hFile, ;
STRING lpBuffer, ;
INTEGER nNumberOfBytesToWrite, ;
INTEGER @lpNumberOfBytesWritten, ;
INTEGER lpOverlapped
* CGI 环境变量常量
CGI_CONTENT_LENGTH = "CONTENT_LENGTH"
cmethod=GETENV("REQUEST_METHOD")
* 主程序
CLEAR
SET TALK OFF
SET CONSOLE OFF
* 获取标准输入输出句柄
hStdIn = GetStdHandle(STD_INPUT_HANDLE)
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)
* 调试用暂停(如果需要)
* [color=#808080]=Sleep(6000) && 暂停60秒等待调试器附加[/color]
DO CASE
CASE cmethod="POST"
* 读取POST内容
lcContentLength = GETENV(CGI_CONTENT_LENGTH)
lnContentLength = VAL(lcContentLength)
IF lnContentLength > 0
* 准备缓冲区
lcReadBuffer = REPLICATE(CHR(0), lnContentLength)
lnBytesRead = 0
* 读取输入
=ReadFile(hStdIn, @lcReadBuffer, lnContentLength, @lnBytesRead, 0)
lcReadBuffer = LEFT(lcReadBuffer, lnBytesRead)
* 解析参数
lnPos = AT("=", lcReadBuffer)
IF lnPos > 0
lcValue = SUBSTR(lcReadBuffer, lnPos + 1)
ELSE
lcValue = lcReadBuffer
ENDIF
ELSE
lcValue = ""
ENDIF
* 构建响应
lcResponse = "HTTP/1.0 200 OK" + CHR(13) + CHR(10) + ;
"Content-Type: text/html" + CHR(13) + CHR(10) + ;
CHR(13) + CHR(10) + ;
"Hello " + lcValue
CASE cmethod="GET"
cpath=GETENV("PATH_TRANSLATED")
cquerystr=GETENV("QUERY_STRING")
IF FILE(cpath)
* 构建响应
lcResponse = "HTTP/1.0 200 OK" + CHR(13) + CHR(10) + ;
"Content-Type: text/html" + CHR(13) + CHR(10) + ;
CHR(13) + CHR(10) + ;
"请求路径为: " + cpath+"<br>"+;
"请求参数为:" +IIF(EMPTY(cquerystr),"没有参数!",cquerystr)
ELSE
lcResponse = "HTTP/1.0 200 OK" + CHR(13) + CHR(10) + ;
"Content-Type: text/html" + CHR(13) + CHR(10) + ;
CHR(13) + CHR(10) + ;
"错误:请求的脚本不存在或已删除!"
ENDIF
OTHERWISE
lcResponse = "HTTP/1.0 200 OK" + CHR(13) + CHR(10) + ;
"Content-Type: text/html" + CHR(13) + CHR(10) + ;
CHR(13) + CHR(10) + ;
"错误:目前只支持GET和POST方法!"
ENDCASE
* 发送响应
lnBytesWritten = 0
=WriteFile(hStdOut, lcResponse, LEN(lcResponse), @lnBytesWritten, 0)
* 清理
CLEAR DLLS
RETURN
服务器上并没有sample1.fpx,所以IIS返回如下:







