Samsung utilise Akamai Image Manager pour servir ces fichiers.
Si je passe un en-tête Accept avec image/jpeg,image/gif, il retourne bien un image/jpeg, comme prévu.
wget --header="Accept: image/jpeg,image/gif" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
--2020-11-13 11:43:58-- http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 83094 (81K) [image/jpeg]
Saving to: ‘samsung-logo-191-1.jpg.6’
Discourse tente de récupérer l’image en appelant FileHelper.download, qui appelle FinalDestination.get, lequel finit par demander le fichier avec un UserAgent de :
Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Ainsi, si nous demandons la même image avec le même en-tête Accept que ci-dessus, mais en ajoutant cet agent utilisateur, nous obtenons :
wget --header="Accept: image/jpeg,image/gif" --header="User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
--2020-11-13 11:52:50-- http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 45540 (44K) [image/webp]
Saving to: ‘samsung-logo-191-1.jpg.10’
Et il retourne un image/webp. Il semble qu’ils ignorent l’en-tête Accept et utilisent leur propre logique pour déterminer le meilleur type de fichier en fonction de l’agent utilisateur.
Apple n’a historiquement pas pris en charge WebP, alors essayons cela :
wget --header="Accept: image/jpeg,image/gif" --header="User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
--2020-11-13 12:27:02-- http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 83094 (81K) [image/jpeg]
Saving to: ‘samsung-logo-191-1.jpg.16’
Succès !
Je pense que l’on peut avancer un argument assez solide selon lequel le serveur web devrait toujours respecter l’en-tête Accept et ne pas essayer de le contourner. D’un autre côté, quelqu’un pourrait dire que si vous présentez une chaîne d’agent utilisateur spécifique, vous devriez être prêt à vous comporter comme cet agent utilisateur (bien que le spoofing d’agent utilisateur ne soit pas rare et ait diverses utilités).
Il se trouve qu’Apple a ajouté la prise en charge de WebP à iOS 14 (sorti récemment) et macOS Big Sur (sorti hier), nous devrions donc probablement le prendre en charge (en l’ajoutant comme extension autorisée par défaut) et en configurant ImageMagick pour le supporter (ce qui introduira une dépendance vers libwebp ou similaire) afin que nous puissions optimiser et redimensionner, etc.