技术开发 频道

如何扩展IIS的架构满足不同需求



五、获得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
0
相关文章