42

I'm currently writing an unit test to check if http/2 is supported.

Is there a curl one-liner which checks if http/2 is supported and outputs a response that is easy to parse?

bn4t
  • 1,448
  • 1
  • 11
  • 23

6 Answers6

86

HTTP/2 supported:

$ curl -sI https://curl.se -o/dev/null -w '%{http_version}\n'
2

HTTP/2 not supported (instead serving 1.1 in this case):

$ curl -sI http://curl.se -o/dev/null -w '%{http_version}\n'
1.1

(curl 7.50.0 or later is required for this command line to work)

HTTP/3

Since curl 7.88.1, if you build curl to support HTTP/3, the above one-liner can be extended to also check for HTTP/3 support like this:

$ curl -sI --http3 https://curl.se -o/dev/null -w '%{http_version}\n'
3
Daniel Stenberg
  • 54,736
  • 17
  • 146
  • 222
11

Run

curl --version

and look for HTTP2 on the Features list

Benav
  • 468
  • 5
  • 5
5

Here you can find a list of Tools for debugging, testing and using HTTP/2.

Probably the easiest one from the command line is:

$ is-http2 www.cloudflare.com

But that requires npm install -g is-http2-cli

For testing using curl you may need to compile it using the nghttp library, in macOS this can be done by using brew you could use:

$ brew install curl --with-nghttp2

And then you could use what @daniel-stenberg suggests in his answer

$ curl -sI https://curl.haxx.se -o/dev/null -w '%{http_version}\n'

In where you will get a 2 if http2 is supported.

nbari
  • 25,603
  • 10
  • 76
  • 131
  • 1
    Thank you for your answer. Your answer also contains options using other tools, which is very useful. However since Daniel Stenberg's answer is more fitting to the original question, I'm going to accept his answer. – bn4t Jul 11 '18 at 11:11
  • 1
    You know, @nbari is-http2 and curl output is different: curl -sI https://curl.haxx.se HTTP/2 200 server: Apache ... is-http2 https://curl.haxx.se:443 × HTTP/2 not supported by https://curl.haxx.se:443 – Ľubomír Mlích Apr 20 '20 at 12:20
4

I used

curl -kvso /dev/null --http2 https://app.domain.com:443

which returned

...
> GET / HTTP/2
...
< HTTP/2 302
...

this is not checking if HTTP2 is supported, but check if HTTP2 actually works.

Ľubomír Mlích
  • 649
  • 6
  • 12
  • 4
    `-kvso /dev/null` is short form to more verbose option list: `--insecure --verbose --silent --output /dev/null` - I suggest to consult https://curl.haxx.se/docs/manpage.html and Ctrl+F those options there to see details. – Ľubomír Mlích Sep 07 '20 at 06:52
0

You could simply do:

curl --http2 --head domain.com
Adriaan
  • 17,741
  • 7
  • 42
  • 75
  • 1
    Welcome to Stack Overflow! Please read [answer] and [edit] your question to contain an explanation as to why this code would actually solve the problem at hand. Always remember that you're not only solving the problem, but are also educating the OP and any future readers of this post. – Adriaan Jul 19 '22 at 07:29
0

Accepted answer doesn't work for h2c in the example I'm looking at. Instead use:

curl --http2 -sI https://curl.se -o/dev/null -w '%{http_version}\n'

CamW
  • 3,223
  • 24
  • 34