http2: PUSH_PROMISE client-side stream state

The http2 spec says:

A receiver MUST treat the receipt of a PUSH_PROMISE on a stream that is neither "open" nor "half-closed (local)" as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. However, an endpoint that has sent RST_STREAM on the associated stream MUST handle PUSH_PROMISE frames that might have been created before the RST_STREAM frame is received and processed.

The spec also has this lifecycle diagram.

My understanding is that in order for a client to receive a PUSH_PROMISE on a stream, the client must have <strong>all</strong> of these on that stream:

    <li>sent HEADERS frame (+ any CONTINUATIONs) to the server</li> <li>not received END_STREAM flag from the server</li> <li>not received RST_STREAM frame from the server</li> </ul>

    (Notably missing here is "not sent RST_STREAM frame to the server”, which would lead to the stream being "closed"; the quote above says this is not grounds for connection error.)

    In any case where these criteria are not met, then the client must treat receiving a PUSH_PROMISE as a connection error.

    Is this a correct understanding?


    Your understanding is correct.

    The HTTP/2 protocol associates PUSH_PROMISE streams to an existing stream, called the associated stream.

    The associated stream must meet the conditions defined in the section of the specification quoted in the question; the bullet list in the question is another way of saying the same thing that the specification section says.


  • How to hide an alias column in mysql EDITED
  • macro that auto-executes when sheet is opened
  • How to add search to some individual columns of DataTable in the footer?
  • asp.net mvc 3: deployment. getJson urls don't work
  • Weka UI and API code in Java gives different results
  • Plotting multiple corrplots (R) in the same graph
  • What does cl parameter in knn function in R mean?
  • CMake cl.exe is not able to compile a simple test program
  • Get linq to return IEnumerable result
  • Parallel cosine distance using clusterapply in R
  • OpenCL: Additional directories for header files
  • How to fix this error? emacs.d/starter-kit.el: `flet' is an obsolete macro (as of 24.3); use ei
  • scrapy - item loader - default processors
  • MSVC10 /MP builds not multicore across folders in a project
  • Clojure embed var to String, a alternative way? Like sprintf way?
  • Unable to connect to OnVif enabled camera using C#
  • Setting WPF Window Background to Resource Dictionary Brush User Setting
  • PayPal API Listener Website Payments Standard URI
  • Consuming a WCF service in a Java Client using wsHttpBinding
  • Python ImageIO Gif Set Delay Between Frames
  • as3-flash: any way to access all the instances placed in different frames from document class?
  • Odoo 10 - Overriding unlink method
  • Not able to aggregate on nested fields in elasticsearch
  • wxPython: displaying multiple widgets in same frame
  • Django rest serializer Breaks when data exists
  • How to rebase a series of branches?
  • R - Combining Columns to String Based on Logical Match
  • Update CALayer sublayers immediately
  • Azure Cloud Service Web Role web pages do not load
  • javaw.exe and eclipse startup problems
  • Updating server-side rendering client-side
  • Incrementing object id automatically JS constructor (static method and variable)
  • what is the difference between the asp.net mvc application and asp.net web application
  • Rails 2: use form_for to build a form covering multiple objects of the same class
  • Proper way to use connect-multiparty with express.js?
  • Free memory of cv::Mat loaded using FileStorage API
  • embed rChart in Markdown
  • need help with bizarre java.net.HttpURLConnection behavior
  • unknown Exception android
  • Unable to use reactive element in my shiny app