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() { ...@@ -1038,6 +1038,7 @@ int HttpNetworkTransaction::DoSendRequest() {
send_start_time_ = base::TimeTicks::Now(); send_start_time_ = base::TimeTicks::Now();
next_state_ = STATE_SEND_REQUEST_COMPLETE; next_state_ = STATE_SEND_REQUEST_COMPLETE;
stream_->SetRequestIdempotency(request_->idempotency);
return stream_->SendRequest(request_headers_, &response_, io_callback_); return stream_->SendRequest(request_headers_, &response_, io_callback_);
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "net/base/completion_once_callback.h" #include "net/base/completion_once_callback.h"
#include "net/base/idempotency.h"
#include "net/base/net_error_details.h" #include "net/base/net_error_details.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/base/net_export.h" #include "net/base/net_export.h"
...@@ -187,6 +188,9 @@ class NET_EXPORT_PRIVATE HttpStream { ...@@ -187,6 +188,9 @@ class NET_EXPORT_PRIVATE HttpStream {
virtual void SetRequestHeadersCallback(RequestHeadersCallback callback) = 0; virtual void SetRequestHeadersCallback(RequestHeadersCallback callback) = 0;
// Set the idempotency of the request. No-op by default.
virtual void SetRequestIdempotency(Idempotency idempotency) {}
private: private:
DISALLOW_COPY_AND_ASSIGN(HttpStream); DISALLOW_COPY_AND_ASSIGN(HttpStream);
}; };
......
...@@ -399,6 +399,15 @@ int QuicChromiumClientStream::Handle::HandleIOComplete(int rv) { ...@@ -399,6 +399,15 @@ int QuicChromiumClientStream::Handle::HandleIOComplete(int rv) {
return net_error_; return net_error_;
} }
void QuicChromiumClientStream::Handle::SetRequestIdempotency(
Idempotency idempotency) {
idempotency_ = idempotency;
}
Idempotency QuicChromiumClientStream::Handle::GetRequestIdempotency() const {
return idempotency_;
}
QuicChromiumClientStream::QuicChromiumClientStream( QuicChromiumClientStream::QuicChromiumClientStream(
quic::QuicStreamId id, quic::QuicStreamId id,
quic::QuicSpdyClientSessionBase* session, quic::QuicSpdyClientSessionBase* session,
...@@ -541,7 +550,9 @@ size_t QuicChromiumClientStream::WriteHeaders( ...@@ -541,7 +550,9 @@ size_t QuicChromiumClientStream::WriteHeaders(
if (!session()->OneRttKeysAvailable()) { if (!session()->OneRttKeysAvailable()) {
auto entry = header_block.find(":method"); auto entry = header_block.find(":method");
DCHECK(entry != header_block.end()); DCHECK(entry != header_block.end());
DCHECK_NE("POST", entry->second); DCHECK(
entry->second != "POST" ||
(handle_ != nullptr && handle_->GetRequestIdempotency() == IDEMPOTENT));
} }
net_log_.AddEvent( net_log_.AddEvent(
NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS,
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/macros.h" #include "base/macros.h"
#include "net/base/completion_once_callback.h" #include "net/base/completion_once_callback.h"
#include "net/base/idempotency.h"
#include "net/base/ip_endpoint.h" #include "net/base/ip_endpoint.h"
#include "net/base/net_export.h" #include "net/base/net_export.h"
#include "net/base/upload_data_stream.h" #include "net/base/upload_data_stream.h"
...@@ -134,6 +135,11 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream ...@@ -134,6 +135,11 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream
const NetLogWithSource& net_log() const; 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: private:
friend class QuicChromiumClientStream; friend class QuicChromiumClientStream;
...@@ -188,6 +194,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream ...@@ -188,6 +194,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream
bool is_done_reading_; bool is_done_reading_;
bool is_first_stream_; bool is_first_stream_;
size_t num_bytes_consumed_; size_t num_bytes_consumed_;
Idempotency idempotency_ = DEFAULT_IDEMPOTENCY;
int net_error_; int net_error_;
......
...@@ -791,4 +791,11 @@ int QuicHttpStream::ComputeResponseStatus() const { ...@@ -791,4 +791,11 @@ int QuicHttpStream::ComputeResponseStatus() const {
return ERR_QUIC_PROTOCOL_ERROR; return ERR_QUIC_PROTOCOL_ERROR;
} }
void QuicHttpStream::SetRequestIdempotency(Idempotency idempotency) {
if (stream_ == nullptr) {
return;
}
stream_->SetRequestIdempotency(idempotency);
}
} // namespace net } // namespace net
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "net/base/completion_once_callback.h" #include "net/base/completion_once_callback.h"
#include "net/base/idempotency.h"
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
#include "net/base/load_timing_info.h" #include "net/base/load_timing_info.h"
#include "net/base/net_export.h" #include "net/base/net_export.h"
...@@ -66,6 +67,7 @@ class NET_EXPORT_PRIVATE QuicHttpStream : public MultiplexedHttpStream { ...@@ -66,6 +67,7 @@ class NET_EXPORT_PRIVATE QuicHttpStream : public MultiplexedHttpStream {
AlternativeService* alternative_service) const override; AlternativeService* alternative_service) const override;
void PopulateNetErrorDetails(NetErrorDetails* details) override; void PopulateNetErrorDetails(NetErrorDetails* details) override;
void SetPriority(RequestPriority priority) override; void SetPriority(RequestPriority priority) override;
void SetRequestIdempotency(Idempotency idempotency) override;
static HttpResponseInfo::ConnectionInfo ConnectionInfoFromQuicVersion( static HttpResponseInfo::ConnectionInfo ConnectionInfoFromQuicVersion(
quic::ParsedQuicVersion quic_version); 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