2017-07-11 1 views
3

J'écris un serveur d'analyse qui va être utilisé par les utilisateurs web. L'un des paramètres que je veux tester est le support de leur navigateur. S'il vous plaît me dire si je peux obtenir les informations de vide sanitaire et comment:Comment dire du côté serveur si le client supporte http/2

  • test si le client (navigateur utilisateur) prend en charge http/2
  • test si le client (navigateur utilisateur) prend en charge http/2 pushes, certains comment détecter lorsque le serveur envoie une poussée, le client est-il capable de l'utiliser, celui-ci est probablement un test de js, ou pas vous me le dites.
  • test si le client (navigateur utilisateur) prend en charge QUIC, la version UDP de http/2

Répondre

1

Cela dépend du serveur Web utilisé et des détails qu'il fournit sur la connexion qui lui est faite.

Apache par exemple, fournit les variables suivantes: https://httpd.apache.org/docs/2.4/mod/mod_http2.html#envvars

Y compris ces variables:

Variable Name: Value Type: Description: 
HTTP2   flag   HTTP/2 is being used. 
H2PUSH   flag   HTTP/2 Server Push is enabled for this connection and also supported by the client. 
H2_PUSHED  string  empty or PUSHED for a request being pushed by the server. 

Vous pouvez facilement ajouter à vos fichiers journaux en utilisant un LogFormat comme ceci:

LogFormat "%h %l %u %t %{ms}T \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{Content-Encoding}o %{H2_PUSHED}e" combined 

Et puis voir à partir des fichiers journaux si elle a été servie sur HTTP/2.0 et si elle a été PUSHED ou non. Par exemple:

86.1.2.3 - - [11/Jul/2017:22:14:56 +0100] 2 "GET/HTTP/2.0" 200 1700 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 br 
86.1.2.3 - - [11/Jul/2017:22:14:56 +0100] 3 "GET /assets/css/common.css HTTP/2.0" 200 5381 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 br PUSHED 

Ces variables sont également disponibles pour les scripts CGI et autres. Notez que ces variables ne seront définies que si HTTP/2 est réellement utilisé.

Tous les serveurs Web n'offrent pas ce niveau de détail aussi facilement qu'Apache et beaucoup ne supportent pas le push HTTP/2 donc ils ne peuvent probablement pas détecter cela étant donné qu'ils ne le supportent pas eux-mêmes!

Je ne suis pas au courant de tous les navigateurs Web qui donnent ces détails du client HTTPS bonjour message (lorsque HTTP/2 seraient négociés) que la plupart fournissent des détails de la connexion actuelle, plutôt que chaque support du protocole, et seulement après la configuration de la session HTTPS. Par exemple, les variables HTTPS d'Apache sont indiquées ici: http://httpd.apache.org/docs/current/mod/mod_ssl.html#envvars

QUIC est moins pris en charge par les serveurs Web, donc pas aussi facile à détecter à cause de cela.

Pour réellement détecter tout cela du côté du client est plus difficile car ils ne sont pas exposés à JavaScript autant que je sache. L'option la plus simple consisterait à appeler un script CGI via HTTP/2 qui renvoie le résultat des valeurs fournies par le serveur Web.

Notez que les ressources poussées ne seront utilisées que si nécessaire. Et si nécessaire et pas poussé, alors il sera récupéré de toute façon. Donc, votre idée d'un test js, détectant probablement si une ressource poussée est utilisée ne dira pas définitivement si le client supporte le push parce que la ressource a pu être récupérée.

+0

Je ne suis pas encore sûr du serveur que le back-end utilisera, donc je veux juste savoir ce que le client envoie au backend qui permettra à l'endossier de comprendre quel protocole le client supporte. –

+0

Indépendamment de la poussée, au cas où la ressource a été poussée, comment pouvez-vous tester à partir de js que vous avez utilisé la ressource poussée et ne l'avez pas récupérée –

+0

Cela dépend entièrement de ce que le backend que vous choisissez expose, comme je l'ai dit. Et vous ne pouvez pas faire la différence entre une ressource poussée qui a été utilisée et la même ressource qui a été récupérée sans pousser, comme je l'ai mentionné dans la réponse. Sauf si vous modifiez le contenu de cette ressource en fonction de savoir si vous savez à partir de l'arrière si le push est pris en charge. –

0

Le mieux que vous serez en mesure de faire est de déterminer leur navigateur, via leur agent utilisateur, puis croisé référence que avec une base de données de navigateurs et de fonctionnalités.

Bien sûr, un user-agent peut mentir, mais la majorité d'entre eux s'annoncent de manière appropriée.

+0

L'agent utilisateur ne vous dit pas le protocole –

+1

Cela serait correct. Si vous lisez ce que j'ai réellement dit, c'est pourquoi j'ai dit que vous devez faire référence à l'agent utilisateur avec une base de données qui indique pour cet agent utilisateur, il prend en charge ces fonctionnalités. Il n'y a rien dans le navigateur qui indique son protocole. – samanime

+0

Le serveur doit être capable de dire si le client supporte http/2 ou non, sinon comment il sait quel protocole utiliser en communication avec ce client. –