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

隨筆-162  評(píng)論-223  文章-30  trackbacks-0
字符集合 
   依據(jù)RFC3986 2規(guī)范,HTTP URI中允許出現(xiàn)的US-ASCII字符的子集,可以分成保留未保留轉(zhuǎn)義這幾類(lèi),每類(lèi)的全部字符列表如下
      ● 保留:  : / ? # [ ] @ ! $ & '( ) * + ,; =共18個(gè),一般用于URI部件分隔符。
      ● 未保留:  a-z A-Z 0-9 - . _ ~共66個(gè),一般用于部件內(nèi)數(shù)據(jù)。
      ● 轉(zhuǎn)義:  %HEXHEX,HEX表示一個(gè)十六進(jìn)制數(shù)字[0-9A-F]或[0-9a-f],通常采用大寫(xiě),這兩個(gè)HEX就表示一個(gè)US-ASCII字符代碼,轉(zhuǎn)義用于在URI內(nèi)部插入保留字符及原本不支持的字符。


編碼原理
 
   當(dāng)構(gòu)建URI的部件時(shí),其中的一個(gè)八位字節(jié)碼相應(yīng)的字符超出了允許的集合或被用作分隔符,就需要編碼,正是在這個(gè)時(shí)候,由實(shí)現(xiàn)決定保留字符的哪些被用于子部件分隔符,哪個(gè)被安全地用于數(shù)據(jù)。一個(gè)百分號(hào)編碼的八位字節(jié)碼被編碼成一個(gè)三重字符, 包括百分號(hào)字符"%"和隨后的兩個(gè)十六進(jìn)制數(shù)字展示那個(gè)八位字節(jié)的數(shù)值。

字符映射表
   用于快速判斷一個(gè)字符是否為未保留字符,定義如下
 1const char http_uri_table[256= 
 2{
 3    /* 0 */
 4    00000000,   00000000,
 5    00000000,   00000000,
 6    00000000,   00000110,
 7    11111111,   11000000,
 8    /* 64 */
 9    01111111,   11111111,
10    11111111,   11100001,
11    01111111,   11111111,
12    11111111,   11100010,
13    /* 128 */
14    00000000,   00000000,
15    00000000,   00000000,
16    00000000,   00000000,
17    00000000,   00000000,
18    /* 192 */
19    00000000,   00000000,
20    00000000,   00000000,
21    00000000,   00000000,
22    00000000,   00000000,
23}
;
24#define HTTP_CHAR_IS_UNRESERVED(c) (http_uri_table[(unsigned char)(c)])

接口實(shí)現(xiàn)
   http_uri_encode有2個(gè)版本:一個(gè)帶uri長(zhǎng)度參數(shù)len,另一個(gè)則不帶。
 1void http_uri_encode(const char *uri, size_t len, std::string &str,bool space_as_plus/*=false*/)
 2{
 3    char c,buf[4];
 4
 5    for (size_t i = 0; i < len; i++{
 6        c = uri[i];
 7        if (HTTP_CHAR_IS_UNRESERVED(c)) {
 8            str.push_back(c);
 9        }
else if(c == ' ' && space_as_plus) {
10            str.push_back('+');
11        }
else{
12            sprintf(buf,"%%%02X",(unsigned char)c);
13            str.append(buf);
14        }

15    }

16}

17
18void http_uri_encode(const char *uri, std::string &str,bool space_as_plus/*=false*/)
19{
20    char c,buf[4];
21
22    for (; c=*uri; ++uri) {
23        if (HTTP_CHAR_IS_UNRESERVED(c)) {
24            str.push_back(c);
25        }
else if(c == ' ' && space_as_plus) {
26            str.push_back('+');
27        }
else{
28            sprintf(buf,"%%%02X",(unsigned char)c);
29            str.append(buf);
30        }

31    }

32}


解碼原理
   當(dāng)解析URI的時(shí)候,首先要根據(jù)HTTP協(xié)議分離各個(gè)部件,再將各部件內(nèi)可能的轉(zhuǎn)義數(shù)據(jù)進(jìn)行反轉(zhuǎn)義以還原。

接口實(shí)現(xiàn)
   http_uri_decode有2種版本,一種提供存儲(chǔ)解碼后的uri參數(shù)str;另一種則不提供即在原uri上解碼,返回實(shí)際解碼后的字節(jié)數(shù)。每種版本又有2個(gè)版本,一個(gè)帶uri長(zhǎng)度參數(shù)len,另一個(gè)則不帶。
 1void http_uri_decode(const char *uri, size_t len, std::string &str, int decode_plus /*= 0*/)
 2{
 3    char c,t[3]={'\0'};
 4
 5    for (size_t i = 0; i < len; i++{
 6        c = uri[i];
 7        if (c == '?'{
 8            if(decode_plus < 0)
 9                decode_plus = 1;
10        }
 else if (c == '+' && decode_plus) {
11            c = ' ';
12        }
 else if (c == '%' && isxdigit(uri[i+1]) && isxdigit(uri[i+2])) {
13            t[0= uri[++i],t[1= uri[++i];
14            c = (char)strtol(t, NULL, 16);
15        }

16        str.push_back(c);
17    }

18}

19
20void http_uri_decode(const char *uri, std::string &str, int decode_plus/*=0*/)
21{
22    char c,t[3]={'\0'};
23
24    for (; c=*uri; ++uri) {
25        if (c == '?'{
26            if(decode_plus < 0)
27                decode_plus = 1;
28        }
 else if (c == '+' && decode_plus) {
29            c = ' ';
30        }
 else if (c == '%' && isxdigit(*(uri+1)) && isxdigit(*(uri+2))) {
31            t[0= *++uri,t[1= *++uri;
32            c = (char)strtol(t, NULL, 16);
33        }

34        str.push_back(c);
35    }

36}

37
38//in place decode function
39size_t http_uri_decode(char *uri, size_t len, int decode_plus/*=0*/)
40{
41    char c,t[3]={'\0'};
42    size_t i,j;
43
44    for (i=j=0; i < len; ++i,++j) {
45        c = uri[i];    
46        if (c == '?'{
47            if(decode_plus < 0)
48                decode_plus = 1;
49        }
 else if (c == '+' && decode_plus) {
50            c = ' ';
51        }
 else if (c == '%' && isxdigit(uri[i+1]) && isxdigit(uri[i+2])) {
52            t[0= uri[++i],t[1= uri[++i];
53            c = (char)strtol(t, NULL, 16);
54        }

55        uri[j] = c;
56    }

57
58    uri[j] = '\0';
59    return j;
60}

61
62size_t http_uri_decode(char *uri,int decode_plus/*=0*/)
63{
64    char c,*s=uri,*d=uri,t[3]={'\0'};
65
66    for (; c=*s; ++s,++d) {
67        if (c == '?'{
68            if(decode_plus < 0)
69                decode_plus = 1;
70        }
 else if (c == '+' && decode_plus) {
71            c = ' ';
72        }
 else if (c == '%' && isxdigit(*(s+1)) && isxdigit(*(s+2))) {
73            t[0= *++s,t[1= *++s;
74            c = (char)strtol(t, NULL, 16);
75        }

76        *= c;
77    }

78
79    *d= '\0';
80    return d-uri;
81}
posted on 2015-02-10 18:40 春秋十二月 閱讀(4759) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): Network

評(píng)論:
# re: HTTP URI編解碼 2015-03-12 09:08 | wxj
好文,收藏  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品国产精品| 99精品视频免费| 在线电影国产精品| 欧美日韩亚洲高清一区二区| 亚洲欧美激情视频| 亚洲日本成人在线观看| 欧美一级夜夜爽| 久久综合免费视频影院| 久久久久国内| 午夜精品视频网站| 亚洲电影免费观看高清完整版在线 | 9i看片成人免费高清| 久久精品欧美| 久久婷婷国产综合精品青草| 亚洲在线观看免费| 99国产精品一区| 国产视频一区二区三区在线观看| 欧美国产日本韩| 久久久xxx| 久久久久久一区二区| 久久福利影视| 久久久久久国产精品一区| 欧美一区91| 你懂的视频一区二区| 久久精品综合| 久久亚洲二区| 欧美日韩精品欧美日韩精品一 | 国产日韩欧美制服另类| 国产精品va在线播放| 欧美日韩国产综合视频在线| 亚洲人成久久| 欧美日韩在线一二三| 欧美三级在线播放| 亚洲人成亚洲人成在线观看图片| 亚洲区一区二| 狂野欧美性猛交xxxx巴西| 国产精品video| 亚洲少妇在线| 亚洲看片网站| 欧美经典一区二区| 亚洲精品久久嫩草网站秘色| 久久全国免费视频| 欧美呦呦网站| 亚洲电影免费观看高清完整版在线| 久久久夜夜夜| 亚洲欧美日韩区| 亚洲高清在线| 久久一区免费| 久久国产99| 久久精品国产免费看久久精品| 国产视频在线一区二区| 国产精品久久国产愉拍| 久久激情网站| 久久国内精品视频| 欧美精品一区二区高清在线观看| 国产精品久久久久久亚洲调教| 亚洲一级特黄| 亚洲影院在线观看| 国产视频一区二区在线观看| 欧美成人精品| 欧美久久九九| 久久精品在线视频| 久久综合狠狠综合久久综合88| 激情视频亚洲| 亚洲国产精品久久久久久女王| 久久福利精品| 日韩亚洲成人av在线| 日韩写真视频在线观看| 美女性感视频久久久| 亚洲综合大片69999| 永久555www成人免费| 亚洲视频在线观看三级| 99国内精品久久| 久久综合国产精品| 午夜精品99久久免费| 日韩视频精品在线| 国产一区二区高清| 亚洲精品在线电影| 国产亚洲观看| 亚洲午夜电影| 日韩图片一区| 亚洲伊人一本大道中文字幕| 亚洲欧洲在线视频| 久久精品水蜜桃av综合天堂| 久久乐国产精品| 欧美天天视频| 亚洲精品资源美女情侣酒店| 极品av少妇一区二区| 亚洲国产日韩欧美在线动漫| 国产三级精品三级| 亚洲午夜精品国产| 欧美影院成人| 国产精品久久久久一区二区三区| 亚洲色图在线视频| 久久精品三级| 怡红院精品视频在线观看极品| 99re热这里只有精品视频| 红桃视频一区| 久久久久久久久久久久久久一区| 午夜精品久久久久影视| 国产精品久久久久久户外露出| 亚洲精品一区在线| 午夜欧美大片免费观看| 樱桃国产成人精品视频| 欧美人成在线视频| 在线天堂一区av电影| 亚洲国产一二三| 精品99一区二区| 欧美日韩精品免费在线观看视频| 91久久精品国产91性色tv| 亚洲一区二区精品| 国产日韩精品一区二区浪潮av| 亚洲午夜一区| 亚洲精品资源| 欧美高清视频一区二区| 久久久久99精品国产片| 亚洲综合丁香| 亚洲精品日韩综合观看成人91| 欧美二区在线观看| 久久久久久久精| 久久xxxx| 亚洲伦理网站| 一区二区三区精品视频| 欧美一区二区福利在线| 欧美大片va欧美在线播放| 亚洲人成人一区二区三区| 国产精品美女久久| 欧美精品电影在线| 麻豆成人综合网| 久久成人精品无人区| 久久国内精品视频| 欧美精品videossex性护士| 欧美午夜女人视频在线| 欧美日韩国产精品一卡| 美女免费视频一区| 欧美福利一区二区| 欧美三日本三级少妇三2023 | 亚洲四色影视在线观看| 午夜免费在线观看精品视频| 免费成人黄色av| 中文一区二区在线观看| 欧美第一黄色网| 免费在线成人av| 国产一区日韩二区欧美三区| 一色屋精品视频在线观看网站| 亚洲欧洲一区二区在线播放| 亚洲欧美一区二区原创| 亚洲青涩在线| 久久久欧美精品sm网站| 欧美精品久久99久久在免费线| 欧美日韩高清在线观看| 国产精品久久久久久妇女6080| 激情综合亚洲| 久久亚洲精品伦理| 羞羞答答国产精品www一本| 欧美性一区二区| 亚洲一区二区三区在线看| 久久精品中文字幕免费mv| 亚洲全部视频| 久久久夜色精品亚洲| 国产欧美一区二区精品秋霞影院| av不卡在线| 一区二区三区精品| 国产欧美在线观看| 久久超碰97中文字幕| 亚洲一区激情| 国产精品成人一区二区三区夜夜夜| 亚洲精品视频在线| 亚洲精品一二三| 国产日产欧美精品| 久久激情一区| 欧美久久视频| 亚洲综合色在线| 正在播放欧美视频| 国产精品日韩一区二区三区| 久久影视精品| 国产精品影视天天线| 亚洲人成网站影音先锋播放| 欧美日韩精品一区视频| 亚洲性夜色噜噜噜7777| 日韩视频中午一区| 欧美日韩一区综合| 美女视频黄 久久| 欧美日韩国产在线观看| 欧美不卡视频一区| 国语自产精品视频在线看抢先版结局| 午夜精品久久久久久99热| 亚洲在线观看| 亚洲欧美在线一区二区| 亚洲欧洲在线一区| 一区二区三区国产精品| 国产精品a级| 夜夜爽www精品| 好看的日韩av电影| 中文日韩电影网站| 亚洲免费在线视频| 国产精品欧美风情| 久久永久免费| 国产精品久久久久久久久果冻传媒| 亚洲欧美在线网|