• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/quic/quic_http_utils.h"
6 
7 #include <utility>
8 
9 #include "base/metrics/histogram_macros.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "net/spdy/spdy_log_util.h"
12 
13 namespace net {
14 
ConvertRequestPriorityToQuicPriority(const RequestPriority priority)15 spdy::SpdyPriority ConvertRequestPriorityToQuicPriority(
16     const RequestPriority priority) {
17   DCHECK_GE(priority, MINIMUM_PRIORITY);
18   DCHECK_LE(priority, MAXIMUM_PRIORITY);
19   return static_cast<spdy::SpdyPriority>(HIGHEST - priority);
20 }
21 
ConvertQuicPriorityToRequestPriority(spdy::SpdyPriority priority)22 RequestPriority ConvertQuicPriorityToRequestPriority(
23     spdy::SpdyPriority priority) {
24   // Handle invalid values gracefully.
25   return (priority >= 5) ? IDLE
26                          : static_cast<RequestPriority>(HIGHEST - priority);
27 }
28 
QuicRequestNetLogParams(quic::QuicStreamId stream_id,const quiche::HttpHeaderBlock * headers,quic::QuicStreamPriority priority,NetLogCaptureMode capture_mode)29 base::Value::Dict QuicRequestNetLogParams(
30     quic::QuicStreamId stream_id,
31     const quiche::HttpHeaderBlock* headers,
32     quic::QuicStreamPriority priority,
33     NetLogCaptureMode capture_mode) {
34   base::Value::Dict dict = HttpHeaderBlockNetLogParams(headers, capture_mode);
35   switch (priority.type()) {
36     case quic::QuicPriorityType::kHttp: {
37       auto http_priority = priority.http();
38       dict.Set("quic_priority_type", "http");
39       dict.Set("quic_priority_urgency", http_priority.urgency);
40       dict.Set("quic_priority_incremental", http_priority.incremental);
41       break;
42     }
43     case quic::QuicPriorityType::kWebTransport: {
44       auto web_transport_priority = priority.web_transport();
45       dict.Set("quic_priority_type", "web_transport");
46       dict.Set("web_transport_session_id",
47                static_cast<int>(web_transport_priority.session_id));
48 
49       // `send_group_number` is an uint64_t, `send_order` is an int64_t. But
50       // base::Value doesn't support these types.
51       // Case to a double instead. As this is just for diagnostics, some loss of
52       // precision is acceptable.
53       dict.Set("web_transport_send_group_number",
54                static_cast<double>(web_transport_priority.send_group_number));
55       dict.Set("web_transport_send_order",
56                static_cast<double>(web_transport_priority.send_order));
57       break;
58     }
59   }
60   dict.Set("quic_stream_id", static_cast<int>(stream_id));
61   return dict;
62 }
63 
QuicResponseNetLogParams(quic::QuicStreamId stream_id,bool fin_received,const quiche::HttpHeaderBlock * headers,NetLogCaptureMode capture_mode)64 base::Value::Dict QuicResponseNetLogParams(
65     quic::QuicStreamId stream_id,
66     bool fin_received,
67     const quiche::HttpHeaderBlock* headers,
68     NetLogCaptureMode capture_mode) {
69   base::Value::Dict dict = HttpHeaderBlockNetLogParams(headers, capture_mode);
70   dict.Set("quic_stream_id", static_cast<int>(stream_id));
71   dict.Set("fin", fin_received);
72   return dict;
73 }
74 
75 }  // namespace net
76