http2 در curl

پروژه‌ی curl به طور آزمایشی پشتیبانی از http2 را از سپتامبر ۲۰۱۳ ارائه می‌دهد.

در روح curl، ما تلاش می‌کنیم که همه‌ی جنبه‌های http2 را پوشش دهیم. curl معمولا به عنوان ابزاری برای تست وب‌سایت‌ها به کار می‌رود و ما تلاش می‌کنیم که این روند را برای http2 نیز حفظ کنیم.

curl از لایبرری جدا‌گانه‌ای به نام nghttp2 برای لایه‌ی فریم استفاده می‌کند. curl به nghttp2 1.0 یا بالاتر نیاز دارد.

البته، فراموش نشود که در حال حاضر، curl ارائه‌شده در لینوکس و libcurl با پشتیبانی از پرتکل HTTP/2 به طور پیش‌فرض ارائه نمی‌شوند.

۱۱.۱. شباهت به HTTP 1.x

در درون، curl هدرهای http2 را به سبک HTTP 1.x تبدیل می‌کند و آن‌ها را به کاربر ارائه می‌دهد تا مانند HTTP کنونی ظاهر شوند. این کار اجازه می‌دهد تا انتقال داده‌ها برای کاربر curl و HTTP امروزی راحت‌تر شود. در درخواست‌های رو به بیرون نیز هدرها در میانه‌ی راه از حالت HTTP 1.x به فرمت http2 تبدیل می‌شوند. این قابلیت باعث می‌شود که کاربران خیلی به این مورد اهمیت ندهند که با کدام نسخه‌ی HTTP رو‌به‌رو هستند.

۱۱.۲. متن‌ساده، ناامن

curl از http2 برمبنای TCP استاندارد و هدر Upgrade: پشتیبانی می‌کند. اگر شما یک درخواست HTTP انجام دهید و بخواهید از HTTP 2 استفاده کنید، curl از سرور می‌خواهد که در صورت امکان از http2 استفاده کند.

۱۱.۳. TLS با لایبرری‌های مختلف

curl از لایبرری‌های مختلف TLS می‌تواند استفاده کند. چالشی که در TLS با آن مواجه هستیم، پشتیبانی از ALPN برای Http2 است و هم‌چنین پشتیبانی از NPN است.

curl را با ورژن‌های جدیدتر OpenSSL یا NSS بیلد (Build) کنید تا پشتیبانی ALPN و NPN را داشته باشید. از GNUTLS یا PolarSSL، پشتیبانی ALPN را می‌گیرید، ولی NPN را نه.

۱۱.۴. استفاده در خط فرمان

برای اطلاع‌دادن به curl برای استفاده از http2، چه به صورت متن‌ساده یا TLS، از آپشن --http2 استفاده کنید. curl هم‌چنان از HTTP/1.1 به طور پیش‌فرض استفاده می‌کند.

۱۱.۵. آپشن‌های libcurl

۱۱.۵.۱. فعال‌کردن HTTP/2

اپلیکیشن شما می‌تواند از URLهای https:// یا http:// پشتیبانی کند، ولی شما می‌توانید از آپشن CURLOPT_HTTP_VERSION استفاده کنید تا نسخه‌ی HTTP مورداستفاده را تغییر دهید.

۱۱.۵.۲. Multiplexing

libcurl تلاش می‌کند که رفتارهای کنونی را ادامه دهد، بنابراین باید قابلیت multiplexing HTTP/2 را با آپشن CURLMOPT_PIPELINING فعال کنید.

نکته‌ی ریز دیگر این‌که در خاطر داشته باشید که اگر چندین درخواست با libcurl یک‌جا بفرستید، با اینترفیس چندگانه‌ی خودش، هر تعداد انتقالی را یک‌جا شروع کند و اگر شما می‌خواهید صبر کنید تا libcurl همه‌ی آن‌ها را در یک کانکشن قرار دهد،‌به جای این‌که چندین کانکشن با هم باز کند، شما می‌توانید از آپشن CURLOPT_PIPEWAIT استفاده کنید.

۱۱.۵.۳. Server push

libcurl 7.44.0 و بالاتر از قابلیت Server push در HTTP/2 پشتیبانی می‌کند. شما می‌توانید از این قابلیت با اضافه‌کردن یک تابع برای فراخوانی هنگام دریافت Push با آپشن CURLMOPT_PUSHFUNCTION ست کنید. اگر Push توسط اپلیکیشن پذیرفته شود، یک انتقال جدید روی curl ساخته می‌شود و محتوا به همان صورت کانکشن‌های معمولی تحویل داده می‌شود.