精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node.js HTTP 解析器 llhttp 的使用

開發(fā) 前端
llhttp 是 Node.js 的 HTTP 1.1 解析器,用于替代早期的http_parser,性能上有了非常大的提升,最近打算在 No.js 里引入 llhttp 來處理 HTTP 協(xié)議的解析,本文簡(jiǎn)單介紹一下如何使用。

[[427068]]

llhttp 是 Node.js 的 HTTP 1.1 解析器,用于替代早期的http_parser,性能上有了非常大的提升,最近打算在 No.js 里引入 llhttp 來處理 HTTP 協(xié)議的解析,本文簡(jiǎn)單介紹一下如何使用。

llhttp 項(xiàng)目是 Node.js 中的子項(xiàng)目,地址在:

https://github.com/nodejs/llhttp。

使用步驟如下:

1. 安裝 npx:npm i npx -g

2. 執(zhí)行 ts 生成 c 代碼:npx ts-node bin/generate.ts,或者執(zhí)行 make generate

3. 這時(shí)候build 目錄下生成了 llhttp.h 和 llhttp.c,再加上 native 下的 c 代碼,就是 llhttp 的全部代碼,我們可以把他復(fù)制到自己的項(xiàng)目中使用

下面看看如何使用。llhttp 使用回調(diào)鉤子的設(shè)計(jì)思想,初始化解析器的時(shí)候,我們可以設(shè)置解析類型,是請(qǐng)求或響應(yīng)報(bào)文,然后設(shè)置解析狀態(tài)的回調(diào),比如解析道 URL 時(shí)回調(diào),解析到 header 時(shí)回調(diào)。接著傳入報(bào)文執(zhí)行 llhttp_execute 就可以,下面是解析請(qǐng)求報(bào)文的例子。

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include "llhttp.h" 
  4. #define MAX_LEN 2048 
  5. int on_message_begin(llhttp_t* parser){ 
  6.     printf("parse start\n"); 
  7.     return 0; 
  8.  
  9. int on_url(llhttp_t* parser, const charat, size_t length){ 
  10.     char url[MAX_LEN]; 
  11.     strncpy(url, at, length); 
  12.     url[length] = '\0'
  13.     printf("on_url: %s\n", url); 
  14.     return 0; 
  15.  
  16. int on_header_field(llhttp_t* parser, const charat, size_t length){ 
  17.     char header_field[MAX_LEN]; 
  18.     strncpy(header_field, at, length); 
  19.     header_field[length] = '\0'
  20.     printf("head field: %s\n", header_field); 
  21.     return 0; 
  22.  
  23. int on_header_value(llhttp_t* parser, const charat, size_t length){ 
  24.     char header_value[MAX_LEN]; 
  25.     strncpy(header_value, at, length); 
  26.     header_value[length] = '\0'
  27.     printf("head value: %s\n", header_value); 
  28.     return 0; 
  29.  
  30. int on_headers_complete(llhttp_t* parser){ 
  31.     printf("on_headers_complete, major: %d, major: %d, keep-alive: %d, upgrade: %d\n", parser->http_major, parser->http_minor, llhttp_should_keep_alive(parser), parser->upgrade); 
  32.     return 0; 
  33.  
  34. int on_body(llhttp_t* parser, const charat, size_t length){ 
  35.     char body[MAX_LEN]; 
  36.     strncpy(body, at, length); 
  37.     body[length] = '\0'
  38.     printf("on_body: %s\n", body); 
  39.     return 0; 
  40.  
  41. int on_message_complete(llhttp_t* parser){ 
  42.     printf("on_message_complete\n"); 
  43.     return 0; 
  44.  
  45. int main(){ 
  46.     llhttp_t parser; 
  47.     llhttp_settings_t settings; 
  48.     llhttp_settings_init(&settings); 
  49.     llhttp_init(&parser, HTTP_REQUEST, &settings); 
  50.  
  51.     settings.on_message_begin = on_message_begin; 
  52.     settings.on_url = on_url; 
  53.     settings.on_header_field = on_header_field; 
  54.     settings.on_header_value = on_header_value; 
  55.     settings.on_headers_complete = on_headers_complete; 
  56.     settings.on_body = on_body; 
  57.     settings.on_message_complete = on_message_complete; 
  58.  
  59.     const char* request = "POST /index.html HTTP/1.1\r\nconnection:close\r\ncontent-length: 1\r\n\r\n1\r\n\r\n"
  60.     int request_len = strlen(request); 
  61.  
  62.     enum llhttp_errno err = llhttp_execute(&parser, request, request_len); 
  63.      
  64.     if (err != HPE_OK) { 
  65.         fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err), 
  66.         parser.reason); 
  67.     } 
  68.  
  69.  
  70.     return 0; 

接著看解析響應(yīng)的例子。

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include "llhttp.h" 
  4. #define MAX_LEN 2048 
  5. int on_message_begin(llhttp_t* parser){ 
  6.     printf("parse start\n"); 
  7.     return 0; 
  8.  
  9. int on_url(llhttp_t* parser, const charat, size_t length){ 
  10.     char url[MAX_LEN]; 
  11.     strncpy(url, at, length); 
  12.     url[length] = '\0'
  13.     printf("on_url: %s\n", url); 
  14.     return 0; 
  15.  
  16. int on_status(llhttp_t* parser, const charat, size_t length){ 
  17.     char status[MAX_LEN]; 
  18.     strncpy(status, at, length); 
  19.     status[length] = '\0'
  20.     printf("on_status: %s\n", status); 
  21.     return 0; 
  22.  
  23. int on_header_field(llhttp_t* parser, const charat, size_t length){ 
  24.     char header_field[MAX_LEN]; 
  25.     strncpy(header_field, at, length); 
  26.     header_field[length] = '\0'
  27.     printf("head field: %s\n", header_field); 
  28.     return 0; 
  29.  
  30. int on_header_value(llhttp_t* parser, const charat, size_t length){ 
  31.     char header_value[MAX_LEN]; 
  32.     strncpy(header_value, at, length); 
  33.     header_value[length] = '\0'
  34.     printf("head value: %s\n", header_value); 
  35.     return 0; 
  36.  
  37. int on_headers_complete(llhttp_t* parser){ 
  38.     printf("on_headers_complete, major: %d, major: %d, keep-alive: %d, upgrade: %d\n", parser->http_major, parser->http_minor, llhttp_should_keep_alive(parser), parser->upgrade); 
  39.     return 0; 
  40.  
  41. int on_body(llhttp_t* parser, const charat, size_t length){ 
  42.     char body[MAX_LEN]; 
  43.     strncpy(body, at, length); 
  44.     body[length] = '\0'
  45.     printf("on_body: %s\n", body); 
  46.     return 0; 
  47.  
  48. int on_message_complete(llhttp_t* parser){ 
  49.     printf("on_message_complete\n"); 
  50.     return 0; 
  51.  
  52. int main(){ 
  53.     llhttp_t parser; 
  54.     llhttp_settings_t settings; 
  55.     llhttp_settings_init(&settings); 
  56.     llhttp_init(&parser, HTTP_RESPONSE, &settings); 
  57.  
  58.     settings.on_message_begin = on_message_begin; 
  59.     settings.on_url = on_url; 
  60.     settings.on_status = on_status; 
  61.     settings.on_header_field = on_header_field; 
  62.     settings.on_header_value = on_header_value; 
  63.     settings.on_headers_complete = on_headers_complete; 
  64.     settings.on_body = on_body; 
  65.     settings.on_message_complete = on_message_complete; 
  66.  
  67.     const char* reponse = "HTTP/1.1 200 OK\r\nServer: nginx\r\ncontent-length: 11\r\n\r\nhello:world\r\n\r\n"
  68.     int reponse_len = strlen(reponse); 
  69.  
  70.     enum llhttp_errno err = llhttp_execute(&parser, reponse, reponse_len); 
  71.      
  72.     if (err != HPE_OK) { 
  73.         fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err), 
  74.         parser.reason); 
  75.     } 
  76.  
  77.  
  78.     return 0; 

llhttp 目前支持以下鉤子回調(diào)。

  1. struct llhttp_settings_s { 
  2.   /* Possible return values 0, -1, `HPE_PAUSED` */ 
  3.   llhttp_cb      on_message_begin; 
  4.  
  5.   /* Possible return values 0, -1, HPE_USER */ 
  6.   llhttp_data_cb on_url; 
  7.   llhttp_data_cb on_status; 
  8.   llhttp_data_cb on_header_field; 
  9.   llhttp_data_cb on_header_value; 
  10.  
  11.   /* Possible return values
  12.    * 0  - Proceed normally 
  13.    * 1  - Assume that request/response has no body, and proceed to parsing the 
  14.    *      next message 
  15.    * 2  - Assume absence of body (as above) and make `llhttp_execute()` return 
  16.    *      `HPE_PAUSED_UPGRADE` 
  17.    * -1 - Error 
  18.    * `HPE_PAUSED` 
  19.    */ 
  20.   llhttp_cb      on_headers_complete; 
  21.  
  22.   /* Possible return values 0, -1, HPE_USER */ 
  23.   llhttp_data_cb on_body; 
  24.  
  25.   /* Possible return values 0, -1, `HPE_PAUSED` */ 
  26.   llhttp_cb      on_message_complete; 
  27.  
  28.   /* When on_chunk_header is called, the current chunk length is stored 
  29.    * in parser->content_length. 
  30.    * Possible return values 0, -1, `HPE_PAUSED` 
  31.    */ 
  32.   llhttp_cb      on_chunk_header; 
  33.   llhttp_cb      on_chunk_complete; 
  34.  
  35.   /* Information-only callbacks, return value is ignored */ 
  36.   llhttp_cb      on_url_complete; 
  37.   llhttp_cb      on_status_complete; 
  38.   llhttp_cb      on_header_field_complete; 
  39.   llhttp_cb      on_header_value_complete;}; 

我們也可以以靜態(tài)庫或動(dòng)態(tài)庫的方式使用 llhttp。執(zhí)行 make all 就會(huì)在 build 目錄下生成靜態(tài)和動(dòng)態(tài)庫,我們把頭文件 llhttp.h 和 靜態(tài)庫或動(dòng)態(tài)庫復(fù)制到自己項(xiàng)目里使用就可以,編譯的時(shí)候加上 -lllhttp -L.。

 

總結(jié):llhttp 的使用上還算比較簡(jiǎn)單清晰,如果我們項(xiàng)目里需要解析 HTTP 協(xié)議的話可以試試,使用 demo 可以參考 https://github.com/theanarkh/llhttp-demo。

 

責(zé)任編輯:武曉燕 來源: 編程雜技
相關(guān)推薦

2023-06-30 23:25:46

HTTP模塊內(nèi)存

2017-08-17 13:56:30

JavascriptNode.jsHttp

2014-11-04 09:54:00

Node.jsWeb

2025-10-15 00:26:20

2022-08-28 16:30:34

Node.jsDocker指令

2020-12-08 06:28:47

Node.js異步迭代器

2014-09-12 10:35:09

Node.jsHTTP 206

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2013-11-01 09:34:56

Node.js技術(shù)

2023-01-10 14:11:26

2021-03-04 23:12:57

Node.js異步迭代器開發(fā)

2016-09-18 16:04:24

HTTPNode應(yīng)用

2017-04-24 08:31:26

Node.jsExpress.jsHTTP

2021-01-14 10:48:34

Docker CompNode.js開發(fā)

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2020-02-25 12:27:59

Node.jsWeb開發(fā)前端

2021-11-11 11:13:20

js Npm基礎(chǔ)

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2021-10-23 06:42:46

Node.js 抓取堆快照.js
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

免费精品一区二区三区在线观看| 中文字幕乱码视频| 日韩在线网址| 精品久久久一区二区| 午夜一区二区三区| 亚洲精品18p| 日韩精品电影在线观看| 欧美成人合集magnet| 素人fc2av清纯18岁| 日本免费成人| 狠狠躁夜夜躁人人爽天天天天97| 国产精品一区二区三区四区五区| 男人av资源站| 思热99re视热频这里只精品| 精品1区2区3区| 日韩av中文字幕第一页| 日本在线观看www| eeuss鲁片一区二区三区在线观看| 久久亚洲成人精品| 免费看黄色的视频| www.成人网| 91精品婷婷国产综合久久竹菊| 欧洲精品国产| 国产v片在线观看| 日韩电影在线免费看| 欧美精品一区三区| 久久久久麻豆v国产| 精品影片在线观看的网站| 精品久久久久99| 17c国产在线| 成人精品高清在线视频| 精品久久久久久久久中文字幕 | 1级黄色大片儿| 日韩1区在线| 国产亚洲一级高清| 90岁老太婆乱淫| 色综合久久中文| 亚洲高清一区二| 五月天丁香社区| 欧美大片91| 日韩一级片网址| 亚洲一区二区中文字幕在线观看| 欧美日韩色网| 久久99国产精品二区高清软件| 亚洲一区网站| 一区二区三区在线视频免费观看| 国产欧美日韩免费| 无码人妻丰满熟妇精品区| 国产精品嫩草99av在线| 91成人免费观看网站| jizz国产免费| 99视频+国产日韩欧美| 国外视频精品毛片| 国产精品久久久免费视频| 国户精品久久久久久久久久久不卡| 日韩高清中文字幕| 欧美熟妇精品一区二区蜜桃视频| 欧美日韩免费观看视频| 一本色道久久综合狠狠躁的推荐| 亚洲电影一二三区| 国产黄在线看| 国产精品麻豆一区二区| 亚洲人一区二区| 91se在线| 亚洲欧美一区二区三区久本道91| 久久99精品久久久久久久久久 | 免费看a在线观看| 中文字幕av一区二区三区免费看| 国产伦视频一区二区三区| 韩国av在线免费观看| 97久久精品人人做人人爽50路| 国产一区二区丝袜| 国产美女免费视频| 成人一道本在线| 欧美日韩综合久久| 男人在线资源站| 伊人一区二区三区| 乱妇乱女熟妇熟女网站| www成人在线视频| 欧美一区二区福利在线| 国产人妻黑人一区二区三区| 亚洲欧美tv| 日日噜噜噜夜夜爽亚洲精品 | 国产中文精品久高清在线不| 永久免费看mv网站入口亚洲| 女同久久另类69精品国产| 综合激情在线| 欧美一级在线亚洲天堂| 中文字幕网址在线| 高清av一区二区| 欧洲视频一区二区三区| www免费视频观看在线| 精品欧美国产一区二区三区| 91插插插插插插插插| 伊人久久噜噜噜躁狠狠躁| 亚洲男人的天堂在线| 亚洲精品久久久久久国| 一区二区三区四区五区在线| 国产精品久久一区| 欧美一级特黄aaaaaa| 欧美国产日韩a欧美在线观看| 区一区二区三区中文字幕| 国产欧美黑人| 色婷婷亚洲精品| 深夜视频在线观看| 国内精品视频在线观看| 久久久久久久久亚洲| 中文字幕在线观看第二页| www.成人在线| 好吊色这里只有精品| 欧美成人ⅴideosxxxxx| 精品美女一区二区| 国产一区在线观看免费| 噜噜噜91成人网| 国产成人免费电影| 国产在线69| 欧美午夜在线观看| 国产艳俗歌舞表演hd| 自拍欧美日韩| 成人福利视频网| 美女毛片在线看| 午夜av电影一区| 在线成人精品视频| 亚洲女同一区| 国产色视频一区| 国产一区二区三区不卡在线| 精品福利视频导航| 中文字幕在线观看91| 91tv官网精品成人亚洲| 国产精品免费视频久久久| 日韩欧美在线番号| 姬川优奈aav一区二区| 中文字幕永久免费| 欧美日韩国产亚洲一区| 91精品视频在线| 黄色视屏免费在线观看| 欧美日韩精品福利| 狂野欧美性猛交| 欧美a级一区二区| 五月天久久狠狠| 99re久久| www亚洲欧美| 国产精选久久久| 亚洲美女淫视频| 激情在线观看视频| 综合激情视频| 国产精品久久九九| 黄页在线观看免费| 亚洲国产精品99| 国产成人精品片| 91在线云播放| 精品国产成人av在线免| 国产欧美日韩在线观看视频| 国产精品18久久久久久首页狼| 国产av一区二区三区| 亚洲视频中文字幕| 日本成人在线免费观看| 欧美91福利在线观看| av成人综合网| 美女av在线免费看| 亚洲色图35p| 中国精品一区二区| 国产精品毛片久久久久久久| 激情图片中文字幕| 黄色成人av网站| 久久综合九九| www.一区| 久久91超碰青草是什么| 天堂中文网在线| 在线观看免费视频综合| 亚洲欧美精品久久| 国产69精品久久久久毛片| 五十路熟女丰满大屁股 | 超碰97国产在线| av在线理伦电影| 亚洲人成电影网站| 97久久人国产精品婷婷| 亚洲国产综合在线| 国产精品亚洲无码| 黑人精品欧美一区二区蜜桃| 国产爆乳无码一区二区麻豆| 青青久久av| 国产精品自产拍高潮在线观看| 亚洲日本在线播放| 欧美在线|欧美| 青青青在线视频| 国产亚洲人成网站| 爱情岛论坛亚洲自拍| 久久精品二区三区| 992tv快乐视频| 国产欧美日韩影院| 99久久精品无码一区二区毛片| 日本美女高清在线观看免费| 亚洲精品在线观看视频| 天天干,天天干| 亚洲男同1069视频| 日本黄色特级片| 国产激情一区二区三区| 男人舔女人下面高潮视频| 欧美国产免费| 亚洲欧洲精品一区| 同性恋视频一区| 99热最新在线| 四虎在线精品| 国产激情视频一区| 黄色在线网站噜噜噜| 久久久黄色av| 国产在线播放av| 日韩成人久久久| 国产精品毛片一区二区在线看舒淇| 日韩美女视频一区二区 | 日韩视频在线免费观看| 天堂在线观看av| 欧美一级免费观看| 在线观看免费视频一区| 欧美天天综合色影久久精品| 农村黄色一级片| 国产精品女主播av| 亚洲 小说 欧美 激情 另类| 成人亚洲精品久久久久软件| 99久久99精品| 麻豆精品一二三| 日韩毛片在线免费看| 中文一区二区| 黄网站欧美内射| 亚洲草久电影| 亚洲一区二区三区欧美| 精品久久国产| 日韩视频精品| 国产一区二区三区天码| 久久国产精品精品国产色婷婷| 东京一区二区| 91av中文字幕| av免费不卡国产观看| 久久999免费视频| 91最新在线视频| 久久人人爽人人爽爽久久| av影片免费在线观看| 一区三区二区视频| 国产一区二区三区福利| 国产亚洲激情在线| 美女毛片在线看| 一区二区成人精品| av资源网站在线观看| 国产亚洲激情视频在线| 在线观看二区| 色妞在线综合亚洲欧美| 欧美被日视频| 久久精品99无色码中文字幕| 黄色片网站在线观看| 久久久国产精彩视频美女艺术照福利| 日本成人动漫在线观看| 精品精品国产高清一毛片一天堂| 久久久久久亚洲av无码专区| 色综合天天综合网国产成人综合天 | 亚洲婷婷综合网| 色综合久久久久久久久久久| 69xxxx国产| 欧美日韩激情一区二区| 国产强伦人妻毛片| 精品久久久久香蕉网| 日韩中文字幕综合| 亚洲老板91色精品久久| bbbbbbbbbbb在线视频| 久久久999精品免费| 性欧美ⅴideo另类hd| 久久久久久18| 希岛爱理一区二区三区av高清| 久久视频免费在线播放| 菠萝菠萝蜜在线视频免费观看| 国产亚洲精品日韩| 2017亚洲天堂1024| 欧美高清视频在线播放| 日本不卡1234视频| 国产精品网红直播| 视频一区在线| 欧美日韩国产综合视频在线| 首页国产精品| 蜜臀精品一区二区| 视频在线在亚洲| 日本少妇一区二区三区| 91香蕉视频在线| 黑人狂躁日本娇小| 精品久久久久久久大神国产| 在线观看国产黄| 精品日韩在线观看| 国产免费av在线| 欧美日本高清视频| 日韩视频网站在线观看| 亚洲最大的网站| 亚洲高清极品| 日韩亚洲欧美一区二区| 快she精品国产999| 人妻互换一二三区激情视频| 久久精品亚洲麻豆av一区二区| 亚洲av无码一区二区二三区| 日本一区二区成人| 精品小视频在线观看| 91国产丝袜在线播放| 成人激情四射网| 伊人激情综合网| 99riav视频在线观看| 91在线色戒在线| 精品成人影院| 福利视频免费在线观看| 另类中文字幕网| 国产夫妻性爱视频| 亚洲自拍偷拍av| 国产女18毛片多18精品| 国产一区二区三区在线观看网站| 国内av一区二区三区| 欧美激情a在线| 亚洲成a人片777777久久| 日本免费高清一区二区| 国模 一区 二区 三区| 国产探花在线看| 国产精品色呦呦| 麻豆成人免费视频| 亚洲高清av在线| 性网站在线观看| 91精品国产综合久久香蕉922| 国产在线一区不卡| 天堂av一区二区| 欧美资源在线| 182在线视频| 香蕉av福利精品导航| 亚洲AV无码国产精品午夜字幕| 亚洲国产毛片完整版| 日本电影在线观看| 92国产精品久久久久首页| 99视频精品视频高清免费| 波多野结衣xxxx| 日本一区二区三级电影在线观看 | 91在线国产电影| 97人人精品| 一级黄色特级片| 国产精品视频麻豆| 中文在线免费看视频| 在线视频欧美日韩精品| 久久青草免费| 91免费网站视频| 国内精品久久久久影院薰衣草 | 国产农村妇女毛片精品| 久久九九免费视频| 欧美成人免费全部网站| 亚洲精品成人a8198a| 久久超级碰视频| 永久免费看片直接| 日韩一区二区三区观看| 人人超在线公开视频| 精品卡一卡二| 天堂一区二区在线| 国产黄色片在线| 欧美一区二区三区成人| 在线免费观看污| 丁香五月网久久综合| 国产亚洲激情| 中文字幕免费高清| 欧美日韩激情在线| 三级福利片在线观看| 狠狠久久综合婷婷不卡| 亚洲综合电影一区二区三区| 97在线观看免费视频| 在线成人高清不卡| 欧美videossex另类| 精品一区在线播放| 日韩av一级电影| 成人性生活毛片| 亚洲国产成人在线视频| 久久91导航| av 日韩 人妻 黑人 综合 无码| 久久国产三级精品| 波多野结衣家庭教师| 亚洲大胆美女视频| 蜜桃精品在线| 特级西西444| 久久久久久久久伊人| 91精品国产乱码久久久| 欧美激情xxxx| 国内亚洲精品| 2018国产精品| 欧美性videosxxxxx| 伦理av在线| 日本中文不卡| 国产a视频精品免费观看| 在线观看日本网站| 久久影院模特热| 色老板在线视频一区二区| 日韩av自拍偷拍| 精品久久久免费| 国产激情小视频在线| 麻豆视频成人| 国产福利不卡视频| 九九热最新视频| 欧美激情第1页| 日本欧美国产| 亚洲天堂成人av| 欧美一区二区三区爱爱| 无人区在线高清完整免费版 一区二| 免费久久99精品国产自|