wearefair-grpc 1.3.1.pre.c → 1.4.0.fair

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +418 -126
  3. data/include/grpc/grpc.h +15 -69
  4. data/include/grpc/grpc_security.h +1 -1
  5. data/include/grpc/impl/codegen/compression_types.h +3 -4
  6. data/include/grpc/impl/codegen/gpr_types.h +0 -1
  7. data/include/grpc/impl/codegen/grpc_types.h +69 -3
  8. data/include/grpc/impl/codegen/port_platform.h +6 -0
  9. data/include/grpc/impl/codegen/slice.h +2 -1
  10. data/include/grpc/load_reporting.h +6 -6
  11. data/include/grpc/slice.h +25 -3
  12. data/include/grpc/slice_buffer.h +4 -0
  13. data/src/core/ext/census/context.c +1 -1
  14. data/src/core/ext/census/resource.c +3 -1
  15. data/src/core/ext/filters/client_channel/channel_connectivity.c +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel.c +158 -100
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.c +3 -2
  18. data/src/core/ext/filters/client_channel/lb_policy.c +2 -1
  19. data/src/core/ext/filters/client_channel/lb_policy.h +5 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +153 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +42 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +344 -88
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +133 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +65 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +47 -5
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +19 -8
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +63 -34
  29. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +2 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +13 -12
  31. data/src/core/ext/filters/client_channel/lb_policy_factory.c +28 -5
  32. data/src/core/ext/filters/client_channel/lb_policy_factory.h +18 -4
  33. data/src/core/ext/filters/client_channel/parse_address.c +37 -7
  34. data/src/core/ext/filters/client_channel/parse_address.h +11 -8
  35. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +3 -3
  36. data/src/core/ext/filters/client_channel/subchannel.c +19 -16
  37. data/src/core/ext/filters/client_channel/subchannel.h +1 -0
  38. data/src/core/ext/filters/client_channel/uri_parser.c +36 -22
  39. data/src/core/ext/filters/client_channel/uri_parser.h +1 -1
  40. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.c +42 -17
  41. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.h +8 -9
  42. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.c +19 -11
  43. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.h +3 -6
  44. data/src/core/ext/filters/http/http_filters_plugin.c +104 -0
  45. data/src/core/{lib/channel/compress_filter.c → ext/filters/http/message_compress/message_compress_filter.c} +124 -23
  46. data/src/core/{lib/channel/compress_filter.h → ext/filters/http/message_compress/message_compress_filter.h} +5 -6
  47. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.c +4 -6
  48. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.h +3 -3
  49. data/src/core/ext/filters/load_reporting/load_reporting.c +2 -25
  50. data/src/core/ext/filters/load_reporting/load_reporting_filter.c +26 -1
  51. data/src/core/ext/filters/max_age/max_age_filter.c +14 -14
  52. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.c +91 -47
  53. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.h +3 -3
  54. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +1 -1
  55. data/src/core/ext/transport/chttp2/server/chttp2_server.c +2 -2
  56. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +2 -2
  57. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +3 -3
  58. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +296 -172
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  60. data/src/core/ext/transport/chttp2/transport/frame_data.c +203 -164
  61. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -14
  62. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +1 -1
  63. data/src/core/ext/transport/chttp2/transport/frame_ping.c +1 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +1 -1
  65. data/src/core/ext/transport/chttp2/transport/frame_settings.c +5 -5
  66. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +1 -1
  67. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +4 -4
  68. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +2 -4
  69. data/src/core/ext/transport/chttp2/transport/hpack_table.c +4 -3
  70. data/src/core/ext/transport/chttp2/transport/internal.h +50 -33
  71. data/src/core/ext/transport/chttp2/transport/parsing.c +10 -11
  72. data/src/core/ext/transport/chttp2/transport/writing.c +32 -13
  73. data/src/core/lib/channel/channel_args.c +28 -9
  74. data/src/core/lib/channel/channel_args.h +5 -1
  75. data/src/core/lib/channel/channel_stack.c +1 -1
  76. data/src/core/lib/channel/channel_stack.h +2 -2
  77. data/src/core/lib/channel/channel_stack_builder.c +13 -1
  78. data/src/core/lib/channel/channel_stack_builder.h +5 -1
  79. data/src/core/lib/channel/connected_channel.c +3 -1
  80. data/src/core/lib/channel/context.h +2 -2
  81. data/src/core/lib/compression/message_compress.c +2 -2
  82. data/src/core/lib/debug/trace.c +13 -6
  83. data/src/core/lib/debug/trace.h +27 -1
  84. data/src/core/lib/http/httpcli.c +1 -1
  85. data/src/core/lib/http/httpcli_security_connector.c +6 -10
  86. data/src/core/lib/http/parser.c +2 -2
  87. data/src/core/lib/http/parser.h +2 -1
  88. data/src/core/lib/iomgr/combiner.c +6 -6
  89. data/src/core/lib/iomgr/combiner.h +2 -1
  90. data/src/core/lib/iomgr/error.c +12 -5
  91. data/src/core/lib/iomgr/error.h +13 -13
  92. data/src/core/lib/iomgr/ev_epoll1_linux.c +984 -0
  93. data/src/core/lib/iomgr/ev_epoll1_linux.h +44 -0
  94. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +2146 -0
  95. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +43 -0
  96. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +1337 -0
  97. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +43 -0
  98. data/src/core/lib/iomgr/ev_epollex_linux.c +1511 -0
  99. data/src/core/lib/iomgr/ev_epollex_linux.h +43 -0
  100. data/src/core/lib/iomgr/{ev_epoll_linux.c → ev_epollsig_linux.c} +24 -31
  101. data/src/core/lib/iomgr/{ev_epoll_linux.h → ev_epollsig_linux.h} +4 -4
  102. data/src/core/lib/iomgr/ev_poll_posix.c +12 -27
  103. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  104. data/src/core/lib/iomgr/ev_posix.c +22 -8
  105. data/src/core/lib/iomgr/ev_posix.h +4 -3
  106. data/src/core/lib/iomgr/exec_ctx.c +5 -0
  107. data/src/core/lib/iomgr/exec_ctx.h +2 -0
  108. data/src/core/lib/iomgr/iomgr.c +4 -0
  109. data/src/core/lib/iomgr/iomgr.h +3 -0
  110. data/src/core/lib/iomgr/is_epollexclusive_available.c +116 -0
  111. data/src/core/lib/iomgr/is_epollexclusive_available.h +41 -0
  112. data/src/core/lib/iomgr/lockfree_event.c +16 -0
  113. data/src/core/lib/iomgr/pollset.h +2 -5
  114. data/src/core/lib/iomgr/pollset_uv.c +1 -1
  115. data/src/core/lib/iomgr/pollset_windows.c +3 -3
  116. data/src/core/lib/iomgr/resource_quota.c +9 -8
  117. data/src/core/lib/iomgr/resource_quota.h +2 -1
  118. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  119. data/src/core/lib/iomgr/socket_mutator.h +2 -0
  120. data/src/core/lib/iomgr/sys_epoll_wrapper.h +43 -0
  121. data/src/core/lib/iomgr/tcp_client_posix.c +6 -6
  122. data/src/core/lib/iomgr/tcp_client_uv.c +3 -3
  123. data/src/core/lib/iomgr/tcp_posix.c +7 -7
  124. data/src/core/lib/iomgr/tcp_posix.h +2 -1
  125. data/src/core/lib/iomgr/tcp_server_posix.c +1 -1
  126. data/src/core/lib/iomgr/tcp_uv.c +6 -6
  127. data/src/core/lib/iomgr/tcp_uv.h +2 -1
  128. data/src/core/lib/iomgr/tcp_windows.c +1 -1
  129. data/src/core/lib/iomgr/timer_generic.c +24 -25
  130. data/src/core/lib/iomgr/timer_manager.c +276 -0
  131. data/src/core/lib/iomgr/timer_manager.h +52 -0
  132. data/src/core/lib/iomgr/timer_uv.c +6 -0
  133. data/src/core/lib/iomgr/udp_server.c +42 -9
  134. data/src/core/lib/iomgr/udp_server.h +3 -1
  135. data/src/core/lib/security/credentials/credentials.c +0 -1
  136. data/src/core/lib/security/credentials/fake/fake_credentials.c +23 -0
  137. data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -9
  138. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +1 -1
  139. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -1
  140. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +1 -1
  141. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +24 -53
  142. data/src/core/lib/security/transport/client_auth_filter.c +9 -3
  143. data/src/core/lib/security/transport/secure_endpoint.c +7 -7
  144. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  145. data/src/core/lib/security/transport/security_connector.c +32 -51
  146. data/src/core/lib/security/transport/security_connector.h +10 -14
  147. data/src/core/lib/slice/b64.c +1 -1
  148. data/src/core/lib/slice/percent_encoding.c +3 -3
  149. data/src/core/lib/slice/slice.c +66 -33
  150. data/src/core/lib/slice/slice_buffer.c +25 -6
  151. data/src/core/lib/slice/slice_hash_table.c +33 -35
  152. data/src/core/lib/slice/slice_hash_table.h +7 -12
  153. data/src/core/lib/support/atomic.h +45 -0
  154. data/src/core/lib/support/atomic_with_atm.h +70 -0
  155. data/src/core/lib/support/atomic_with_std.h +48 -0
  156. data/src/core/lib/support/avl.c +14 -14
  157. data/src/core/lib/support/memory.h +74 -0
  158. data/src/core/lib/support/mpscq.c +12 -1
  159. data/src/core/lib/support/mpscq.h +4 -0
  160. data/src/core/lib/support/stack_lockfree.c +3 -36
  161. data/src/core/lib/support/time_posix.c +8 -0
  162. data/src/core/lib/support/tmpfile_posix.c +10 -10
  163. data/src/core/lib/surface/alarm.c +3 -1
  164. data/src/core/lib/surface/api_trace.c +2 -1
  165. data/src/core/lib/surface/api_trace.h +2 -2
  166. data/src/core/lib/surface/byte_buffer_reader.c +1 -1
  167. data/src/core/lib/surface/call.c +65 -22
  168. data/src/core/lib/surface/call.h +4 -2
  169. data/src/core/lib/surface/channel_init.c +2 -19
  170. data/src/core/lib/surface/channel_stack_type.c +18 -0
  171. data/src/core/lib/surface/channel_stack_type.h +2 -0
  172. data/src/core/lib/surface/completion_queue.c +249 -83
  173. data/src/core/lib/surface/completion_queue.h +18 -13
  174. data/src/core/lib/surface/completion_queue_factory.c +24 -9
  175. data/src/core/lib/surface/init.c +1 -52
  176. data/src/core/lib/surface/{lame_client.c → lame_client.cc} +37 -26
  177. data/src/core/lib/surface/server.c +50 -27
  178. data/src/core/lib/surface/server.h +2 -1
  179. data/src/core/lib/surface/version.c +2 -2
  180. data/src/core/lib/transport/bdp_estimator.c +20 -9
  181. data/src/core/lib/transport/bdp_estimator.h +5 -1
  182. data/src/core/lib/transport/byte_stream.c +23 -9
  183. data/src/core/lib/transport/byte_stream.h +15 -6
  184. data/src/core/lib/transport/connectivity_state.c +6 -6
  185. data/src/core/lib/transport/connectivity_state.h +2 -1
  186. data/src/core/lib/transport/service_config.c +6 -13
  187. data/src/core/lib/transport/service_config.h +2 -2
  188. data/src/core/lib/transport/static_metadata.c +403 -389
  189. data/src/core/lib/transport/static_metadata.h +127 -114
  190. data/src/core/plugin_registry/grpc_plugin_registry.c +12 -0
  191. data/src/core/tsi/fake_transport_security.c +5 -4
  192. data/src/core/tsi/ssl_transport_security.c +71 -82
  193. data/src/core/tsi/ssl_transport_security.h +39 -61
  194. data/src/core/tsi/transport_security.c +83 -2
  195. data/src/core/tsi/transport_security.h +27 -2
  196. data/src/core/tsi/transport_security_adapter.c +236 -0
  197. data/src/core/tsi/transport_security_adapter.h +62 -0
  198. data/src/core/tsi/transport_security_interface.h +179 -66
  199. data/src/ruby/ext/grpc/extconf.rb +2 -1
  200. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -6
  201. data/src/ruby/ext/grpc/rb_call.c +56 -48
  202. data/src/ruby/ext/grpc/rb_call.h +3 -4
  203. data/src/ruby/ext/grpc/rb_call_credentials.c +23 -22
  204. data/src/ruby/ext/grpc/rb_channel.c +45 -29
  205. data/src/ruby/ext/grpc/rb_channel_args.c +11 -9
  206. data/src/ruby/ext/grpc/rb_channel_credentials.c +16 -12
  207. data/src/ruby/ext/grpc/rb_completion_queue.c +7 -9
  208. data/src/ruby/ext/grpc/rb_compression_options.c +7 -6
  209. data/src/ruby/ext/grpc/rb_event_thread.c +10 -12
  210. data/src/ruby/ext/grpc/rb_event_thread.h +1 -2
  211. data/src/ruby/ext/grpc/rb_grpc.c +11 -15
  212. data/src/ruby/ext/grpc/rb_grpc.h +2 -2
  213. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +14 -6
  214. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +22 -10
  215. data/src/ruby/ext/grpc/rb_server.c +26 -28
  216. data/src/ruby/lib/grpc/version.rb +1 -1
  217. metadata +40 -18
  218. data/src/ruby/lib/grpc/grpc_c.bundle +0 -0
  219. data/src/ruby/lib/grpc/grpc_c.so +0 -0
@@ -34,11 +34,12 @@
34
34
  #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CHTTP2_TRANSPORT_H
35
35
  #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CHTTP2_TRANSPORT_H
36
36
 
37
+ #include "src/core/lib/debug/trace.h"
37
38
  #include "src/core/lib/iomgr/endpoint.h"
38
39
  #include "src/core/lib/transport/transport.h"
39
40
 
40
- extern int grpc_http_trace;
41
- extern int grpc_flowctl_trace;
41
+ extern grpc_tracer_flag grpc_http_trace;
42
+ extern grpc_tracer_flag grpc_flowctl_trace;
42
43
 
43
44
  grpc_transport *grpc_create_chttp2_transport(
44
45
  grpc_exec_ctx *exec_ctx, const grpc_channel_args *channel_args,
@@ -40,6 +40,7 @@
40
40
  #include <grpc/support/string_util.h>
41
41
  #include <grpc/support/useful.h>
42
42
  #include "src/core/ext/transport/chttp2/transport/internal.h"
43
+ #include "src/core/lib/slice/slice_internal.h"
43
44
  #include "src/core/lib/slice/slice_string_helpers.h"
44
45
  #include "src/core/lib/support/string.h"
45
46
  #include "src/core/lib/transport/transport.h"
@@ -53,16 +54,17 @@ grpc_error *grpc_chttp2_data_parser_init(grpc_chttp2_data_parser *parser) {
53
54
  void grpc_chttp2_data_parser_destroy(grpc_exec_ctx *exec_ctx,
54
55
  grpc_chttp2_data_parser *parser) {
55
56
  if (parser->parsing_frame != NULL) {
56
- grpc_chttp2_incoming_byte_stream_finished(
57
+ GRPC_ERROR_UNREF(grpc_chttp2_incoming_byte_stream_finished(
57
58
  exec_ctx, parser->parsing_frame,
58
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Parser destroyed"));
59
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Parser destroyed"), false));
59
60
  }
60
61
  GRPC_ERROR_UNREF(parser->error);
61
62
  }
62
63
 
63
64
  grpc_error *grpc_chttp2_data_parser_begin_frame(grpc_chttp2_data_parser *parser,
64
65
  uint8_t flags,
65
- uint32_t stream_id) {
66
+ uint32_t stream_id,
67
+ grpc_chttp2_stream *s) {
66
68
  if (flags & ~GRPC_CHTTP2_DATA_FLAG_END_STREAM) {
67
69
  char *msg;
68
70
  gpr_asprintf(&msg, "unsupported data flags: 0x%02x", flags);
@@ -74,47 +76,14 @@ grpc_error *grpc_chttp2_data_parser_begin_frame(grpc_chttp2_data_parser *parser,
74
76
  }
75
77
 
76
78
  if (flags & GRPC_CHTTP2_DATA_FLAG_END_STREAM) {
77
- parser->is_last_frame = 1;
79
+ s->received_last_frame = true;
78
80
  } else {
79
- parser->is_last_frame = 0;
81
+ s->received_last_frame = false;
80
82
  }
81
83
 
82
84
  return GRPC_ERROR_NONE;
83
85
  }
84
86
 
85
- void grpc_chttp2_incoming_frame_queue_merge(
86
- grpc_chttp2_incoming_frame_queue *head_dst,
87
- grpc_chttp2_incoming_frame_queue *tail_src) {
88
- if (tail_src->head == NULL) {
89
- return;
90
- }
91
-
92
- if (head_dst->head == NULL) {
93
- *head_dst = *tail_src;
94
- memset(tail_src, 0, sizeof(*tail_src));
95
- return;
96
- }
97
-
98
- head_dst->tail->next_message = tail_src->head;
99
- head_dst->tail = tail_src->tail;
100
- memset(tail_src, 0, sizeof(*tail_src));
101
- }
102
-
103
- grpc_byte_stream *grpc_chttp2_incoming_frame_queue_pop(
104
- grpc_chttp2_incoming_frame_queue *q) {
105
- grpc_byte_stream *out;
106
- if (q->head == NULL) {
107
- return NULL;
108
- }
109
- out = &q->head->base;
110
- if (q->head == q->tail) {
111
- memset(q, 0, sizeof(*q));
112
- } else {
113
- q->head = q->head->next_message;
114
- }
115
- return out;
116
- }
117
-
118
87
  void grpc_chttp2_encode_data(uint32_t id, grpc_slice_buffer *inbuf,
119
88
  uint32_t write_bytes, int is_eof,
120
89
  grpc_transport_one_way_stats *stats,
@@ -123,7 +92,7 @@ void grpc_chttp2_encode_data(uint32_t id, grpc_slice_buffer *inbuf,
123
92
  uint8_t *p;
124
93
  static const size_t header_size = 9;
125
94
 
126
- hdr = grpc_slice_malloc(header_size);
95
+ hdr = GRPC_SLICE_MALLOC(header_size);
127
96
  p = GRPC_SLICE_START_PTR(hdr);
128
97
  GPR_ASSERT(write_bytes < (1 << 24));
129
98
  *p++ = (uint8_t)(write_bytes >> 16);
@@ -137,151 +106,221 @@ void grpc_chttp2_encode_data(uint32_t id, grpc_slice_buffer *inbuf,
137
106
  *p++ = (uint8_t)(id);
138
107
  grpc_slice_buffer_add(outbuf, hdr);
139
108
 
140
- grpc_slice_buffer_move_first(inbuf, write_bytes, outbuf);
109
+ grpc_slice_buffer_move_first_no_ref(inbuf, write_bytes, outbuf);
141
110
 
142
111
  stats->framing_bytes += header_size;
143
112
  stats->data_bytes += write_bytes;
144
113
  }
145
114
 
146
- static grpc_error *parse_inner(grpc_exec_ctx *exec_ctx,
147
- grpc_chttp2_data_parser *p,
148
- grpc_chttp2_transport *t, grpc_chttp2_stream *s,
149
- grpc_slice slice) {
150
- uint8_t *const beg = GRPC_SLICE_START_PTR(slice);
151
- uint8_t *const end = GRPC_SLICE_END_PTR(slice);
152
- uint8_t *cur = beg;
153
- uint32_t message_flags;
154
- grpc_chttp2_incoming_byte_stream *incoming_byte_stream;
155
- char *msg;
115
+ grpc_error *grpc_deframe_unprocessed_incoming_frames(
116
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_data_parser *p, grpc_chttp2_stream *s,
117
+ grpc_slice_buffer *slices, grpc_slice *slice_out,
118
+ grpc_byte_stream **stream_out) {
119
+ grpc_error *error = GRPC_ERROR_NONE;
120
+ grpc_chttp2_transport *t = s->t;
156
121
 
157
- if (cur == end) {
158
- return GRPC_ERROR_NONE;
159
- }
122
+ while (slices->count > 0) {
123
+ uint8_t *beg = NULL;
124
+ uint8_t *end = NULL;
125
+ uint8_t *cur = NULL;
160
126
 
161
- switch (p->state) {
162
- case GRPC_CHTTP2_DATA_ERROR:
163
- p->state = GRPC_CHTTP2_DATA_ERROR;
164
- return GRPC_ERROR_REF(p->error);
165
- fh_0:
166
- case GRPC_CHTTP2_DATA_FH_0:
167
- s->stats.incoming.framing_bytes++;
168
- p->frame_type = *cur;
169
- switch (p->frame_type) {
170
- case 0:
171
- p->is_frame_compressed = 0; /* GPR_FALSE */
172
- break;
173
- case 1:
174
- p->is_frame_compressed = 1; /* GPR_TRUE */
175
- break;
176
- default:
177
- gpr_asprintf(&msg, "Bad GRPC frame type 0x%02x", p->frame_type);
178
- p->error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
179
- p->error = grpc_error_set_int(p->error, GRPC_ERROR_INT_STREAM_ID,
180
- (intptr_t)s->id);
181
- gpr_free(msg);
182
- msg = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
183
- p->error = grpc_error_set_str(p->error, GRPC_ERROR_STR_RAW_BYTES,
184
- grpc_slice_from_copied_string(msg));
185
- gpr_free(msg);
186
- p->error =
187
- grpc_error_set_int(p->error, GRPC_ERROR_INT_OFFSET, cur - beg);
188
- p->state = GRPC_CHTTP2_DATA_ERROR;
189
- return GRPC_ERROR_REF(p->error);
190
- }
191
- if (++cur == end) {
192
- p->state = GRPC_CHTTP2_DATA_FH_1;
193
- return GRPC_ERROR_NONE;
194
- }
195
- /* fallthrough */
196
- case GRPC_CHTTP2_DATA_FH_1:
197
- s->stats.incoming.framing_bytes++;
198
- p->frame_size = ((uint32_t)*cur) << 24;
199
- if (++cur == end) {
200
- p->state = GRPC_CHTTP2_DATA_FH_2;
201
- return GRPC_ERROR_NONE;
202
- }
203
- /* fallthrough */
204
- case GRPC_CHTTP2_DATA_FH_2:
205
- s->stats.incoming.framing_bytes++;
206
- p->frame_size |= ((uint32_t)*cur) << 16;
207
- if (++cur == end) {
208
- p->state = GRPC_CHTTP2_DATA_FH_3;
209
- return GRPC_ERROR_NONE;
210
- }
211
- /* fallthrough */
212
- case GRPC_CHTTP2_DATA_FH_3:
213
- s->stats.incoming.framing_bytes++;
214
- p->frame_size |= ((uint32_t)*cur) << 8;
215
- if (++cur == end) {
216
- p->state = GRPC_CHTTP2_DATA_FH_4;
217
- return GRPC_ERROR_NONE;
218
- }
219
- /* fallthrough */
220
- case GRPC_CHTTP2_DATA_FH_4:
221
- s->stats.incoming.framing_bytes++;
222
- p->frame_size |= ((uint32_t)*cur);
223
- p->state = GRPC_CHTTP2_DATA_FRAME;
224
- ++cur;
225
- message_flags = 0;
226
- if (p->is_frame_compressed) {
227
- message_flags |= GRPC_WRITE_INTERNAL_COMPRESS;
228
- }
229
- p->parsing_frame = incoming_byte_stream =
230
- grpc_chttp2_incoming_byte_stream_create(exec_ctx, t, s, p->frame_size,
231
- message_flags);
232
- /* fallthrough */
233
- case GRPC_CHTTP2_DATA_FRAME:
234
- if (cur == end) {
235
- return GRPC_ERROR_NONE;
236
- }
237
- uint32_t remaining = (uint32_t)(end - cur);
238
- if (remaining == p->frame_size) {
239
- s->stats.incoming.data_bytes += p->frame_size;
240
- grpc_chttp2_incoming_byte_stream_push(
241
- exec_ctx, p->parsing_frame,
242
- grpc_slice_sub(slice, (size_t)(cur - beg), (size_t)(end - beg)));
243
- grpc_chttp2_incoming_byte_stream_finished(exec_ctx, p->parsing_frame,
244
- GRPC_ERROR_NONE);
245
- p->parsing_frame = NULL;
246
- p->state = GRPC_CHTTP2_DATA_FH_0;
247
- return GRPC_ERROR_NONE;
248
- } else if (remaining > p->frame_size) {
249
- s->stats.incoming.data_bytes += p->frame_size;
250
- grpc_chttp2_incoming_byte_stream_push(
251
- exec_ctx, p->parsing_frame,
252
- grpc_slice_sub(slice, (size_t)(cur - beg),
253
- (size_t)(cur + p->frame_size - beg)));
254
- grpc_chttp2_incoming_byte_stream_finished(exec_ctx, p->parsing_frame,
255
- GRPC_ERROR_NONE);
256
- p->parsing_frame = NULL;
257
- cur += p->frame_size;
258
- goto fh_0; /* loop */
259
- } else {
260
- GPR_ASSERT(remaining <= p->frame_size);
261
- grpc_chttp2_incoming_byte_stream_push(
262
- exec_ctx, p->parsing_frame,
263
- grpc_slice_sub(slice, (size_t)(cur - beg), (size_t)(end - beg)));
264
- p->frame_size -= remaining;
265
- s->stats.incoming.data_bytes += remaining;
127
+ grpc_slice slice = grpc_slice_buffer_take_first(slices);
128
+
129
+ beg = GRPC_SLICE_START_PTR(slice);
130
+ end = GRPC_SLICE_END_PTR(slice);
131
+ cur = beg;
132
+ uint32_t message_flags;
133
+ char *msg;
134
+
135
+ if (cur == end) {
136
+ grpc_slice_unref_internal(exec_ctx, slice);
137
+ continue;
138
+ }
139
+
140
+ switch (p->state) {
141
+ case GRPC_CHTTP2_DATA_ERROR:
142
+ p->state = GRPC_CHTTP2_DATA_ERROR;
143
+ grpc_slice_unref_internal(exec_ctx, slice);
144
+ return GRPC_ERROR_REF(p->error);
145
+ case GRPC_CHTTP2_DATA_FH_0:
146
+ p->frame_type = *cur;
147
+ switch (p->frame_type) {
148
+ case 0:
149
+ p->is_frame_compressed = false; /* GPR_FALSE */
150
+ break;
151
+ case 1:
152
+ p->is_frame_compressed = true; /* GPR_TRUE */
153
+ break;
154
+ default:
155
+ gpr_asprintf(&msg, "Bad GRPC frame type 0x%02x", p->frame_type);
156
+ p->error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
157
+ p->error = grpc_error_set_int(p->error, GRPC_ERROR_INT_STREAM_ID,
158
+ (intptr_t)s->id);
159
+ gpr_free(msg);
160
+ msg = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
161
+ p->error = grpc_error_set_str(p->error, GRPC_ERROR_STR_RAW_BYTES,
162
+ grpc_slice_from_copied_string(msg));
163
+ gpr_free(msg);
164
+ p->error =
165
+ grpc_error_set_int(p->error, GRPC_ERROR_INT_OFFSET, cur - beg);
166
+ p->state = GRPC_CHTTP2_DATA_ERROR;
167
+ grpc_slice_unref_internal(exec_ctx, slice);
168
+ return GRPC_ERROR_REF(p->error);
169
+ }
170
+ if (++cur == end) {
171
+ p->state = GRPC_CHTTP2_DATA_FH_1;
172
+ grpc_slice_unref_internal(exec_ctx, slice);
173
+ continue;
174
+ }
175
+ /* fallthrough */
176
+ case GRPC_CHTTP2_DATA_FH_1:
177
+ p->frame_size = ((uint32_t)*cur) << 24;
178
+ if (++cur == end) {
179
+ p->state = GRPC_CHTTP2_DATA_FH_2;
180
+ grpc_slice_unref_internal(exec_ctx, slice);
181
+ continue;
182
+ }
183
+ /* fallthrough */
184
+ case GRPC_CHTTP2_DATA_FH_2:
185
+ p->frame_size |= ((uint32_t)*cur) << 16;
186
+ if (++cur == end) {
187
+ p->state = GRPC_CHTTP2_DATA_FH_3;
188
+ grpc_slice_unref_internal(exec_ctx, slice);
189
+ continue;
190
+ }
191
+ /* fallthrough */
192
+ case GRPC_CHTTP2_DATA_FH_3:
193
+ p->frame_size |= ((uint32_t)*cur) << 8;
194
+ if (++cur == end) {
195
+ p->state = GRPC_CHTTP2_DATA_FH_4;
196
+ grpc_slice_unref_internal(exec_ctx, slice);
197
+ continue;
198
+ }
199
+ /* fallthrough */
200
+ case GRPC_CHTTP2_DATA_FH_4:
201
+ GPR_ASSERT(stream_out != NULL);
202
+ GPR_ASSERT(p->parsing_frame == NULL);
203
+ p->frame_size |= ((uint32_t)*cur);
204
+ p->state = GRPC_CHTTP2_DATA_FRAME;
205
+ ++cur;
206
+ message_flags = 0;
207
+ if (p->is_frame_compressed) {
208
+ message_flags |= GRPC_WRITE_INTERNAL_COMPRESS;
209
+ }
210
+ p->parsing_frame = grpc_chttp2_incoming_byte_stream_create(
211
+ exec_ctx, t, s, p->frame_size, message_flags);
212
+ *stream_out = &p->parsing_frame->base;
213
+ if (p->parsing_frame->remaining_bytes == 0) {
214
+ GRPC_ERROR_UNREF(grpc_chttp2_incoming_byte_stream_finished(
215
+ exec_ctx, p->parsing_frame, GRPC_ERROR_NONE, true));
216
+ p->parsing_frame = NULL;
217
+ p->state = GRPC_CHTTP2_DATA_FH_0;
218
+ }
219
+ s->pending_byte_stream = true;
220
+
221
+ if (cur != end) {
222
+ grpc_slice_buffer_undo_take_first(
223
+ &s->unprocessed_incoming_frames_buffer,
224
+ grpc_slice_sub(slice, (size_t)(cur - beg), (size_t)(end - beg)));
225
+ }
226
+ grpc_slice_unref_internal(exec_ctx, slice);
266
227
  return GRPC_ERROR_NONE;
228
+ case GRPC_CHTTP2_DATA_FRAME: {
229
+ GPR_ASSERT(p->parsing_frame != NULL);
230
+ GPR_ASSERT(slice_out != NULL);
231
+ if (cur == end) {
232
+ grpc_slice_unref_internal(exec_ctx, slice);
233
+ continue;
234
+ }
235
+ uint32_t remaining = (uint32_t)(end - cur);
236
+ if (remaining == p->frame_size) {
237
+ if (GRPC_ERROR_NONE != (error = grpc_chttp2_incoming_byte_stream_push(
238
+ exec_ctx, p->parsing_frame,
239
+ grpc_slice_sub(slice, (size_t)(cur - beg),
240
+ (size_t)(end - beg)),
241
+ slice_out))) {
242
+ grpc_slice_unref_internal(exec_ctx, slice);
243
+ return error;
244
+ }
245
+ if (GRPC_ERROR_NONE !=
246
+ (error = grpc_chttp2_incoming_byte_stream_finished(
247
+ exec_ctx, p->parsing_frame, GRPC_ERROR_NONE, true))) {
248
+ grpc_slice_unref_internal(exec_ctx, slice);
249
+ return error;
250
+ }
251
+ p->parsing_frame = NULL;
252
+ p->state = GRPC_CHTTP2_DATA_FH_0;
253
+ grpc_slice_unref_internal(exec_ctx, slice);
254
+ return GRPC_ERROR_NONE;
255
+ } else if (remaining < p->frame_size) {
256
+ if (GRPC_ERROR_NONE != (error = grpc_chttp2_incoming_byte_stream_push(
257
+ exec_ctx, p->parsing_frame,
258
+ grpc_slice_sub(slice, (size_t)(cur - beg),
259
+ (size_t)(end - beg)),
260
+ slice_out))) {
261
+ return error;
262
+ }
263
+ p->frame_size -= remaining;
264
+ grpc_slice_unref_internal(exec_ctx, slice);
265
+ return GRPC_ERROR_NONE;
266
+ } else {
267
+ GPR_ASSERT(remaining > p->frame_size);
268
+ if (GRPC_ERROR_NONE !=
269
+ (grpc_chttp2_incoming_byte_stream_push(
270
+ exec_ctx, p->parsing_frame,
271
+ grpc_slice_sub(slice, (size_t)(cur - beg),
272
+ (size_t)(cur + p->frame_size - beg)),
273
+ slice_out))) {
274
+ grpc_slice_unref_internal(exec_ctx, slice);
275
+ return error;
276
+ }
277
+ if (GRPC_ERROR_NONE !=
278
+ (error = grpc_chttp2_incoming_byte_stream_finished(
279
+ exec_ctx, p->parsing_frame, GRPC_ERROR_NONE, true))) {
280
+ grpc_slice_unref_internal(exec_ctx, slice);
281
+ return error;
282
+ }
283
+ p->parsing_frame = NULL;
284
+ p->state = GRPC_CHTTP2_DATA_FH_0;
285
+ cur += p->frame_size;
286
+ grpc_slice_buffer_undo_take_first(
287
+ &s->unprocessed_incoming_frames_buffer,
288
+ grpc_slice_sub(slice, (size_t)(cur - beg), (size_t)(end - beg)));
289
+ grpc_slice_unref_internal(exec_ctx, slice);
290
+ return GRPC_ERROR_NONE;
291
+ }
267
292
  }
293
+ }
268
294
  }
269
295
 
270
- GPR_UNREACHABLE_CODE(
271
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here"));
296
+ return GRPC_ERROR_NONE;
272
297
  }
273
298
 
274
299
  grpc_error *grpc_chttp2_data_parser_parse(grpc_exec_ctx *exec_ctx, void *parser,
275
300
  grpc_chttp2_transport *t,
276
301
  grpc_chttp2_stream *s,
277
302
  grpc_slice slice, int is_last) {
278
- grpc_chttp2_data_parser *p = parser;
279
- grpc_error *error = parse_inner(exec_ctx, p, t, s, slice);
303
+ /* grpc_error *error = parse_inner_buffer(exec_ctx, p, t, s, slice); */
304
+ s->stats.incoming.framing_bytes += GRPC_SLICE_LENGTH(slice);
305
+ if (!s->pending_byte_stream) {
306
+ grpc_slice_ref_internal(slice);
307
+ grpc_slice_buffer_add(&s->frame_storage, slice);
308
+ grpc_chttp2_maybe_complete_recv_message(exec_ctx, t, s);
309
+ } else if (s->on_next) {
310
+ GPR_ASSERT(s->frame_storage.length == 0);
311
+ grpc_slice_ref_internal(slice);
312
+ grpc_slice_buffer_add(&s->unprocessed_incoming_frames_buffer, slice);
313
+ grpc_closure_sched(exec_ctx, s->on_next, GRPC_ERROR_NONE);
314
+ s->on_next = NULL;
315
+ } else {
316
+ grpc_slice_ref_internal(slice);
317
+ grpc_slice_buffer_add(&s->frame_storage, slice);
318
+ }
280
319
 
281
- if (is_last && p->is_last_frame) {
320
+ if (is_last && s->received_last_frame) {
282
321
  grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, false,
283
322
  GRPC_ERROR_NONE);
284
323
  }
285
324
 
286
- return error;
325
+ return GRPC_ERROR_NONE;
287
326
  }
@@ -56,28 +56,16 @@ typedef enum {
56
56
  typedef struct grpc_chttp2_incoming_byte_stream
57
57
  grpc_chttp2_incoming_byte_stream;
58
58
 
59
- typedef struct grpc_chttp2_incoming_frame_queue {
60
- grpc_chttp2_incoming_byte_stream *head;
61
- grpc_chttp2_incoming_byte_stream *tail;
62
- } grpc_chttp2_incoming_frame_queue;
63
-
64
59
  typedef struct {
65
60
  grpc_chttp2_stream_state state;
66
- uint8_t is_last_frame;
67
61
  uint8_t frame_type;
68
62
  uint32_t frame_size;
69
63
  grpc_error *error;
70
64
 
71
- int is_frame_compressed;
65
+ bool is_frame_compressed;
72
66
  grpc_chttp2_incoming_byte_stream *parsing_frame;
73
67
  } grpc_chttp2_data_parser;
74
68
 
75
- void grpc_chttp2_incoming_frame_queue_merge(
76
- grpc_chttp2_incoming_frame_queue *head_dst,
77
- grpc_chttp2_incoming_frame_queue *tail_src);
78
- grpc_byte_stream *grpc_chttp2_incoming_frame_queue_pop(
79
- grpc_chttp2_incoming_frame_queue *q);
80
-
81
69
  /* initialize per-stream state for data frame parsing */
82
70
  grpc_error *grpc_chttp2_data_parser_init(grpc_chttp2_data_parser *parser);
83
71
 
@@ -87,7 +75,8 @@ void grpc_chttp2_data_parser_destroy(grpc_exec_ctx *exec_ctx,
87
75
  /* start processing a new data frame */
88
76
  grpc_error *grpc_chttp2_data_parser_begin_frame(grpc_chttp2_data_parser *parser,
89
77
  uint8_t flags,
90
- uint32_t stream_id);
78
+ uint32_t stream_id,
79
+ grpc_chttp2_stream *s);
91
80
 
92
81
  /* handle a slice of a data frame - is_last indicates the last slice of a
93
82
  frame */
@@ -101,4 +90,9 @@ void grpc_chttp2_encode_data(uint32_t id, grpc_slice_buffer *inbuf,
101
90
  grpc_transport_one_way_stats *stats,
102
91
  grpc_slice_buffer *outbuf);
103
92
 
93
+ grpc_error *grpc_deframe_unprocessed_incoming_frames(
94
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_data_parser *p, grpc_chttp2_stream *s,
95
+ grpc_slice_buffer *slices, grpc_slice *slice_out,
96
+ grpc_byte_stream **stream_out);
97
+
104
98
  #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FRAME_DATA_H */