[HN Gopher] Removing HTTP/2 Server Push from Chrome
       ___________________________________________________________________
        
       Removing HTTP/2 Server Push from Chrome
        
       Author : msoad
       Score  : 135 points
       Date   : 2022-08-19 16:17 UTC (6 hours ago)
        
 (HTM) web link (developer.chrome.com)
 (TXT) w3m dump (developer.chrome.com)
        
       | treve wrote:
       | The reason I'm a little disappointing about this, is because I
       | was really hoping for a future where we improve sending
       | collections of items from APIs.
       | 
       | One issue with the typical API formats is that all the data for
       | each resource is shipped with the collection, which means that
       | client caches are unaware of the 'transcluded'/'embedded'
       | resources.
       | 
       | Server push, if implemented well could have allowed us to just
       | push every collection member down the wire. Push lets you solve
       | the Q+1 issue because all members can be generated together.
       | 
       | I did some work trying standardize a simple version of this:
       | https://datatracker.ietf.org/doc/html/draft-pot-prefer-push-...
       | 
       | Also, at some point there were talks about a browser request
       | header that would send the browsers' cache state as a bloom
       | filter to the server, which would let the browser have a pretty
       | good idea of what not to send.
       | 
       | When the push removal was originally announced, I wrote a bit
       | more about this: https://evertpot.com/http-2-push-is-dead/
       | 
       | Anyway, I'm disappointed this happens. I get that people had
       | trouble putting push to good use, but in my opinion this just
       | needed more time to brew. Once Chrome announced the removal, all
       | of this died.
        
         | nine_k wrote:
         | I'm afraid per-item responses are not very realistic, even with
         | HTTP/2 and efficient message formats. The items then begin to
         | be comparable, or smaller, than the client identity token sent
         | with each request. Its size is limited by cryptography.
         | 
         | Caching is also notoriously hard to get right. Apps (including
         | web apps) usually prefer to depend on their own caching: it
         | saves them more in development and support expenses.
        
       | sidcool wrote:
       | Is Websockets a viable option to HTTP2 server push?
        
         | detaro wrote:
         | Websockets serve entirely different purposes.
        
         | luhn wrote:
         | You might be confusing Server Push with Server-Sent Events.
         | https://developer.mozilla.org/en-US/docs/Web/API/Server-sent...
         | 
         | Server Push just deals with eagerly loading assets like CSS,
         | JS, and images.
        
       | unlog wrote:
       | What we need is somehow the ability to serve the html/js and json
       | at the same time without having to wait for the client to get the
       | html and then do the fetch request for that json. This will save
       | a full round trip for loading content while keeping things
       | simple.
        
         | cyral wrote:
         | If you mean avoiding the dreaded loading spinner when loading a
         | single page app, you can add the JSON data in some script
         | within the HTML. This is what server-side rendering frameworks
         | like Next.JS do. In it's simplest form, just include something
         | like:
         | 
         | <script> window.initialData = { isLoggedIn: true, email:
         | 'example@example.com', todos: [ ... ] } </script>
        
         | yread wrote:
         | I just generate the json when loading the page and embed it as
         | script with a nonce. Of couse I lose the caching of the
         | "static" page but it's worth it.
        
         | GordonS wrote:
         | Hmm, that's an interesting idea - perhaps the browser first
         | downloads some kind of "manifest" file, which lists the
         | required URIs, then the browser can request them all at once?
        
         | jefftk wrote:
         | I think you're asking for https://developer.mozilla.org/en-
         | US/docs/Web/HTTP/Status/103
         | 
         | Mozilla has it as "worth prototyping"
         | https://mozilla.github.io/standards-positions/#http-early-hi...
         | and their tracker entry is
         | https://bugzilla.mozilla.org/show_bug.cgi?id=1407355
        
         | johnny_canuck wrote:
         | This sort of sounds like what 103 Early Hints aims to resolve
         | 
         | https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/103
        
         | riskable wrote:
         | An alternative is to have a minimal HTML that has basically
         | nothing except a <script> tag that connects to a WebSocket then
         | have all content delivered over that. I've done testing with
         | this in the past and it definitely outperforms HTTP/1.1 but
         | maybe not HTTP/2 or HTTP/3 (never tested against those--this
         | was several years ago).
         | 
         | I even wrote a web server with bundled framework (as an
         | academic exercise) whose whole purpose was to work like this.
         | It was basically made for delivering any given bundles of
         | assets over a WebSocket and had some cool features like the
         | ability to auto-encode, auto-compress, or translate from one
         | file type to another (say, turning a PNG into a JPEG or
         | minifiying JS/CSS) as a simple matter of modifying the
         | configuration.
        
         | dmw_ng wrote:
         | Put the HTML/CSS inside the JS, make that whole bundle
         | cacheable, and make your "HTML" response basically be one
         | <script> tag starting the JS and another containing the JSON
         | response.
         | 
         | Folk have been using this technique for a decade or more
        
         | toast0 wrote:
         | If you're going to serve all the js all the time, put it
         | inline.
        
           | pca006132 wrote:
           | It is not faster in case the js can be cached or serviced
           | through a faster CDN comparing to your own server.
        
             | kastagg wrote:
             | Is it slower?
        
       | bullen wrote:
       | We already have Server Sent Events over HTTP/1.1 so yes this was
       | completely unneccessary.
       | 
       | The TCP head-of-line problem makes HTTP/2 a solution ONLY for
       | people that abuse the bandwidth in the first place (read big
       | centralized coorporations that have large bills of wasted
       | eletricity) making it a non-solution across the board for the
       | distributed (hosting HTTP from home) humanity.
       | 
       | The reason for "eternal growth" mindset is job security:
       | 
       | "What are all these people going to do now that we have the final
       | HTTP/1.1 working perfectly across the globe on every machine?"
       | Depreceate and "improve"...
       | 
       | In my mind the second version (not always named 2) is always the
       | final version, see half-life and starcraft for other stories that
       | tell you a similar progression: you make 1.0 as well as you could
       | and then take a pause and realize you need some final additions
       | so 1.1 completes the product/protocol. (both HL and SC where
       | rewritten in a large manner after they where "done").
       | 
       | 2.0 is often a waste of resources, see HL2+ and Starcraft 2,
       | where the electricity prices are going now and for eternity you
       | wont be able to play them anyway!
       | 
       | Complexity has a price, HTTP/1.1 is simple!
        
         | detaro wrote:
         | Server Sent Events and Server Push don't really have anything
         | to do with each other... (SSE is still a thing with HTTP2/3
         | too)
        
           | [deleted]
        
         | rubenv wrote:
         | Server Sent Events and H2 Server Push serve completely
         | different purposes, one is about application messages, the
         | other about loading resources.
         | 
         | But it's obviously much easier to criticize if you don't
         | actually dive deeper than the name of things.
        
       | stagas wrote:
       | I posted this at the Google group, though it is pending approval.
       | So this is a shorter version of it from memory:
       | 
       | I have a dev http/2 server that is serving my app locally,
       | amounting to 271 module dependencies. It takes about 400-500ms to
       | load everything and startup the app. The implementation is
       | trivial and without errors, every dependency can locate its
       | assets because it sits at its real path, sourcemaps etc.
       | 
       | Switching to Early hints/Link: it becomes 4-5s and even with all
       | of the modules cached, it doesn't get less than 2-3s. So this
       | could be an implementation difficulty and might be improved, but
       | it is still a non-trivial overhead.
       | 
       | Now the only viable solution becomes bundling, even with esbuild
       | the improvement over http/2 push is marginal. But now there is an
       | extra build step that before was handled at the HTTP layer by
       | "push". The files are bundled to a single file, so they no longer
       | can access their assets relatively to their path, since they have
       | changed paths. Workers etc. have the same problem,
       | import.meta.url no longer works and so they can't be located. Not
       | without various steps of transformations and assets handling, and
       | there'll always be edge cases where those are going to fail.
       | Certainly not composable across domains/projects since by
       | bundling they become hardwired to their environment.
       | 
       | Push doesn't have these problems. So, it's a step backwards IMO
       | to remove it. Without "push", the only viable solution becomes to
       | use 3rd party bundling tools for any non-trivial work that
       | exceeds a handful of dependencies, where with "push" you could
       | deploy the exact structure of the code as it was. Bundling makes
       | source code and the web less open and less accessible and with
       | this change there is no other solution. Early hints are fine when
       | dependencies are less than a dozen, but it becomes much worse as
       | they grow, leaving you with no choice than build steps/bundle
       | steps, instead of simply uploading the directory of your source
       | code to the http/2 push server leaving the structure intact.
        
       | a-dub wrote:
       | it was a cool idea, but i don't remember even seeing it
       | implemented in spdy which is where i believe it came from.
        
       | NightMKoder wrote:
       | They mention this in the doc, but it seems like the future
       | solution to preloading resources will involve HTTP Status 403
       | [1]. That seems like a great alternative to server push.
       | 
       | Currently it seems like the best option is to use Transfer-
       | Encoding: chunked and make sure you flush out an HTML header that
       | includes the preload directives before you spend any time
       | rendering the web page. This is a pain - especially if something
       | in the rendering fails and you now have to figure out how to
       | deliver...something to the client. It also limits other headers
       | significantly - e.g. cookies.
       | 
       | [1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/103
        
         | chrisshroba wrote:
         | In case anyone is confused, I believe the parent poster means
         | 103, not 403.
        
         | orangepanda wrote:
         | > solution to preloading resources will involve HTTP Status 403
         | 
         | "Access forbidden, here have this css file instead"
         | 
         | Or did you mean HTTP Status 103?
        
       | nousermane wrote:
       | Are they going to kill Cache API [0] as well? because if not, one
       | can still (kinda) "server-push" stuff through that.
       | 
       | [0] https://developer.mozilla.org/en-US/docs/Web/API/Cache
        
         | judah wrote:
         | Certainly not. Cache API is a useful API that can enable faster
         | web apps by skipping network calls altogether. It also enables
         | offline-capable web apps. I regularly use this API to speed up
         | my web apps -- both personal and professional. I recently wrote
         | about using Cache API to make a web app work entirely offline:
         | [0].
         | 
         | Also, I think you may be mistaken about being "(kinda) server-
         | push" - Cache API is entirely client-driven: the server can't
         | push items into that cache; the client (usually a service
         | worker) must choose to do so. I don't know what you mean when
         | you say it's like server push.
         | 
         | [0]:
         | https://debuggerdotbreak.judahgabriel.com/2022/07/01/offline...
        
           | nousermane wrote:
           | Cache API being "useful" and "entirely client-driven" - both
           | great points, but how is does it contradict my statement
           | about same API being usable for server-push (i.e. force-
           | feeding some objects to client it didn't ask for), may I ask?
           | 
           | Remember, "client" (assuming user didn't disable javascript)
           | is a dumb machine that executes whatever (code downloaded
           | from) server tells it to, within some (pretty generous)
           | limits. Imagine index HTML containing this:
           | <script>       const cache = await caches.open('push');
           | cache.put('/resource.json',        new Response('{"foo":
           | "bar"}'));       cache.put('/resource.gif',        new
           | Response(atob('R0lGODlh...'));       </script>
           | 
           | That, of course, assumes that rest of code would use
           | cache.match() instead of fetch API or XHR. Or, more
           | realistically, a wrapper that tries both.
        
             | judah wrote:
             | I don't deny that Cache API was usable from HTTP/2 push.
             | I'm responding to your question asking whether Chrome will
             | obsolete the Cache API because it was usable from HTTP/2
             | server push.
             | 
             | My answer is no, of course not, because Cache API is
             | unrelated to HTTP/2 push. It's useful for storing resources
             | regardless of whether they're HTTP/2 push'd from the server
             | or fetched from the client. Indeed, the primary use of
             | Cache API is storing resources fetched from a client's
             | service worker.
        
       | ThalesX wrote:
       | Huh, I just moved my NSFW scraper to serve me content through
       | HTTP2 server push. Guess it's back to the drawing board.
       | 
       | [le: curious about the downvotes (-3), for anyone willing to shed
       | some light]
       | 
       | (le2: turns out I'm using Server Side Events and _not_ HTTP2
       | server push; sry for the noise)
        
         | infensus wrote:
         | You can use HTTP3... unless they find out it also has a design
         | flaw and it's time to move to the next thing
        
           | ocdtrekkie wrote:
           | This is one of the reasons HTTP/1.1 will still be reliable
           | and workable decades from now, and every HTTP/2 and HTTP/3
           | client will be long gone. Google has just taken their
           | ridiculous deprecation policies and applied them to web
           | standards bodies.
        
         | coolspot wrote:
         | Can you elaborate, for my friend, please.
        
           | ThalesX wrote:
           | Not all that complicated, I have some places on the interwebz
           | where my kind of NSFW content is posted so I scrape those and
           | maintain an SQLite database of direct urls.
           | 
           | Over that database I have a tiny Koa server that checks if
           | URL is still active, processes image in memory and serves it
           | through HTTP2 over to a Preact app that handles displaying
           | them.
           | 
           | I do this so I can share this with some people, and allow
           | them to share _some_ stuff without exposing myself to
           | liability for hosting.
        
             | cmeacham98 wrote:
             | > I do this so I can share this with some people, and allow
             | them to share some stuff without exposing myself to
             | liability for hosting.
             | 
             | I don't know what country you live in, but here where I
             | live (in the US) you definitely aren't avoiding any legal
             | definition of hosting by only relaying.
        
             | detaro wrote:
             | I'm fairly certain you are confusing Server Push with
             | something else, because as far as I can tell Server Push is
             | not useful for doing what you describe.
        
               | ThalesX wrote:
               | Clients connect to server, connection kept open and
               | server push the base64 data to all connected clients.
        
               | detaro wrote:
               | that's not Server Push, but Server-Sent Events probably
        
               | ThalesX wrote:
               | Thanks for this! You are right. I'll update my posts and
               | perhaps this also answers my question of why I am
               | downvoted! I'm using SSE indeed.
        
       | rektide wrote:
       | As I commented yesterday[1], accelerating page loading was only
       | one use case for http Push frames. Alas it's the only ude case
       | Chrome ever acknowledged or cared about or have ever seemingly
       | recognized (in spite of it under-the-hood powering Push API).
       | 
       | Push also could have been useful to replace theess of non-web
       | non-resourceful ad-hoc protocols people have endlessly kept
       | reinventing atop WebSockets/WebTransport/SSE/Long-polling to push
       | things like new chat messages to the browser.
       | 
       | The author cites Jake Archibald's struggle using Push for page
       | loading. But Jake also was interested in expanding past this
       | incredibly limited use case, and threw together a mini-proposal
       | to let Fetch hear of incoming Pushed resources[2]. Chrome though
       | largely have never acknowledged this desire, even though it's
       | been asked for for ~7 years now.
       | 
       | So the web is still request & response & there's still no natural
       | obvious way for the browser to hear of new resources that are
       | ocurring. Chrome didnt listen to developers, never let us
       | actually use the feature, and now they're killing it, and we're
       | stuck where we were two decades ago, scabling to figuring out
       | what to do to get some bidirectionalism beyond request-response.
       | 
       | [1] https://news.ycombinator.com/item?id=32514159
       | 
       | [2] https://github.com/whatwg/fetch/issues/607
        
         | chrismorgan wrote:
         | > _in spite of it under-the-hood powering Push API_
         | 
         | The Push API <https://w3c.github.io/push-api/> is a completely
         | different thing with absolutely nothing in common with HTTP/2
         | PUSH frames (Server Push), just like Server Push is nothing to
         | do with Server-Sent Events. PUSH frames would be unsuitable for
         | the Push API, which is all about _not_ having to keep a
         | connection alive.
         | 
         | (The rest of your comment is still valid, though I reckon you
         | overstate the practical usefulness/superiority of Server Push
         | somewhat--sure, the ability to push multiple streams instead of
         | just one _is_ useful in some cases, helping avoid head-of-line
         | blocking or subprotocol complexity, but in practice I suggest
         | that most scenarios can't actually use that power _at all_.)
        
           | rektide wrote:
           | The only standardized implementation of Push API is Web Push
           | Protocol, which uses HTTP Push frames to push new message
           | resources.
           | 
           | https://datatracker.ietf.org/doc/html/draft-ietf-webpush-
           | pro...
           | 
           | You've listed some fine advantages of Push frames, but the
           | one most near & dear to me is that it is supported by HTTP
           | itself & delivers http resources. This is an incomparable
           | advantage versus everything else: slotting nicely into the
           | existing ecosystem.
           | 
           | With QUIC based semi-connectionless HTTP3, the advantagea
           | would only have been further accelerated, no longer even
           | needing a TCP connection to be maintained.
        
             | chrismorgan wrote:
             | Better link, https://datatracker.ietf.org/doc/html/rfc8030.
             | 
             | I see now that I misunderstood what you were speaking of by
             | "under-the-hood". I was thinking about the developer-facing
             | parts of the Push API, but you actually meant the bit in
             | the browser's control, opaque to the developer. I retract
             | my quibble.
        
             | tehbeard wrote:
             | That's not a standardized implementation it's a draft spec
             | that's years old and expired.
        
       | EarthLaunch wrote:
       | HTTP/2 Server Push being impractical matches my experience on
       | getting my game client[0] to load quickly (2.5 - 3.5 seconds via
       | Starlink, for cold - warm cache). What slowed it down:
       | 
       | 1. Fetching many resources simultaneously, 162 resources just for
       | terrain data, a couple hundred more for meshes. I am currently
       | serving with Express, so the solution here was to put Cloudflare
       | in front of it as a reverse proxy with a short cache TTL.
       | Cloudflare then serves them with HTTP/3. Also, requesting all of
       | these simultaneously rather than sequentially. The header
       | overhead isn't a problem with HTTP/3 since that uses a hash or
       | something rather than re-sending all the same headers in each
       | request.
       | 
       | 2. Resource byte size. Cloudflare does Brotli but from my
       | testing, I would need to combine terrain zones into a single
       | binary blob for this to reduce byte size by half. (Compressing
       | things that are a few hundred bytes achieves very little.) But
       | combining these would mean that any change to the data of one
       | zone would require re-compressing all zones. (Mesh compression
       | with Draco[1] helped though.)
       | 
       | 3. ROUNDTRIP. Especially with connection latency. This is where
       | Server Push comes in. I actually experimented with it. But it
       | basically only saves one roundtrip (~50-500ms depending on
       | connection); the server establishes a connection then can push.
       | Without server push, the server establishes a connection, then
       | waits for the client to request resources.
       | 
       | The client requesting resources has a few advantages. 1) Server
       | doesn't need to figure out what data the client needs, the client
       | can do those calculations, and the server can simply verify
       | (which is a lighter SQL query than discovery). 2) Client can not-
       | request resources which it already has (in cache or storage)! 3)
       | Resources can be cached by Cloudflare at the edge.
       | 
       | 0: earth.suncapped.com
       | 
       | 1: github.com/google/draco
        
         | ryantownsend wrote:
         | You've got a fairly heafty JS file on the critical rendering
         | path (350kb), so one option to help your roundtrips 3 is to
         | preload the other files it uses so it's not dependent on the JS
         | download and executing before they are discovered. See:
         | https://web.dev/preload-critical-assets/
        
           | EarthLaunch wrote:
           | Thanks! That JS file is the whole minified application. The
           | application is what knows what needs to be loaded - so I
           | would have to move that logic out into the page. It would
           | help but I am not sure it's worth the cost of maintaining
           | that extra logic, in this case (being indie).
        
       | jefftk wrote:
       | 2020-11 announcement with technical details on why they're
       | removing it: https://groups.google.com/a/chromium.org/g/blink-
       | dev/c/K3rYL...
       | 
       | No one as far as we know, inside or outside Google, ever figured
       | out how to use server push to consistently speed up loading
       | pages.
        
         | msoad wrote:
         | Push is a bad design. The client should manage the resources on
         | the client not the server.
         | 
         | Stuff like resource media queries for instance. How the server
         | can know if user wants dark mode or light mode CSS file?
        
           | Koffiepoeder wrote:
           | Use css variables for colors, then load the relevant set with
           | a 'prefers-color-scheme' media query. No need to serve 2 CSS
           | assets: the difference should be minimal.
        
             | jefftk wrote:
             | A stronger version of msoad's point would be deciding
             | whether to push a dark or light image, based on the user's
             | theme.
        
               | msoad wrote:
               | You can solve this using the <picture> element. As Github
               | does:https://github.blog/changelog/2022-08-15-specify-
               | theme-conte...
        
             | mikewhy wrote:
             | That sounds exactly like "The client should manage the
             | resources on the client not the server"
        
           | nousermane wrote:
           | It _is_ bad design, but more importantly, server push is a
           | (subpar) solution to a problem we shouldn 't have in the
           | first place.
           | 
           | How exactly modern web ended up in a situation where, first
           | time browser is displaying a single page (with maybe 3
           | pictures and 2 paragraphs of text), it has to download 300
           | resources from 12 different servers, including 2 megabytes of
           | minified javascript?
        
             | jupp0r wrote:
             | > How exactly modern web ended up in a situation where
             | [...]
             | 
             | > it has to download 300 resources from 12 different
             | servers,
             | 
             | > including 2 megabytes of minified javascript?
             | 
             | This is "best practice" that is used widely to work around
             | HTTP 1.1 Head of Line Blocking [1]. HTTP/2 and to a greater
             | degree HTTP/3 (as it also alleviates TCP head of line
             | blocking) are fixing the underlying problem making the
             | former best practice an anti pattern (but only for those
             | users able to use modern HTTP implementations).
             | 
             | [1] https://en.wikipedia.org/wiki/Head-of-
             | line_blocking#In_HTTP
        
               | divbzero wrote:
               | "12 different servers" and "minified JavaScript" were
               | indeed workarounds for head-of-line blocking, but I think
               | the GP's main point is that "300 resources" and "2
               | megabytes" should not be required for displaying a web
               | page.
        
               | nine_k wrote:
               | They are not required to display a web page. They are
               | mostly required to make money off that web page, and, to
               | a smaller degree, to observe how users interact with it
               | and thus improve it (also aligns with making more money).
               | 
               | Fortunately, Reader Mode is available in a few user-
               | friendly browsers.
        
               | [deleted]
        
             | vbezhenar wrote:
             | How many files touches some typical desktop program to
             | display 3 pictures and 2 paragraphs of text? How many
             | megabytes its installation occupies? My bet is that numbers
             | will be comparable. That's the way people write software.
             | Standards and tools should adapt. It makes no sense to
             | complain about it as nothing changes. Every popular JS
             | build tool helps with good practices by building a single
             | minified bundle. Popular JS frameworks are tiny portion of
             | those 2 megabytes. Developers just don't care and you can't
             | do anything about it. You can build better protocols and
             | better tools to make those applications work faster. And
             | developers will leverage those to make their apps even
             | slower. Who cares about 2 MB with 5G?
        
               | mtoohig wrote:
               | As much as I agree in general, the last part affects me
               | and many others. I only get 2.5Mb/s and I work for the
               | WISP.
               | 
               | The wife's family living away from the main city have
               | intermittent connection and slower speeds. We have only
               | one submarine cable and poor infrastructure further out.
               | So heavy, bloated sites eat up people's pre-paid internet
               | packages quickly or have trouble loading altogether.
               | Prepaid is around $1.25 for 500MB or $10 for 5.5GB.
               | 
               | I think lower bundle sizes should be a goal. Or lower
               | bandwidth websites should be available such as a 'm.'
               | Domain. IMO
        
               | aaaaaaaaaaab wrote:
               | _Yawn..._
               | 
               | Strawman argument.
               | 
               | I just want to read a damn article. Why does it need to
               | download hundreds of resources from dozens of origins?
               | Reading a PDF article on my desktop touches exactly one
               | file, the PDF. Ok, maybe some dylibs from the OS related
               | to PDF rendering. But surprise! Browsers already have
               | everything built-in for HTML rendering! No need to
               | download an HTML rendering engine, because it's already
               | there: it's the browser!
        
               | vbezhenar wrote:
               | Basically because site owner wants to monetise your
               | visit. Those who don't want to monetise you, usually
               | don't put loads of trackers, ads and other stuff which is
               | main reason of those hundreds of requests.
        
               | staticassertion wrote:
               | Why is multiple files worse than one? PDF is an insanely
               | complex format, I don't think the argument of "I can just
               | read a PDF file" is strong.
        
               | okasaki wrote:
               | Even if so, the javascript doesn't replace the OS
               | "bloat", it adds to it.
        
               | nousermane wrote:
               | > How many files touches some typical desktop program to
               | display 3 pictures
               | 
               | Not sure about typical, but here is rough estimate for
               | the rock bottom of it: "feh" image viewer on Ubuntu/X11:
               | $ strace -e openat -o >(wc -l) feh -F \         one.jpg
               | two.jpg three.jpg            105
        
               | the8472 wrote:
               | 63 for me, and most of those are libraries which should
               | already be in memory. Which is nanoseconds away from the
               | CPU while servers are dozens to hundreds milliseconds
               | away.
        
               | [deleted]
        
               | jchw wrote:
               | That's not the whole story of course: there's an X server
               | that feh is communicating with over a domain socket and
               | usually shared memory, and X implements significant
               | functionality on its end. Then there's drivers, and the
               | stuff between these things.
        
               | nousermane wrote:
               | Sure. And bloated websites aren't dropping from the race
               | here, either. They are communicating, over HTTP (and
               | maybe WS/SSE), with fair number of servers, that also
               | implement significant functionality. Then, there are
               | microservices, databases, network between those...
        
               | doliveira wrote:
               | > Who cares about 2 MB with 5G
               | 
               | Statements like this reminds me we live in different
               | planets
        
             | dwheeler wrote:
             | > How exactly [has the] modern web ended up in a situation
             | where, first time browser is displaying a single page (with
             | maybe 3 pictures and 2 paragraphs of text), it has to
             | download 300 resources from 12 different servers, including
             | 2 megabytes of minified javascript?
             | 
             | Ads.
        
               | edude03 wrote:
               | Also bundlers without treeshaking - I personally once
               | delivered 70MB of compressed JS to clients in production
        
             | skyde wrote:
             | When working on the Bing web crawler, we tried to take
             | screenshot of webpage to use as thumbnail.
             | 
             | What you describe was a huge pain, most page forced us to
             | download 15MB of data and load it in memory just to display
             | 2 small images and some text.
             | 
             | A format like PDF would have been much better because we
             | could have read enough byte until we are able to render the
             | visible part of the document.
             | 
             | But instead we had to download and execute 30 javascript
             | files.
        
           | riedel wrote:
           | Push would IMHO allow nice pub sub if combined with SSE.
           | Particularly for short lived objects one could actually
           | considerably reduce overhead. However, it has been build with
           | the design goal to be an optional feature (as there is no
           | client side API) : I guess it fulfilled at least that goal.
        
           | jefftk wrote:
           | I agree on removing it, since it turned out not to work well
           | despite lots of people trying.
           | 
           | On your particular question, there's the client hint Sec-CH-
           | Prefers-Color-Scheme: https://web.dev/user-preference-media-
           | features-headers/
        
             | msoad wrote:
             | > The Sec-CH-Prefers-Color-Scheme client hint header is
             | supported on Chromium 93. Other vendors' feedback, namely
             | WebKit's and Mozilla's, is pending.
             | 
             | I don't see this header being sent in Chrome 104!
        
               | panopticon wrote:
               | Works on Chrome 104 for me: https://sec-ch-prefers-color-
               | scheme.glitch.me/
               | 
               | Note that the server has to request that header using
               | accept-ch.
        
               | msoad wrote:
               | curl --head  https://sec-ch-prefers-color-
               | scheme.glitch.me/              HTTP/2 200          date:
               | Fri, 19 Aug 2022 18:55:43 GMT         content-type:
               | text/html; charset=utf-8         content-length: 936
               | x-powered-by: Express         accept-ch: Sec-CH-Prefers-
               | Color-Scheme         vary: Sec-CH-Prefers-Color-Scheme
               | critical-ch: Sec-CH-Prefers-Color-Scheme         etag:
               | W/"3a8-iEB3drxZIB7EZYHQL534qwomDuI"
        
           | fzfaa wrote:
           | > How the server can know if user wants dark mode or light
           | mode CSS file?
           | 
           | Cookies? Custom header?
        
         | therein wrote:
         | Yeah, that's the thing. So very many years ago when we started
         | using HTTP/2 at LinkedIn, we simply just couldn't find a use
         | for server push. It was a fascinating meeting. We got this
         | technology, no matter how much we tried to use it, couldn't
         | come up with a use for it. I still remember how awkward that
         | meeting was to this day.
        
           | skyde wrote:
           | How is this different from rel="preload" in HTML to preload
           | (css javascript ... ) Ex: https://developer.mozilla.org/en-
           | US/docs/Web/HTML/Link_types...
           | 
           | The webserver could just parse the HTML and send http push
           | for each dependency! What was the problem with doing this?
           | 
           | To me this seem very similar to "open document format" are
           | storing html with all its dependency in a ZIP package. So
           | with HTTP/2 push you just push the whole package and the
           | client tell the server if it already have some of the files.
        
             | coder543 wrote:
             | > The webserver could just parse the HTML and send http
             | push for each dependency! What was the problem with doing
             | this?
             | 
             | Well... the client knows which resources are already in its
             | cache. The server does not. You just suggested that the
             | server should always send resources that client almost
             | certainly already had cached, which is wasteful for
             | everyone involved.
             | 
             | > So with HTTP/2 push you just push the whole package and
             | the client tell the server if it already have some of the
             | files.
             | 
             | That doesn't make sense. Once the files have been pushed,
             | the bandwidth and time has already been wasted. The client
             | doesn't get to tell the server anything in that scenario.
        
               | skyde wrote:
               | a push is an HTTP2 stream. the stream header contain
               | everything the client need to know if it already have
               | that file.
               | 
               | If it does already have that file, client simply close
               | the stream it doesn't need to download the file or send
               | request to server to say it doesn't need the file.
        
               | coder543 wrote:
               | Even then, the average case would still be worse because
               | the server would be sending all these unnecessary stream
               | headers and forcing the client to send so many
               | unnecessary RST_STREAM frames back. Each PUSH_PROMISE is
               | supposed to contain the full set of headers for each
               | resource.
               | 
               | I guess I hadn't realized that clients could RST_STREAM
               | on these pushes, but it doesn't change the outcome here.
               | 
               | What you describe isn't a win for anyone except a client
               | with a cold cache, and then they start losing immediately
               | after that. That's why it isn't done. That's why HTTP/2
               | Push is going away.
        
               | Matthias247 wrote:
               | Even if a client does a RST_STREAM, the origin server
               | might already have done a lot of additional work (e.g.
               | request the pushed file from an upstream if it's a
               | proxy/CDN), and probably stuffed
               | min(TCP_SEND_BUFFER_SIZE, STREAM_FLOW_CONTRO_WINDOW) of
               | data into the stream. Which then also means all of that
               | work might get billed if the server is a managed service.
               | It's really quite some waste of resources compared to the
               | client sending an additional request (which might even be
               | a conditional request).
        
               | 0x457 wrote:
               | I guess the client could tell server that "I already have
               | that file in cache", but it's still weird, might require
               | another round-trip (server asking if client needs this
               | file).
        
         | nousermane wrote:
         | Wasn't originally intended use for server push, something like
         | this?
         | 
         | 1) Load page through javascript-enabled browser (headless
         | chrome, etc), and record resources accessed from the same
         | server;
         | 
         | 2) Save this list somewhere, where server can read it, keyed by
         | URL;
         | 
         | 3) When user requests same URL, push resources from the list.
        
           | jefftk wrote:
           | That's the idea that led to implementing server push. Lots of
           | people it, and it turns out not to work very well. There's
           | too much variation in what people will already have in their
           | caches and the server is not great at predicting the order in
           | which clients will need the resources.
        
             | [deleted]
        
             | vbezhenar wrote:
             | Client can send bloom filter with first request.
        
               | habibur wrote:
               | How? The client needs to know what the resources are to
               | create a bloom filter. It doesn't know that before 1st
               | request.
        
               | vbezhenar wrote:
               | First request is empty filter, server will push
               | everything mentioned in HTML. For subsequent requests
               | browser will fill filter with known hashes, server will
               | push changed resources (and false positives).
        
               | skyde wrote:
               | your browser can have a bloom filter for each subdomain.
        
             | saurik wrote:
             | I'm just still shocked that this wasn't obvious to more
             | people before: it isn't like you even need to have
             | implemented this feature to do the instrumentation required
             | to know whether this would work, and it frankly had always
             | seemed like a long shot.
        
           | mmis1000 wrote:
           | Ans it turns out the way this was implemented didn't really
           | works well. There just isn't a universal format that you can
           | generate the list and upload it to server/cdn/whatever. No
           | one ever figure out how to actually use this list to generate
           | a http2 server push from a common platform/cdn.
           | 
           | The alternative (Service worker/<meta> preferch/preload tags)
           | on other hand are much easier to handle although have one
           | extra round trip. Because they are just text files that you
           | need to upload to the server.
        
           | 0x457 wrote:
           | I think it was something much simpler: oh, you're navigating
           | to `index.html` without session? You're going to need this
           | CSS, JS and PNG files as well.
           | 
           | And the idea is that client would already have those files by
           | the time browsers parses `<head>` it already has them all.
           | Except...browser cache exists, so who cares.
        
       | hackbinary wrote:
       | It would be great if Google stopped making nasty Urls with the
       | nasty "Scroll To Text Fragment" feature.
       | 
       | It is the biggest tech retrograde since MS started putting UUIDs
       | in to their Urls. Which they largely stopped except for
       | sharepoint documents.
        
       | jksmith wrote:
       | This is forcing a solution to fit the problem.
        
       | chrsig wrote:
       | this really strikes me as evidence that something is wrong with
       | the http standardization process. we should know if something's a
       | good idea before immortalizing it in a standard.
       | 
       | It may be removed from chrome, but it's still in the standard.
        
         | isodev wrote:
         | I would say what's wrong is that Chrome decided to remove a
         | standard feature, and due to their market share, nobody can
         | oppose it. There was a time when a single company controlled
         | the web. That was Microsoft. Today, it's Google.
        
         | BrainVirus wrote:
         | _> this really strikes me as evidence that something is wrong
         | with the http standardization process._
         | 
         | The overall decision-making around how the web works is insane
         | and getting more insane by the year. We have fairly trivial and
         | absolutely universal problems unsolved for decades, while
         | browsers get crammed full of features that aren't used by 99.9%
         | of websites.
         | 
         | Worse, some problems are finally solved in such a half-assed
         | way that it's almost worse than having no solution at all.
         | (Input type="date", meter element, dialog element etc.)
         | 
         | This is not at all what I imagined the field would look like
         | when I entered it nearly two decades ago.
        
           | pixl97 wrote:
           | >We have fairly trivial and absolutely universal problems
           | unsolved for decades, while browsers get crammed full of
           | features that aren't used by 99.9% of websites.
           | 
           | Why is this surprising? Universal problems are hard to solve
           | otherwise it wouldn't be a universal problem in the first
           | place. Add to that large numbers of groups will have their
           | own set of opinions on what the best solution is, and it will
           | conflict with some ideas.
        
             | BrainVirus wrote:
             | _> Universal problems are hard to solve otherwise it
             | wouldn't be a universal problem in the first place._
             | 
             | This is completely backwards. Universal problems on the web
             | are routinely solved by everyone designing a standard
             | website. They often have fairly standard solutions. Browser
             | vendors routinely fail to generalize the experience of run-
             | of-the-mill web developers. It's not about engineering.
             | It's about misaligned incentives and operating from a bad
             | frame of reference.
        
           | modeless wrote:
           | > We have fairly trivial and absolutely universal problems
           | unsolved for decades
           | 
           | This describes most areas of applied computer science,
           | honestly. Language design, build systems, operating systems,
           | etc. When standards and/or widely used systems are involved,
           | nothing is trivial. And the web is the most widely used and
           | most standards-based system out there.
        
           | tehbeard wrote:
           | You want to explain your examples?
           | 
           | Because what I see is:
           | 
           | - A working element that only got half assed/ignored by one
           | provider (Apple, but who's surprised?) which meant polyfills
           | for years to fix it. - A niche element, there are plenty of
           | those? - A relatively new element that solves a lot of issues
           | with Z layer, accessibility etc and is a good basis for other
           | components/libraries to use for their styled/enhanced modal
           | dialogs.
        
         | gunapologist99 wrote:
         | Agreed, it should have received much more testing.
         | 
         | However, in this case it being in the HTTP/2 standard is moot,
         | since it's just a (premature) optimization and thus its removal
         | results in a reasonable fallback, which is simply not using
         | that particular optimization, and also because HTTP/3 is so far
         | along already.
         | 
         | Not to get too tangential, but this seems similar to fetch
         | removing support for reponse bodies for POST/PUT requests; a
         | login POST, for example, might return information about the
         | user's login or the state of the server, or even a per-tab/per-
         | page token that isn't a cookie header, but fetch simply refuses
         | to support it (even though XMLHttpRequest still does). Fetch
         | removing this means that additional round-trips are needed,
         | even over a multiplexed connection, and certain app designs are
         | simply not possible. The solution seems to be to buck the trend
         | and just use XHR instead of fetch, especially since fetch
         | doesn't seem to be available on older Android Chrome (possibly
         | 5-15% marketshare even now.)
        
           | Thiez wrote:
           | > this seems similar to fetch removing support for reponse
           | bodies for POST/PUT requests
           | 
           | Wait what? I have never heard of that, do you have a link
           | where this removal is documented?
        
           | chrsig wrote:
           | > it's just a (premature) optimization and thus its removal
           | results in a reasonable fallback, which is simply not using
           | that particular optimization
           | 
           | this is a salient point. if it's just an optimization and not
           | implementing it (or removal) doesn't change behavior of sites
           | that have adopted it, then it's benign.
        
         | nousermane wrote:
         | Well, IETF can always publish an HTTP/2.1 with that removed,
         | no?
        
           | chrsig wrote:
           | an HTTP/2.1 doesn't stop HTTP/2 from existing, it just
           | creates _another_ standard.
        
             | samwillis wrote:
             | HTML5 doesn't stop XHTML from existing, however it's
             | collectively considered a bad idea and no one uses it.
             | 
             | Sometimes specs are proved to be wrong, this is just one of
             | those occasions.
        
               | jraph wrote:
               | What's wrong with XHTML 1.0 or 1.1? (assuming you are
               | speaking about this)
               | 
               | What significant feature in XHTML is not supported by
               | HTML5?
               | 
               | if you are only speaking about the syntax (so your
               | statement includes XHTML5), I don't follow you neither: I
               | don't see what's wrong with the XML version of HTML5.
        
               | 0x457 wrote:
               | The issue is that if the page is an invalid XHTML - it
               | supposed not render anything at all, which is very
               | undesirable.
               | 
               | `<b><p></b></p>` wouldn't stop HTML from rendering, but
               | would stop XHTML. Plus the whole "XML parsers are very
               | unsafe"
        
               | Thiez wrote:
               | That issue is considered a feature by many. Don't send
               | out broken web pages. If you don't build your pages using
               | string concatenation you have already eliminated most
               | problems (it's just like SQL, in that respect).
               | 
               | XML parsers are not that bad when you disable custom
               | entities, which browsers could easily do.
        
               | codedokode wrote:
               | No. This is actually wrong that browser by default
               | doesn't report errors in HTML, CSS or JS - because of
               | this nobody notices them and you cannot understand why
               | the button is not working. Instead, in case of any error
               | a browser should show a big red bar above or below the
               | page. So that the user immediately understands that the
               | page is broken and it makes no sense to try to enter
               | anything.
               | 
               | Hiding errors is always a poor choice. Only if you are
               | low paid developer not interested in making a quality
               | product then probably you like browser's behaviour.
        
               | chrsig wrote:
               | > however it's collectively considered a bad idea and no
               | one uses it
               | 
               | No one uses it going forward. I'd hate to venture a guess
               | at how many existing sites there are that use xhtml.
               | Browsers are still expected to parse and render them
               | properly.
        
               | samwillis wrote:
               | True, although in this case no one is using HTTP/2 Push,
               | so removing it is no harm and only makes it easer to
               | maintain browsers.
        
               | vbezhenar wrote:
               | Who said noone uses it? XHTML is awesome.
        
         | geofft wrote:
         | But the only real way to be sure if something is a good idea,
         | especially in complex distributed systems such as the web
         | platform, is to try it out. And when you try it out at scale,
         | standardization is very important. The alternative is to have
         | everyone using new ActiveXObject("Microsoft.XMLHTTP") because
         | you have a non-standardized thing that's rapidly turning out to
         | be a good idea.
         | 
         | The purpose of a standardization process isn't to stamp
         | approval on good ideas; it's to ensure interoperability. Server
         | Push was a _plausible_ idea. It very much could have been a
         | good idea. It turned out not to be, after we tried it in the
         | real world for many years, but that 's okay. And we know one
         | thing for sure - the reason it didn't work wasn't that people
         | were afraid to use a nonstandard X-Chrome-Server-Push
         | extension.
        
           | haroldp wrote:
           | That kind of seems like the difference between top-down and
           | bottom-up standards. MS added a weird extension to IE to
           | support their proprietary webmail app, and... actually it was
           | great so people wanted it pulled in to every browser as a
           | standard. Many other features from Netscape's blink to IE's
           | scrolling marquee died natural deaths.
           | 
           | HTTP/2 was what? Something no one wanted, imposed by Google?
           | Is that too strong?
           | 
           | Is bottom-up maybe better in practice?
        
       ___________________________________________________________________
       (page generated 2022-08-19 23:00 UTC)