About HTTP/2 Push
This document contains technical details about our HTTP/2 implementation, for a hands-on
introduction on how to enable HTTP/2 push in
check our tutorial.
Priorities on pushed streams
HTTP/2 uses independent streams to exchange resources between the browser and the server. Those assets however share the same channel, and their relative priority can heavily influence how quickly a web-page is rendered.
With ShimmerCat, streams are pushed by default with conventional priorities: CSS high, JS a little less high, and so on. The main response HTML is given the highest priority and its DATA frames will start traveling the HTTP/2 connection as soon as they are available.
How is it configured: push-lists and calm maps
HTTP/2 Push is optimized by the accelerator service, and the output of the accelerator service is what we call "push lists": a list of resources to push. These are YAML files with the relative locations of the assets to push for a given view.
They live in a file with
.push-list extension that looks like this one:
hints: - /my-statics-location/my-js/cool.js - /my-statics-location/my-css/coolest.css?ver=1.2 # ... schema: push-list-v1
In the example above, ShimmerCat will push the files with URL paths
though for the later it will also use the provided query string.
.push-list files are not limited to pushed assets, but can also contain so
called calm maps.
Works for all browsers
ShimmerCat QS HTTP/2 Push implementation is guided by the principle "it should work today".
Since browser's HTTP/2 Push implementations are slightly different, ShimmerCat comes with
a (so far very small) database of adaptations for HTTP/2 Push, even disabling it for those
cases where the technique is of no use.
The adaptations used as of QS 2378 are as follow:
Modern Safari versions, in Mac and iOS: disable HTTP/2 Push, since despite our extensive years of testing, we have never seen Safari use any pushed assets, although we have seen it crash plenty of times when deploying HTTP/2 Push, always using the same cryptic error message that Safari uses for all network and miscellaneous errors.
Microsoft Edge: limit the number of concurrently pushed streams to 8.
Firefox in Android: limit the number of concurrently pushed streams to 16.
Browsers are identified using fingerprints for their TLS and HTTP/2 stacks, so changing
the "User-Agent" in the HTTP request has no effect on the decision about enabling
HTTP/2 push that
ShimmerCat QS takes.