五、获得url请求信息
这是实现ISAPI的第一步。从客户端发送来的url请求中含有一些有用的信息,在这个例子中需要获得url请求所指的文件在服务端的绝对路径和查询字符串(即url请求?后面的部分)。这些信息通过HttpExtensionProc函数的参数传入。GetExtensionVersion函数的定义如下:
DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB)
其中绝对路径和查询字符串分别由pECB->lpszPathTranslated和pECB->lpszQueryString得到。如url请求为:http://localhost/a.my?name=xyz&age=16。绝对路径可能为d:\isapi\a.my,查询字符串为name=xyz&age=16。由于查询字符串是连在一起了,无法直接使用,因此这就需要做一个函数将其分成单独的查询串。实现拆分查询串功能的函数叫AnalyzeQuery,下面是它的实现代码。
//将连在一起的查询串分开,如将aa=xyz&bb=uu分成aa xyz,bb uu
void AnalyzeQuery(string query_original, map<string, string> &query)
{
string s;
int last_pos = -1, new_pos = -1;
while(true)
{
new_pos = query_original.find('&', last_pos + 1);
if(new_pos == query_original.npos)
break;
else
{
last_pos++;
s = query_original.substr(last_pos, new_pos - last_pos);
//处理每一个query
int pos = s.find('=');
if(pos == s.npos)
query[s] = "";
else
{
string q, v;
q = s.substr(0, pos);
v = s.substr(pos + 1, s.length() - pos - 1);
query[q] = v;
}
last_pos = new_pos;
}
}
last_pos++;
s = query_original.substr(last_pos);
if(s != "")
{
//处理每一个query
int pos = s.find('=');
if(pos == s.npos)
query[s] = "";
else
{
string q, v;
q = s.substr(0, pos);
v = s.substr(pos + 1, s.length() - pos - 1);
query[q] = v;
}
}
}
这个函数是通过一个map的引用返回结果的,返回的结果如下。
name xyz
age 16