2011-05-21 38 views
1

我正在编写C CGI程序基本CGI协议的格式。示例

对于GET请求,我假设所有信息都以某种方式存储在getenv()中。我的问题是,这个数组看起来像来自web服务器的最基本的CGI请求。有两位参与者,例如用户名=和密码=。

对于POST请求,我不确定。我读过的东西是在标准输入上处理的。通过标准输入(从网络服务器)传递给CGI程序的这些行是什么样的?

指我一个冗长的RFC是无益的。

任何书?我特别感兴趣的是该协议的低级细节。我已经知道如何用辅助库来编写CGI应用程序......我只需要知道这些辅助库的语义。

+4

RFC 3875:http://tools.ietf.org/html/rfc3875 – 2011-05-21 02:12:27

回答

3

envp不是标准的(好吧,无论如何,不​​是ISO C或C++标准,尽管POSIX可能有它的东西)。

但是,envp几乎与argv格式相同,但它没有控制argc来限制它。

每个envp[x]会的形式"key=value"其中key是环境变量名和value是它的价值,令人惊讶的是:-)

您应该处理的元素顺序,直到你得到一个NULL指针,东西像:

#include <stdio.h> 
int main (int argc, char *argv[], char *envp[]) { 
    int i = 0; 
    while (envp[i] != NULL) 
     printf ("[%s]\n", envp[i++]); 
    return 0; 
} 

Wikipedia entry for CGI给出进一步的细节,希望不淹没你会喜欢一个详细的RFC太多的信息。

复制有关的东西,使这个答案自足:

  • 服务器特定的变量:
    • SERVER_SOFTWARE - 名称/版本HTTP服务器。
    • SERVER_NAME - 服务器的主机名,可能是点十进制IP地址。
    • GATEWAY_INTERFACE - CGI/version。
  • 请求特定的变量:
    • SERVER_PROTOCOL - HTTP /版本。
    • SERVER_PORT - TCP端口(十进制)。
    • REQUEST_METHOD - HTTP方法的名称(参见上文)。
    • PATH_INFO - 路径后缀,如果在程序名称和斜杠后附加到URL。
    • PATH_TRANSLATED - 如果存在PATH_INFO,则与服务器假定的相应的完整路径。
    • SCRIPT_NAME - 程序的相对路径,如/cgi-bin/script.cgi。
    • QUERY_STRING - URL之后的部分?字符。当用于提交通过HTML应用程序/ x-www-form-urlencoded定义的GET方法传输的表单数据时,可能由*名称=值对组成(如var1 = val1 & var2 = val2 ...)。
    • REMOTE_HOST - 客户端的主机名,如果服务器未执行此类查找,则取消设置。
    • REMOTE_ADDR - 客户端的IP地址(点分十进制)。
    • AUTH_TYPE - 标识类型(如果适用)。
    • REMOTE_USER用于某些AUTH_TYPE。
    • REMOTE_IDENT - 仅在服务器执行此类查找时才能看到ident。
    • CONTENT_TYPE - 如果使用PUT或POST方法(通过HTTP标头提供),则输入数据的MIME类型。
    • CONTENT_LENGTH - 类似地,如果通过HTTP头提供输入数据的大小(十进制,以八位字节为单位)。
    • 用户代理传递的变量(HTTP_ACCEPT,HTTP_ACCEPT_LANGUAGE,HTTP_USER_AGENT,HTTP_COOKIE和其他可能的变量)包含相应HTTP标头的值,因此具有相同的含义。

除此之外的详细程度,你可能会寻找到RFC文档,我害怕。在Google上搜索RFC3875应找到它。

具体而言,对于POST,环境变量包含在请求的第一个空白行(引入消息正文的行)之前。它们的格式如下:

Content-Type: application/wonderful_app_by_pax 
Content-Length: 314159 

其中密钥不区分大小写,值在冒号后面。

+0

**是** CGI协议。 – 2011-05-21 02:16:23

+1

@ unixman83,我已经用更多细节更新了答案。 _More_细节可能会把这个答案变成一个“冗长的”RFC的副本,所以如果你想要更多的细节,你应该参考一下:-) – paxdiablo 2011-05-21 02:25:36

+1

'extern char ** environ;'是正确的,可移植的(POSIX)方式以数组的形式访问环境变量。 'envp'不是。顺便说一句,如果你知道你想要的变量名,你可以简单地使用'getenv',它是纯粹的C. – 2011-05-21 02:59:49