0

Update WriteHeaders check with request idempotency.

Since in cl:
https://chromium-review.googlesource.com/c/chromium/src/+/2508299
we allow 0-RTT for POST request if the request is idempotent, we update
the DCHECK in net/quic/quic_chromium_client_stream.cc

Change-Id: I02a8a4c6a1da7eb945b65a8453c92957f10cd945
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2565453
Reviewed-by: David Schinazi <dschinazi@chromium.org>
Commit-Queue: Yu Su <yuyansu@google.com>
Cr-Commit-Position: refs/heads/master@{#833563}
This commit is contained in:
Yu Su
2020-12-04 02:14:41 +00:00
committed by Chromium LUCI CQ
parent 448a8f789c
commit ba2a1d76c0
6 changed files with 33 additions and 1 deletions

@ -1038,6 +1038,7 @@ int HttpNetworkTransaction::DoSendRequest() {
send_start_time_ = base::TimeTicks::Now();
next_state_ = STATE_SEND_REQUEST_COMPLETE;
stream_->SetRequestIdempotency(request_->idempotency);
return stream_->SendRequest(request_headers_, &response_, io_callback_);
}

@ -18,6 +18,7 @@
#include "base/macros.h"
#include "net/base/completion_once_callback.h"
#include "net/base/idempotency.h"
#include "net/base/net_error_details.h"
#include "net/base/net_errors.h"
#include "net/base/net_export.h"
@ -187,6 +188,9 @@ class NET_EXPORT_PRIVATE HttpStream {
virtual void SetRequestHeadersCallback(RequestHeadersCallback callback) = 0;
// Set the idempotency of the request. No-op by default.
virtual void SetRequestIdempotency(Idempotency idempotency) {}
private:
DISALLOW_COPY_AND_ASSIGN(HttpStream);
};

@ -399,6 +399,15 @@ int QuicChromiumClientStream::Handle::HandleIOComplete(int rv) {
return net_error_;
}
void QuicChromiumClientStream::Handle::SetRequestIdempotency(
Idempotency idempotency) {
idempotency_ = idempotency;
}
Idempotency QuicChromiumClientStream::Handle::GetRequestIdempotency() const {
return idempotency_;
}
QuicChromiumClientStream::QuicChromiumClientStream(
quic::QuicStreamId id,
quic::QuicSpdyClientSessionBase* session,
@ -541,7 +550,9 @@ size_t QuicChromiumClientStream::WriteHeaders(
if (!session()->OneRttKeysAvailable()) {
auto entry = header_block.find(":method");
DCHECK(entry != header_block.end());
DCHECK_NE("POST", entry->second);
DCHECK(
entry->second != "POST" ||
(handle_ != nullptr && handle_->GetRequestIdempotency() == IDEMPOTENT));
}
net_log_.AddEvent(
NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS,

@ -15,6 +15,7 @@
#include "base/callback_forward.h"
#include "base/macros.h"
#include "net/base/completion_once_callback.h"
#include "net/base/idempotency.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_export.h"
#include "net/base/upload_data_stream.h"
@ -134,6 +135,11 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream
const NetLogWithSource& net_log() const;
// Sets the idempotency of the request.
void SetRequestIdempotency(Idempotency idempotency);
// Returns the idempotency of the request.
Idempotency GetRequestIdempotency() const;
private:
friend class QuicChromiumClientStream;
@ -188,6 +194,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream
bool is_done_reading_;
bool is_first_stream_;
size_t num_bytes_consumed_;
Idempotency idempotency_ = DEFAULT_IDEMPOTENCY;
int net_error_;

@ -791,4 +791,11 @@ int QuicHttpStream::ComputeResponseStatus() const {
return ERR_QUIC_PROTOCOL_ERROR;
}
void QuicHttpStream::SetRequestIdempotency(Idempotency idempotency) {
if (stream_ == nullptr) {
return;
}
stream_->SetRequestIdempotency(idempotency);
}
} // namespace net

@ -15,6 +15,7 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "net/base/completion_once_callback.h"
#include "net/base/idempotency.h"
#include "net/base/io_buffer.h"
#include "net/base/load_timing_info.h"
#include "net/base/net_export.h"
@ -66,6 +67,7 @@ class NET_EXPORT_PRIVATE QuicHttpStream : public MultiplexedHttpStream {
AlternativeService* alternative_service) const override;
void PopulateNetErrorDetails(NetErrorDetails* details) override;
void SetPriority(RequestPriority priority) override;
void SetRequestIdempotency(Idempotency idempotency) override;
static HttpResponseInfo::ConnectionInfo ConnectionInfoFromQuicVersion(
quic::ParsedQuicVersion quic_version);