def _read_http_push_promise(self, size, kind, flag):
if size < <NUM_LIT:4>:<EOL><INDENT>raise ProtocolError(f'<STR_LIT>', quiet=True)<EOL><DEDENT>_plen = <NUM_LIT:0><EOL>_flag = dict(<EOL>END_HEADERS=False,      <EOL>PADDED=False,           <EOL>)<EOL>for index, bit in enumerate(flag):<EOL><INDENT>if index == <NUM_LIT:2> and bit:<EOL><INDENT>_flag['<STR_LIT>'] = True<EOL><DEDENT>elif index == <NUM_LIT:3> and bit:<EOL><INDENT>_flag['<STR_LIT>'] = True<EOL>_plen = self._read_unpack(<NUM_LIT:1>)<EOL><DEDENT>elif bit:<EOL><INDENT>raise ProtocolError(f'<STR_LIT>', quiet=True)<EOL><DEDENT>else:<EOL><INDENT>continue<EOL><DEDENT><DEDENT>if _flag['<STR_LIT>']:<EOL><INDENT>_dlen = size - _plen - <NUM_LIT:5><EOL><DEDENT>else:<EOL><INDENT>_dlen = size - _plen - <NUM_LIT:4><EOL><DEDENT>if _dlen < <NUM_LIT:0>:<EOL><INDENT>raise ProtocolError(f'<STR_LIT>', quiet=True)<EOL><DEDENT>_rpid = self._read_binary(<NUM_LIT:4>)<EOL>_frag = self._read_fileng(_dlen) or None<EOL>if int(_rpid[<NUM_LIT:0>], base=<NUM_LIT:2>):<EOL><INDENT>raise ProtocolError(f'<STR_LIT>', quiet=True)<EOL><DEDENT>padding = self._read_binary(_plen)<EOL>if any((int(bit, base=<NUM_LIT:2>) for bit in padding)):<EOL><INDENT>raise ProtocolError(f'<STR_LIT>', quiet=True)<EOL><DEDENT>data = dict(<EOL>flags=_flag,<EOL>pid=int(_rpid[<NUM_LIT:1>:], base=<NUM_LIT:2>),<EOL>frag=_frag,<EOL>)<EOL>if _flag['<STR_LIT>']:<EOL><INDENT>data['<STR_LIT>'] = _plen<EOL><DEDENT>return data<EOL>
Read HTTP/2 PUSH_PROMISE frames.

        Structure of HTTP/2 PUSH_PROMISE frame [RFC 7540]:
            +-----------------------------------------------+
            |                 Length (24)                   |
            +---------------+---------------+---------------+
            |   Type (8)    |   Flags (8)   |
            +-+-------------+---------------+-------------------------------+
            |R|                 Stream Identifier (31)                      |
            +---------------+-----------------------------------------------+
            |Pad Length? (8)|
            +-+-------------+-----------------------------------------------+
            |R|                  Promised Stream ID (31)                    |
            +-+-----------------------------+-------------------------------+
            |                   Header Block Fragment (*)                 ...
            +---------------------------------------------------------------+
            |                           Padding (*)                       ...
            +---------------------------------------------------------------+

            Octets      Bits        Name                    Description
              0           0     http.length             Length
              3          24     http.type               Type (1)
              4          32     http.flags              Flags
              5          40     -                       Reserved
              5          41     http.sid                Stream Identifier
              9          72     http.pad_len            Pad Length (Optional)
              10         80     -                       Reserved
              10         81     http.pid                Promised Stream ID
              14        112     http.frag               Header Block Fragment
              ?           ?     -                       Padding (Optional)