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

聊聊No.js 支持 HTTP 模塊

開發 前端
No.js 初步支持了 HTTP 能力,目前只是支持解析 HTTP 請求,很多地方還需要慢慢琢磨,本文簡單介紹其實現。

[[427158]]

1 HTTP 解析器

No.js 使用 Node.js 的 HTTP 解析器 llhttp 實現 HTTP 協議的解析,llhttp 負責解析 HTTP 報文,No.js 需要做的事情是保存解析的結果并封裝具體的能力。看看 No.js 是如何封裝 llhttp 的。

  1. class HTTP_Parser { 
  2.     public
  3.         HTTP_Parser(llhttp_type type, parser_callback callbacks = {}) { 
  4.             llhttp_init(&parser, type, &HTTP_Parser::settings); 
  5.             // set data after llhttp_init, because llhttp_init will call memset to fill zero to memory  
  6.             parser.data = this; 
  7.             memset((void *)&callback, 0, sizeof(callback)); 
  8.             callback = callbacks; 
  9.         } 
  10.  
  11.         int on_message_begin(llhttp_t* parser); 
  12.         int on_status(llhttp_t* parser, const charat, size_t length); 
  13.         int on_url(llhttp_t* parser, const charat, size_t length); 
  14.         int on_header_field(llhttp_t* parser, const charat, size_t length); 
  15.         int on_header_value(llhttp_t* parser, const charat, size_t length); 
  16.         int on_headers_complete(llhttp_t* parser); 
  17.         int on_body(llhttp_t* parser, const charat, size_t length); 
  18.         int on_message_complete(llhttp_t* parser); 
  19.         int parse(const char* data, int len); 
  20.         void print(); 
  21.     private:  
  22.         unsigned char major_version; 
  23.         unsigned char minor_version; 
  24.         unsigned char upgrade; 
  25.         unsigned char keepalive; 
  26.         time_t parse_start_time; 
  27.         time_t header_end_time; 
  28.         time_t message_end_time; 
  29.         string url; 
  30.         string status; 
  31.         vector<string> keys; 
  32.         vector<string> values
  33.         string body; 
  34.         llhttp_t parser; 
  35.         parser_callback callback; 
  36.         static llhttp_settings_t settings; 
  37. }; 

HTTP_Parser 是對 llhttp 的封裝,主要是注冊 llhttp 的鉤子,llhttp 在解析 HTTP 報文的時候會回調 HTTP_Parser 的鉤子。比較麻煩的是需要在 HTTP_Parser 對象里保存 llhttp 的解析結果,把 HTTP_Parser 類的成員函數轉成 c 函數作為 llhttp 的回調非常麻煩,問題在于如何在 llhttp 執行回調的時候找到對應的 HTTP_Parser 對象。比如 llhttp 的 on_message_begin 回調格式是

  1. typedef int (*llhttp_cb)(llhttp_t*); 

我們看到回調里只有 llhttp 相關的數據結構,拿不到 HTTP_Parser 對象,最終發現 llhttp 提供了 data 字段關聯上下文。所以在 HTTP_Parser 初始化時關聯 llhttp 和 HTTP_Parser 的上下文。

  1. HTTP_Parser(llhttp_type type, parser_callback callbacks = {}) { 
  2.     llhttp_init(&parser, type, &HTTP_Parser::settings); 
  3.     parser.data = this; 

我們在 llhttp 回調時通過 data 字段就可以取得 HTTP_Parser 對象。下面是所有鉤子的實現。

  1. llhttp_settings_t No::HTTP::HTTP_Parser::settings = { 
  2.     [](llhttp_t * parser) { 
  3.         return ((HTTP_Parser *)parser->data)->on_message_begin(parser); 
  4.     }, 
  5.     [](llhttp_t * parser, const char * data, size_t len) { 
  6.         return ((HTTP_Parser *)parser->data)->on_url(parser, data, len); 
  7.     }, 
  8.     [](llhttp_t * parser, const char * data, size_t len) { 
  9.         return ((HTTP_Parser *)parser->data)->on_status(parser, data, len); 
  10.     }, 
  11.     [](llhttp_t * parser, const char * data, size_t len) { 
  12.         return ((HTTP_Parser *)parser->data)->on_header_field(parser, data, len); 
  13.     }, 
  14.     [](llhttp_t * parser, const char * data, size_t len) { 
  15.         return ((HTTP_Parser *)parser->data)->on_header_value(parser, data, len); 
  16.     }, 
  17.     [](llhttp_t * parser) { 
  18.         return ((HTTP_Parser *)parser->data)->on_headers_complete(parser); 
  19.     }, 
  20.     [](llhttp_t * parser, const char * data, size_t len) { 
  21.         return ((HTTP_Parser *)parser->data)->on_body(parser, data, len); 
  22.     }, 
  23.     [](llhttp_t * parser) { 
  24.         return ((HTTP_Parser *)parser->data)->on_message_complete(parser); 
  25.     } 
  26. }; 

這樣就完成了 llhttp 和 No.js 的關聯。解析完 HTTP 協議后,最終還需要回調 No.js 的 JS 層。HTTP_Parser 目前支持三種回調。

  1. struct parser_callback { 
  2.     void * data; 
  3.     p_on_headers_complete on_headers_complete; 
  4.     p_on_body on_body; 
  5.     p_on_body_complete on_body_complete; 
  6. }; 

2 HTTP C++ 模塊

完成了 llhttp 的封裝后,接著需要把這個能力暴露到 JS 層。看一下 C++ 模塊到定義。

  1. class Parser : public BaseObject { 
  2.   public
  3.       Parser(Environment* env, Local<Object> object): BaseObject(env, object) { 
  4.           // 注冊到 HTTP_Parser 的回調 
  5.           parser_callback callback = { 
  6.               this, 
  7.               ..., 
  8.               ..., 
  9.               [](on_body_complete_info info, parser_callback callback) { 
  10.                   Parser * parser = (Parser *)callback.data; 
  11.                   Local<Value> cb; 
  12.                   Local<Context> context = parser->env()->GetContext(); 
  13.                   Isolate * isolate = parser->env()->GetIsolate(); 
  14.                   Local <String> key = newStringToLcal(isolate, "onBodyComplete"); 
  15.                   parser->object()->Get(context, key).ToLocal(&cb); 
  16.                   // 回調 JS 層 
  17.                   if (!cb.IsEmpty() && cb->IsFunction()) { 
  18.                       Local<Value> argv[] = { 
  19.                           newStringToLcal(isolate, info.body.c_str()) 
  20.                       }; 
  21.                       cb.As<v8::Function>()->Call(context, parser->object(), 1, argv);   
  22.                   } 
  23.               }, 
  24.           }; 
  25.           httpparser = new HTTP_Parser(HTTP_REQUEST, callback); 
  26.       } 
  27.       void Parse(const char * data, size_t len);  
  28.       static void Parse(const FunctionCallbackInfo<Value>& args);  
  29.       static void New(const FunctionCallbackInfo<Value>& args);  
  30.   private: 
  31.       HTTP_Parser * httpparser; 
  32. }; 

C++ 模塊到定義非常簡單,只是對 HTTP_Parser 的封裝,然后通過 V8 導出能力到 JS 層。

  1. void No::HTTP::Init(Isolate* isolate, Local<Object> target) { 
  2.     Local<FunctionTemplate> parser = FunctionTemplate::New(isolate, No::HTTP::Parser::New); 
  3.     parser->InstanceTemplate()->SetInternalFieldCount(1); 
  4.     parser->SetClassName(newStringToLcal(isolate, "HTTPParser")); 
  5.     parser->PrototypeTemplate()->Set(newStringToLcal(isolate, "parse"), FunctionTemplate::New(isolate, No::HTTP::Parser::Parse)); 
  6.     setObjectValue(isolate, target, "HTTPParser", parser->GetFunction(isolate->GetCurrentContext()).ToLocalChecked()); 

我們看到 C++ 模塊導出了 HTTPParser 到 JS 層,并提供一個 parse方法。JS 層拿到 TCP 層的數據后,通過執行 parse 進行 HTTP 協議的解析,我們看看 parse 對應函數 No::HTTP::Parser::Parse 的實現。

  1. void No::HTTP::Parser::Parse(const FunctionCallbackInfo<Value>& args) { 
  2.     Parser * parser = (Parser *)unwrap(args.This()); 
  3.     Local<ArrayBuffer> arrayBuffer = args[0].As<ArrayBuffer>(); 
  4.     std::shared_ptr<BackingStore> backing = arrayBuffer->GetBackingStore(); 
  5.     const char * data = (const char * )backing->Data(); 
  6.     parser->Parse(data, strlen(data)); 

Parse首先通過 args 拿到 C++ 的對象 Parser(熟悉 Node.js 的同學應該很容易明白這個處理方式)。接著調用 HTTP_Parser 的 parse 方法,在解析的過程中,llhttp 就會執行 HTTP_Parser 的回調, HTTP_Parser 就會執行 Parser 對象的回調,Parser 就會執行 JS 回調。比如解析完 body 后執行 JS 層回調。

  1. [](on_body_complete_info info, parser_callback callback) { 
  2.     Parser * parser = (Parser *)callback.data; 
  3.     Local<Value> cb; 
  4.     Local<Context> context = parser->env()->GetContext(); 
  5.     Isolate * isolate = parser->env()->GetIsolate(); 
  6.     Local <String> key = newStringToLcal(isolate, "onBodyComplete"); 
  7.     parser->object()->Get(context, key).ToLocal(&cb); 
  8.     if (!cb.IsEmpty() && cb->IsFunction()) { 
  9.         Local<Value> argv[] = { 
  10.             newStringToLcal(isolate, info.body.c_str()) 
  11.         }; 
  12.         cb.As<v8::Function>()->Call(context, parser->object(), 1, argv);   
  13.     } 
  14. }, 

就是找到 JS 設置的 onBodyComplete 函數并執行。結構如下。

3 JS 層

完成了底層的封裝和能力導出,接下來就是 JS 層的實現,首先看看 一個使用例子。

  1. const { 
  2.     console,} = No;const { http } = No.libs; 
  3.  
  4. http.createServer({host: '127.0.0.1', port: 8888}, (req, res) => { 
  5.     console.log(JSON.stringify(req.headers)); 
  6.     req.on('data', (buffer) => { 
  7.         console.log(buffer); 
  8.     }); 
  9. }); 

和 Node.js 很相似,接下來看看具體實現。先看 TCP 層的封裝。

  1. class Server extends events { 
  2.     fd = -1; 
  3.     connections = 0; 
  4.     constructor(options = {}) { 
  5.         super(); 
  6.         const fd = tcp.socket(constant.domain.AF_INET, constant.type.SOCK_STREAM); 
  7.         this.fd = fd; 
  8.         tcp.bind(fd, options.host, options.port); 
  9.         tcp.listen(fd, 512, (clientFd) => { 
  10.             this.connections++; 
  11.             const serverSocket = new ServerSocket({fd: clientFd}); 
  12.             this.emit('connection', serverSocket); 
  13.         }); 
  14.     } 

createServer 的時候會監聽傳入的地址,從而啟動一個服務器,listen 回調執行說明有連接到來,我們新建一個 ServerSocket 對象表示和客戶端通信的 Socket。并觸發 connection 事件到上層。接著看 ServerSocket 的實現

  1. class ServerSocket extends Socket { 
  2.     constructor(options = {}) { 
  3.         super(options); 
  4.         this.fd = options.fd; 
  5.         this.read(); 
  6.     } 
  7.     read() { 
  8.         const buffer = new ArrayBuffer(1024); 
  9.         tcp.read(this.fd, buffer, 0, (status) => { 
  10.             this.emit('data', buffer); 
  11.             this.read(); 
  12.         }) 
  13.     } 

ServerSocket 的實現目前很簡單,主要是讀取數據并觸發 data 事件,因為 TCP 只是負責數據傳輸,不負責數據解析。有了這個能力后,我們看看 http 層的實現。

  1. function createServer(...arg) { 
  2.     return new Server(...arg);} 
  3.  
  4. class Server extends No.libs.tcp.Server { 
  5.     constructor(options = {}, cb) { 
  6.         super(options); 
  7.         this.options = options; 
  8.         if (typeof cb === 'function') { 
  9.             this.on('request', cb); 
  10.         } 
  11.         this.on('connection', (socket) => { 
  12.             new HTTPRequest({socket, server: this}); 
  13.         }); 
  14.     } 

http 模塊繼承于 tcp 模塊,所以我們調用 http.createServer 的時候,會先執行 tcp 模塊啟動一個服務器,http 層監聽 connection 事件等待連接到來,有連接到來時,http 創建一個 HTTPRequest 對象表示 http 請求。

  1. class HTTPRequest extends No.libs.events { 
  2.     socket = null
  3.     httpparser = null
  4.     constructor({socket, server}) { 
  5.         super(); 
  6.         this.server = server; 
  7.         this.socket = socket; 
  8.         this.httpparser = new HTTPParser(); 
  9.         this.httpparser.onHeaderComplete = (data) => { 
  10.             this.major = data.major; 
  11.             this.minor = data.minor; 
  12.             this.keepalive = data.keepalive; 
  13.             this.upgrade = data.upgrade; 
  14.             this.headers = data.headers; 
  15.             this.server.emit('request', this); 
  16.         } 
  17.         this.httpparser.onBody = (data) => { 
  18.             this.emit('data', data); 
  19.         } 
  20.         this.httpparser.onBodyComplete = (data) => { 
  21.             // console.log(data); 
  22.         } 
  23.  
  24.         socket.on('data', (buffer) => { 
  25.             this.httpparser.parse(buffer); 
  26.         }); 
  27.     } 

HTTPRequest 的邏輯如下 1. 保存底層的 socket 2. 新建一個 HTTPParser 解析 HTTP 協議。3. 監聽 data 事件,收到 TCP 層數據后調用 HTTP 解析器解析。4. 注冊 HTTP 解析的回調鉤子,就是前面講到的。等到解析完 HTTP header 后,也就是執行 onHeaderComplete 回調后,No.js 就會通過觸發 request事件 回調業務層,也就是 createServer 傳入的回調。業務層可以監聽 HTTPRequest 的 data 事件,當 HTTP 請求有 body 數據時,就會注冊 HTTPRequest 的 data 事件回調業務層。

4 總結

 

 

 

雖然目前只是粗糙地實現了 HTTP 模塊,但實現的過程中,涉及到的內容還是挺多的,后面有時間再慢慢完善。有興趣的同學可以到 https://github.com/theanarkh/No.js 了解。

 

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

2021-07-09 00:24:10

No.jsNode.js原理

2021-09-16 05:32:31

No.js 模塊加載器module1.js

2021-09-26 05:06:04

Node.js模塊機制

2024-02-29 18:06:39

HTTP性能優化

2023-03-27 08:49:51

2023-06-30 23:25:46

HTTP模塊內存

2022-05-09 08:34:01

FeignhttpJava

2021-10-03 15:02:50

HTTPNodejs

2022-10-08 00:07:00

JSV8調用棧

2022-09-30 00:03:03

JS斷點線程

2016-11-28 09:00:10

瀏覽器瀏覽器緩存服務端

2021-09-05 17:46:21

云計算No.jsio_uringJS

2020-10-22 10:43:55

HTTP框架AOP

2021-10-05 20:12:57

No.jsV8 編碼

2022-05-27 07:01:48

JSGIF總幀數

2021-01-27 05:28:38

工具RestSharpHTTP

2022-06-13 07:36:47

useEffectHooks

2024-05-13 08:04:26

Vue.jsWeb應用程序

2024-04-07 08:23:01

JS隔離JavaScript

2021-11-06 18:40:27

js底層模塊
點贊
收藏

51CTO技術棧公眾號

亚洲精品视频三区| 久久精品国产美女| 青青操国产视频| 澳门久久精品| 欧美日韩国产在线看| 亚洲国产精品一区二区第四页av| 91高潮大合集爽到抽搐| 国模一区二区三区| 亚洲区在线播放| 视频区 图片区 小说区| 九九色在线视频| 国产视频一区二区在线| 99c视频在线| 国内av在线播放| 欧美日韩亚洲一区| 日韩精品一区二区视频| 欧美成人福利在线观看| 欧美伦理91| 伊人开心综合网| 日韩免费三级| 天天爽夜夜爽夜夜爽| 久久精品国产一区二区| 欧美一级电影免费在线观看| 日本精品人妻无码77777| 女人丝袜激情亚洲| 欧美成va人片在线观看| 污污的视频免费| 日韩av大片站长工具| 亚洲一区二区三区在线看| 亚洲精品在线视频观看| 欧美精品a∨在线观看不卡 | 日韩美女国产精品| 91精品国产91久久久久久最新毛片| 成年人视频观看| 日本在线视频中文有码| 一区二区中文视频| 日韩中文一区| 加勒比一区二区三区在线| bt7086福利一区国产| 亚洲最大成人免费视频| 91精品中文字幕| 蜜臀va亚洲va欧美va天堂 | 人妻av无码专区| 黄在线免费观看| 国产精品国产三级国产aⅴ原创 | 色呦呦呦在线观看| 综合网在线视频| 亚洲在线色站| 日本在线观看www| 欧美激情一二三区| 日韩三级在线播放| 国产视频精选在线| 日本一区二区三区四区| 欧美一区二区三区在线播放| 日韩大胆人体| 久久久精品tv| 神马影院午夜我不卡影院| 毛片免费在线| 日本一区二区免费在线观看视频| 欧美一区国产一区| 国产乱子伦三级在线播放| 国产视频911| 亚洲人体一区| 欧美成人视屏| 一区二区三区日韩欧美精品| 成人一级生活片| 黄色羞羞视频在线观看| 欧美日韩国产综合视频在线观看中文| 免费看黄在线看| 国偷自产一区二区免费视频| 一本色道久久综合亚洲91| 国产又黄又猛视频| 日本亚洲欧洲无免费码在线| 51精品国自产在线| 精品熟女一区二区三区| 国内毛片久久| 亚洲天堂男人天堂| 国产天堂av在线| 影院欧美亚洲| 国产成人综合精品在线| 在线黄色av网站| 国产精品白丝av| 久久国产精品一区二区三区四区| 欧美套图亚洲一区| 国产精品国产a级| 97超碰国产精品| 欧美色999| 日韩一区二区三区精品视频| 人体私拍套图hdxxxx| 国产欧美久久一区二区三区| 久久精品夜夜夜夜夜久久| 久草福利资源在线观看| 久久久国产精品一区二区中文| 国产精品久久中文| 亚洲精品久久久狠狠狠爱| 久久精品网站免费观看| 手机福利在线视频| 涩涩视频在线播放| 制服丝袜日韩国产| 欧美色图亚洲激情| 久久久久美女| 日韩av免费在线| 国产高清免费观看| 国产调教视频一区| 久久av综合网| 欧美成人高清视频在线观看| 精品国产一区二区三区久久影院| 成人午夜剧场视频网站| 欧美 亚欧 日韩视频在线 | 成人春色在线观看免费网站| 国产一区二区三区三区在线观看| 青娱乐国产在线视频| 青娱乐精品在线视频| 黑人另类av| 成人在线网址| 欧美中文字幕一区二区三区| 中文视频在线观看| 亚洲五月综合| 国产精品久久久久9999| 少妇精品高潮欲妇又嫩中文字幕 | xxxxxxxxx欧美| 亚洲婷婷综合网| 成人18精品视频| 成人黄色片免费| 一区二区三区| 色噜噜狠狠色综合网图区| 伊人手机在线视频| 暴力调教一区二区三区| 777久久精品一区二区三区无码| 91成人在线| 亚洲日本欧美中文幕| 国产精品白浆一区二小说| 狠狠色狠狠色综合系列| 先锋影音亚洲资源| 欧美日韩国产网站| 亚洲精品一区中文| 制服.丝袜.亚洲.中文.综合懂色| 国产福利一区二区三区视频在线 | 国产天堂av在线| 蜜桃精品视频在线| 亚洲国产高清国产精品| 亚洲四虎影院| 伊人av综合网| 波多野结衣在线电影| 久久精品一区二区三区四区| 国产xxxxx在线观看| 亚洲国产欧美日韩在线观看第一区| 欧美激情综合亚洲一二区| www香蕉视频| 亚洲综合色丁香婷婷六月图片| 国产精品熟女一区二区不卡| 亚洲色图88| av免费精品一区二区三区| 国产在线一区二区视频| 欧美一区二区在线看| 欧美一区二区三区爽爽爽| 国产精品亚洲综合一区在线观看| 亚洲天堂av免费在线观看| 国产一区二区三区免费观看在线 | 日韩av中文字幕在线播放| 日产精品久久久久久久| 91偷拍与自偷拍精品| 免费在线观看毛片网站| 日韩精品一区二区久久| 成人福利在线视频| 五月天激情在线| 亚洲国产精久久久久久| 亚洲成人第一网站| 中文字幕av不卡| 涩多多在线观看| 在线欧美三区| 日本一区二区三区免费观看| 国产精品蜜月aⅴ在线| 久久综合色88| 全国男人的天堂网| 色婷婷精品大在线视频 | 日本久久一级片| 色又黄又爽网站www久久| 免费一级特黄3大片视频| 国内精品在线播放| 无码粉嫩虎白一线天在线观看 | 日产精品久久久久久久蜜臀| 国产日韩三级| 国产精品久久久精品| 久久久久久国产精品免费无遮挡| 日韩久久精品一区| 日批视频免费在线观看| 亚洲欧洲av一区二区三区久久| 伊人av在线播放| 久久国产精品亚洲77777| 超碰免费在线公开| 亚洲精品亚洲人成在线观看| 国产精品网址在线| 超碰中文在线| 日韩中文综合网| 色一情一乱一乱一区91av| 欧美在线你懂的| 国产无遮挡裸体免费视频| 国产午夜亚洲精品理论片色戒| 免费不卡av网站| 久久久久免费| 成年在线观看视频| 午夜精品福利影院| 1卡2卡3卡精品视频| 惠美惠精品网| 久久久免费观看| 久久99精品久久久久久野外| 亚洲毛片一区二区| 成人黄色在线观看视频| 91国偷自产一区二区开放时间 | 成人免费无码大片a毛片| 美女一区二区久久| 国产肥臀一区二区福利视频| 一区二区三区四区电影| 欧美在线一区二区三区四区| 亚洲精品一二三**| 国产日韩欧美黄色| 成人自拍av| 91国产在线精品| 午夜伦理大片视频在线观看| 最近2019好看的中文字幕免费| 婷婷伊人综合中文字幕| 欧美岛国在线观看| av高清一区二区| 欧美日韩成人综合天天影院 | 日韩av一区二区在线| 国产黄色免费大片| 在线成人午夜影院| 亚洲天堂男人网| 欧美视频一区二| 久久精品国产成人av| 亚洲最大成人综合| 色在线观看视频| 成人免费在线观看入口| 午夜黄色福利视频| 国产精品美女久久久久aⅴ| 六月婷婷七月丁香| 国产日韩精品一区二区三区在线| 人妻无码中文久久久久专区| 国产91丝袜在线播放0| 国产又粗又长又爽又黄的视频| 久久99精品久久久久久| 牛夜精品久久久久久久| 蜜臀久久99精品久久久久宅男| 亚洲 中文字幕 日韩 无码| 久久久久国产精品一区二区| 日韩av资源在线| 久久亚洲精选| wwww.国产| 久久狠狠亚洲综合| 男女污污视频网站| 国产美女av一区二区三区| 奇米777在线视频| 成人教育av在线| 国产精品第七页| 日本一区二区三区四区| 潘金莲一级黄色片| 亚洲最新在线观看| 韩国av免费观看| 色综合激情久久| 亚洲综合精品视频| 91精品国产麻豆国产自产在线| 99riav国产| 亚洲国产精品va在线| 午夜国产在线观看| 精品视频在线播放色网色视频| 免费在线国产| 久久韩国免费视频| tube8在线hd| 国产成人精品免高潮在线观看| 欧美国产日韩电影| 7777精品伊久久久大香线蕉语言| 99re热精品视频| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 日本高清免费不卡视频| 一本色道久久综合精品婷婷| 日韩午夜电影在线观看| 深夜福利视频一区| 日韩在线视频观看| 九色91在线| 国产精品wwwwww| 久久精品免视看国产成人| 国产日韩在线一区二区三区| 中日韩免视频上线全都免费| 一区二区三区四区不卡| 国产在线成人| 天美星空大象mv在线观看视频| 国产在线精品一区二区| 日本japanese极品少妇| 国产精品蜜臀在线观看| 国产精品不卡av| 欧美日韩日日夜夜| 无码精品在线观看| 日韩在线高清视频| 欧美aa在线观看| 亚洲精品日韩av| 国产一区日韩| 黄色一级片黄色| 美女视频黄免费的久久| 五月天激情小说| 综合精品久久久| 日韩免费av网站| 亚洲精品在线一区二区| 免费av在线| 国产精品99久久久久久白浆小说| 日韩精品成人| 中文字幕av导航| 日韩精品欧美精品| 日本五十肥熟交尾| 亚洲精品日韩专区silk | 日韩精品中文字幕一区 | 久久久久久亚洲精品| 精品自拍视频| 欧美自拍资源在线| 亚洲美女91| 日韩精品国产一区| 亚洲免费观看视频| 中文字幕第315页| 亚洲欧美精品在线| 91超碰国产在线| 国产经品一区二区| 欧美.日韩.国产.一区.二区| 天天插天天操天天射| 2023国产精品自拍| 国产午夜在线播放| 亚洲白虎美女被爆操| 婷婷av在线| 99www免费人成精品| 欧美91精品| 佐山爱在线视频| 亚洲色图都市小说| 中文字幕av影视| 中文字幕av一区| www.26天天久久天堂| 日本一区二区三不卡| 天堂va蜜桃一区二区三区| 91精品人妻一区二区| 偷偷要91色婷婷| 天天操天天操天天操| 隔壁老王国产在线精品| 超碰成人在线免费| 亚洲 欧美 综合 另类 中字| 国产suv精品一区二区6| 国产一级aa大片毛片| 精品国产一区二区三区久久久蜜月 | 日韩av字幕| 国产特级黄色大片| 91蜜桃在线观看| 亚洲午夜18毛片在线看| 亚洲全黄一级网站| 国产美女久久| 国产奶头好大揉着好爽视频| 精品一区二区三区不卡 | 激情综合久久| 中文字幕乱码一区| 欧美性猛交xxxx黑人| 久久国产精品高清一区二区三区| 国产91网红主播在线观看| 视频精品在线观看| 中日韩av在线播放| 亚洲欧美一区二区三区极速播放 | 色吧影院999| 久久伊人久久| 无码av天堂一区二区三区| 91视频你懂的| 91porny九色| 麻豆乱码国产一区二区三区| 999久久久精品一区二区| 日本午夜激情视频| 国产拍揄自揄精品视频麻豆| 亚洲视频在线免费播放| 欧美成人激情在线| 精品亚洲自拍| 色综合天天色综合| 一区二区三区四区在线播放| 天天干天天操av| 国产精品久久婷婷六月丁香| 影视一区二区| aaaaa一级片| 欧美人牲a欧美精品| 国产探花在线观看| 色就是色欧美| 成人av网站免费观看| 国产乡下妇女三片| 美日韩精品视频免费看| 亚洲电影一级片| 日韩 国产 一区| 色猫猫国产区一区二在线视频| 麻豆影视在线观看_| 精品九九九九| 国产在线乱码一区二区三区| 男女啊啊啊视频| 久久久精品2019中文字幕神马| 国产精品网在线观看| 污版视频在线观看| 欧美日韩激情美女| 成人免费在线| 小说区图片区图片区另类灬| 成人精品视频网站| 91超薄丝袜肉丝一区二区|