• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            Fastcgi協(xié)議定義解釋與說(shuō)明

            http://wangnow.com/article/28-fastcgi-protocol-specification

             

            首先介紹響應(yīng)的數(shù)據(jù),比較簡(jiǎn)單,再者我們對(duì)返回的數(shù)據(jù)比較敏感……
            1
            響應(yīng)格式
            如(十六進(jìn)制方式顯示)

            序列 0  1  2  3  4  5  6  7 ...
            數(shù)值 01 06 00 01 01 1D 03 00...


            序列0(值01)為version,固定取1即可
            序列1(值06)為type,代表FCGI_STDOUT,表示應(yīng)用的輸出
            序列2 300 01)代表2字節(jié)的請(qǐng)求id,默認(rèn)取1即可(準(zhǔn)確說(shuō)應(yīng)該是和請(qǐng)求應(yīng)用時(shí)發(fā)送的id一致,這里假設(shè)請(qǐng)求和響應(yīng)的id都是1
            序列4 501 1D)代表2字節(jié)的輸出長(zhǎng)度,最大為65535,例如當(dāng)前內(nèi)容長(zhǎng)度為(0x01 << 8) + 0x1D = 285
            序列603)代表填充padding字節(jié)數(shù)(填充為滿8字節(jié)的整數(shù)倍),例如當(dāng)前填充(以0填充)長(zhǎng)度為8 - 285 % 8 = 3,即獲取輸出長(zhǎng)度(285)的內(nèi)容后要跳過(guò)的字節(jié)數(shù),當(dāng)然如果為8就無(wú)需填充了
            序列700)為保留字節(jié)
            8
            字節(jié)(序列7)之后為具體內(nèi)容(contentData)和填充內(nèi)容(paddingData

            最后為通知web服務(wù)器的請(qǐng)求結(jié)束記錄,具體內(nèi)容如下

            序列 0  1  2  3  4  5  6  7 ...
            數(shù)值 01 03 00 01 00 08 00 00...


            其中序列103type代表FCGI_END_REQUEST,即請(qǐng)求結(jié)束,8字節(jié)之后為contentDataEndRequestBody)和paddingData
            EndRequestBody
            的內(nèi)容也比較個(gè)性,是單獨(dú)定義的

            typedef struct {
                 unsigned char appStatusB3;
                 unsigned char appStatusB2;
                 unsigned char appStatusB1;
                 unsigned char appStatusB0;
                 unsigned char protocolStatus;
                 unsigned char reserved[3];
            } FCGI_EndRequestBody;



            appStatus
            占了四個(gè)字節(jié),定義為cgi通過(guò)調(diào)用系統(tǒng)退出返回的狀態(tài)碼(The application sets the protocolStatus component to FCGI_REQUEST_COMPLETE and the appStatus component to the status code that the CGI program would have returned via the exit system call.Linux正常的程序退出默認(rèn)是返回0(應(yīng)該是吧?我記著是……

            protocolStatus
            的值可以是

            #define FCGI_REQUEST_COMPLETE 0
            #define FCGI_CANT_MPX_CONN 1
            #define FCGI_OVERLOADED 2
            #define FCGI_UNKNOWN_ROLE 3



            因此最后FCGI_END_REQUESTcontentData

            序列 0  1  2  3  4  5  6  7
            數(shù)值 00 00 00 00 00 00 00 00


            0-3
            序列為appStatus
            4
            序列protocolStatus0FCGI_REQUEST_COMPLETE
            5-7
            序列為保留的3字節(jié)reserved[3]

            2
            請(qǐng)求格式

            序列 0  1  2  3  4  5  6  7 ...
            數(shù)值 01 01 00 01 00 08 00 00...


            序列0(值01)為version
            序列1(值01)為type,代表FCGI_BEGIN_REQUES,表示開(kāi)始發(fā)送請(qǐng)求
            序列2 300 01)代表2字節(jié)的請(qǐng)求id,默認(rèn)取1即可
            請(qǐng)求開(kāi)始的記錄稍微特殊,發(fā)送的內(nèi)容(contentData)如下格式

            typedef struct {
                 unsigned char roleB1;
                 unsigned char roleB0;
                 unsigned char flags;
                 unsigned char reserved[5];
            } FCGI_BeginRequestBody;

             

            #role的可以取如下三個(gè)值
            #define FCGI_RESPONDER 1
            #define FCGI_AUTHORIZER 2
            #define FCGI_FILTER 3


            我們?nèi)?span lang="EN-US">1FCGI_RESPONDER)為啥?說(shuō)是和經(jīng)典的CGI/1.1作用一樣(http那些東西)
            flags
            0表示本次請(qǐng)求完畢后即關(guān)閉鏈接。

            序列 0  1  2  3  4  5  6  7
            數(shù)值 00 01 00 00 00 00 00 00


            0
            1序列代表role1FCGI_RESPONDER
            2
            序列為flags 0
            3-7
            序列為reserved[5]

            再說(shuō)下協(xié)議中FCGI_PARAMS中的Name-Value Pairs,目的是提供應(yīng)用層一些必要的變量(類似http中的headerheaderName-headerValue,當(dāng)然可以為多個(gè)),詳細(xì)定義見(jiàn)http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S3.4
            其中一種定義格式如下:

            typedef struct {
                 unsigned char nameLengthB0; /* nameLengthB0 >> 7 == 0 */
                 unsigned char valueLengthB3; /* valueLengthB3 >> 7 == 1 */
                 unsigned char valueLengthB2;
                 unsigned char valueLengthB1;
                 unsigned char valueLengthB0;
                 unsigned char nameData[nameLength];
                 unsigned char valueData[valueLength
                 ((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
            } FCGI_NameValuePair14;


            結(jié)合實(shí)例說(shuō)明下

            序列 0  1  2  3  4  5  6  7 ...
            數(shù)值 00 04 00 01 04 EB 05 00...


            序列104)代表FCGI_PARAMS
            序列7之后的為相應(yīng)的名字(Name)長(zhǎng)度(nameLength)、值(Value)長(zhǎng)度(valueLength)、名字(nameData)、值(valueData
            其中規(guī)定名字或者值的長(zhǎng)度如果大于127字節(jié),則要以4字節(jié)存儲(chǔ),如下

            序列 0  1  2  3  4  5  6  7 ............
            數(shù)值 0F 80 00 00 91 S  C  R IPT_FILENAME/data/www/......


            序列00F即十進(jìn)制的15SCRIPT_FILENAME的長(zhǎng)度),不大于127所以占一個(gè)字節(jié)
            序列180即十進(jìn)制的128,大于127,說(shuō)明要占用4字節(jié)(80 00 00 91),長(zhǎng)度為

            ((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0

            算算等于多少呢?如果對(duì)位移、與等操作符號(hào)不熟悉的話,更詳細(xì)的介紹見(jiàn)之前的文章

            3
            其他說(shuō)明
            各個(gè)值的詳細(xì)定義參見(jiàn)http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S8
            以下做一些概要說(shuō)明
            記錄(Records,可以順序發(fā)送或者接受多個(gè)記錄)的格式具體定義如下

            typedef struct {
                 unsigned char version;
                 unsigned char type;
                 unsigned char requestIdB1;
                 unsigned char requestIdB0;
                 unsigned char contentLengthB1;
                 unsigned char contentLengthB0;
                 unsigned char paddingLength;
                 unsigned char reserved;
                 unsigned char contentData[contentLength];
                 unsigned char paddingData[paddingLength];
            } FCGI_Record;


            #
            前八字節(jié)定義為Header(可以這么理解,頭信息+響應(yīng)內(nèi)容,想想htpp協(xié)議中的header+body就明白了)
            #
            協(xié)議說(shuō)明中把這部分定義為FCGI_Header(以上紅色字體部分),即:

            typedef struct {
                 unsigned char version;
                 unsigned char type;
                 unsigned char requestIdB1;
                 unsigned char requestIdB0;
                 unsigned char contentLengthB1;
                 unsigned char contentLengthB0;
                 unsigned char paddingLength;
                 unsigned char reserved;
            } FCGI_Header;

             

            #version定義為1
            #define FCGI_VERSION_1 1



            #type
            具體值定義,主要關(guān)注FCGI_BEGIN_REQUEST(請(qǐng)求開(kāi)始) FCGI_END_REQUEST(請(qǐng)求結(jié)束) FCGI_PARAMSfastcgi參數(shù),即一些服務(wù)器變量,如HTTP_USER_AGENT FCGI_STDOUTfastcgi標(biāo)準(zhǔn)輸出,即請(qǐng)求后返回的內(nèi)容)

            #define FCGI_BEGIN_REQUEST 1
            #define FCGI_ABORT_REQUEST 2
            #define FCGI_END_REQUEST 3
            #define FCGI_PARAMS 4
            #define FCGI_STDIN 5
            #define FCGI_STDOUT 6
            #define FCGI_STDERR 7
            #define FCGI_DATA 8
            #define FCGI_GET_VALUES 9
            #define FCGI_GET_VALUES_RESULT 10
            #define FCGI_UNKNOWN_TYPE 11
            #define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE)



            Fastcgi
            官方文檔:http://www.fastcgi.com/devkit/doc/fcgi-spec.html
            中文版:http://fuzhong1983.blog.163.com/blog/static/1684705201051002951763/

            FAQ

            1
            如何查看web服務(wù)器發(fā)送給fastcgi應(yīng)用的頭信息呢?
            我采用的是用python監(jiān)聽(tīng)一個(gè)端口,然后把nginx中的fastcgi配置改為此端口,這樣python中就可以把接受的信息存為文件。當(dāng)然你還可以直接改nginx的代碼……

            2
            那請(qǐng)求后對(duì)應(yīng)的輸出內(nèi)容如何查看呢?
            既然發(fā)送的信息都有了,那就直接發(fā)送給fastcgi應(yīng)用(如php-fpm)吧,然后輸出隨你處理

            3
            如何查看請(qǐng)求或者響應(yīng)信息呢?
            Linux
            下可通過(guò)xxd命令查看這種二進(jìn)制輸出文件,WindowsUltraEdit也可以(我用的是未注冊(cè)版的,剩余日子21,注冊(cè)要$59.95),免費(fèi)的還可以試試PSPad(想起了游戲機(jī))

             

            posted on 2011-06-21 11:40 肥仔 閱讀(5091) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Web-后臺(tái)

            99久久夜色精品国产网站| 久久发布国产伦子伦精品| 亚洲狠狠综合久久| 91麻豆精品国产91久久久久久| 久久久久国产精品三级网| 久久国产AVJUST麻豆| av无码久久久久久不卡网站| 久久久久无码精品国产app| 青春久久| 色综合久久中文色婷婷| 伊人久久成人成综合网222| 国产成人久久精品区一区二区| 久久高清一级毛片| 2022年国产精品久久久久| 欧美国产成人久久精品| 狠狠色丁香久久婷婷综| 久久久久青草线蕉综合超碰| 国产成人99久久亚洲综合精品| 国内精品久久久久久久久电影网 | 精品一区二区久久| 最新久久免费视频| 国产精品成人99久久久久 | 久久国产精品久久久| 久久人妻少妇嫩草AV蜜桃| 久久精品一区二区影院| 丁香狠狠色婷婷久久综合| 亚洲综合日韩久久成人AV| 日韩影院久久| 色综合合久久天天给综看| 久久国产精品偷99| 97久久精品人人做人人爽| 波多野结衣中文字幕久久| 日本强好片久久久久久AAA| 无码专区久久综合久中文字幕 | 久久发布国产伦子伦精品| 久久99精品久久久大学生| 久久人做人爽一区二区三区| 国产精品久久久久免费a∨| 久久久久久久97| 久久亚洲私人国产精品vA | 亚洲七七久久精品中文国产|