De twee WordPress functies om een uitgaande HTTP-verbinding mee te maken zijn WP_Http::request() en WP_Http_Curl::request(). Deze functies gebruiken standaard het HTTP/1.0 protocol. Terwijl HTTP-versie 1.1 ook geaccepteerd wordt in de functies. Is HTTP/1.1 beter? Misschien niet, maar het kàn wel, dus we gaan in dit artikel WordPress HTTP/1.1 voor uitgaande verbindingen laten gebruiken. Leuk hè?! :)

Het HTTP-protocol kent een aantal versies:

  • HTTP/0.9
  • HTTP/1.0
  • HTTP/1.1
  • HTTP/2
  • HTTP/3

De WordPress functies WP_Http::request() en WP_Http_Curl::request() begrijpen alleen HTTP 1.0 en HTTP 1.1, waarbij 1.0 de standaard versie is. Dit staat in de documentatie van WP_Http::request en WP_Http_Curl::request. Welke httpversion gebruikt wordt kun je inzichtelijk maken met een plugin als Log HTTP Requests:

HTTP versie 1.0 request in WordPress volgens Log HTTP Requests plugin

Een groot verschil tussen 1.0 en 1.1 is: HTTP/1.1 ondersteunt persistente verbindingen. Een verbinding met een externe host blijft geopend (keep-alive). In HTTP/1.0 wordt een verbinding steeds direct gesloten en moet steeds een nieuwe verbinding opgezet worden. Dat kost tijd en resources.

De HTTP-verzoeken die WordPress maakt zijn over het algemeen API-calls en een verbinding hoeft niet open te blijven. Vandaar HTTP/1.0, en dit is vaak goed genoeg. Voor dit artikel gaan we ervan uit dat je in één verbinding meerdere keren gegevens wilt opvragen of versturen via HTTP.

Wil je meer over de verschillende HTTP-versies lezen, lees dan bijvoorbeeld Evolution of HTTP — HTTP/0.9, HTTP/1.0, HTTP/1.1, Keep-Alive, Upgrade, and HTTPS even. Dit artikel wacht wel. Benieuwd hoe je HTTP/3 gebruikt in Windows Server 2022? Het artikel How to enable HTTP/3 in Windows Server 2022 op Saotn.org legt het je uit.

Forceer HTTP/1.1 met een Must Use of site-specific plugin

Zoals gezegd kun je het gebruik van HTTP versie 1.1 forceren in WordPress. Waarom? Omdat het kan. Dit kan met een filter dat je in een Must Use plugin of site-specific plugin plaatst. Als voorbeeld een Must Use plugin (mu-plugin):

  1. maak een nieuw bestand aan en noem dit bestand use-http11-in-wordpress.php. Als je het bestand anders noemt geeft regel 27 een fout
  2. plak hierin de volgende PHP code en sla het op:
<?php
/**
* Plugin Name: Use HTTP/1.1 in WordPress
* Plugin URI: https://www.saotn.org/
* Donate URI: https://www.paypal.me/jreilink
* Description: Forces HTTP/1.1 for connections instead of HTTP 1.0
* Network: True
* Version: 1.0
* Author: Jan Reilink
* Author URI: https://www.saotn.org
* License: GPLv2
*/

add_filter('http_request_args', 'itfaq_http_request_args', 10, 3);
function itfaq_http_request_args($r) {
$r['httpversion'] = 1.1;
return $r;
}

add_action('http_api_curl', 'itfaq_http_api_curl', 10, 3);
function itfaq_http_api_curl($handle) {
curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
}

add_filter( 'plugin_row_meta', 'itfaq_http11_plugin_row_meta', 10, 2 );
function itfaq_http11_plugin_row_meta( $links, $file ) {
if ( !preg_match('/use-http11-in-wordpress.php$/', $file ) ) {
return $links;
}
$links[] = sprintf(
'<a target="_blank" href="https://paypal.me/jreilink" title="Donate to Jan Reilink / Sysadmins of the North">%s</a>',
__( 'Donate' )
);
return $links;
}
  1. upload het bestand via FTP naar de map wp-content/mu-plugins. Als de map mu-plugins niet bestaat kun je die aanmaken

Hierna zul je zien dat HTTP/1.1 als protocol voor uitgaande verbindingen wordt gebruikt.

HTTP/1.1 in WordPress

Je kunt meer verbindingsparameters aanpassen, zoals de timeout, user-agent, etc. Zie hiervoor de documentatie. Dit heeft overigens niets te maken met of je website via HTTP/2 bereikbaar is of niet. Het gaat om uitgaande verbindingen die WordPress maakt.

De code van de must use plugin vind je ook als Gist op mijn Github: Forces HTTP/1.1 for outgoing connections in WordPress instead of HTTP 1.0.

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *