2011-05-21 117 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