curl項(xiàng)目從2013年9月就開(kāi)始對(duì)http2提供實(shí)驗(yàn)性的支持。
為了遵從curl的要旨,我們盡可能地支持http2的每個(gè)方面。curl通常被當(dāng)作一個(gè)網(wǎng)站連接測(cè)試工具,希望這也能在http2上得以延續(xù)。
curl使用一個(gè)叫做nghttp2的庫(kù)來(lái)支持http2幀層的功能。
curl會(huì)在內(nèi)部把收到的http2頭部轉(zhuǎn)換為HTTP1.x風(fēng)格的頭部再呈現(xiàn)給用戶,這樣一來(lái),它們就和目前的HTTP非常類似。這也使得無(wú)論是用curl還是HTTP,轉(zhuǎn)換都非常容易。類似地,curl會(huì)用相同的方式對(duì)發(fā)出的HTTP頭部做轉(zhuǎn)換,即發(fā)給curl的HTTP 1.x風(fēng)格頭部會(huì)在被發(fā)送到http2服務(wù)器之前完成轉(zhuǎn)換。這使得戶無(wú)需關(guān)心底層到底使用的是哪個(gè)版本的HTTP協(xié)議。
curl通過(guò)升級(jí)頭部支持基于標(biāo)準(zhǔn)TCP的http2. 當(dāng)發(fā)起一個(gè)使用http2的HTTP請(qǐng)求,如果可能,curl會(huì)請(qǐng)求服務(wù)器把連接升級(jí)到http2.
curl可以使用許多不同TLS的底層庫(kù)來(lái)提供TLS支持,http2也得這樣。TLS兼容http2的挑戰(zhàn)來(lái)自于對(duì)APLN以及一些NPN擴(kuò)展的支持。
基于最新版本的OpenSSL或NSS編譯curl可以同時(shí)獲得ALPN和NPN支持。而使用GnuTLS或PolarSSL只能得到ALPN。
無(wú)論是用純文本還是通過(guò)TLS,必須使用--http2參數(shù)來(lái)讓curl使用http2。默認(rèn)未使用該參數(shù)的情況下,curl會(huì)使用HTTP/1.1。
應(yīng)用程序和從前一樣使用https://或者http://風(fēng)格的URL,但你可以通過(guò)將curl_easy_setopt的SURLOPT_HTTP_VERSION參數(shù)設(shè)置為CURL_HTTP_VERSION_2來(lái)使libcurl嘗試使用http2。它將優(yōu)先盡可能地使用http2,如果不行的話,會(huì)繼續(xù)使用HTTP 1.1。