Landing Recent QUIC changes until 2:10 PM, Sep 28, 2018 UTC-4

Update QUIC feature flags to the state as of Tue Oct  2 15:08:15 EDT 2018

https://chromium-review.googlesource.com/c/chromium/src/+/1258028

Replace QuicUrlUtils with GURL.

Merge internal change: 214964597

https://chromium-review.googlesource.com/c/1256143/

Implement QPACK encoder stream.

The encoder stream is a unidirectional stream, so the two endpoints hold
it differently.  The endpoint that creates the stream has a
QpackEncoderStreamSender instance that its QpackEncoder uses.  The other
side creates a QpackEncoderStreamReceiver instance when it receives the
opening data from its peer and notifies its QpackDecoder.

Of course each connection has two separate encoder streams corresponding
to two independent compression contexts, so every endpoint will end up
having one QpackEncoder, one QpackDecoder, one QpackEncoderStreamSender,
and one QpackEncoderStreamReceiver.

Merge internal change: 214847161

https://chromium-review.googlesource.com/c/1255664/

Fix hex string in
QpackEncoderStreamReceiverTest.InsertWithNameReferenceIndexTooLarge.

Hex encoded string had odd length; add one character.

Merge internal change: 215318537

https://chromium-review.googlesource.com/c/1255664/

Refactor QpackDecoder States.

1. Split up DoNameString() into two methods: DoReadName(), which
continues reading the headename, and DoDecodeName(), which does
the optional Huffman decoding.  Same with DoValueString().  This
makes states more atomic and therefore maybe easier to reason about.
2. Add comments to explain the awkward difference between handling
empty names and empty values.  (The other option would be to handle
empty names the same way, which feels wrong because they should never
occur in HTTP, but QPACK does not forbid them.)

Merge internal change: 214688919

https://chromium-review.googlesource.com/c/1254583/

Get rid of QuicControlFrame. No functional change, not protected.

The only thing QuicControlFrame saves the derived classes from doing is
to provide a default value(kInvalidControlFrameId), this can easily be
done the derived classes too.

Merge internal change: 214649060

https://chromium-review.googlesource.com/c/1254582/

Remove QuicSentPacketManager.HasUnackedPackets(), because it is misleading and should not be used externally.

Merge internal change: 214612735

https://chromium-review.googlesource.com/c/1254581/

Fix QUIC's path degrading alarm so it is is not set on the server and
uses HasInFlightPackets() instead of HasUnackedPackets().  Protected by
FLAGS_quic_reloadable_flag_quic_fix_path_degrading_alarm.

Merge internal change: 214705628

https://chromium-review.googlesource.com/c/1254581/

Modify QuicSentPacketManagerTest.GetTransmissionTimeCryptoHandshake to verify the exponential backoff of crypto packet retransmission timeout. For v39+, last_crypto_packet_sent_time_ gets updated each time a crypto packet gets sent. For v39-, last_crypto_packet_sent_time_ does not get updated for retransmitted crypto packets.

Merge internal change: 214603426

https://chromium-review.googlesource.com/c/1254472/

Deprecate FLAGS_quic_reloadable_flag_quic_fix_retransmit_lost_data.

Merge internal change: 214593916

https://chromium-review.googlesource.com/c/1254422/

Move checks on stream ID limits into common method in QuicStream

Flag Protected by FLAGS_quic_use_common_stream_check

This CL moves functionality that is common for checking on whether
the limit on stream creation has been reached into a common QuicStream
method.  This work is preparatory to adding Version-99/IETF-QUIC's
stream ID limits.

Merge internal change: 214588549

https://chromium-review.googlesource.com/c/1254482/

Pull all inlined quic frames out of the anonymous struct within QuicFrame. No functional change, not protected.

This is similar to what CL 210144041 did to the QuicStreamFrame. By
doing this to all inlined frames, the anonymous struct will not contain
anything with custom constructors, this allows the code to compile under
GCC.

The chromium bug for the compile issue with this code is
https://bugs.chromium.org/p/chromium/issues/detail?id=882347#c6.

The (more general) GCC bug is
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77314

Merge internal change: 214536295

https://chromium-review.googlesource.com/c/1254469/

Rename EncodeHeaderSet() to EncodeHeaderList().

Because I renamed header set to header list in the QPACK draft at
https://github.com/quicwg/base-drafts/pull/1725.  (For some reason
the argument of EncodeHeaderSet() was already called |header_list|.)

n/a (Prototype code not in production yet.)

Merge internal change: 214481848

https://chromium-review.googlesource.com/c/1254468/

Do not use std::string in QPACK code.

Use QuicString instead.

Merge internal change: 214457698

https://chromium-review.googlesource.com/c/1254467/

Enable timestamps in QUIC ack frames in QuaRTC.

Merge internal change: 214450843

https://chromium-review.googlesource.com/c/1254481/

Remove unused QuicTestRandom class from QUIC platform.

Merge internal change: 214341130

https://chromium-review.googlesource.com/c/1254465/

Change the vector of static streams in QuicWriteBlockedList from std::vector to QuicInlinedVector. Data structure change, not protected.

Merge internal change: 214277121

https://chromium-review.googlesource.com/c/1254463/

Remove unused should_process_data from TestStream's constructor.

Merge internal change: 214266461

https://chromium-review.googlesource.com/c/1254461/

Add framer support for IETF QUIC NEW_TOKEN frame.

This change adds framer support for the NEW_TOKEN frame defined
in IETF QUIC. Frames can be parsed and generated for Verion 99/IETF
QUIC packets. Higher level code, to request generation of a NEW_TOKEN
frame, or handle receipt of one, is not included in this C/L.

Merge internal change: 214257180

https://chromium-review.googlesource.com/c/1254421/

[email protected]

Change-Id: Ib8c6977043d47472968b0a5ca9653c38fe13c839
Reviewed-on: https://chromium-review.googlesource.com/c/1258029
Commit-Queue: Victor Vasiliev <[email protected]>
Reviewed-by: Bence Béky <[email protected]>
Cr-Commit-Position: refs/heads/master@{#596087}
91 files changed