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