wifidog源码wifidog分析用户连接
用户连接启动线程(void thread_httpd(void * args))
此段代码是当有新用户(未认证的用户)连接时创建的线程,其主要功能为
获取用户浏览器发送过来的http报头
分析http报头,分析是否包含关键路径
不包含关键路径则调用404回调函数
包含关键路径则执行关键路径回调函数(这里主要讲解"/wifidog/auth"路径)
void
thread_httpd(void *args)
{
void **params;
httpd *webserver;
request *r;
params = (void **)args;
webserver = *params;
r = *(params + 1);
free(params);
/* 获取http报文 */
if (httpdReadRequest(webserver, r) == 0) {
debug(LOG_DEBUG, "Processing request from %s", r->clientAddr);
debug(LOG_DEBUG, "Calling httpdProcessRequest() for %s", r->clientAddr);
/* 分析http报文 */
httpdProcessRequest(webserver, r);
debug(LOG_DEBUG, "Returned from httpdProcessRequest() for %s", r->clientAddr);
}
else {
debug(LOG_DEBUG, "No valid request received from %s", r->clientAddr);
}
debug(LOG_DEBUG, "Closing connection with %s", r->clientAddr);
httpdEndRequest(r);
}
/* 被thread_httpd调用 */
void httpdProcessRequest(httpd *server, request *r)
{
char dirName[HTTP_MAX_URL],
entryName[HTTP_MAX_URL],
*cp;
httpDir *dir;
httpContent *entry;
r->response.responseLength = 0;
strncpy(dirName, httpdRequestPath(r), HTTP_MAX_URL);
dirName[HTTP_MAX_URL-1]=0;
cp = rindex(dirName, '/');
if (cp == NULL)
{
printf("Invalid request path '%s'\n",dirName);
return;
}
strncpy(entryName, cp + 1, HTTP_MAX_URL);
entryName[HTTP_MAX_URL-1]=0;
if (cp != dirName)
*cp = 0;
else
*(cp+1) = 0;
/* 获取http报文中的关键路径,在main_loop中已经设置 */
dir = _httpd_findContentDir(server, dirName, HTTP_FALSE);
if (dir == NULL)
{
/* http报文中未包含关键路径,执行404回调函数(在404回调函数中新用户被重定向到认证服务器) */
_httpd_send404(server, r);
_httpd_writeAccessLog(server, r);
return;
}
/* 获取关键路径内容描述符 */
entry = _httpd_findContentEntry(r, dir, entryName);
if (entry == NULL)
{
_httpd_send404(server, r);
_httpd_writeAccessLog(server, r);
return;
}
if (entry->preload)
{
if ((entry->preload)(server) < 0)
{
_httpd_writeAccessLog(server, r);
return;
}
}
switch(entry->type)
{
case HTTP_C_FUNCT:
case HTTP_C_WILDCARD:
/* 如果是被认证服务器重定向到网关的用户,此处的关键路径为"/wifidog/auth",并执行回调函数 */
(entry->function)(server, r);
break;
case HTTP_STATIC:
_httpd_sendStatic(server, r, entry->data);
break;
case HTTP_FILE:
_httpd_sendFile(server, r, entry->path);
break;
case HTTP_WILDCARD:
if (_httpd_sendDirectoryEntry(server, r, entry,
entryName)<0)
{
_httpd_send404(server, r);
}
break;
}
_httpd_writeAccessLog(server, r);
}
本文章由 http://www.wifidog.pro/2015/04/02/wifidog%E6%BA%90%E7%A0%81wifidog%E5%88%86%E6%9E%90.html 整理编辑,转载请注明出处