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

用Go語言寫HTTP中間件

開發 前端
在web開發過程中,中間件一般是指應用程序中封裝原始信息,添加額外功能的組件。不知道為什么,中間件通常是一種不太受歡迎的概念。但我認為它棒極了

web開發過程中,中間件一般是指應用程序中封裝原始信息,添加額外功能的組件。不知道為什么,中間件通常是一種不太受歡迎的概念。但我認為它棒極了。

其一,一個好的中間件擁有單一的功能,可插拔并且是自我約束的。這就意味著你可以在接口的層次上把它放到應用中,并能很好的工作。中間件并不影響你 的代碼風格,它也不是一個框架,僅僅是你處理請求流程中額外一層罷了。根本不需要重寫代碼:如果你想用一個中間件,就把它加上應用中;如果你改變主意了, 去掉就好了。就這么簡單。

來看看GoHTTP中間件非常流行,標準庫中也是這樣。或許咋看上去并不明顯,net/http包中的函數,如StripPrefix 和TimeoutHandler 正是我們上面定義的中間件:封裝處理過程并在處理輸入或輸出時增加額外的動作。

我最近的Gonosurf 也是一個中間件。我從一開始就有意的這樣設計。大多數情況下,你根本不必在應用層關心CSRF檢查。nosurf,和其他中間件一樣,非常獨立,可以和實現標準庫net/http接口的工具配合使用。

你也可以使用中間件做這些:

  • 通過隱藏長度緩解BREACH攻擊
  • 頻率限制
  • 屏蔽惡意自動程序
  • 提供調試信息
  • 添加HSTS, X-Frame-Options頭
  • 從異常中優雅恢復
  • 以及其他等等。

寫一個簡單的中間件

第一個例子中,我寫了一個中間件,只允許用戶從特定的域(在HTTPHost頭中有域信息)來訪問服務器。這樣的中間件可以保護應用程序不受“主機欺騙攻擊

定義類型

為了方便,讓我們為這個中間件定義一種類型,叫做SingleHost

  1. type SingleHost struct { 
  2.   
  3.     handler     http.Handler 
  4.   
  5.     allowedHost string 
  6.   

只包含兩個字段:

  • 封裝的Handler。如果是有效的Host訪問,我們就調用這個Handler
  • 允許的主機值。

由于我們把字段名小寫了,使得該字段只對我們自己的包可見。我們還應該寫一個初始化函數。

  1. func NewSingleHost(handler http.Handler, allowedHost string) *SingleHost { 
  2.   
  3.     return &SingleHost{handler: handler, allowedHost: allowedHost} 
  4.   

處理請求

現在才是實際的邏輯。為了實現http.Handler,我們的類型秩序實現一個方法:

  1. type Handler interface { 
  2.   
  3.         ServeHTTP(ResponseWriter, *Request) 
  4.   

這就是我們實現的方法:

  1. func (s *SingleHost) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
  2.   
  3.     host :r.Host 
  4.   
  5.     if host == s.allowedHost { 
  6.   
  7.         s.handler.ServeHTTP(w, r) 
  8.   
  9.     } else { 
  10.   
  11.         w.WriteHeader(403) 
  12.   
  13.     } 
  14.   

ServeHTTP 函數僅僅檢查請求中的Host頭:

  • 如果Host頭匹配初始化函數設置的allowedHost ,就調用封裝handlerServeHTTP方法。
  • 如果Host頭不匹配,就返回403狀態碼(禁止訪問)。

在后一種情況中,封裝handlerServeHTTP方法根本就不會被調用。因此封裝的handler根本不會有任何輸出,實際上它根本就不知道有這樣一個請求到來。

現在我們已經完成了自己的中間件,來把它放到應用中。這次我們不把Handler直接放到net/http服務中,而是先把Handler封裝到中間件中。

  1. singleHosted = NewSingleHost(myHandler, "example.com") 
  2.   
  3. http.ListenAndServe(":8080", singleHosted) 

另外一種方法

我們剛才寫的中間件實在是太簡單了,只有僅僅15行代碼。為了寫這樣的中間件,引入了一個不太通用的方法。由于Go支持函數第一型和閉包,并且擁有簡潔的http.HandlerFunc包裝器,我們可以將其實現為一個簡單的函數,而不是寫一個單獨的類型。下面是基于函數的中間件版本。

  1. func SingleHost(handler http.Handler, allowedHost string) http.Handler { 
  2.   
  3.     ourFunc :func(w http.ResponseWriter, r *http.Request) { 
  4.   
  5.         host :r.Host 
  6.   
  7.         if host == allowedHost { 
  8.   
  9.             handler.ServeHTTP(w, r) 
  10.   
  11.         } else { 
  12.   
  13.             w.WriteHeader(403) 
  14.   
  15.         } 
  16.   
  17.     } 
  18.   
  19.     return http.HandlerFunc(ourFunc) 
  20.   

#p#

這里我們聲明了一個叫做SingleHost的簡單函數,接受一個Handler和允許的主機名。在函數內部,我們創建了一個類似之前版本ServeHTTP的函數。這個內部函數其實是一個閉包,所以它可以從SingleHost外部訪問。最終,我們通過HandlerFunc把這個函數用作http.Handler

使用Handler還是定義一個http.Handler類型完全取決于你。對簡單的情況而已,一個函數就足夠了。但是隨著中間件功能的復雜,你應該考慮定義自己的數據結構,把邏輯獨立到多個方法中。

實際上,標準庫這兩種方法都用了。StripPrefix 是一個返回HandlerFunc的函數。雖然TimeoutHandler也是一個函數,但它返回了處理請求的自定義的類型。

更復雜的情況

我們的SingleHost中間件非常簡單:先檢查請求的一個屬性,然后要么什么也不管,把請求直接傳給封裝的Handler;要么自己返回一個響應,根本不讓封裝的Handler處理這次請求。然而,有些情況是這樣的,不但基于請求觸發一些動作,還要在封裝的Handler處理后做一些掃尾工作,比如修改響應內容等。

添加數據比較容易

如果我們想在封裝的handler輸出的內容后添加一些數據,我們只需要在handler結束后繼續調用Write()即可:

  1. type AppendMiddleware struct { 
  2.     handler http.Handler 
  3.   
  4. func (a *AppendMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
  5.     a.handler.ServeHTTP(w, r) 
  6.     w.Write([]byte("Middleware says hello.")) 

響應內容現在就應該包含封裝的handler的內容,再加上Middleware says hello.

問題是

做其他的響應內容操作比較麻煩。比如,如果我們想在響應內容前寫入一些數據。如果我們在封裝的handler前調用Write(),那么封裝的handler就好失去對HTTP狀態碼和HTTP頭的控制。因為第一次調用Write()會直接將頭輸出。

想要修改原有輸出(比如,替換其中的某些字符串),改變特定的HTTP頭,設置不同的狀態碼也都因為同樣的原因而不可行:當封裝的handler返回時,上述數據早已被發送給客戶端了。

為了處理這樣的需求,我們需要一種特殊的可以用做bufferResponseWriter,它能夠收集、暫存輸出以用于修改等操作,最后再發送給客戶端。我們可以將這個帶bufferResponseWriter傳給封裝的handler,而不是真實的RW,這樣就避免直接發送數據給客戶端。

幸運的是,在Go標準庫中確實存在這樣一個工具。net/http/httptest中的ResponseRecorder就是這樣的:它保存狀態碼,一個保存響應頭的字典,將輸出累計在buffer中。盡管是用于測試(這個包名暗示了這一點),它還是很好的滿足了我們的需求。

讓我們看一個使用ResponseRecorder的例子,這里修改了響應內容的所有東西,是為了更完整的演示。

  1. type ModifierMiddleware struct { 
  2.   
  3.     handler http.Handler 
  4.   
  5.   
  6. func (m *ModifierMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
  7.   
  8.     rec :httptest.NewRecorder() 
  9.   
  10.     // passing a ResponseRecorder instead of the original RW 
  11.   
  12.     m.handler.ServeHTTP(rec, r) 
  13.   
  14.     // after this finishes, we have the response recorded 
  15.   
  16.     // and can modify it before copying it to the original RW 
  17.   
  18.     // we copy the original headers first 
  19.   
  20.     for k, v :range rec.Header() { 
  21.   
  22.         w.Header()[k] = v 
  23.   
  24.     } 
  25.   
  26.     // and set an additional one 
  27.   
  28.     w.Header().Set("X-We-Modified-This", "Yup") 
  29.   
  30.     // only then the status code, as this call writes out the headers 
  31.   
  32.     w.WriteHeader(418) 
  33.   
  34.     // the body hasn't been written (to the real RW) yet, 
  35.   
  36.     // so we can prepend some data. 
  37.   
  38.     w.Write([]byte("Middleware says hello again. ")) 
  39.   
  40.     // then write out the original body 
  41.   
  42.     w.Write(rec.Body.Bytes()) 
  43.   

下面是我們包裝的handler的輸出。如果不用我們的中間件封裝,原來的handler僅僅會輸出Success!。

  1. HTTP/1.1 418 I'm a teapot 
  2.   
  3. X-We-Modified-This: Yup 
  4.   
  5. Content-Type: text/plain; charset=utf-8 
  6.   
  7. Content-Length: 37 
  8.   
  9. Date: Tue, 03 Sep 2013 18:41:39 GMT 
  10.   
  11. Middleware says hello again. Success! 

這種方式提供了非常大的便利。被封裝的handler現在完全在我們的控制之下:即使在其返回之后,我們也可以以任意方式操作輸出。

#p#

和其他handlers共享數據

在不同的情況下,中間件可以需要給其他的中間件或者應用程序暴露特定的信息。比如,nosurf需要給用戶提供一種獲取CSRF 密鑰的方式以及錯誤原因(如果有錯誤的話)。

對這種需求,一個合適的模型就是使用一個隱藏的map,將http.Request指針指向需要的數據,然后暴露一個包級別(handler級別)的函數來訪問這些數據。

我在nosurf中也使用了這種模型。這里,我創建了一個全局的上下文map。注意到,由于默認情況下Gomap不是并發訪問安全的,需要一個mutex

  1. type csrfContext struct { 
  2.   
  3.     token string 
  4.   
  5.     reason error 
  6.   
  7.   
  8. var ( 
  9.   
  10.     contextMap = make(map[*http.Request]*csrfContext) 
  11.   
  12.     cmMutex    = new(sync.RWMutex) 
  13.   

使用handler設置數據,然后通過暴露的函數Token()來獲取數據。

  1. func Token(req *http.Request) string { 
  2.   
  3.     cmMutex.RLock() 
  4.   
  5.     defer cmMutex.RUnlock() 
  6.   
  7.     ctx, ok :contextMap[req] 
  8.   
  9.     if !ok { 
  10.   
  11.             return "" 
  12.   
  13.     } 
  14.   
  15.     return ctx.token 
  16.   

你可以在nosurf的代碼庫context.go中找到完整的實現。

雖然我選擇在nosurf中自己實現這種需求,但實際上存在一個handygorilla/context包,它實現了一個通用的保存請求信息的map。在大多數情況下,這個包足以滿足你的需求,避免你在自己實現一個共享存儲時踩坑。它甚至還有一個自己的中間件能在請求處理結束之后清除請求信息。

總結

這篇文章的目的是吸引Go用戶對中間件概念的注意以及展示使用Go寫中間件的一些基本組件。盡管Go是一個相對年輕的開發語言,Go擁有非常漂亮的標準HTTP接口。這也是用Go寫中間件是個非常簡單甚至快樂的過程的原因之一。

然而,目前Go仍然缺乏高質量的HTTP工具。我之前提到的Go中間件想法,大多都還沒實現。現在你已經知道如何用Go寫中間件了,為什么不自己做一個呢?

PS,你可以在一個GitHub gist中找到這篇文章中所有的中間件例子。

原文鏈接:http://justinas.org/writing-http-middleware-in-go/

譯文鏈接:http://blog.jobbole.com/53265/

 

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2015-12-21 14:56:12

Go語言Http網絡協議

2021-10-06 19:03:35

Go中間件Middleware

2022-11-18 07:54:02

Go中間件項目

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發CRUD

2020-06-28 09:20:33

代碼開發Go

2018-07-29 12:27:30

云中間件云計算API

2018-02-01 10:19:22

中間件服務器系統

2016-11-11 21:00:46

中間件

2024-05-06 12:30:51

Go語言中間件

2023-06-29 10:10:06

Rocket MQ消息中間件

2012-11-30 10:21:46

移動中間件

2009-06-16 15:55:06

JBoss企業中間件

2023-10-24 07:50:18

消息中間件MQ

2017-12-11 13:30:49

Go語言數據庫中間件

2024-02-06 14:05:00

Go中間件框架

2024-08-09 08:11:02

2012-11-01 15:16:22

金蝶中間件研究院院長

2021-06-15 10:01:02

應用系統軟件

2013-03-14 22:54:15

PaaS中間件平臺即服務
點贊
收藏

51CTO技術棧公眾號

精品国产美女在线| 色悠悠亚洲一区二区| 成人片在线免费看| 久久狠狠高潮亚洲精品| 精品国产一区二区三区av片| 欧美精品乱人伦久久久久久| 在线丝袜欧美日韩制服| 亚洲精品无amm毛片| 亚洲影视在线| 欧美成人免费大片| wwwwww日本| 精品一区二区三区中文字幕视频 | 国产精品国产三级国产专播精品人| 91在线视频观看免费| 麻豆视频网站在线观看| 国产成人综合在线观看| 97成人超碰免| 艳妇荡乳欲伦69影片| 日韩在线麻豆| 日韩三级中文字幕| 国产视频一区二区三区在线播放| 免费在线稳定资源站| 国内国产精品久久| 欧美在线观看日本一区| 任我爽在线视频| 日韩aaa久久蜜桃av| 欧美久久久久中文字幕| 免费av网址在线| 男女免费观看在线爽爽爽视频| 粉嫩嫩av羞羞动漫久久久| 日韩免费观看视频| 日本少妇久久久| 91亚洲人成网污www| 亚洲区中文字幕| 免费a v网站| 麻豆精品国产| 欧美日韩国产天堂| 国产成人无码av在线播放dvd| 黄色小视频在线观看| 成人久久18免费网站麻豆| 国产日韩精品在线播放| 人人爽人人爽人人片av| 国产欧美综合一区二区三区| 欧美国产日韩视频| 女教师淫辱の教室蜜臀av软件| 青草综合视频| 在线视频中文字幕一区二区| 午夜肉伦伦影院| 丝袜老师在线| 黑人狂躁日本妞一区二区三区 | 精品国产午夜福利在线观看| 97人人做人人爽香蕉精品| 日韩欧美在线网址 | 欧美午夜电影在线观看| 久久久91精品国产| 欧美特黄一级片| 婷婷伊人综合| 欧美理论电影在线观看| 成人观看免费视频| 欧美99在线视频观看| x99av成人免费| 乱老熟女一区二区三区| 欧美国产一级| 欧美精品在线网站| 欧美色图一区二区| 欧美三级乱码| 欧美高清激情视频| 日本五十路女优| 亚洲专区一区| 国产精品美女www| 一二三区在线播放| 久久99久国产精品黄毛片色诱| 午夜精品一区二区三区在线| 国产成人在线观看网站| 性欧美xxxx大乳国产app| 国产成人精品在线| 中文字幕人妻色偷偷久久| 久久成人免费日本黄色| 91成人免费在线观看| 囯产精品久久久久久| 91在线精品秘密一区二区| 欧美污视频久久久| 久久av少妇| 亚洲天堂2014| 日韩在线一级片| 国产精品99久久久久久董美香| 欧美日韩中文字幕在线视频| caopor在线视频| **日韩最新| 亚洲成av人乱码色午夜| 日韩精品无码一区二区三区久久久| 成人激情自拍| 日韩精品久久久久 | 国产精品视频3p| 日本免费久久| 国产精品福利一区二区| 超碰在线免费观看97| 高清电影在线免费观看| 午夜影视日本亚洲欧洲精品| 国产又黄又猛又粗又爽的视频| 操人在线观看| 欧美日韩一区二区三区在线| 久久精品无码专区| 精品日韩在线| 久久久久在线观看| 国产美女www爽爽爽| 国产黄色精品视频| 日韩高清dvd| 蜜乳av一区| 欧美欧美欧美欧美| 丰满少妇在线观看资源站| 亚洲欧洲中文字幕| 日本成人免费在线| 丁香六月天婷婷| 国产精品精品国产色婷婷| 国产69精品久久久久久久| 欧美成人黄色| 亚洲日本aⅴ片在线观看香蕉| 日韩人妻无码精品综合区| 一区二区中文| 国产精品美腿一区在线看| 十八禁一区二区三区| 亚洲日韩欧美一区二区在线| 国产免费人做人爱午夜视频| 97久久综合精品久久久综合| 国产**成人网毛片九色| 亚洲欧洲午夜一线一品| 成人免费看片98| 老妇喷水一区二区三区| 国产一区高清视频| 美女91在线| 8v天堂国产在线一区二区| 国产免费看av| 亚洲一区二区伦理| 国产精品一区二区三区不卡| 成人影院在线观看| 欧美日韩亚洲综合在线| 亚洲做受高潮无遮挡| 国产精品激情| 成人自拍视频网站| 黄色成人影院| 欧美精品一级二级| 国产不卡在线观看视频| 日韩电影一二三区| 欧美日韩在线精品| 中文字幕 在线观看| 亚洲国产99精品国自产| 欧美人妻一区二区| 国产麻豆视频一区| 老司机午夜网站| 95精品视频| 久久精品国产久精国产一老狼 | 美国成人xxx| 久热精品视频在线观看| 国产剧情久久久| 亚洲男人的天堂网| 中文字幕在线播放一区二区| 欧美国产专区| 国产精品免费观看高清| 97人澡人人添人人爽欧美| 精品国产电影一区二区 | 亚洲精品中文在线影院| 亚洲图色中文字幕| 在线成人超碰| 91精品视频在线看| 日韩免费网站| 欧美一级艳片视频免费观看| 久草视频免费在线| 成人18视频日本| 91av资源网| 欧美午夜精彩| 国产精品扒开腿做| 在线观看的av| 欧美xxx久久| 六月丁香在线视频| 国产欧美一区二区精品仙草咪| 国产精品www在线观看| 精品女人视频| 国产精品成人国产乱一区 | 成人性色生活片| 国产视频九色蝌蚪| 久久亚洲黄色| 国产精品人成电影| 99自拍视频在线观看| 亚洲国产91精品在线观看| 99久久久无码国产精品免费蜜柚| 99re这里只有精品6| 不要播放器的av网站| 天天综合网网欲色| 国产一区自拍视频| 欧美videos粗暴| 午夜精品www| 999国产在线视频| 欧美不卡视频一区| 国产天堂第一区| 亚洲成人av中文| 日本美女bbw| 波多野结衣亚洲一区| 欧美午夜aaaaaa免费视频| 韩日成人av| 日韩欧美亚洲v片| 999国产精品一区| 国产精品久久一| gogo高清在线播放免费| 中文字幕亚洲综合久久| 午夜美女福利视频| 欧美写真视频网站| 日韩精品久久久久久久酒店| 国产精品视频yy9299一区| 在线观看一区二区三区四区| 麻豆91在线播放| 免费高清在线观看免费| 亚洲私人影院| 黄色一级片网址| 欧美裸体在线版观看完整版| 久久大香伊蕉在人线观看热2| 亚洲欧洲高清| 欧美激情精品久久久久久蜜臀| www.国产视频| 欧美日韩电影一区| 国产一级18片视频| 亚洲午夜一区二区| 天天做夜夜爱爱爱| 国产亚洲成年网址在线观看| 国产精品久久AV无码| 国产精品一区二区三区四区| 五月婷婷丁香色| 久久黄色网页| 日韩少妇内射免费播放18禁裸乳| 日韩欧美字幕| 日本一区二区久久精品| 日韩人体视频| 韩日午夜在线资源一区二区| 色妞ww精品视频7777| 成人亲热视频网站| 成人看片毛片免费播放器| 日韩av成人在线观看| 福利影院在线看| 久久久久久久久久久av| 日韩伦理av| 欧美黑人极品猛少妇色xxxxx| 青青草在线视频免费观看| 亚洲电影免费观看高清完整版在线观看 | 亚洲资源网站| 久久精品日韩精品| 卡一精品卡二卡三网站乱码 | 久久精品九色| 91精品在线影院| 高清一区二区| 亚洲专区在线视频| 人人爱人人干婷婷丁香亚洲| 91成人免费视频| 高潮按摩久久久久久av免费| 国产精品sss| 另类尿喷潮videofree| 国产伦精品一区二区三区| 欧美尿孔扩张虐视频| 精品国产乱码久久久久| 天天躁日日躁成人字幕aⅴ| 美脚丝袜一区二区三区在线观看| 国产精品亚洲综合在线观看| 亚洲一区中文字幕| 9999久久久久| 欧美理论一区二区| 欧美日韩一区二区三区视频播放| 国产经典一区二区三区| 久久精品色综合| 青青草久久网络| 国产精品二区不卡| h无码动漫在线观看| 亚洲精品色图| 精品久久久久久中文字幕2017| 亚洲视频福利| 欧美v在线观看| 三级不卡在线观看| 久国产精品视频| 成人动漫在线一区| 亚洲色成人网站www永久四虎| 成人激情文学综合网| 特级西西人体wwwww| 欧美—级在线免费片| 亚洲精品一区二区三区在线播放| 欧美激情一区二区三区不卡| 一级黄色片日本| 午夜久久久影院| 日本黄色一级视频| 91麻豆精品国产91久久久久久久久 | 亚洲乱码视频| 亚洲欧美在线精品| 国产aⅴ精品一区二区三区色成熟| 天堂中文av在线| 成人免费看的视频| 精品国产成人亚洲午夜福利| 亚洲欧洲99久久| 日韩 国产 欧美| 日韩亚洲欧美在线| 国产一级在线观看| 久久久午夜视频| 黑人一区二区三区| 精品乱码一区二区三区| 欧美jizz| 日韩免费高清在线| 国产mv日韩mv欧美| 羞羞在线观看视频| 精品久久久久久久久中文字幕| 日本一区二区不卡在线| 欧美片在线播放| 天堂av中文在线资源库| 欧美精品免费播放| 欧美日韩精品免费观看视完整| 日韩美女在线观看| 91午夜精品| 夜夜爽99久久国产综合精品女不卡 | 男女男精品视频| 大尺度做爰床戏呻吟舒畅| 中文字幕av一区二区三区免费看| 国产精品1区2区3区4区| 欧美日韩国产在线看| 国产极品久久久| 色爱av美腿丝袜综合粉嫩av| 亚洲综合电影| 国产成人看片| 午夜精品婷婷| 福利片一区二区三区| 国产目拍亚洲精品99久久精品| 999福利视频| 在线观看一区日韩| 天堂av在线免费观看| 国产综合在线视频| 精品视频国内| 自拍视频一区二区三区| 日韩国产欧美三级| 91视频在线网站| 精品久久久久人成| 色欲av永久无码精品无码蜜桃| 尤物tv国产一区| 成人软件在线观看| 久久99国产精品| 最新亚洲视频| 久久久午夜精品福利内容| 亚洲一二三专区| 亚洲精品.www| 欧美激情视频三区| 亚洲一区二区电影| 日韩精品久久一区二区| 国产激情一区二区三区四区 | 欧美第十八页| 奇米影视四色在线| 国产精品九色蝌蚪自拍| 依依成人在线视频| 综合欧美国产视频二区| 精品视频在线一区二区在线| 亚洲成人一区二区三区| 蜜臀av一级做a爰片久久| 成人精品一二三区| 在线播放视频一区| av黄色在线| 精品乱码一区| 日韩和欧美的一区| 一二三四国产精品| 51精品秘密在线观看| 51xtv成人影院| 国产一区二区中文字幕免费看| 91精品一区二区三区综合| 亚洲丝袜在线观看| 亚洲一区免费观看| 天堂91在线| 国产成人综合久久| 国产精品麻豆久久| 蜜桃视频无码区在线观看| 亚洲1区2区3区4区| 户外极限露出调教在线视频| 成人激情av在线| 亚洲二区精品| www.99热| 欧美sm极限捆绑bd| 日韩免费福利视频| 一区二区三区欧美成人| 粉嫩av一区二区三区粉嫩| 国产精品xxxx喷水欧美| 一区二区三区美女xx视频| 91精品亚洲一区在线观看| 久久综合色视频| 国产精品高潮呻吟| 刘亦菲毛片一区二区三区| 国产成人综合亚洲| 欧美午夜不卡| 欧美亚洲色综久久精品国产| 日韩精品一区二区三区视频在线观看| 免费观看在线黄色网| 国产精品sss| 蜜臀va亚洲va欧美va天堂 | 日韩精品aaa| 亚洲18女电影在线观看| 永久免费在线观看视频| 国产嫩草一区二区三区在线观看| 欧美在线日韩| 免费网站在线高清观看| 精品国内二区三区| jizz欧美|