Landing Recent QUIC changes until 1:56 PM, Dec 21, 2018 UTC-8

Use PendingStreams to buffer incoming streams. Behavior changes protected
by  QUIC version 99

Allow QuicSession to buffer frames for incoming streams in a PendingStream
until the first byte arrives, if ShouldBufferIncomingStream() returns true.
Change QuicSpdySession to return true for v99 unidirectional streams.
Merge internal change: 226538637
https://chromium-review.googlesource.com/c/chromium/src/+/1394084

Changes how QUIC connection IDs are created.

Seventh step towards variable length QUIC connection IDs.

This CL has more of the codebase treat QUIC connection IDs as opaque bags of
bytes instead of uint64_t's. The change is protected by GFE restart flags
quic_variable_length_connection_ids_(client|server).

This CL also removes the enabling_blocked_by on
quic_restart_flag_quic_connection_ids_network_byte_order.
Merge internal change: 226428581
https://chromium-review.googlesource.com/c/chromium/src/+/1394083

In QUIC v99, client closes connection if it tries to create a server initiated
bidirectional stream.
Merge internal change: 226397697
https://chromium-review.googlesource.com/c/chromium/src/+/1393784

Add QpackHeaderTable::inserted_entry_count().

Turns out this quantity is needed for relative indexing on the encoder stream,
not the dropped entry count.  See
https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#rfc.section.3.2.5.
Merge internal change: 226352231
https://chromium-review.googlesource.com/c/chromium/src/+/1393342

Fix ServerSendsVersionNegotiation in http end_to_end_test

In tests with the client supporting all versions (from a bucket) and the server
supporting all possible versions, the client's choice of version can be one
that the server also supports, but not be the head of the list. The current
implementation of ServerSendsVersionNegotiation would return true in this case,
even though the server won't send version negotiation.

(This currently isn't an issue because of which tests are run with TLS enabled
 and how the buckets are set up, but it will be an issue when there are more
 version buckets added in the CRYPTO frame CL.)
Merge internal change: 226246369
https://chromium-review.googlesource.com/c/chromium/src/+/1393673

Change header type byte in v99 to meet draft 17

https://quicwg.org/base-drafts/draft-ietf-quic-transport.html
Merge internal change: 226235106
https://chromium-review.googlesource.com/c/chromium/src/+/1393672

Modify CheckMultiPathResponse to use a client_framer to validate path responses.
Merge internal change: 226227650
https://chromium-review.googlesource.com/c/chromium/src/+/1393341

Add two DCHECKs to TestHeadersHandler::ReleaseHeaderList().

Because belts and suspenders.
Merge internal change: 226211897
https://chromium-review.googlesource.com/c/chromium/src/+/1393377

Change flag count 'quic_monotonic_epoll_clock' to only increment when time goes
backwards.
Merge internal change: 226196406
https://chromium-review.googlesource.com/c/chromium/src/+/1393663

Make ReadFileContents take |filename| argument as QuicStringPiece.
Merge internal change: 226192259
https://chromium-review.googlesource.com/c/chromium/src/+/1393462

Signal error in QpackProgressiveDecoder if header data prefix is incomplete.

Every header block must have a prefix that communicates Largest Reference and
Delta Base Index.  Make it an error if header block data is terminated without a
complete prefix.
Merge internal change: 226190644
https://chromium-review.googlesource.com/c/chromium/src/+/1393550

Change behavior of empty QUIC connection IDs.

Empty connection IDs (created using either QuicConnectionId()
(the default constructor) or EmptyQuicConnectionId()) now have
length zero instead of 8. QuicConnectionIdFromUInt64(0) is no
longer considered empty. QuicConnectionIdIsEmpty() has been removed.
Some test code is changed from EmptyConnectionId() to TestConnectionId()
because the code it exercises expects 8-byte connection IDs.
Merge internal change: 226099591
https://chromium-review.googlesource.com/c/chromium/src/+/1393549

Adopt QuicConnectionId::ToString().

Switches the parts of the code that need a string representation of a
connection ID away from the hop through a uint64_t.

Use QuicConnectionId::ToString() to stringify QUIC connection IDs as hex
strings instead of decimal strings.
Merge internal change: 226060328
https://chromium-review.googlesource.com/c/chromium/src/+/1393525

Change server_address/client_address to self_address/peer_address in
ProcessPacketInterface::ProcessPacket and all override methods.
Merge internal change: 225995694
https://chromium-review.googlesource.com/c/chromium/src/+/1393446

Fix Quic_Frame.cc output to use correct frame type for APPLICATION_CLOSE frame

Quic_frame.cc attempted to output a CONNECTION_CLOSE frame when when the frame
was, in fact, an APPLICATION_CLOSE.  This CL corrects that.
N/A - these frames exist only in version 99
Merge internal change: 225979605
https://chromium-review.googlesource.com/c/chromium/src/+/1393445

Add default virtual destructor for every derived class in QPACK.
Merge internal change: 225925387
https://chromium-review.googlesource.com/c/chromium/src/+/1393434

Add stream_id to progressive encoder and decoder.

This will be necessary for the encoder to keep track of references to dynamic
entries by stream id, and for the decoder so that a Header Acknowledgement
instruction (which contains the stream id) can be sent when decoding is
complete.

Also use the (currently incorrectly defined 32-bit, soon-to-be-64 bit)
QuicStreamId type instead of uint64_t for stream IDs.
Merge internal change: 225917487
https://chromium-review.googlesource.com/c/chromium/src/+/1393433

Add Header Data Prefix to Qpack{En,De}coder.

Encoder does not emit dynamic entries yet, so Largest Reference
and Base Index are always zero.

Decoder does not decode dynamic entries yet, but at least records
Largest Reference and Base Index.
Merge internal change: 225908419
https://chromium-review.googlesource.com/c/chromium/src/+/1393334

Add Header Data Prefix instruction and necessary fields.

Add support for second varint in QpackInstructoin{En,De}coder.
Also rename static bit to S bit, because in the Header Data Prefix
it is a Sign.
Merge internal change: 225895953
https://chromium-review.googlesource.com/c/chromium/src/+/1392366

Sixth step towards variable length QUIC connection IDs.

This CL creates QuicUtils::CreateRandomConnectionId() and adopts it from inside
//third_party/quic/. There will be followup CLs to adopt it from our clients, to
facilitate our effort of moving them away from QuicConnectionIdFromUInt64().
Merge internal change: 225884942
https://chromium-review.googlesource.com/c/chromium/src/+/1392362

Add QPACK dynamic table.(Prototype code not used in production yet.)

Implement dynamic table with synchronous lookup only.  The ability to request an
entry that has not been added to the table yet and call back with the result
later will be added in a future CL.  However, as the decoder can request that
the encoder never refers to an unacknowledged entry by setting
SETTINGS_QPACK_BLOCKED_STREAMS to zero (default value), this functionality will
be enough for a compliant (though not maximally efficient) decoder.

This CL already uses the nomenclature "dynamic table capacity" and "maximum
dynamic table capacity" proposed at
https://github.com/quicwg/base-drafts/pull/2115#issuecomment-446796679 which has
not been merged into the spec yet.
Merge internal change: 225870655
https://chromium-review.googlesource.com/c/chromium/src/+/1392329

Split AppendIetfTypeByte and ProcessIetfTypeByte out from AppendIetfPacketHeader
and ProcessIetfPacketHeader. Refactoring only. No functional change expected.
Merge internal change: 225827558
https://chromium-review.googlesource.com/c/chromium/src/+/1392359

Change server_address/client_address to self_address/peer_address in buffered
packet store. (n/a) Rename only, not protected.
Merge internal change: 225817243
https://chromium-review.googlesource.com/c/chromium/src/+/1392177

Change-Id: I073e223e92314ac7fdb69a15098e63ac52855f7c
Reviewed-on: https://chromium-review.googlesource.com/c/1394143
Commit-Queue: Zhongyi Shi <[email protected]>
Reviewed-by: Nick Harper <[email protected]>
Cr-Commit-Position: refs/heads/master@{#619590}
82 files changed