接上篇,这次做了小小的改动和提升。增加了对POST的支持和对其他方法(GET和POST之外的)选择405回复。另外,增加了对CGI的支持,目前可以使用C语言来写(是不是好蠢的赶脚)。相对于上篇,整体做了小小的优化。这次代码就只贴mod_cgi.bas的部分,其他文件我打包了,感兴趣的同学可以下来看看。

注:由于我不是很了解WebServer,写这个东西也是盲人摸象。像什么状态控制、任务调度、容错之类的基本上能省则省,另外也是因为不会写,哈哈。如果有不足之处,还请不吝赐教,右路西裤(霓虹语:请多多指教)!

 'mod_cgi.bas
'code by lichmama from cnblogs.com
'CGI支持状态
Public CGI_ENABLED As Boolean
'CGI程序目录
Public Const CGI_ROOT As String = "c:\cgi-bin\" Private Declare Function CreatePipe Lib "kernel32" ( _
phReadPipe As Long, _
phWritePipe As Long, _
lpPipeAttributes As SECURITY_ATTRIBUTES, _
ByVal nSize As Long) As Long Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" ( _
lpStartupInfo As STARTUPINFO) Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" ( _
ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, _
lpProcessAttributes As Any, _
lpThreadAttributes As Any, _
ByVal bInheritHandles As Boolean, _
ByVal dwCreationFlags As Long, _
lpEnvironment As Any, _
ByVal lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long Private Declare Function ReadFile Lib "kernel32" ( _
ByVal hFile As Long, _
lpBuffer As Any, _
ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, _
lpOverlapped As Any) As Long Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type Private Type STARTUPINFO
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type Private Type OVERLAPPED
ternal As Long
ternalHigh As Long
offset As Long
OffsetHigh As Long
hEvent As Long
End Type Private Const STARTF_USESHOWWINDOW = &H1
Private Const STARTF_USESTDHANDLES = &H100
Private Const SW_HIDE =
Private Declare Sub RtlZeroMemory Lib "kernel32" (dest As Any, ByVal _
numBytes As Long) Public Function ShellCGI(ByVal head As Object, rep_state As Long) As String
Dim sa As SECURITY_ATTRIBUTES
Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
Dim hrp As Long
Dim hwp As Long
Dim ret As Long
Dim envstr As String 'fill this with CGI standard envrionment strings,
' which delimited by chr(0)
envstr = MakeEnvString(head)
Call RtlZeroMemory(ByVal VarPtr(sa), Len(sa))
Call RtlZeroMemory(ByVal VarPtr(si), Len(si))
Call RtlZeroMemory(ByVal VarPtr(pi), Len(pi)) sa.nLength = Len(sa)
sa.lpSecurityDescriptor = &
sa.bInheritHandle = & 'create pipe
ret = CreatePipe(hrp, hwp, sa, &)
If ret = Then
Debug.Print "[HTTP-VBS]: CGI Exception, pipe failed"
Exit Function
End If si.cb = Len(si)
si.hStdOutput = hwp
si.hStdError = hwp
si.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
si.wShowWindow = SW_HIDE 'create the cgi-process, cgi-path: head("Path_Translated")
ret = CreateProcess(head("Path_Translated"), vbNullString, _
ByVal &, ByVal &, True, &, ByVal envstr, vbNullString, si, pi)
If ret = Then
Debug.Print "[HTTP-VBS]: CGI Exception, create process failed"
Exit Function
End If 'read response from cgi
Dim nobr As Long 'num of bytes read
Dim lpbuff As String
Dim szbuff( * ) As Byte
Dim sum As Long
sum =
Call RtlZeroMemory(ByVal VarPtr(szbuff()), * )
Do
nobr = &
lpbuff = String(, " ")
If ReadFile(hrp, ByVal lpbuff, &, nobr, ByVal &) Then
Call RtlMoveMemory(ByVal VarPtr(szbuff(sum)), ByVal StrPtr(lpbuff), LenB(lpbuff))
sum = sum + LenB(lpbuff)
Else
Exit Do
End If
Call CloseHandle(hwp)
Loop
Call CloseHandle(hrp) rep_state =
ShellCGI = Left(szbuff, sum)
End Function Private Function MakeEnvString(ByVal head As Object) As String
MakeEnvString = "REQUEST_METHOD=" & head("Request")("Method") & Chr() & _
"CONTENT_TYPE=" & head("Content-Type") & Chr() & _
"CONTENT_LENGTH=" & head("Content-Length") & Chr() & _
"QUERY_STRING=" & head("Query_String") & Chr() & _
"SCRIPT_NAME=" & head("Script_Name") & Chr() & _
"PATH_INFO=" & head("Path_Info") & Chr() & _
"PATH_TRANSLATED=" & head("Path_Translated") & Chr() & _
"REMOTE_HOST=" & head("Remote_Host") & Chr() & _
"REMOTE_ADDR=" & head("Remote_Addr") & Chr() & _
"REMOTE_PORT=" & head("Remote_Port") & Chr() & _
"REMOTE_USER=" & head("Remote_User") & Chr() & _
"REMOTE_IDENT=" & head("Remote_Ident") & Chr() & _
"AUTH_TYPE=" & head("Auth_Type") & Chr() & _
"SERVER_NAME=http-vb/0.1" & Chr() & _
"SERVER_PORT=80" & Chr() & _
"SERVER_PROTOCOL=HTTP/1.1" & Chr() & _
"DOCUMENT_ROOT=" & head("Document_Root") & Chr() & _
"SERVER_SOFTWARE=http-vb/0.1 vb/6.0" & Chr() & _
"HTTP_ACCEPT=" & head("Accept") & Chr() & _
"HTTP_USER_AGENT=" & head("User-Agent") & Chr() & _
"HTTP_REFERER=" & head("Referer") & Chr() & _
"HTTP_COOKIE=" & head("Cookie") & Chr() & _
"GATEWAY_INTERFACE=CGI/1.1" & Chr()
End Function

CGI的代码:

 #include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define ENV_MAX_LENGTH 0x7fff char *GetEnv(const char *lpName, char *lpbuff){
memset(lpbuff, , ENV_MAX_LENGTH);
GetEnvironmentVariable(lpName, lpbuff, ENV_MAX_LENGTH);
return lpbuff;
} int main(int argc, char *argv[]){
char lpbuff[ENV_MAX_LENGTH]={};
printf("Content-Type: text/html; charset=utf-8\n");
printf("\n");
printf("<html>\n");
printf("<head>\n");
printf("<meta content='text/html; charset=utf-8' http-equiv='content-type' />\n");
printf("<title>cgi page@lichmama</title>\n");
printf("</head>\n");
printf("<body>\n");
printf("<ul style='font-family:courier new'>\n");
printf("<li>REQUEST_METHOD: %s</li>\n", GetEnv("REQUEST_METHOD", lpbuff));
printf("<li>CONTENT_TYPE: %s</li>\n", GetEnv("CONTENT_TYPE", lpbuff));
printf("<li>CONTENT_LENGTH: %s</li>\n", GetEnv("CONTENT_LENGTH", lpbuff));
printf("<li>QUERY_STRING: %s</li>\n", GetEnv("QUERY_STRING", lpbuff));
printf("<li>SCRIPT_NAME: %s</li>\n", GetEnv("SCRIPT_NAME", lpbuff));
printf("<li>PATH_INFO: %s</li>\n", GetEnv("PATH_INFO", lpbuff));
printf("<li>PATH_TRANSLATED: %s</li>\n",GetEnv("PATH_TRANSLATED", lpbuff));
printf("<li>REMOTE_HOST: %s</li>\n", GetEnv("REMOTE_HOST", lpbuff));
printf("<li>REMOTE_ADDR: %s</li>\n", GetEnv("REMOTE_ADDR", lpbuff));
printf("<li>REMOTE_PORT: %s</li>\n", GetEnv("REMOTE_PORT", lpbuff));
printf("<li>REMOTE_USER: %s</li>\n", GetEnv("REMOTE_USER", lpbuff));
printf("<li>REMOTE_IDENT: %s</li>\n", GetEnv("REMOTE_IDENT", lpbuff));
printf("<li>AUTH_TYPE: %s</li>\n", GetEnv("AUTH_TYPE", lpbuff));
printf("<li>GATEWAY_INTERFACE: %s</li>\n", GetEnv("GATEWAY_INTERFACE", lpbuff));
printf("<li>SERVER_NAME: %s</li>\n", GetEnv("SERVER_NAME", lpbuff));
printf("<li>SERVER_PORT: %s</li>\n", GetEnv("SERVER_PORT", lpbuff));
printf("<li>SERVER_PROTOCOL: %s</li>\n",GetEnv("SERVER_PROTOCOL", lpbuff));
printf("<li>DOCUMENT_ROOT: %s</li>\n", GetEnv("DOCUMENT_ROOT", lpbuff));
printf("<li>SERVER_SOFTWARE: %s</li>\n",GetEnv("SERVER_SOFTWARE", lpbuff));
printf("<li>HTTP_ACCEPT: %s</li>\n", GetEnv("HTTP_ACCEPT", lpbuff));
printf("<li>HTTP_USER_AGENT: %s</li>\n",GetEnv("HTTP_USER_AGENT", lpbuff));
printf("<li>HTTP_REFERER: %s</li>\n", GetEnv("HTTP_REFERER", lpbuff));
printf("<li>HTTP_COOKIE: %s</li>\n", GetEnv("HTTP_COOKIE", lpbuff));
printf("</ul>\n");
printf("</body>\n");
printf("</html>\n");
return ;
}

贴张图,看看效果(看到.exe会不会觉得邪恶):

咦,怎么添加附件?先来个百度云盘吧。

VB6之HTTP服务器的实现(二)的更多相关文章

  1. Python 创建本地服务器环境生成二维码

    一. 需求 公司要做一个H5手机端适配页面,因技术问题所以H5是外包的,每次前端给我们源码,我们把源码传到服务器让其他人访问看是否存在bug,这个不是很麻烦吗?有人说,可以让前端在他们的服务器上先托管 ...

  2. Citrix 服务器虚拟化之二十一 桌面虚拟化之部署Provisioning Services

    Citrix 服务器虚拟化之二十一  桌面虚拟化之部署Provisioning Services Provisioning Services 是Citrix 出品的一系列虚拟化产品中最核心的一个组件, ...

  3. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  4. Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面

    Citrix 服务器虚拟化之二十七  XenApp6.5发布服务器桌面 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  5. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  6. Citrix 服务器虚拟化之二 Xenserver加域管理

    Citrix 服务器虚拟化之二   Xenserver加域管理 如果要使用多个用户和用户组来管理XenServer服务器,就必须使用 Active Directory 用户账户进行身份验证.XenSe ...

  7. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  8. VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器

    VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...

  9. VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化

    VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化 VMware ThinApp 应用程序虚拟化软件是无代理解决方案,通过将应用程序隔离并封装为EXE ...

随机推荐

  1. UIWebView 跳过HTTPS证书认证

    UIWebView跳过证书认证 在UIWebView中加入如下代码即可(Error Domain=NSURLErrorDomain Code=-1202) //跳过证书验证 @interface NS ...

  2. 网站权限管理 之 角(jue)色管理

    公司或网站的正常运行,离不开管理员对各个员工的合理分配,那先看看权限管理中的角色管理好了: 要更改用户的角色,那么先来理一下思路: (1)用户现在是什么角色? (2)用户将要成为什么角色? (3)怎样 ...

  3. 011一对一 唯一外键关联映射_单向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  4. java基础之数组常用操作

    常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 public cla ...

  5. 一天搞定CSS:边框border--02

    每一个标签都是一个盒子,具体见HTML教程 因此,每一个标签有大小,有边框 1.border样式:单一样式 2.border样式:复合样式 border: 粗细 类型 颜色: 3.border方向 4 ...

  6. jQuery杂项方法

    前面的话 杂项方法其实也是工具类方法,但由于其不是定义在jQuery构造函数上的方法,所以不能称为工具方法.本文将详细介绍jQuery中的杂项方法 数据操作 [data()] 该方法用于在匹配元素上存 ...

  7. Coursera 机器学习笔记(二)

    主要为第三周课程内容:逻辑回归与正则化 逻辑回归(Logistic Regression) 一.逻辑回归模型引入 分类问题是指尝试预测的是结果是否属于某一个类. 维基百科的定义为:根据已知训练区提供的 ...

  8. java基础(八章)

    一.        什么是数组及其作用? 定义:具有相同数据类型的一个集合 作用:存储连续的具有相同类型的数据 二.        java中如何声明和定义数组 l  声明和定义的语法: 数据类型[ ...

  9. Dojo初探之2:设置dojoConfig详解,dojoConfig参数详解+Dojo中预置自定义AMD模块的四种方式(基于dojo1.11.2)

    Dojo中想要加载自定义的AMD模块,需要先设置好这个模块对应的路径,模块的路径就是这个模块的唯一标识符. 一.dojoConfig参数设置详解 var dojoConfig = { baseUrl: ...

  10. Dubbo有意思的特性介绍

    Duboo 不单让我们可以像使用本地服务一样的使用远程服务,还设计了很多特性来满足我们平时开发时常见的场景,省却了我们不少麻烦,真是一款有良心的框架,下面针对这些场景和解决方案来具体解释下: 1.接口 ...