Thttpd源程序解析18 thttpd请求处理过程详解之CGI过程

本文详细解析了thttpd服务器中CGI(Common Gateway Interface)请求的处理流程,包括程序判断、子进程创建、文件描述符设置、环境及参数配置、管道使用等关键步骤,旨在帮助理解CGI在轻量级HTTP服务器中的实现机制。
摘要由CSDN通过智能技术生成

从之前讲述的really_start_request函数我们知道当设置的cgi_pattern不为空且文件具有其他用户可执行的权限且cgi_pattern与文件的扩展名称匹配时将调用CGI过程。

CGI过程根据用户的请求方式和请求参数调用存在于cgi_pattern文件目录中的可执行程序返回用户数据的过程。

程序流程

(1)判断已经使用的CGI的程序数量是否超过了设置的最大数量,如果是退出函数,反之继续执行。

(2)设置当前使用的CGI的程序数量加一。

(3)设置连接的文件描述符为阻塞模式。

(4)创建子进程,如果创建失败退出函数;如果创建成功子进程关闭服务器的文件描述符,调用cgi_child函数;父进程设置子进程超时处理函数,设置状态码等参数然后退出。

(5)设置连接的文件描述符的F_SETFD值为0。

(6)如果连接的文件描述符为标准输入输出或者是标准错误赋值连接的文件描述符为3。

(7)设置环境变量

(8)设置参数变量

(9)对于方式是POST方式,创建管道,创建失败返回500错误退出函数,创建成功将会创建子进程,创建子进程失败返回500错误退出函数,创建成功读取未读取完的数据写到管道的写数据端口,如果读管道的文件描述符不是标准输入复制为标准输入。对于不是POST方式设置连接的文件描述符的值为标准输入。

(10)复制连接的文件描述符到标准输入和标准错误

(10)设置子程序运行的优先级

(11)设置子程序的名称。

(12)调用子程序。

流程图

源程序

/**cgi程序处理*/
static int cgi( httpd_conn* hc )
{
    int r;
    ClientData client_data;
	/**判断是否是有效的CGI程序*/
    if ( hc->hs->cgi_limit != 0 && hc->hs->cgi_count >= hc->hs->cgi_limit )
	{
		httpd_send_err(hc, 503, httpd_err503title, "", httpd_err503form,hc->encodedurl );
		return -1;
	}
    ++hc->hs->cgi_count;
	/**设置为非阻塞模式*/
    httpd_clear_ndelay( hc->conn_fd );
	/**创建子进程*/
    r = fork( );
    if ( r < 0 )
	{
		syslog( LOG_ERR, "fork - %m" );
		httpd_send_err(hc, 500, err500title, "", err500form, hc->encodedurl );
		return -1;
	}
	/**子进程处理函数*/
    if ( r == 0 )
	{
	/* Child process. */
		sub_process = 1;
		httpd
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你实现这个功能。首先,我们需要明确一下 thttpd-cgi 接口是什么。thttpd 是一个非常轻量级的 HTTP 服务器,而 thttpd-cgi 则是用来处理 CGI 请求的模块。在 thttpd-cgi 中,我们可以通过解析 HTTP 请求的参数和数据来处理 CGI 请求,并返回相应的响应。 为了实现清空网页内容的功能,我们可以编写一个简单的 CGI 程序,将其部署在 thttpd-cgi 中。具体实现方式如下: 1. 编写 CGI 程序的源码,可以使用 C/C++、Python、Perl 等语言实现。下面是一个 Python 实现的示例代码: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- print("Content-type:text/html") print("") print(""" <html> <head> <title>清空网页内容</title> </head> <body> <script> document.body.innerHTML = ""; </script> <h1>网页内容已清空</h1> </body> </html> """) ``` 2. 将上述代码保存为一个 Python 文件,如 `clear.py`。 3. 将 `clear.py` 文件部署到 thttpd-cgiCGI 目录中,例如 `/var/www/cgi-bin/` 目录。 4. 在 thttpd 的配置文件中添加以下配置: ``` dir cgi-bin { cgi ".py=/usr/bin/python3" } ``` 这个配置告诉 thttpd-cgi,当请求以 `.py` 结尾时,使用 `/usr/bin/python3` 解释器来执行 CGI 程序。 5. 重启 thttpd 服务器,使配置生效。 现在,当你访问 `http://<服务器IP>/cgi-bin/clear.py` 时,就会执行上述 Python 程序,清空网页内容,并在页面上显示“网页内容已清空”的文字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值