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

Go語言的Http 中間件實現

網絡 網絡管理
這篇文章,我會給大家介紹怎么自己去實現一個自定義的middleware模式。以及通過使用第三方的中間件軟件包的一些具體的實例。

當你正在構建一個Web應用程序有可能要運行許多(甚至全部)的HTTP請求一些共享功能,你可能想記錄每一個request,gzip壓縮的每個response,或者做一些繁重的處理或者緩存檢查。

實現這個共享功能的一種方法是將其設置為中間件,他可以作為一個獨立的程序,在正常的handlers處理之前。根本不需要重寫代碼:如果你想用一個中間件,就把它加上應用中;如果你改變主意了,去掉就好了。就這么簡單。

  1. ServeMux => Middleware Handler => Application Handler 

這篇文章,我會給大家介紹怎么自己去實現一個自定義的middleware模式。以及通過使用第三方的中間件軟件包的一些具體的實例。

基本原則:

在Go語言中實現和使用middleware是非常簡單的。

使我們的中間件能搞滿足 http.handlers 這個接口

建立一個 handlers 鏈,使其能夠滿足中間件的 handler 和 正常應用的 handler,并且能夠注冊到 http.ServeMux

我來解釋如何實現:

首先你要知道go 的http handle,這里假設你是知道的

  1. func messageHandler(message string) http.Handler { 
  2.  
  3. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
  4.  
  5. w.Write([]byte(message) 
  6.  
  7. }) 
  8.  

這上面這個代碼片段里面我們的邏輯很簡單只是一個簡單的 w.Write() 然后我們使用 http.HandlerFunc 適配器來轉化這個閉包,并返回。

我們可以使用一個相同的方法來創建一個 handler 鏈。可以使用 handler 代替參數 string 傳進閉包,然后把控制 handler 給傳進來的 handler,并且調用 ServeHTTP() 方法。

這給了我們一個完整的模式構建中間件:

  1. func exampleMiddleware(next http.Handler) http.Handler { 
  2.  
  3. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
  4.  
  5. // Our middleware logic goes here... 
  6.  
  7. next.ServeHTTP(w, r) 
  8.  
  9. }) 
  10.  

你注意到這個中間件有一個這樣的函數結構 func(http.Handler) http.Handler 。它接受一個 handler 作為參數,并且返回一個 handler。這里有兩個很有用的原因:

因為這個函數返回一個句柄可以直接供中間件注冊

我們可以建立任意長度的 handler 鏈來通過中間件的方法互相嵌套

比如:

  1. http.Handle("/", middlewareOne(middlewareTwo(finalHandler))) 

控制流說明:

讓我們來看一個帶有多個中間件的例子,并且把日志輸出到控制臺:

  1. package main 
  2.  
  3. import ( 
  4.  
  5. "log" 
  6.  
  7. "net/http" 
  8.  
  9.  
  10. func middlewareOne(next http.Handler) http.Handler { 
  11.  
  12. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
  13.  
  14. log.Println("Executing middlewareOne"
  15.  
  16. next.ServeHTTP(w, r) 
  17.  
  18. log.Println("Executing middlewareOne again"
  19.  
  20. }) 
  21.  
  22.  
  23. func middlewareTwo(next http.Handler) http.Handler { 
  24.  
  25. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
  26.  
  27. log.Println("Executing middlewareTwo"
  28.  
  29. if r.URL.Path != "/" { 
  30.  
  31. return 
  32.  
  33.  
  34. next.ServeHTTP(w, r) 
  35.  
  36. log.Println("Executing middlewareTwo again"
  37.  
  38. }) 
  39.  
  40.  
  41. func final(w http.ResponseWriter, r *http.Request) { 
  42.  
  43. log.Println("Executing finalHandler"
  44.  
  45. w.Write([]byte("OK")) 
  46.  
  47.  
  48. func main() { 
  49.  
  50. finalHandler := http.HandlerFunc(final
  51.  
  52. http.Handle("/", middlewareOne(middlewareTwo(finalHandler))) 
  53.  
  54. http.ListenAndServe(":3000", nil) 
  55.  

然后我們執行 go run main.go 在瀏覽器打開http://localhost:3000。 你會看到下面的輸出。

 [[159858]]

我們能夠很清楚的看到handle的流程控制。我們嵌套他們的返回順序。我們可以通過中間件中得 return 隨時停止handle鏈的控制。

在上面的代碼中我們在middlewareTwo function包含了retrun 語句。我們在瀏覽器中打開http://localhost:3000/foo,我們會看到。

  1. 2015/12/19 04:21:57 Executing middlewareOne 
  2.  
  3. 2015/12/19 04:21:57 Executing middlewareTwo 
  4.  
  5. 2015/12/19 04:21:57 Executing middlewareOne again 
  6.  
  7. 2015/12/19 04:21:57 Executing middlewareOne 
  8.  
  9. 2015/12/19 04:21:57 Executing middlewareTwo 
  10.  
  11. 2015/12/19 04:21:57 Executing middlewareOne again 

我們實現一個真實的項目的示例:

我們實現一個判斷請求是不是XMl的功能,我們要實現一個中間件。用來檢查的請求體的存在。檢查請求體,以確保它是XML。如果其中檢查失敗,我希望我們的中間件輸出錯誤信息然后終止我們的handle處理。

  1. package main 
  2.  
  3. import ( 
  4.  
  5. "bytes" 
  6.  
  7. "net/http" 
  8.  
  9.  
  10. func enforceXMLHandler(next http.Handler) http.Handler { 
  11.  
  12. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
  13.  
  14. // Check for a request body 
  15.  
  16. if r.ContentLength == 0 { 
  17.  
  18. http.Error(w, http.StatusText(400), 400) 
  19.  
  20. return 
  21.  
  22.  
  23. // Check its MIME type 
  24.  
  25. buf := new(bytes.Buffer) 
  26.  
  27. buf.ReadFrom(r.Body) 
  28.  
  29. if http.DetectContentType(buf.Bytes()) != "text/xml; charset=utf-8" { 
  30.  
  31. http.Error(w, http.StatusText(415), 415) 
  32.  
  33. return 
  34.  
  35.  
  36. next.ServeHTTP(w, r) 
  37.  
  38. }) 
  39.  
  40.  
  41. func main() { 
  42.  
  43. finalHandler := http.HandlerFunc(final
  44.  
  45. http.Handle("/", enforceXMLHandler(finalHandler)) 
  46.  
  47. http.ListenAndServe(":3000", nil) 
  48.  
  49.  
  50. func final(w http.ResponseWriter, r *http.Request) { 
  51.  
  52. w.Write([]byte("OK")) 
  53.  

為了檢驗我們的中間件是否實現了這個功能,我們首先創建一個XML文件。

  1. $ cat > books.xml  
  2. H. G. Wells  
  3. 8.50   

然后通過使用cURL來進行模擬請求:

  1. $ curl -i localhost:3000 
  2.  
  3. HTTP/1.1 400 Bad Request 
  4.  
  5. Content-Type: text/plain; charset=utf-8 
  6.  
  7. Content-Length: 12 
  8.  
  9. Bad Request 
  10.  
  11. $ curl -i -d "This is not XML" localhost:3000 
  12.  
  13. HTTP/1.1 415 Unsupported Media Type 
  14.  
  15. Content-Type: text/plain; charset=utf-8 
  16.  
  17. Content-Length: 23 
  18.  
  19. Unsupported Media Type 
  20.  
  21. $ curl -i -d @books.xml localhost:3000 
  22.  
  23. HTTP/1.1 200 OK 
  24.  
  25. Date: Fri, 17 Oct 2014 13:42:10 GMT 
  26.  
  27. Content-Length: 2 
  28.  
  29. Content-Type: text/plain; charset=utf-8 
  30.  
  31. OK 

接下來給大家介紹一下第三方中間件的使用:

秉承不造輪子的原則,其實在Github上有很多實現了一些功能的中間件。比如這里給大家介紹2個基礎驗證的中間件goji/httpauth和Gorilla’s LoggingHandler

首先我們需要引入第三方包

  1. $ go get github.com/goji/httpauth 
  1. package main 
  2.  
  3. import ( 
  4.  
  5. "github.com/goji/httpauth" 
  6.  
  7. "net/http" 
  8.  
  9.  
  10. func main() { 
  11.  
  12. finalHandler := http.HandlerFunc(final
  13.  
  14. authHandler := httpauth.SimpleBasicAuth("username""password"
  15.  
  16. http.Handle("/", authHandler(finalHandler)) 
  17.  
  18. http.ListenAndServe(":3000", nil) 
  19.  
  20.  
  21. func final(w http.ResponseWriter, r *http.Request) { 
  22.  
  23. w.Write([]byte("OK")) 
  24.  

如果你運行這個例子,你應該得到你所期望的有效和無效的憑證響應

  1. $ curl -i username:password@localhost:3000 
  2.  
  3. HTTP/1.1 200 OK 
  4.  
  5. Content-Length: 2 
  6.  
  7. Content-Type: text/plain; charset=utf-8 
  8.  
  9. OK 
  10.  
  11. $ curl -i username:wrongpassword@localhost:3000 
  12.  
  13. HTTP/1.1 401 Unauthorized 
  14.  
  15. Content-Type: text/plain; charset=utf-8 
  16.  
  17. Www-Authenticate: Basic realm=""Restricted"" 
  18.  
  19. Content-Length: 13 
  20.  
  21. Unauthorized 

Gorilla’s LoggingHandler和Apache-style logs有一些區別

以下是我們在其中寫入日志到server.log文件一個簡單的例子:

首先還是引入第三包

  1. go get github.com/gorilla/handlers 
  1. package main 
  2.  
  3. import ( 
  4.  
  5. "github.com/gorilla/handlers" 
  6.  
  7. "net/http" 
  8.  
  9. "os" 
  10.  
  11.  
  12. func main() { 
  13.  
  14. finalHandler := http.HandlerFunc(final
  15.  
  16. logFile, err := os.OpenFile("server.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) 
  17.  
  18. if err != nil { 
  19.  
  20. panic(err) 
  21.  
  22.  
  23. http.Handle("/", handlers.LoggingHandler(logFile, finalHandler)) 
  24.  
  25. http.ListenAndServe(":3000", nil) 
  26.  
  27.  
  28. func final(w http.ResponseWriter, r *http.Request) { 
  29.  
  30. w.Write([]byte("OK")) 
  31.  

在一個簡單的情況下,這樣我們的代碼是相當清楚的。但是,如果我們想用LoggingHandler作為一個更大的中間件鏈中的一部分會發生什么?我們可以很容易地結束了一個聲明,看起來像這樣:

  1. http.Handle("/", handlers.LoggingHandler(logFile, authHandler(enforceXMLHandler(finalHandler)))) 

不過這看起來太糟糕了。

我們可以通過創建一個構造函數打來整理一下我們給它取名為(myLoggingHandler)

和signature func(http.Handler) http.Handler.這樣就會是我們的代碼更加整潔和可讀性:

 

  1. func myLoggingHandler(h http.Handler) http.Handler { 
  2.  
  3. logFile, err := os.OpenFile("server.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) 
  4.  
  5. if err != nil { 
  6.  
  7. panic(err) 
  8.  
  9.  
  10. return handlers.LoggingHandler(logFile, h) 
  11.  
  12.  
  13. func main() { 
  14.  
  15. finalHandler := http.HandlerFunc(final
  16.  
  17. http.Handle("/", myLoggingHandler(finalHandler)) 
  18.  
  19. http.ListenAndServe(":3000", nil) 
  20.  
  1. $ cat server.log 
  2.  
  3. 127.0.0.1 - - [21/Oct/2014:18:56:43 +0100] "GET / HTTP/1.1" 200 2 
  4.  
  5. 127.0.0.1 - - [21/Oct/2014:18:56:36 +0100] "POST / HTTP/1.1" 200 2 
  6.  
  7. 127.0.0.1 - - [21/Oct/2014:18:56:43 +0100] "PUT / HTTP/1.1" 200 2 

這里還有一個比較完整結構的中間件使用的示例:

  1. package main 
  2.  
  3. import ( 
  4.  
  5. "bytes" 
  6.  
  7. "github.com/goji/httpauth" 
  8.  
  9. "github.com/gorilla/handlers" 
  10.  
  11. "net/http" 
  12.  
  13. "os" 
  14.  
  15.  
  16. func enforceXMLHandler(next http.Handler) http.Handler { 
  17.  
  18. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
  19.  
  20. if r.ContentLength == 0 { 
  21.  
  22. http.Error(w, http.StatusText(400), 400) 
  23.  
  24. return 
  25.  
  26.  
  27. buf := new(bytes.Buffer) 
  28.  
  29. buf.ReadFrom(r.Body) 
  30.  
  31. if http.DetectContentType(buf.Bytes()) != "text/xml; charset=utf-8" { 
  32.  
  33. http.Error(w, http.StatusText(415), 415) 
  34.  
  35. return 
  36.  
  37.  
  38. next.ServeHTTP(w, r) 
  39.  
  40. }) 
  41.  
  42.  
  43. func myLoggingHandler(h http.Handler) http.Handler { 
  44.  
  45. logFile, err := os.OpenFile("server.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) 
  46.  
  47. if err != nil { 
  48.  
  49. panic(err) 
  50.  
  51.  
  52. return handlers.LoggingHandler(logFile, h) 
  53.  
  54.  
  55. func main() { 
  56.  
  57. indexHandler := http.HandlerFunc(index) 
  58.  
  59. authHandler := httpauth.SimpleBasicAuth("username""password"
  60.  
  61. http.Handle("/", myLoggingHandler(authHandler(enforceXMLHandler(indexHandler)))) 
  62.  
  63. http.ListenAndServe(":3000", nil) 
  64.  
  65.  
  66. func index(w http.ResponseWriter, r *http.Request) { 
  67.  
  68. w.Write([]byte("OK")) 
  69.  

有很多人不太喜歡中間件的設計模式,不過我還是慢喜歡的。

責任編輯:何妍 來源: 謝權'blog
相關推薦

2013-12-12 10:55:21

2024-05-06 12:30:51

Go語言中間件

2021-10-06 19:03:35

Go中間件Middleware

2022-11-18 07:54:02

Go中間件項目

2014-06-20 09:18:54

Dustjs中間件

2016-11-11 21:00:46

中間件

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發CRUD

2017-12-11 13:30:49

Go語言數據庫中間件

2018-07-29 12:27:30

云中間件云計算API

2018-02-01 10:19:22

中間件服務器系統

2024-02-06 14:05:00

Go中間件框架

2021-07-19 07:55:24

Redux中間件原理

2018-05-02 16:23:24

中間件RPC容器

2013-03-13 10:37:22

中間件Windows

2015-02-07 21:52:45

PaaS中間件

2023-11-27 07:10:06

日志中間件

2010-03-24 17:59:20

2023-06-29 10:10:06

Rocket MQ消息中間件

2012-11-30 10:21:46

移動中間件
點贊
收藏

51CTO技術棧公眾號

av网页在线观看| 999一区二区三区| wwwwww在线观看| 亚洲欧美偷拍自拍| 亚洲精品久久在线| 国产一伦一伦一伦| heyzo高清国产精品| 国产亚洲欧美在线| av色综合网| 日本午夜视频在线观看| 9191国语精品高清在线| 日韩大片免费观看视频播放| 一个色综合久久| 老色鬼在线视频| 亚洲视频在线观看一区| 日韩精品欧美一区二区三区| www.污视频| 麻豆精品在线看| 欧美一区二区三区……| 麻豆精品一区二区三区视频| 精品国产乱码久久久久久果冻传媒| 欧美一区二区久久久| 男女啪啪网站视频| 美女露胸视频在线观看| 一区二区三区波多野结衣在线观看 | 久久精品美女| 亚洲爱情岛论坛永久| 老司机精品视频一区二区三区| 69久久夜色精品国产69| 美女毛片在线观看| 国产精品传媒精东影业在线| 亚洲欧美激情四射在线日| 中文字幕一区二区三区乱码不卡| 成人国产精品一区二区网站| 欧美三区在线视频| 欧美日韩亚洲自拍| 69久成人做爰电影| 欧美日韩国产麻豆| 欧美狂野激情性xxxx在线观| 在线观看中文| 亚洲男女一区二区三区| 伊人色综合久久天天五月婷| 福利成人在线观看| 久久精品男人天堂av| 美女精品国产| 飘雪影院手机免费高清版在线观看 | 国产精品亚洲欧美导航| 久久久久久在线观看| 亚洲男人影院| 91av在线精品| 日韩在线播放中文字幕| 久久精品成人| 国产成人亚洲综合青青| 免费黄色片视频| 日本午夜一本久久久综合| 国产成人亚洲综合91精品| 无码人妻精品一区二区三区蜜桃91| 欧美一级一区| 国产精品极品在线| 91tv国产成人福利| 国产毛片精品国产一区二区三区| 成人午夜一级二级三级| 成人av一区二区三区在线观看| 国产精品影视天天线| 91情侣在线视频| 性欧美videos另类hd| zzijzzij亚洲日本少妇熟睡| 久久精品日韩精品| 国产视频第一区| 中文字幕亚洲综合久久菠萝蜜| 99精品视频网站| 中文字幕有码在线视频| 亚洲一区视频在线| 男人天堂999| 黄色日韩网站| 精品久久国产老人久久综合| 国产亚洲色婷婷久久99精品91| 欧美精品momsxxx| 久久精品国产精品亚洲| 久久伊人成人网| 亚洲自拍另类| 成人www视频在线观看| 亚洲高清视频网站| 久久久久久久久久看片| 在线视频一二三区| 精品精品导航| 色综合久久六月婷婷中文字幕| 色婷婷成人在线| 成人精品毛片| 亚洲最新av在线网站| 中文字幕手机在线观看| 亚洲中字黄色| 91大片在线观看| 免费在线视频一级不卡| 亚洲色图视频免费播放| www.com毛片| 久久久91麻豆精品国产一区| 日韩风俗一区 二区| 日本一级片免费| 亚洲女同在线| av在线亚洲男人的天堂| 91在线不卡| 亚洲电影第三页| 亚洲第一天堂久久| 欧美人妖在线| 欧美成人手机在线| 午夜视频网站在线观看| 成人aaaa免费全部观看| 亚洲自拍偷拍一区二区三区| 成人av观看| 精品免费国产二区三区| 国产精品综合激情| 国产模特精品视频久久久久| www.成人av| 免费在线毛片网站| 色激情天天射综合网| 国产精品成人99一区无码| 亚洲精品成人| 国产在线精品成人一区二区三区| 青青色在线视频| 亚洲国产精品影院| 香蕉视频xxxx| 婷婷久久综合| 国产日本欧美一区| 大地资源中文在线观看免费版| 五月天精品一区二区三区| 亚洲熟女乱综合一区二区| 99国产**精品****| 国产精品看片资源| 国产午夜精品一区理论片| 精品日韩视频在线观看| 日韩免费高清一区二区| 国产尤物精品| 草莓视频一区| 好吊日av在线| 精品免费99久久| 久久久国产成人| 成人一级片在线观看| 日本天堂免费a| 欧美第一在线视频| 美女福利精品视频| 国产999久久久| 一区二区三区自拍| 少妇极品熟妇人妻无码| 欧美视频在线观看| 97超碰人人看人人| 羞羞的视频在线观看| 日韩你懂的电影在线观看| 黄色一级视频免费| 成人污视频在线观看| 亚洲一区二区三区av无码| 国产精品高潮呻吟久久久久| 久久久影视精品| 人人妻人人玩人人澡人人爽| 午夜国产精品一区| 熟女丰满老熟女熟妇| 久久久精品网| 亚洲开发第一视频在线播放| 91麻豆精品| 九九视频这里只有精品| 欧美一区二区在线观看视频| 精品电影在线观看| 欧美熟妇激情一区二区三区| 久久精品国产99久久6| 玖玖精品在线视频| 黄色网一区二区| 日本精品在线视频| 欧洲日本在线| 欧美成人a∨高清免费观看| 91国产丝袜播放在线| 国产喂奶挤奶一区二区三区| 亚洲免费av一区| 精品成人国产| 欧洲一区二区日韩在线视频观看免费| 欧美日韩五区| 欧美黄色性视频| 牛牛澡牛牛爽一区二区| 欧美日韩高清一区二区三区| 久久免费公开视频| 久久久久久黄色| 国产在线观看中文字幕| 一本色道久久综合| 一本一本a久久| 一区二区三区国产好| 日韩美女av在线免费观看| 国产原厂视频在线观看| 日韩成人av在线| 国产一区二区自拍视频| 天天综合色天天综合| 91香蕉视频污在线观看| www.在线成人| 天堂在线中文在线| 国产一区二区高清| 香蕉精品视频在线| 日韩欧美ww| 亚洲va国产va天堂va久久| 自拍视频在线看| 欧美成人免费网| 国产露出视频在线观看| 亚洲精品一区二区三区四区高清| 羞羞色院91蜜桃| 午夜精品久久久| www.xxxx日本| 国产日韩精品一区| 日韩精品视频一区二区| 国产美女娇喘av呻吟久久| 爱情岛论坛亚洲首页入口章节| 亚洲精品孕妇| 免费日韩在线观看| 色999国产精品| 你懂的网址一区二区三区| 午夜日韩影院| 国产日韩精品综合网站| 亚洲欧洲自拍| 91精品国产高清久久久久久久久| 日本免费在线视频| 国产一区二区日韩精品欧美精品| 欧美视频久久久| 91麻豆精品国产91久久久资源速度 | 欧美一区二区三区影视| 日韩av免费播放| 日韩欧美精品免费在线| av资源吧首页| 一区二区三区色| 国产精品白嫩白嫩大学美女| 1024精品合集| 亚洲女人久久久| 欧美激情一区二区| 先锋影音av在线| 91麻豆国产在线观看| 三级电影在线看| yourporn久久国产精品| 亚洲精品国产成人av在线| 国产成人三级在线观看| 亚洲精品一二三四| 国模无码大尺度一区二区三区| 国内外成人免费在线视频| 奇米精品一区二区三区四区| 美女喷白浆视频| 日本伊人精品一区二区三区观看方式| 久久久久久香蕉| 免费在线看成人av| 成人亚洲视频在线观看| 久久久久国产一区二区| 无码人妻丰满熟妇区五十路百度| 亚洲欧美日韩精品一区二区 | 欧美久久久久久久久久久久| 亚洲精选视频免费看| 欧美成人三级在线观看| 一区二区三区在线观看国产| 久久高清无码视频| 亚洲成人av福利| 五月天综合激情网| 色妞www精品视频| 欧美三级网站在线观看| 91精品国产综合久久久蜜臀图片| 99久久免费国产精精品| 日韩免费视频一区| 色噜噜一区二区三区| 日韩国产精品视频| 国产女人在线视频| 日韩在线观看免费高清| 欧洲成人综合网| 91精品国产免费久久久久久 | 高清国产在线一区| 日韩成人午夜| 五月天久久综合网| 亚洲一区色图| 亚洲 自拍 另类小说综合图区| 亚洲一级在线| 日韩不卡一二三| 国产成人在线看| 少妇大叫太粗太大爽一区二区| 中文字幕+乱码+中文字幕一区| 国产尤物在线播放| 午夜精品爽啪视频| 中文字幕人妻丝袜乱一区三区| 日韩一级完整毛片| 四虎在线观看| 俺去啦;欧美日韩| 极品在线视频| 国产有码一区二区| 国内露脸中年夫妇交换精品| 欧美主播一区二区三区美女 久久精品人 | 精品麻豆剧传媒av国产九九九| 国产精品久久久久久久天堂第1集| 久久99精品久久久久久园产越南| 正在播放一区二区三区| 99国产精品| www.污污视频| 久久伊人蜜桃av一区二区| 三级影片在线看| 日本韩国欧美一区| 亚洲高清在线观看视频| 色系列之999| 成年美女黄网站色大片不卡| 亚洲a级在线观看| 国产一区二区三区探花| 久无码久无码av无码| 蜜桃视频一区二区| 色天使在线视频| 樱桃视频在线观看一区| 欧美三级网站在线观看| 亚洲国模精品私拍| 成人无遮挡免费网站视频在线观看| 欧美一乱一性一交一视频| 亚洲图色一区二区三区| 一本一本a久久| 老妇喷水一区二区三区| 国产真实乱人偷精品| 一区二区视频在线看| 中文字幕在线观看精品| 亚洲免费一在线| 欧美hdxxx| 亚洲a中文字幕| 欧美激情黄色片| 波多野结衣天堂| 久久亚洲综合av| 国产精品成人av久久| 日韩欧美国产精品| 精品黄色免费中文电影在线播放| 国产精品久久久久久久久久久久| 欧美福利在线播放网址导航| 欧洲精品在线播放| 国产精品1024久久| 内射一区二区三区| 欧美日本国产视频| av中文天堂在线| 国产精品999| 国产欧美日韩视频在线| 日韩av资源在线| 91原创在线视频| 久久午夜免费视频| 亚洲黄色av网站| а√在线中文在线新版| 国产亚洲精品自在久久| 精品91视频| av免费观看不卡| 亚欧色一区w666天堂| 欧美视频一二区| 午夜精品一区二区三区视频免费看| 波多野结衣一区二区三区免费视频| 成年丰满熟妇午夜免费视频| 国产成人综合视频| 欧美日韩在线视频免费播放| 日韩视频一区二区在线观看| 五月天激情在线| 国产一区二区三区高清| 亚洲国产三级| chinese麻豆新拍video| 欧美性猛交xxxx偷拍洗澡| 你懂的在线播放| 国产精品狼人色视频一区| 国产精品久久久久蜜臀 | 人妻中文字幕一区二区三区| 尤物tv国产一区| 91成人短视频在线观看| 影音先锋成人资源网站| 国产高清久久久| 九九九国产视频| 亚洲精品网站在线播放gif| 国产经典一区| 日本黄xxxxxxxxx100| 成人av电影在线网| 天天干天天操天天爱| 综合激情国产一区| 日韩精品成人在线观看| 黄色一级视频片| 国产精品网友自拍| 99精品免费观看| 欧美有码在线观看视频| 大胆日韩av| 午夜性福利视频| 色综合久久综合网欧美综合网| 免费大片在线观看www| 国产成人亚洲欧美| 丝袜美腿亚洲一区| 好吊色视频在线观看| 日韩精品免费电影| 欧美激情三区| 日韩精品一区在线视频| 日本一区二区视频在线观看| h片在线免费看| 国产精品第一视频| 国产综合久久| 成人激情五月天| 日韩欧美国产一区二区在线播放| 中文字幕乱码在线播放| 影音先锋欧美在线| 久久综合九色综合欧美98| 国产欧美久久久| 国产成人精品一区二区三区| 欧美日韩日本国产亚洲在线| 乐播av一区二区三区| 日韩女同互慰一区二区| 成人做爰视频www| 99色这里只有精品| 亚洲欧洲一区二区三区| 噜噜噜在线观看播放视频| 99精品99久久久久久宅男|