Commit ba2a1d76 authored by Yu Su's avatar Yu Su Committed by Chromium LUCI CQ

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/+/2565453Reviewed-by: default avatarDavid Schinazi <dschinazi@chromium.org>
Commit-Queue: Yu Su <yuyansu@google.com>
Cr-Commit-Position: refs/heads/master@{#833563}
parent 448a8f78
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment