成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Node.js HTTP 解析器 llhttp 的使用

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

[[427068]]

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

llhttp 項目是 Node.js 中的子項目,地址在:

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

使用步驟如下:

1. 安裝 npx:npm i npx -g

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

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

下面看看如何使用。llhttp 使用回調鉤子的設計思想,初始化解析器的時候,我們可以設置解析類型,是請求或響應報文,然后設置解析狀態的回調,比如解析道 URL 時回調,解析到 header 時回調。接著傳入報文執行 llhttp_execute 就可以,下面是解析請求報文的例子。

  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; 

接著看解析響應的例子。

  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 目前支持以下鉤子回調。

  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;}; 

我們也可以以靜態庫或動態庫的方式使用 llhttp。執行 make all 就會在 build 目錄下生成靜態和動態庫,我們把頭文件 llhttp.h 和 靜態庫或動態庫復制到自己項目里使用就可以,編譯的時候加上 -lllhttp -L.。

 

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

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2017-08-17 13:56:30

JavascriptNode.jsHttp

2023-06-30 23:25:46

HTTP模塊內存

2014-11-04 09:54:00

Node.jsWeb

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

2013-11-01 09:34:56

Node.js技術

2023-01-10 14:11:26

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2021-03-04 23:12:57

Node.js異步迭代器開發

2016-09-18 16:04:24

HTTPNode應用

2021-10-23 06:42:46

Node.js 抓取堆快照.js

2020-02-25 12:27:59

Node.jsWeb開發前端

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2021-01-14 10:48:34

Docker CompNode.js開發

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2017-04-24 08:31:26

Node.jsExpress.jsHTTP

2021-11-11 11:13:20

js Npm基礎

2020-10-12 08:06:28

HTTP 服務器證書
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕亚洲精品在线观看 | 日韩2020狼一二三 | 精品久久久久久一区二区 | 精品国产乱码久久久久久蜜柚 | 欧美激情一区二区三区 | 欧美激情一区二区 | 久久久久久成人 | 亚洲精品乱码8久久久久久日本 | 欧美区日韩区 | 久久久www成人免费精品 | 91精品国产91久久久久游泳池 | 欧美一区二区在线观看 | 欧美一区二区在线播放 | 国产在线精品一区二区三区 | 九九在线视频 | 精品一区二区三区免费视频 | 亚洲不卡在线观看 | 一区二区三区回区在观看免费视频 | 欧美精品一区二区在线观看 | 一级做a爰片性色毛片视频停止 | 亚洲一级视频在线 | 成人不卡 | 国产精品日韩一区二区 | 国产精品久久久久aaaa | 亚洲精选一区 | 日本高清视频网站 | 国产一区二区三区久久久久久久久 | 欧美日韩精品久久久免费观看 | 欧美一级在线 | 日韩一区中文字幕 | 欧美日韩精品综合 | 麻豆av片 | 久久久高清 | 久草在线青青草 | 夜夜爽99久久国产综合精品女不卡 | 国产欧美精品区一区二区三区 | 久久久做 | 亚欧性视频 | 国产精品96久久久久久 | 精品国产一区二区在线 | 鲁大师一区影视 |