青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

Fastcgi協議定義解釋與說明

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

 

首先介紹響應的數據,比較簡單,再者我們對返回的數據比較敏感……
1
響應格式
如(十六進制方式顯示)

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


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

最后為通知web服務器的請求結束記錄,具體內容如下

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


其中序列103type代表FCGI_END_REQUEST,即請求結束,8字節之后為contentDataEndRequestBody)和paddingData
EndRequestBody
的內容也比較個性,是單獨定義的

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



appStatus
占了四個字節,定義為cgi通過調用系統退出返回的狀態碼(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正常的程序退出默認是返回0(應該是吧?我記著是……

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
數值 00 00 00 00 00 00 00 00


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

2
請求格式

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


序列0(值01)為version
序列1(值01)為type,代表FCGI_BEGIN_REQUES,表示開始發送請求
序列2 300 01)代表2字節的請求id,默認取1即可
請求開始的記錄稍微特殊,發送的內容(contentData)如下格式

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

 

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


我們取1FCGI_RESPONDER)為啥?說是和經典的CGI/1.1作用一樣(http那些東西)
flags
0表示本次請求完畢后即關閉鏈接。

序列 0  1  2  3  4  5  6  7
數值 00 01 00 00 00 00 00 00


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

再說下協議中FCGI_PARAMS中的Name-Value Pairs,目的是提供應用層一些必要的變量(類似http中的headerheaderName-headerValue,當然可以為多個),詳細定義見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;


結合實例說明下

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


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

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


序列00F即十進制的15SCRIPT_FILENAME的長度),不大于127所以占一個字節
序列180即十進制的128,大于127,說明要占用4字節(80 00 00 91),長度為

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

算算等于多少呢?如果對位移、與等操作符號不熟悉的話,更詳細的介紹見之前的文章

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

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;


#
前八字節定義為Header(可以這么理解,頭信息+響應內容,想想htpp協議中的header+body就明白了)
#
協議說明中把這部分定義為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
具體值定義,主要關注FCGI_BEGIN_REQUEST(請求開始) FCGI_END_REQUEST(請求結束) FCGI_PARAMSfastcgi參數,即一些服務器變量,如HTTP_USER_AGENT FCGI_STDOUTfastcgi標準輸出,即請求后返回的內容)

#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服務器發送給fastcgi應用的頭信息呢?
我采用的是用python監聽一個端口,然后把nginx中的fastcgi配置改為此端口,這樣python中就可以把接受的信息存為文件。當然你還可以直接改nginx的代碼……

2
那請求后對應的輸出內容如何查看呢?
既然發送的信息都有了,那就直接發送給fastcgi應用(如php-fpm)吧,然后輸出隨你處理

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

 

posted on 2011-06-21 11:40 肥仔 閱讀(5105) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品亚洲一区二区三区嫩草| 韩国女主播一区二区三区| 欧美成年人在线观看| 亚洲男女自偷自拍图片另类| 99re热这里只有精品免费视频| 亚洲激情国产| 亚洲欧洲三级| 日韩亚洲不卡在线| 一本不卡影院| 亚洲一区二区三区午夜| 午夜欧美精品久久久久久久| 欧美亚洲在线| 久久亚洲精选| 亚洲第一久久影院| 亚洲人人精品| 亚洲天堂成人在线观看| 亚洲欧美国产77777| 久久精品国产亚洲一区二区三区| 久久一区二区三区av| 欧美电影免费观看高清| 欧美日韩在线一区二区三区| 国产精品一区免费视频| 亚洲成人在线视频播放| 性色av一区二区三区| 久久福利精品| 久久一综合视频| 国内精品久久久久久久影视麻豆| 国产精品av免费在线观看| 欧美国产免费| 国产精品手机视频| 欧美三区在线| 国产日韩在线看| 亚洲欧洲日本在线| 亚洲人成久久| 一本色道久久加勒比精品| 亚洲在线第一页| 亚洲性xxxx| 男女精品网站| 欧美一区免费| 亚洲国产99| 国产日韩一区在线| 毛片一区二区三区| 国产精品美女久久久| 国产日韩精品一区二区三区在线| 欧美日韩一区精品| 国产视频一区三区| 亚洲欧美日本视频在线观看| 欧美成人免费观看| 亚洲欧美成人综合| 国产伦精品一区二区三区视频黑人| 精品电影在线观看| 久久亚洲精品网站| 国产精品视频网| 欧美一区二视频| 亚洲电影免费在线观看| 中文在线资源观看网站视频免费不卡| 久久不射网站| 亚洲国产欧美一区二区三区久久 | 国产在线播放一区二区三区| 一级成人国产| 亚洲激情校园春色| 久久夜色精品国产欧美乱| 国产一区二区三区久久悠悠色av | 欧美激情偷拍| 美女久久一区| 亚洲人被黑人高潮完整版| 老鸭窝91久久精品色噜噜导演| 亚洲综合首页| 国产一区在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 午夜免费电影一区在线观看| 国产精品久久久亚洲一区| 亚洲视屏一区| 亚洲一区二区在线免费观看视频| 欧美系列精品| 午夜欧美不卡精品aaaaa| 亚洲天堂av电影| 国产精品一区二区久久久| 欧美一区二区在线免费播放| 亚洲综合导航| 韩国av一区二区三区| 久久综合伊人77777麻豆| 久久美女艺术照精彩视频福利播放| 永久免费精品影视网站| 亚洲国产精品精华液2区45| 欧美巨乳在线观看| 亚洲综合国产| 久久久久88色偷偷免费| 亚洲精品欧美精品| 一区二区三区视频在线播放| 国产精品一区二区久久久| 久久综合狠狠综合久久综青草 | 欧美日韩在线一区二区| 午夜亚洲视频| 久久久久久久精| 一本一本大道香蕉久在线精品| 亚洲网站在线| 在线免费观看视频一区| 久久精品动漫| 男人的天堂亚洲在线| 亚洲手机在线| 久久男女视频| 亚洲欧美中文另类| 久久中文精品| 亚洲影院色在线观看免费| 国产美女精品视频| 先锋影音国产一区| 欧美制服第一页| 亚洲毛片av| 欧美一级在线亚洲天堂| 亚洲美女性视频| 欧美一级专区| 亚洲一区免费网站| 亚洲人成亚洲人成在线观看图片| 国产精品视频免费| 亚洲黄色三级| 亚洲二区在线观看| 亚洲欧美视频在线| 亚洲午夜精品一区二区三区他趣| 久久久久久久成人| 欧美专区在线播放| 欧美色综合天天久久综合精品| 欧美99在线视频观看| 久久久另类综合| 亚洲欧美网站| 欧美日韩一区综合| 亚洲激情av在线| 亚洲国产成人久久综合一区| 久久久av毛片精品| 欧美亚洲一区二区在线观看| 亚洲欧洲99久久| 亚洲一区欧美二区| 欧美精品一区二区三区在线看午夜| 免费亚洲一区二区| 国产一区二区三区在线观看免费| 亚洲午夜精品视频| 亚洲伊人伊色伊影伊综合网| 欧美精品成人一区二区在线观看 | 国语精品中文字幕| 亚洲欧美日韩精品一区二区| 亚洲欧美变态国产另类| 欧美日韩免费观看中文| 亚洲国产欧美国产综合一区 | 亚洲欧美日韩精品久久久久| 欧美美女喷水视频| 亚洲欧洲在线一区| 亚洲免费精品| 欧美日韩成人在线| 99在线精品视频| 在线一区视频| 欧美先锋影音| 中文在线不卡| 亚洲一区二区在线观看视频| 欧美日韩免费观看一区=区三区 | 在线亚洲一区| 亚洲视频在线观看| 性伦欧美刺激片在线观看| 亚洲视频第一页| 欧美欧美全黄| 久久福利毛片| 99伊人成综合| 久久精品国产欧美激情| 嫩草国产精品入口| 久久青青草综合| 国产精品人人做人人爽人人添| 亚洲日本一区二区三区| 国产精品久久久久久av福利软件| 亚洲精品国产精品国自产在线| 亚洲国产精品成人精品| 亚洲国产天堂久久综合网| 一区二区三区产品免费精品久久75 | 国产欧美精品在线播放| 亚洲精品久久嫩草网站秘色| 国产欧美另类| 久久久久久久高潮| 久久久999精品免费| 影音先锋欧美精品| 免费成人黄色av| 亚洲激情网址| 亚洲免费视频中文字幕| 国产精品欧美日韩| 午夜久久福利| 亚洲午夜久久久久久久久电影网| 国产模特精品视频久久久久| 欧美亚洲在线播放| 欧美高清影院| 欧美一区三区三区高中清蜜桃| 国内久久婷婷综合| 久久米奇亚洲| 亚洲精品在线三区| 一区二区三区精品视频| 欧美日韩在线播放一区二区| 亚洲欧美精品中文字幕在线| 老色鬼久久亚洲一区二区| 亚洲精品国精品久久99热| 国产午夜精品一区理论片飘花| 欧美fxxxxxx另类| 亚洲视频一起| 欧美黄色网络| 久久夜色精品国产|