| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 641 人关注过本帖
标题:foxpro web 开发原理(三)
只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:915
专家分:1391
注 册:2021-10-13
收藏
得分:0 
在我们的CGI程序能解释脚本之前,我们对control.exe进行升级,验证一下可行性:
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返回如下:
图片附件: 游客没有浏览图片的权限,请 登录注册
3 天前 22:33
快速回复:foxpro web 开发原理(三)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020662 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved