grpc 1.63.0 → 1.63.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +36 -27
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -0
- data/src/core/ext/xds/xds_client_stats.cc +14 -12
- data/src/core/lib/promise/detail/promise_like.h +7 -1
- data/src/core/lib/surface/legacy_channel.cc +6 -6
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45385306b018c5a5ee8deaceb0d4b2e42eff9bf3f7de922e76f4b46bab140219
|
4
|
+
data.tar.gz: 01cd49f71a51109fc90baacc84eb2c58a06bc4ed7dac78ccbc70cece75a1bd11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c79a81a75a8e55799f231fcfc0f918aa990d984e59ef31eec07273e4a7df7141b131fc0b433bab0095e773acde8963021a350b3bd9974e7191604f06f851145
|
7
|
+
data.tar.gz: c1b5cc5e1e4a5af78b08d5d60513b4058514990a2877292b4c7ea8b1710ecd46d8ecfdfa3c81a2ba823aabf8d2dd0b7cd19f6d5aa29f6a873023612681a3b78f
|
data/Makefile
CHANGED
@@ -92,12 +92,14 @@ constexpr Base64InverseTable kBase64InverseTable;
|
|
92
92
|
class HPackParser::Input {
|
93
93
|
public:
|
94
94
|
Input(grpc_slice_refcount* current_slice_refcount, const uint8_t* begin,
|
95
|
-
const uint8_t* end, absl::BitGenRef bitsrc,
|
95
|
+
const uint8_t* end, absl::BitGenRef bitsrc,
|
96
|
+
HpackParseResult& frame_error, HpackParseResult& field_error)
|
96
97
|
: current_slice_refcount_(current_slice_refcount),
|
97
98
|
begin_(begin),
|
98
99
|
end_(end),
|
99
100
|
frontier_(begin),
|
100
|
-
|
101
|
+
frame_error_(frame_error),
|
102
|
+
field_error_(field_error),
|
101
103
|
bitsrc_(bitsrc) {}
|
102
104
|
|
103
105
|
// If input is backed by a slice, retrieve its refcount. If not, return
|
@@ -216,14 +218,18 @@ class HPackParser::Input {
|
|
216
218
|
|
217
219
|
// Check if we saw an EOF
|
218
220
|
bool eof_error() const {
|
219
|
-
return min_progress_size_ != 0 ||
|
221
|
+
return min_progress_size_ != 0 || frame_error_.connection_error();
|
222
|
+
}
|
223
|
+
|
224
|
+
// Reset the field error to be ok
|
225
|
+
void ClearFieldError() {
|
226
|
+
if (field_error_.ok()) return;
|
227
|
+
field_error_ = HpackParseResult();
|
220
228
|
}
|
221
229
|
|
222
230
|
// Minimum number of bytes to unstuck the current parse
|
223
231
|
size_t min_progress_size() const { return min_progress_size_; }
|
224
232
|
|
225
|
-
bool has_error() const { return !error_.ok(); }
|
226
|
-
|
227
233
|
// Set the current error - tweaks the error to include a stream id so that
|
228
234
|
// chttp2 does not close the connection.
|
229
235
|
// Intended for errors that are specific to a stream and recoverable.
|
@@ -247,10 +253,7 @@ class HPackParser::Input {
|
|
247
253
|
// read prior to being able to get further in this parse.
|
248
254
|
void UnexpectedEOF(size_t min_progress_size) {
|
249
255
|
GPR_ASSERT(min_progress_size > 0);
|
250
|
-
if (
|
251
|
-
GPR_DEBUG_ASSERT(eof_error());
|
252
|
-
return;
|
253
|
-
}
|
256
|
+
if (eof_error()) return;
|
254
257
|
// Set min progress size, taking into account bytes parsed already but not
|
255
258
|
// consumed.
|
256
259
|
min_progress_size_ = min_progress_size + (begin_ - frontier_);
|
@@ -303,13 +306,18 @@ class HPackParser::Input {
|
|
303
306
|
// Do not use this directly, instead use SetErrorAndContinueParsing or
|
304
307
|
// SetErrorAndStopParsing.
|
305
308
|
void SetError(HpackParseResult error) {
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
+
SetErrorFor(frame_error_, error);
|
310
|
+
SetErrorFor(field_error_, std::move(error));
|
311
|
+
}
|
312
|
+
|
313
|
+
void SetErrorFor(HpackParseResult& error, HpackParseResult new_error) {
|
314
|
+
if (!error.ok() || min_progress_size_ > 0) {
|
315
|
+
if (new_error.connection_error() && !error.connection_error()) {
|
316
|
+
error = std::move(new_error); // connection errors dominate
|
309
317
|
}
|
310
318
|
return;
|
311
319
|
}
|
312
|
-
|
320
|
+
error = std::move(new_error);
|
313
321
|
}
|
314
322
|
|
315
323
|
// Refcount if we are backed by a slice
|
@@ -321,7 +329,8 @@ class HPackParser::Input {
|
|
321
329
|
// Frontier denotes the first byte past successfully processed input
|
322
330
|
const uint8_t* frontier_;
|
323
331
|
// Current error
|
324
|
-
HpackParseResult&
|
332
|
+
HpackParseResult& frame_error_;
|
333
|
+
HpackParseResult& field_error_;
|
325
334
|
// If the error was EOF, we flag it here by noting how many more bytes would
|
326
335
|
// be needed to make progress
|
327
336
|
size_t min_progress_size_ = 0;
|
@@ -598,6 +607,7 @@ class HPackParser::Parser {
|
|
598
607
|
bool ParseTop() {
|
599
608
|
GPR_DEBUG_ASSERT(state_.parse_state == ParseState::kTop);
|
600
609
|
auto cur = *input_->Next();
|
610
|
+
input_->ClearFieldError();
|
601
611
|
switch (cur >> 4) {
|
602
612
|
// Literal header not indexed - First byte format: 0000xxxx
|
603
613
|
// Literal header never indexed - First byte format: 0001xxxx
|
@@ -703,7 +713,7 @@ class HPackParser::Parser {
|
|
703
713
|
break;
|
704
714
|
}
|
705
715
|
gpr_log(
|
706
|
-
|
716
|
+
GPR_INFO, "HTTP:%d:%s:%s: %s%s", log_info_.stream_id, type,
|
707
717
|
log_info_.is_client ? "CLI" : "SVR", memento.md.DebugString().c_str(),
|
708
718
|
memento.parse_status == nullptr
|
709
719
|
? ""
|
@@ -952,11 +962,10 @@ class HPackParser::Parser {
|
|
952
962
|
state_.string_length)
|
953
963
|
: String::Parse(input_, state_.is_string_huff_compressed,
|
954
964
|
state_.string_length);
|
955
|
-
HpackParseResult& status = state_.frame_error;
|
956
965
|
absl::string_view key_string;
|
957
966
|
if (auto* s = absl::get_if<Slice>(&state_.key)) {
|
958
967
|
key_string = s->as_string_view();
|
959
|
-
if (
|
968
|
+
if (state_.field_error.ok()) {
|
960
969
|
auto r = ValidateKey(key_string);
|
961
970
|
if (r != ValidateMetadataResult::kOk) {
|
962
971
|
input_->SetErrorAndContinueParsing(
|
@@ -966,7 +975,7 @@ class HPackParser::Parser {
|
|
966
975
|
} else {
|
967
976
|
const auto* memento = absl::get<const HPackTable::Memento*>(state_.key);
|
968
977
|
key_string = memento->md.key();
|
969
|
-
if (
|
978
|
+
if (state_.field_error.ok() && memento->parse_status != nullptr) {
|
970
979
|
input_->SetErrorAndContinueParsing(*memento->parse_status);
|
971
980
|
}
|
972
981
|
}
|
@@ -993,16 +1002,16 @@ class HPackParser::Parser {
|
|
993
1002
|
key_string.size() + value.wire_size + hpack_constants::kEntryOverhead;
|
994
1003
|
auto md = grpc_metadata_batch::Parse(
|
995
1004
|
key_string, std::move(value_slice), state_.add_to_table, transport_size,
|
996
|
-
[key_string,
|
997
|
-
if (!
|
1005
|
+
[key_string, this](absl::string_view message, const Slice&) {
|
1006
|
+
if (!state_.field_error.ok()) return;
|
998
1007
|
input_->SetErrorAndContinueParsing(
|
999
1008
|
HpackParseResult::MetadataParseError(key_string));
|
1000
1009
|
gpr_log(GPR_ERROR, "Error parsing '%s' metadata: %s",
|
1001
1010
|
std::string(key_string).c_str(),
|
1002
1011
|
std::string(message).c_str());
|
1003
1012
|
});
|
1004
|
-
HPackTable::Memento memento{
|
1005
|
-
|
1013
|
+
HPackTable::Memento memento{
|
1014
|
+
std::move(md), state_.field_error.PersistentStreamErrorOrNullptr()};
|
1006
1015
|
input_->UpdateFrontier();
|
1007
1016
|
state_.parse_state = ParseState::kTop;
|
1008
1017
|
if (state_.add_to_table) {
|
@@ -1115,13 +1124,13 @@ grpc_error_handle HPackParser::Parse(
|
|
1115
1124
|
std::vector<uint8_t> buffer = std::move(unparsed_bytes_);
|
1116
1125
|
return ParseInput(
|
1117
1126
|
Input(nullptr, buffer.data(), buffer.data() + buffer.size(), bitsrc,
|
1118
|
-
state_.frame_error),
|
1127
|
+
state_.frame_error, state_.field_error),
|
1119
1128
|
is_last, call_tracer);
|
1120
1129
|
}
|
1121
|
-
return ParseInput(
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1130
|
+
return ParseInput(Input(slice.refcount, GRPC_SLICE_START_PTR(slice),
|
1131
|
+
GRPC_SLICE_END_PTR(slice), bitsrc, state_.frame_error,
|
1132
|
+
state_.field_error),
|
1133
|
+
is_last, call_tracer);
|
1125
1134
|
}
|
1126
1135
|
|
1127
1136
|
grpc_error_handle HPackParser::ParseInput(
|
@@ -236,6 +236,8 @@ class HPackParser {
|
|
236
236
|
HPackTable hpack_table;
|
237
237
|
// Error so far for this frame (set by class Input)
|
238
238
|
HpackParseResult frame_error;
|
239
|
+
// Error so far for this field (set by class Input)
|
240
|
+
HpackParseResult field_error;
|
239
241
|
// Length of frame so far.
|
240
242
|
uint32_t frame_length = 0;
|
241
243
|
// Length of the string being parsed
|
@@ -106,23 +106,25 @@ XdsClusterLocalityStats::XdsClusterLocalityStats(
|
|
106
106
|
eds_service_name_(eds_service_name),
|
107
107
|
name_(std::move(name)) {
|
108
108
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
109
|
-
gpr_log(
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
109
|
+
gpr_log(
|
110
|
+
GPR_INFO,
|
111
|
+
"[xds_client %p] created locality stats %p for {%s, %s, %s, %s}",
|
112
|
+
xds_client_.get(), this, std::string(lrs_server_).c_str(),
|
113
|
+
std::string(cluster_name_).c_str(),
|
114
|
+
std::string(eds_service_name_).c_str(),
|
115
|
+
name_ == nullptr ? "<none>" : name_->human_readable_string().c_str());
|
115
116
|
}
|
116
117
|
}
|
117
118
|
|
118
119
|
XdsClusterLocalityStats::~XdsClusterLocalityStats() {
|
119
120
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
120
|
-
gpr_log(
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
121
|
+
gpr_log(
|
122
|
+
GPR_INFO,
|
123
|
+
"[xds_client %p] destroying locality stats %p for {%s, %s, %s, %s}",
|
124
|
+
xds_client_.get(), this, std::string(lrs_server_).c_str(),
|
125
|
+
std::string(cluster_name_).c_str(),
|
126
|
+
std::string(eds_service_name_).c_str(),
|
127
|
+
name_ == nullptr ? "<none>" : name_->human_readable_string().c_str());
|
126
128
|
}
|
127
129
|
xds_client_->RemoveClusterLocalityStats(lrs_server_, cluster_name_,
|
128
130
|
eds_service_name_, name_, this);
|
@@ -71,7 +71,13 @@ class PromiseLike<void>;
|
|
71
71
|
|
72
72
|
template <typename F>
|
73
73
|
class PromiseLike<F, absl::enable_if_t<!std::is_void<
|
74
|
-
|
74
|
+
#if (defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703L) || \
|
75
|
+
(defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
76
|
+
std::invoke_result_t<F>
|
77
|
+
#else
|
78
|
+
typename std::result_of<F()>::type
|
79
|
+
#endif
|
80
|
+
>::value>> {
|
75
81
|
private:
|
76
82
|
GPR_NO_UNIQUE_ADDRESS F f_;
|
77
83
|
|
@@ -93,13 +93,13 @@ absl::StatusOr<OrphanablePtr<Channel>> LegacyChannel::Create(
|
|
93
93
|
*(*r)->stats_plugin_group =
|
94
94
|
GlobalStatsPluginRegistry::GetStatsPluginsForServer(args);
|
95
95
|
} else {
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
.GetDefaultAuthority(target)));
|
96
|
+
std::string authority = args.GetOwnedString(GRPC_ARG_DEFAULT_AUTHORITY)
|
97
|
+
.value_or(CoreConfiguration::Get()
|
98
|
+
.resolver_registry()
|
99
|
+
.GetDefaultAuthority(target));
|
101
100
|
*(*r)->stats_plugin_group =
|
102
|
-
GlobalStatsPluginRegistry::GetStatsPluginsForChannel(
|
101
|
+
GlobalStatsPluginRegistry::GetStatsPluginsForChannel(
|
102
|
+
experimental::StatsPluginChannelScope(target, authority));
|
103
103
|
}
|
104
104
|
return MakeOrphanable<LegacyChannel>(
|
105
105
|
grpc_channel_stack_type_is_client(builder.channel_stack_type()),
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grpc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.63.
|
4
|
+
version: 1.63.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gRPC Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: src/ruby/bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|
@@ -3570,7 +3570,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
3570
3570
|
- !ruby/object:Gem::Version
|
3571
3571
|
version: '0'
|
3572
3572
|
requirements: []
|
3573
|
-
rubygems_version: 3.5.
|
3573
|
+
rubygems_version: 3.5.17
|
3574
3574
|
signing_key:
|
3575
3575
|
specification_version: 4
|
3576
3576
|
summary: GRPC system in Ruby
|