grpc 0.11.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +29456 -0
- data/Rakefile +13 -8
- data/etc/roots.pem +5114 -0
- data/include/grpc/byte_buffer.h +120 -0
- data/include/grpc/byte_buffer_reader.h +58 -0
- data/include/grpc/census.h +488 -0
- data/include/grpc/compression.h +106 -0
- data/include/grpc/grpc.h +732 -0
- data/include/grpc/grpc_security.h +374 -0
- data/include/grpc/grpc_zookeeper.h +59 -0
- data/include/grpc/status.h +163 -0
- data/include/grpc/support/alloc.h +72 -0
- data/include/grpc/support/atm.h +92 -0
- data/include/grpc/support/atm_gcc_atomic.h +72 -0
- data/include/grpc/support/atm_gcc_sync.h +87 -0
- data/include/grpc/support/atm_win32.h +125 -0
- data/include/grpc/support/avl.h +91 -0
- data/include/grpc/support/cmdline.h +101 -0
- data/include/grpc/support/cpu.h +57 -0
- data/include/grpc/support/histogram.h +76 -0
- data/include/grpc/support/host_port.h +64 -0
- data/include/grpc/support/log.h +108 -0
- data/include/grpc/support/log_win32.h +51 -0
- data/include/grpc/support/port_platform.h +356 -0
- data/include/grpc/support/slice.h +182 -0
- data/include/grpc/support/slice_buffer.h +102 -0
- data/include/grpc/support/string_util.h +61 -0
- data/include/grpc/support/subprocess.h +57 -0
- data/include/grpc/support/sync.h +315 -0
- data/include/grpc/support/sync_generic.h +55 -0
- data/include/grpc/support/sync_posix.h +47 -0
- data/include/grpc/support/sync_win32.h +49 -0
- data/include/grpc/support/thd.h +91 -0
- data/include/grpc/support/time.h +128 -0
- data/include/grpc/support/tls.h +77 -0
- data/include/grpc/support/tls_gcc.h +56 -0
- data/include/grpc/support/tls_msvc.h +56 -0
- data/include/grpc/support/tls_pthread.h +60 -0
- data/include/grpc/support/useful.h +75 -0
- data/src/core/census/aggregation.h +66 -0
- data/src/core/census/context.c +46 -0
- data/src/core/census/context.h +47 -0
- data/src/core/census/grpc_context.c +53 -0
- data/src/core/census/grpc_filter.c +184 -0
- data/src/core/census/grpc_filter.h +44 -0
- data/src/core/census/initialize.c +57 -0
- data/src/core/census/operation.c +63 -0
- data/src/core/census/rpc_metric_id.h +51 -0
- data/src/core/census/tracing.c +45 -0
- data/src/core/channel/channel_args.c +209 -0
- data/src/core/channel/channel_args.h +88 -0
- data/src/core/channel/channel_stack.c +262 -0
- data/src/core/channel/channel_stack.h +260 -0
- data/src/core/channel/client_channel.c +524 -0
- data/src/core/channel/client_channel.h +63 -0
- data/src/core/channel/client_uchannel.c +243 -0
- data/src/core/channel/client_uchannel.h +60 -0
- data/src/core/channel/compress_filter.c +297 -0
- data/src/core/channel/compress_filter.h +65 -0
- data/src/core/channel/connected_channel.c +167 -0
- data/src/core/channel/connected_channel.h +51 -0
- data/src/core/channel/context.h +49 -0
- data/src/core/channel/http_client_filter.c +248 -0
- data/src/core/channel/http_client_filter.h +44 -0
- data/src/core/channel/http_server_filter.c +233 -0
- data/src/core/channel/http_server_filter.h +42 -0
- data/src/core/channel/subchannel_call_holder.c +259 -0
- data/src/core/channel/subchannel_call_holder.h +98 -0
- data/src/core/client_config/client_config.c +72 -0
- data/src/core/client_config/client_config.h +53 -0
- data/src/core/client_config/connector.c +54 -0
- data/src/core/client_config/connector.h +95 -0
- data/src/core/client_config/default_initial_connect_string.c +39 -0
- data/src/core/client_config/initial_connect_string.c +53 -0
- data/src/core/client_config/initial_connect_string.h +50 -0
- data/src/core/client_config/lb_policies/pick_first.c +398 -0
- data/src/core/client_config/lb_policies/pick_first.h +43 -0
- data/src/core/client_config/lb_policies/round_robin.c +537 -0
- data/src/core/client_config/lb_policies/round_robin.h +46 -0
- data/src/core/client_config/lb_policy.c +134 -0
- data/src/core/client_config/lb_policy.h +143 -0
- data/src/core/client_config/lb_policy_factory.c +48 -0
- data/src/core/client_config/lb_policy_factory.h +73 -0
- data/src/core/client_config/lb_policy_registry.c +88 -0
- data/src/core/client_config/lb_policy_registry.h +54 -0
- data/src/core/client_config/resolver.c +82 -0
- data/src/core/client_config/resolver.h +94 -0
- data/src/core/client_config/resolver_factory.c +55 -0
- data/src/core/client_config/resolver_factory.h +82 -0
- data/src/core/client_config/resolver_registry.c +137 -0
- data/src/core/client_config/resolver_registry.h +65 -0
- data/src/core/client_config/resolvers/dns_resolver.c +257 -0
- data/src/core/client_config/resolvers/dns_resolver.h +42 -0
- data/src/core/client_config/resolvers/sockaddr_resolver.c +391 -0
- data/src/core/client_config/resolvers/sockaddr_resolver.h +50 -0
- data/src/core/client_config/subchannel.c +697 -0
- data/src/core/client_config/subchannel.h +165 -0
- data/src/core/client_config/subchannel_factory.c +49 -0
- data/src/core/client_config/subchannel_factory.h +66 -0
- data/src/core/client_config/uri_parser.c +242 -0
- data/src/core/client_config/uri_parser.h +51 -0
- data/src/core/compression/algorithm.c +166 -0
- data/src/core/compression/algorithm_metadata.h +53 -0
- data/src/core/compression/message_compress.c +198 -0
- data/src/core/compression/message_compress.h +52 -0
- data/src/core/debug/trace.c +136 -0
- data/src/core/debug/trace.h +43 -0
- data/src/core/httpcli/format_request.c +120 -0
- data/src/core/httpcli/format_request.h +45 -0
- data/src/core/httpcli/httpcli.c +286 -0
- data/src/core/httpcli/httpcli.h +162 -0
- data/src/core/httpcli/httpcli_security_connector.c +189 -0
- data/src/core/httpcli/parser.c +211 -0
- data/src/core/httpcli/parser.h +64 -0
- data/src/core/iomgr/closure.c +98 -0
- data/src/core/iomgr/closure.h +97 -0
- data/src/core/iomgr/endpoint.c +67 -0
- data/src/core/iomgr/endpoint.h +102 -0
- data/src/core/iomgr/endpoint_pair.h +47 -0
- data/src/core/iomgr/endpoint_pair_posix.c +82 -0
- data/src/core/iomgr/endpoint_pair_windows.c +97 -0
- data/src/core/iomgr/exec_ctx.c +72 -0
- data/src/core/iomgr/exec_ctx.h +78 -0
- data/src/core/iomgr/executor.c +143 -0
- data/src/core/iomgr/executor.h +53 -0
- data/src/core/iomgr/fd_posix.c +438 -0
- data/src/core/iomgr/fd_posix.h +189 -0
- data/src/core/iomgr/iocp_windows.c +206 -0
- data/src/core/iomgr/iocp_windows.h +56 -0
- data/src/core/iomgr/iomgr.c +156 -0
- data/src/core/iomgr/iomgr.h +43 -0
- data/src/core/iomgr/iomgr_internal.h +58 -0
- data/src/core/iomgr/iomgr_posix.c +52 -0
- data/src/core/iomgr/iomgr_posix.h +39 -0
- data/src/core/iomgr/iomgr_windows.c +73 -0
- data/src/core/iomgr/pollset.h +95 -0
- data/src/core/iomgr/pollset_multipoller_with_epoll.c +258 -0
- data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +227 -0
- data/src/core/iomgr/pollset_posix.c +638 -0
- data/src/core/iomgr/pollset_posix.h +147 -0
- data/src/core/iomgr/pollset_set.h +67 -0
- data/src/core/iomgr/pollset_set_posix.c +182 -0
- data/src/core/iomgr/pollset_set_posix.h +61 -0
- data/src/core/iomgr/pollset_set_windows.c +60 -0
- data/src/core/iomgr/pollset_set_windows.h +39 -0
- data/src/core/iomgr/pollset_windows.c +248 -0
- data/src/core/iomgr/pollset_windows.h +79 -0
- data/src/core/iomgr/resolve_address.h +72 -0
- data/src/core/iomgr/resolve_address_posix.c +183 -0
- data/src/core/iomgr/resolve_address_windows.c +166 -0
- data/src/core/iomgr/sockaddr.h +47 -0
- data/src/core/iomgr/sockaddr_posix.h +44 -0
- data/src/core/iomgr/sockaddr_utils.c +234 -0
- data/src/core/iomgr/sockaddr_utils.h +89 -0
- data/src/core/iomgr/sockaddr_win32.h +46 -0
- data/src/core/iomgr/socket_utils_common_posix.c +208 -0
- data/src/core/iomgr/socket_utils_linux.c +51 -0
- data/src/core/iomgr/socket_utils_posix.c +70 -0
- data/src/core/iomgr/socket_utils_posix.h +113 -0
- data/src/core/iomgr/socket_windows.c +98 -0
- data/src/core/iomgr/socket_windows.h +111 -0
- data/src/core/iomgr/tcp_client.h +53 -0
- data/src/core/iomgr/tcp_client_posix.c +304 -0
- data/src/core/iomgr/tcp_client_windows.c +221 -0
- data/src/core/iomgr/tcp_posix.c +485 -0
- data/src/core/iomgr/tcp_posix.h +65 -0
- data/src/core/iomgr/tcp_server.h +83 -0
- data/src/core/iomgr/tcp_server_posix.c +562 -0
- data/src/core/iomgr/tcp_server_windows.c +509 -0
- data/src/core/iomgr/tcp_windows.c +406 -0
- data/src/core/iomgr/tcp_windows.h +57 -0
- data/src/core/iomgr/time_averaged_stats.c +77 -0
- data/src/core/iomgr/time_averaged_stats.h +88 -0
- data/src/core/iomgr/timer.c +345 -0
- data/src/core/iomgr/timer.h +89 -0
- data/src/core/iomgr/timer_heap.c +148 -0
- data/src/core/iomgr/timer_heap.h +57 -0
- data/src/core/iomgr/timer_internal.h +61 -0
- data/src/core/iomgr/udp_server.c +439 -0
- data/src/core/iomgr/udp_server.h +83 -0
- data/src/core/iomgr/wakeup_fd_eventfd.c +85 -0
- data/src/core/iomgr/wakeup_fd_nospecial.c +51 -0
- data/src/core/iomgr/wakeup_fd_pipe.c +97 -0
- data/src/core/iomgr/wakeup_fd_pipe.h +41 -0
- data/src/core/iomgr/wakeup_fd_posix.c +72 -0
- data/src/core/iomgr/wakeup_fd_posix.h +101 -0
- data/src/core/iomgr/workqueue.h +85 -0
- data/src/core/iomgr/workqueue_posix.c +143 -0
- data/src/core/iomgr/workqueue_posix.h +51 -0
- data/src/core/iomgr/workqueue_windows.c +40 -0
- data/src/core/iomgr/workqueue_windows.h +37 -0
- data/src/core/json/json.c +64 -0
- data/src/core/json/json.h +88 -0
- data/src/core/json/json_common.h +49 -0
- data/src/core/json/json_reader.c +660 -0
- data/src/core/json/json_reader.h +160 -0
- data/src/core/json/json_string.c +379 -0
- data/src/core/json/json_writer.c +260 -0
- data/src/core/json/json_writer.h +97 -0
- data/src/core/profiling/basic_timers.c +274 -0
- data/src/core/profiling/stap_timers.c +65 -0
- data/src/core/profiling/timers.h +119 -0
- data/src/core/security/auth_filters.h +42 -0
- data/src/core/security/base64.c +233 -0
- data/src/core/security/base64.h +52 -0
- data/src/core/security/client_auth_filter.c +337 -0
- data/src/core/security/credentials.c +1273 -0
- data/src/core/security/credentials.h +376 -0
- data/src/core/security/credentials_metadata.c +101 -0
- data/src/core/security/credentials_posix.c +61 -0
- data/src/core/security/credentials_win32.c +61 -0
- data/src/core/security/google_default_credentials.c +260 -0
- data/src/core/security/handshake.c +327 -0
- data/src/core/security/handshake.h +50 -0
- data/src/core/security/json_token.c +405 -0
- data/src/core/security/json_token.h +118 -0
- data/src/core/security/jwt_verifier.c +842 -0
- data/src/core/security/jwt_verifier.h +136 -0
- data/src/core/security/secure_endpoint.c +383 -0
- data/src/core/security/secure_endpoint.h +49 -0
- data/src/core/security/security_connector.c +756 -0
- data/src/core/security/security_connector.h +246 -0
- data/src/core/security/security_context.c +342 -0
- data/src/core/security/security_context.h +114 -0
- data/src/core/security/server_auth_filter.c +264 -0
- data/src/core/security/server_secure_chttp2.c +268 -0
- data/src/core/statistics/census_interface.h +76 -0
- data/src/core/statistics/census_rpc_stats.h +101 -0
- data/src/core/support/alloc.c +90 -0
- data/src/core/support/avl.c +288 -0
- data/src/core/support/block_annotate.h +48 -0
- data/src/core/support/cmdline.c +347 -0
- data/src/core/support/cpu_iphone.c +49 -0
- data/src/core/support/cpu_linux.c +78 -0
- data/src/core/support/cpu_posix.c +77 -0
- data/src/core/support/cpu_windows.c +47 -0
- data/src/core/support/env.h +60 -0
- data/src/core/support/env_linux.c +62 -0
- data/src/core/support/env_posix.c +57 -0
- data/src/core/support/env_win32.c +65 -0
- data/src/core/support/file.c +91 -0
- data/src/core/support/file.h +63 -0
- data/src/core/support/file_posix.c +85 -0
- data/src/core/support/file_win32.c +84 -0
- data/src/core/support/histogram.c +244 -0
- data/src/core/support/host_port.c +110 -0
- data/src/core/support/log.c +66 -0
- data/src/core/support/log_android.c +87 -0
- data/src/core/support/log_linux.c +105 -0
- data/src/core/support/log_posix.c +102 -0
- data/src/core/support/log_win32.c +125 -0
- data/src/core/support/murmur_hash.c +96 -0
- data/src/core/support/murmur_hash.h +44 -0
- data/src/core/support/slice.c +343 -0
- data/src/core/support/slice_buffer.c +282 -0
- data/src/core/support/stack_lockfree.c +175 -0
- data/src/core/support/stack_lockfree.h +53 -0
- data/src/core/support/string.c +296 -0
- data/src/core/support/string.h +121 -0
- data/src/core/support/string_posix.c +86 -0
- data/src/core/support/string_win32.c +109 -0
- data/src/core/support/string_win32.h +47 -0
- data/src/core/support/subprocess_posix.c +112 -0
- data/src/core/support/sync.c +122 -0
- data/src/core/support/sync_posix.c +104 -0
- data/src/core/support/sync_win32.c +128 -0
- data/src/core/support/thd.c +64 -0
- data/src/core/support/thd_internal.h +39 -0
- data/src/core/support/thd_posix.c +94 -0
- data/src/core/support/thd_win32.c +117 -0
- data/src/core/support/time.c +304 -0
- data/src/core/support/time_posix.c +161 -0
- data/src/core/support/time_precise.c +89 -0
- data/src/core/support/time_precise.h +42 -0
- data/src/core/support/time_win32.c +101 -0
- data/src/core/support/tls_pthread.c +45 -0
- data/src/core/surface/api_trace.c +36 -0
- data/src/core/surface/api_trace.h +65 -0
- data/src/core/surface/byte_buffer.c +97 -0
- data/src/core/surface/byte_buffer_reader.c +123 -0
- data/src/core/surface/call.c +1424 -0
- data/src/core/surface/call.h +109 -0
- data/src/core/surface/call_details.c +50 -0
- data/src/core/surface/call_log_batch.c +118 -0
- data/src/core/surface/call_test_only.h +64 -0
- data/src/core/surface/channel.c +327 -0
- data/src/core/surface/channel.h +74 -0
- data/src/core/surface/channel_connectivity.c +220 -0
- data/src/core/surface/channel_create.c +235 -0
- data/src/core/surface/channel_ping.c +79 -0
- data/src/core/surface/completion_queue.c +481 -0
- data/src/core/surface/completion_queue.h +91 -0
- data/src/core/surface/event_string.c +81 -0
- data/src/core/surface/event_string.h +42 -0
- data/src/core/surface/init.c +168 -0
- data/src/core/surface/init.h +40 -0
- data/src/core/surface/init_secure.c +42 -0
- data/src/core/surface/lame_client.c +149 -0
- data/src/core/surface/metadata_array.c +49 -0
- data/src/core/surface/secure_channel_create.c +336 -0
- data/src/core/surface/server.c +1343 -0
- data/src/core/surface/server.h +67 -0
- data/src/core/surface/server_chttp2.c +149 -0
- data/src/core/surface/server_create.c +51 -0
- data/src/core/surface/surface_trace.h +48 -0
- data/src/core/surface/validate_metadata.c +73 -0
- data/src/core/surface/version.c +39 -0
- data/src/core/transport/byte_stream.c +76 -0
- data/src/core/transport/byte_stream.h +88 -0
- data/src/core/transport/chttp2/alpn.c +56 -0
- data/src/core/transport/chttp2/alpn.h +49 -0
- data/src/core/transport/chttp2/bin_encoder.c +285 -0
- data/src/core/transport/chttp2/bin_encoder.h +54 -0
- data/src/core/transport/chttp2/frame.h +69 -0
- data/src/core/transport/chttp2/frame_data.c +245 -0
- data/src/core/transport/chttp2/frame_data.h +101 -0
- data/src/core/transport/chttp2/frame_goaway.c +193 -0
- data/src/core/transport/chttp2/frame_goaway.h +77 -0
- data/src/core/transport/chttp2/frame_ping.c +97 -0
- data/src/core/transport/chttp2/frame_ping.h +56 -0
- data/src/core/transport/chttp2/frame_rst_stream.c +100 -0
- data/src/core/transport/chttp2/frame_rst_stream.h +55 -0
- data/src/core/transport/chttp2/frame_settings.c +259 -0
- data/src/core/transport/chttp2/frame_settings.h +103 -0
- data/src/core/transport/chttp2/frame_window_update.c +114 -0
- data/src/core/transport/chttp2/frame_window_update.h +58 -0
- data/src/core/transport/chttp2/hpack_encoder.c +572 -0
- data/src/core/transport/chttp2/hpack_encoder.h +95 -0
- data/src/core/transport/chttp2/hpack_parser.c +1449 -0
- data/src/core/transport/chttp2/hpack_parser.h +116 -0
- data/src/core/transport/chttp2/hpack_table.c +361 -0
- data/src/core/transport/chttp2/hpack_table.h +108 -0
- data/src/core/transport/chttp2/http2_errors.h +56 -0
- data/src/core/transport/chttp2/huffsyms.c +297 -0
- data/src/core/transport/chttp2/huffsyms.h +48 -0
- data/src/core/transport/chttp2/incoming_metadata.c +96 -0
- data/src/core/transport/chttp2/incoming_metadata.h +60 -0
- data/src/core/transport/chttp2/internal.h +757 -0
- data/src/core/transport/chttp2/parsing.c +866 -0
- data/src/core/transport/chttp2/status_conversion.c +109 -0
- data/src/core/transport/chttp2/status_conversion.h +50 -0
- data/src/core/transport/chttp2/stream_lists.c +401 -0
- data/src/core/transport/chttp2/stream_map.c +198 -0
- data/src/core/transport/chttp2/stream_map.h +85 -0
- data/src/core/transport/chttp2/timeout_encoding.c +185 -0
- data/src/core/transport/chttp2/timeout_encoding.h +47 -0
- data/src/core/transport/chttp2/varint.c +66 -0
- data/src/core/transport/chttp2/varint.h +76 -0
- data/src/core/transport/chttp2/writing.c +356 -0
- data/src/core/transport/chttp2_transport.c +1692 -0
- data/src/core/transport/chttp2_transport.h +51 -0
- data/src/core/transport/connectivity_state.c +164 -0
- data/src/core/transport/connectivity_state.h +85 -0
- data/src/core/transport/metadata.c +690 -0
- data/src/core/transport/metadata.h +156 -0
- data/src/core/transport/metadata_batch.c +194 -0
- data/src/core/transport/metadata_batch.h +125 -0
- data/src/core/transport/static_metadata.c +90 -0
- data/src/core/transport/static_metadata.h +408 -0
- data/src/core/transport/transport.c +183 -0
- data/src/core/transport/transport.h +222 -0
- data/src/core/transport/transport_impl.h +78 -0
- data/src/core/transport/transport_op_string.c +140 -0
- data/src/core/tsi/fake_transport_security.c +525 -0
- data/src/core/tsi/fake_transport_security.h +61 -0
- data/src/core/tsi/ssl_transport_security.c +1467 -0
- data/src/core/tsi/ssl_transport_security.h +173 -0
- data/src/core/tsi/transport_security.c +284 -0
- data/src/core/tsi/transport_security.h +111 -0
- data/src/core/tsi/transport_security_interface.h +344 -0
- data/{bin → src/ruby/bin}/apis/google/protobuf/empty.rb +0 -0
- data/{bin → src/ruby/bin}/apis/pubsub_demo.rb +7 -15
- data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub.rb +0 -0
- data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub_services.rb +0 -0
- data/{bin → src/ruby/bin}/grpc_ruby_interop_client +0 -0
- data/{bin → src/ruby/bin}/grpc_ruby_interop_server +0 -0
- data/{bin → src/ruby/bin}/interop/interop_client.rb +0 -0
- data/{bin → src/ruby/bin}/interop/interop_server.rb +0 -0
- data/src/ruby/bin/math.rb +32 -0
- data/{bin → src/ruby/bin}/math_client.rb +1 -1
- data/{bin → src/ruby/bin}/math_server.rb +1 -1
- data/src/ruby/bin/math_services.rb +27 -0
- data/{bin → src/ruby/bin}/noproto_client.rb +1 -1
- data/{bin → src/ruby/bin}/noproto_server.rb +1 -1
- data/{ext → src/ruby/ext}/grpc/extconf.rb +24 -40
- data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.c +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_call.c +80 -18
- data/{ext → src/ruby/ext}/grpc/rb_call.h +6 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +315 -0
- data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
- data/{ext → src/ruby/ext}/grpc/rb_channel.c +19 -7
- data/{ext → src/ruby/ext}/grpc/rb_channel.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_channel_args.c +2 -0
- data/{ext → src/ruby/ext}/grpc/rb_channel_args.h +0 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.c +266 -0
- data/{ext/grpc/rb_credentials.h → src/ruby/ext/grpc/rb_channel_credentials.h} +3 -3
- data/{ext → src/ruby/ext}/grpc/rb_completion_queue.c +3 -1
- data/{ext → src/ruby/ext}/grpc/rb_completion_queue.h +0 -0
- data/src/ruby/ext/grpc/rb_event_thread.c +153 -0
- data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
- data/{ext → src/ruby/ext}/grpc/rb_grpc.c +25 -5
- data/{ext → src/ruby/ext}/grpc/rb_grpc.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_server.c +4 -1
- data/{ext → src/ruby/ext}/grpc/rb_server.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_server_credentials.c +2 -0
- data/{ext → src/ruby/ext}/grpc/rb_server_credentials.h +0 -0
- data/{lib → src/ruby/lib}/grpc.rb +6 -1
- data/{lib → src/ruby/lib}/grpc/core/time_consts.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/errors.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/generic/active_call.rb +4 -6
- data/{lib → src/ruby/lib}/grpc/generic/bidi_call.rb +16 -4
- data/{lib → src/ruby/lib}/grpc/generic/client_stub.rb +42 -52
- data/{lib → src/ruby/lib}/grpc/generic/rpc_desc.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/generic/rpc_server.rb +15 -8
- data/{lib → src/ruby/lib}/grpc/generic/service.rb +4 -2
- data/src/ruby/lib/grpc/grpc.so +0 -0
- data/{lib → src/ruby/lib}/grpc/logconfig.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/notifier.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/version.rb +2 -2
- data/src/ruby/pb/README.md +42 -0
- data/src/ruby/pb/generate_proto_ruby.sh +51 -0
- data/src/ruby/pb/grpc/health/checker.rb +75 -0
- data/src/ruby/pb/grpc/health/v1alpha/health.rb +29 -0
- data/src/ruby/pb/grpc/health/v1alpha/health_services.rb +28 -0
- data/src/ruby/pb/test/client.rb +469 -0
- data/src/ruby/pb/test/proto/empty.rb +15 -0
- data/src/ruby/pb/test/proto/messages.rb +80 -0
- data/src/ruby/pb/test/proto/test.rb +14 -0
- data/src/ruby/pb/test/proto/test_services.rb +64 -0
- data/src/ruby/pb/test/server.rb +253 -0
- data/{bin/math_services.rb → src/ruby/spec/call_credentials_spec.rb} +19 -18
- data/{spec → src/ruby/spec}/call_spec.rb +10 -1
- data/{spec/credentials_spec.rb → src/ruby/spec/channel_credentials_spec.rb} +38 -12
- data/{spec → src/ruby/spec}/channel_spec.rb +14 -9
- data/{spec → src/ruby/spec}/client_server_spec.rb +31 -2
- data/{spec → src/ruby/spec}/completion_queue_spec.rb +0 -0
- data/{spec → src/ruby/spec}/generic/active_call_spec.rb +2 -1
- data/{spec → src/ruby/spec}/generic/client_stub_spec.rb +27 -67
- data/{spec → src/ruby/spec}/generic/rpc_desc_spec.rb +0 -0
- data/{spec → src/ruby/spec}/generic/rpc_server_pool_spec.rb +0 -0
- data/{spec → src/ruby/spec}/generic/rpc_server_spec.rb +12 -46
- data/{spec → src/ruby/spec}/generic/service_spec.rb +6 -3
- data/{spec → src/ruby/spec}/pb/health/checker_spec.rb +8 -8
- data/{spec → src/ruby/spec}/server_credentials_spec.rb +0 -0
- data/{spec → src/ruby/spec}/server_spec.rb +0 -0
- data/{spec → src/ruby/spec}/spec_helper.rb +0 -0
- data/{spec → src/ruby/spec}/testdata/README +0 -0
- data/{spec → src/ruby/spec}/testdata/ca.pem +0 -0
- data/{spec → src/ruby/spec}/testdata/server1.key +0 -0
- data/src/ruby/spec/testdata/server1.pem +16 -0
- data/{spec → src/ruby/spec}/time_consts_spec.rb +0 -0
- metadata +496 -97
- data/bin/math.proto +0 -80
- data/bin/math.rb +0 -61
- data/ext/grpc/rb_credentials.c +0 -294
- data/lib/grpc/grpc.so +0 -0
- data/spec/testdata/server1.pem +0 -16
@@ -0,0 +1,95 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2015, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
#ifndef GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_HPACK_ENCODER_H
|
35
|
+
#define GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_HPACK_ENCODER_H
|
36
|
+
|
37
|
+
#include "src/core/transport/chttp2/frame.h"
|
38
|
+
#include "src/core/transport/metadata.h"
|
39
|
+
#include "src/core/transport/metadata_batch.h"
|
40
|
+
#include <grpc/support/port_platform.h>
|
41
|
+
#include <grpc/support/slice.h>
|
42
|
+
#include <grpc/support/slice_buffer.h>
|
43
|
+
|
44
|
+
#define GRPC_CHTTP2_HPACKC_NUM_FILTERS 256
|
45
|
+
#define GRPC_CHTTP2_HPACKC_NUM_VALUES 256
|
46
|
+
/* initial table size, per spec */
|
47
|
+
#define GRPC_CHTTP2_HPACKC_INITIAL_TABLE_SIZE 4096
|
48
|
+
/* maximum table size we'll actually use */
|
49
|
+
#define GRPC_CHTTP2_HPACKC_MAX_TABLE_SIZE (1024 * 1024)
|
50
|
+
|
51
|
+
typedef struct {
|
52
|
+
gpr_uint32 filter_elems_sum;
|
53
|
+
gpr_uint32 max_table_size;
|
54
|
+
gpr_uint32 max_table_elems;
|
55
|
+
gpr_uint32 cap_table_elems;
|
56
|
+
/** if non-zero, advertise to the decoder that we'll start using a table
|
57
|
+
of this size */
|
58
|
+
gpr_uint8 advertise_table_size_change;
|
59
|
+
/** maximum number of bytes we'll use for the decode table (to guard against
|
60
|
+
peers ooming us by setting decode table size high) */
|
61
|
+
gpr_uint32 max_usable_size;
|
62
|
+
/* one before the lowest usable table index */
|
63
|
+
gpr_uint32 tail_remote_index;
|
64
|
+
gpr_uint32 table_size;
|
65
|
+
gpr_uint32 table_elems;
|
66
|
+
|
67
|
+
/* filter tables for elems: this tables provides an approximate
|
68
|
+
popularity count for particular hashes, and are used to determine whether
|
69
|
+
a new literal should be added to the compression table or not.
|
70
|
+
They track a single integer that counts how often a particular value has
|
71
|
+
been seen. When that count reaches max (255), all values are halved. */
|
72
|
+
gpr_uint8 filter_elems[GRPC_CHTTP2_HPACKC_NUM_FILTERS];
|
73
|
+
|
74
|
+
/* entry tables for keys & elems: these tables track values that have been
|
75
|
+
seen and *may* be in the decompressor table */
|
76
|
+
grpc_mdstr *entries_keys[GRPC_CHTTP2_HPACKC_NUM_VALUES];
|
77
|
+
grpc_mdelem *entries_elems[GRPC_CHTTP2_HPACKC_NUM_VALUES];
|
78
|
+
gpr_uint32 indices_keys[GRPC_CHTTP2_HPACKC_NUM_VALUES];
|
79
|
+
gpr_uint32 indices_elems[GRPC_CHTTP2_HPACKC_NUM_VALUES];
|
80
|
+
|
81
|
+
gpr_uint16 *table_elem_size;
|
82
|
+
} grpc_chttp2_hpack_compressor;
|
83
|
+
|
84
|
+
void grpc_chttp2_hpack_compressor_init(grpc_chttp2_hpack_compressor *c);
|
85
|
+
void grpc_chttp2_hpack_compressor_destroy(grpc_chttp2_hpack_compressor *c);
|
86
|
+
void grpc_chttp2_hpack_compressor_set_max_table_size(
|
87
|
+
grpc_chttp2_hpack_compressor *c, gpr_uint32 max_table_size);
|
88
|
+
void grpc_chttp2_hpack_compressor_set_max_usable_size(
|
89
|
+
grpc_chttp2_hpack_compressor *c, gpr_uint32 max_table_size);
|
90
|
+
|
91
|
+
void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor *c, gpr_uint32 id,
|
92
|
+
grpc_metadata_batch *metadata, int is_eof,
|
93
|
+
gpr_slice_buffer *outbuf);
|
94
|
+
|
95
|
+
#endif /* GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_HPACK_ENCODER_H */
|
@@ -0,0 +1,1449 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2015-2016, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
#include "src/core/transport/chttp2/hpack_parser.h"
|
35
|
+
#include "src/core/transport/chttp2/internal.h"
|
36
|
+
|
37
|
+
#include <stddef.h>
|
38
|
+
#include <string.h>
|
39
|
+
#include <assert.h>
|
40
|
+
|
41
|
+
/* This is here for grpc_is_binary_header
|
42
|
+
* TODO(murgatroid99): Remove this
|
43
|
+
*/
|
44
|
+
#include <grpc/grpc.h>
|
45
|
+
|
46
|
+
#include <grpc/support/alloc.h>
|
47
|
+
#include <grpc/support/log.h>
|
48
|
+
#include <grpc/support/port_platform.h>
|
49
|
+
#include <grpc/support/useful.h>
|
50
|
+
|
51
|
+
#include "src/core/profiling/timers.h"
|
52
|
+
#include "src/core/support/string.h"
|
53
|
+
#include "src/core/transport/chttp2/bin_encoder.h"
|
54
|
+
|
55
|
+
typedef enum {
|
56
|
+
NOT_BINARY,
|
57
|
+
B64_BYTE0,
|
58
|
+
B64_BYTE1,
|
59
|
+
B64_BYTE2,
|
60
|
+
B64_BYTE3
|
61
|
+
} binary_state;
|
62
|
+
|
63
|
+
/* How parsing works:
|
64
|
+
|
65
|
+
The parser object keeps track of a function pointer which represents the
|
66
|
+
current parse state.
|
67
|
+
|
68
|
+
Each time new bytes are presented, we call into the current state, which
|
69
|
+
recursively parses until all bytes in the given chunk are exhausted.
|
70
|
+
|
71
|
+
The parse state that terminates then saves its function pointer to be the
|
72
|
+
current state so that it can resume when more bytes are available.
|
73
|
+
|
74
|
+
It's expected that most optimizing compilers will turn this code into
|
75
|
+
a set of indirect jumps, and so not waste stack space. */
|
76
|
+
|
77
|
+
/* forward declarations for parsing states */
|
78
|
+
static int parse_begin(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
79
|
+
const gpr_uint8 *end);
|
80
|
+
static int parse_error(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
81
|
+
const gpr_uint8 *end);
|
82
|
+
static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
83
|
+
const gpr_uint8 *end);
|
84
|
+
|
85
|
+
static int parse_string_prefix(grpc_chttp2_hpack_parser *p,
|
86
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
87
|
+
static int parse_key_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
88
|
+
const gpr_uint8 *end);
|
89
|
+
static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p,
|
90
|
+
const gpr_uint8 *cur,
|
91
|
+
const gpr_uint8 *end);
|
92
|
+
static int parse_value_string_with_literal_key(grpc_chttp2_hpack_parser *p,
|
93
|
+
const gpr_uint8 *cur,
|
94
|
+
const gpr_uint8 *end);
|
95
|
+
|
96
|
+
static int parse_value0(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
97
|
+
const gpr_uint8 *end);
|
98
|
+
static int parse_value1(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
99
|
+
const gpr_uint8 *end);
|
100
|
+
static int parse_value2(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
101
|
+
const gpr_uint8 *end);
|
102
|
+
static int parse_value3(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
103
|
+
const gpr_uint8 *end);
|
104
|
+
static int parse_value4(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
105
|
+
const gpr_uint8 *end);
|
106
|
+
static int parse_value5up(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
107
|
+
const gpr_uint8 *end);
|
108
|
+
|
109
|
+
static int parse_indexed_field(grpc_chttp2_hpack_parser *p,
|
110
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
111
|
+
static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
|
112
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
113
|
+
static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p,
|
114
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
115
|
+
static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
|
116
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
117
|
+
static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
|
118
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
119
|
+
static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p,
|
120
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
121
|
+
static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
|
122
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
123
|
+
static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
|
124
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
125
|
+
static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
|
126
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
127
|
+
static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
|
128
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
129
|
+
static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
|
130
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
131
|
+
static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
132
|
+
const gpr_uint8 *end);
|
133
|
+
static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
|
134
|
+
const gpr_uint8 *cur, const gpr_uint8 *end);
|
135
|
+
|
136
|
+
/* we translate the first byte of a hpack field into one of these decoding
|
137
|
+
cases, then use a lookup table to jump directly to the appropriate parser.
|
138
|
+
|
139
|
+
_X => the integer index is all ones, meaning we need to do varint decoding
|
140
|
+
_V => the integer index is all zeros, meaning we need to decode an additional
|
141
|
+
string value */
|
142
|
+
typedef enum {
|
143
|
+
INDEXED_FIELD,
|
144
|
+
INDEXED_FIELD_X,
|
145
|
+
LITHDR_INCIDX,
|
146
|
+
LITHDR_INCIDX_X,
|
147
|
+
LITHDR_INCIDX_V,
|
148
|
+
LITHDR_NOTIDX,
|
149
|
+
LITHDR_NOTIDX_X,
|
150
|
+
LITHDR_NOTIDX_V,
|
151
|
+
LITHDR_NVRIDX,
|
152
|
+
LITHDR_NVRIDX_X,
|
153
|
+
LITHDR_NVRIDX_V,
|
154
|
+
MAX_TBL_SIZE,
|
155
|
+
MAX_TBL_SIZE_X,
|
156
|
+
ILLEGAL
|
157
|
+
} first_byte_type;
|
158
|
+
|
159
|
+
/* jump table of parse state functions -- order must match first_byte_type
|
160
|
+
above */
|
161
|
+
static const grpc_chttp2_hpack_parser_state first_byte_action[] = {
|
162
|
+
parse_indexed_field, parse_indexed_field_x, parse_lithdr_incidx,
|
163
|
+
parse_lithdr_incidx_x, parse_lithdr_incidx_v, parse_lithdr_notidx,
|
164
|
+
parse_lithdr_notidx_x, parse_lithdr_notidx_v, parse_lithdr_nvridx,
|
165
|
+
parse_lithdr_nvridx_x, parse_lithdr_nvridx_v, parse_max_tbl_size,
|
166
|
+
parse_max_tbl_size_x, parse_illegal_op};
|
167
|
+
|
168
|
+
/* indexes the first byte to a parse state function - generated by
|
169
|
+
gen_hpack_tables.c */
|
170
|
+
static const gpr_uint8 first_byte_lut[256] = {
|
171
|
+
LITHDR_NOTIDX_V, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
|
172
|
+
LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
|
173
|
+
LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
|
174
|
+
LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX_X,
|
175
|
+
LITHDR_NVRIDX_V, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
|
176
|
+
LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
|
177
|
+
LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
|
178
|
+
LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX_X,
|
179
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
|
180
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
|
181
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
|
182
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
|
183
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
|
184
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
|
185
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
|
186
|
+
MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE_X,
|
187
|
+
LITHDR_INCIDX_V, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
188
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
189
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
190
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
191
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
192
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
193
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
194
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
195
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
196
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
197
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
198
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
199
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
200
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
201
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
|
202
|
+
LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX_X,
|
203
|
+
ILLEGAL, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
204
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
205
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
206
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
207
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
208
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
209
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
210
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
211
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
212
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
213
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
214
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
215
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
216
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
217
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
218
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
219
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
220
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
221
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
222
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
223
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
224
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
225
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
226
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
227
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
228
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
229
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
230
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
231
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
232
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
233
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
|
234
|
+
INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD_X,
|
235
|
+
};
|
236
|
+
|
237
|
+
/* state table for huffman decoding: given a state, gives an index/16 into
|
238
|
+
next_sub_tbl. Taking that index and adding the value of the nibble being
|
239
|
+
considered returns the next state.
|
240
|
+
|
241
|
+
generated by gen_hpack_tables.c */
|
242
|
+
static const gpr_uint8 next_tbl[256] = {
|
243
|
+
0, 1, 2, 3, 4, 1, 2, 5, 6, 1, 7, 8, 1, 3, 3, 9, 10, 11, 1, 1,
|
244
|
+
1, 12, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
|
245
|
+
14, 1, 15, 16, 1, 17, 1, 15, 2, 7, 3, 18, 19, 1, 1, 1, 1, 20, 1, 1,
|
246
|
+
1, 1, 1, 1, 1, 1, 1, 1, 15, 2, 2, 7, 21, 1, 22, 1, 1, 1, 1, 1,
|
247
|
+
1, 1, 1, 15, 2, 2, 2, 2, 2, 2, 23, 24, 25, 1, 1, 1, 1, 2, 2, 2,
|
248
|
+
26, 3, 3, 27, 10, 28, 1, 1, 1, 1, 1, 1, 2, 3, 29, 10, 30, 1, 1, 1,
|
249
|
+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 2,
|
250
|
+
2, 2, 2, 2, 2, 2, 2, 32, 1, 1, 15, 33, 1, 34, 35, 9, 36, 1, 1, 1,
|
251
|
+
1, 1, 1, 1, 37, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 26, 9,
|
252
|
+
38, 1, 1, 1, 1, 1, 1, 1, 15, 2, 2, 2, 2, 26, 3, 3, 39, 1, 1, 1,
|
253
|
+
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 7, 3, 3, 3, 40, 2,
|
254
|
+
41, 1, 1, 1, 42, 43, 1, 1, 44, 1, 1, 1, 1, 15, 2, 2, 2, 2, 2, 2,
|
255
|
+
3, 3, 3, 45, 46, 1, 1, 2, 2, 2, 35, 3, 3, 18, 47, 2,
|
256
|
+
};
|
257
|
+
|
258
|
+
/* next state, based upon current state and the current nibble: see above.
|
259
|
+
generated by gen_hpack_tables.c */
|
260
|
+
static const gpr_int16 next_sub_tbl[48 * 16] = {
|
261
|
+
1, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
|
262
|
+
218, 2, 6, 10, 13, 14, 15, 16, 17, 2, 6, 10, 13, 14, 15,
|
263
|
+
16, 17, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7, 11, 24, 3,
|
264
|
+
7, 11, 24, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8,
|
265
|
+
4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
|
266
|
+
199, 200, 201, 202, 203, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0,
|
267
|
+
0, 0, 0, 0, 0, 0, 9, 133, 134, 135, 136, 137, 138, 139, 140,
|
268
|
+
141, 142, 143, 144, 145, 146, 147, 3, 7, 11, 24, 3, 7, 11, 24,
|
269
|
+
4, 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0,
|
270
|
+
0, 0, 0, 0, 0, 0, 0, 12, 132, 4, 8, 4, 8, 4, 8,
|
271
|
+
4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
272
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
273
|
+
0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 4, 8, 4,
|
274
|
+
8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 22, 23, 91, 25, 26,
|
275
|
+
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 3,
|
276
|
+
7, 11, 24, 3, 7, 11, 24, 0, 0, 0, 0, 0, 41, 42, 43,
|
277
|
+
2, 6, 10, 13, 14, 15, 16, 17, 3, 7, 11, 24, 3, 7, 11,
|
278
|
+
24, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0,
|
279
|
+
44, 45, 2, 6, 10, 13, 14, 15, 16, 17, 46, 47, 48, 49, 50,
|
280
|
+
51, 52, 57, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
281
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
282
|
+
0, 53, 54, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
|
283
|
+
68, 69, 70, 71, 72, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
284
|
+
0, 0, 0, 0, 0, 0, 73, 75, 76, 77, 78, 79, 80, 81, 82,
|
285
|
+
83, 84, 85, 86, 87, 88, 89, 90, 3, 7, 11, 24, 3, 7, 11,
|
286
|
+
24, 3, 7, 11, 24, 0, 0, 0, 0, 3, 7, 11, 24, 3, 7,
|
287
|
+
11, 24, 4, 8, 4, 8, 0, 0, 0, 92, 0, 0, 0, 93, 94,
|
288
|
+
95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 3, 7, 11, 24,
|
289
|
+
4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4,
|
290
|
+
8, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
291
|
+
0, 0, 0, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 4,
|
292
|
+
8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0,
|
293
|
+
0, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
|
294
|
+
131, 2, 6, 10, 13, 14, 15, 16, 17, 4, 8, 4, 8, 4, 8,
|
295
|
+
4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 148,
|
296
|
+
149, 150, 151, 3, 7, 11, 24, 4, 8, 4, 8, 0, 0, 0, 0,
|
297
|
+
0, 0, 152, 153, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7, 11,
|
298
|
+
24, 154, 155, 156, 164, 3, 7, 11, 24, 3, 7, 11, 24, 3, 7,
|
299
|
+
11, 24, 4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
300
|
+
157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 169, 170, 171, 172,
|
301
|
+
173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
|
302
|
+
188, 189, 190, 191, 192, 193, 194, 195, 196, 4, 8, 4, 8, 4, 8,
|
303
|
+
4, 8, 4, 8, 4, 8, 4, 8, 197, 198, 4, 8, 4, 8, 4,
|
304
|
+
8, 4, 8, 0, 0, 0, 0, 0, 0, 219, 220, 3, 7, 11, 24,
|
305
|
+
4, 8, 4, 8, 4, 8, 0, 0, 221, 222, 223, 224, 3, 7, 11,
|
306
|
+
24, 3, 7, 11, 24, 4, 8, 4, 8, 4, 8, 225, 228, 4, 8,
|
307
|
+
4, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 229,
|
308
|
+
230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
|
309
|
+
4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0,
|
310
|
+
0, 0, 0, 0, 0, 0, 0, 245, 246, 247, 248, 249, 250, 251, 252,
|
311
|
+
253, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
312
|
+
0, 0, 255,
|
313
|
+
};
|
314
|
+
|
315
|
+
/* emission table: indexed like next_tbl, ultimately gives the byte to be
|
316
|
+
emitted, or -1 for no byte, or 256 for end of stream
|
317
|
+
|
318
|
+
generated by gen_hpack_tables.c */
|
319
|
+
static const gpr_uint16 emit_tbl[256] = {
|
320
|
+
0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 12, 13,
|
321
|
+
14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 23, 24, 25, 26, 27,
|
322
|
+
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
|
323
|
+
43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 0, 55, 56,
|
324
|
+
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 0,
|
325
|
+
71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
|
326
|
+
86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
|
327
|
+
101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
|
328
|
+
116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
|
329
|
+
131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
|
330
|
+
146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 0,
|
331
|
+
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
|
332
|
+
0, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
|
333
|
+
189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
|
334
|
+
204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
|
335
|
+
219, 220, 221, 0, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
|
336
|
+
233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
|
337
|
+
248,
|
338
|
+
};
|
339
|
+
|
340
|
+
/* generated by gen_hpack_tables.c */
|
341
|
+
static const gpr_int16 emit_sub_tbl[249 * 16] = {
|
342
|
+
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
343
|
+
-1, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49,
|
344
|
+
49, 49, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 97,
|
345
|
+
97, 97, 97, 48, 48, 49, 49, 50, 50, 97, 97, 99, 99, 101, 101,
|
346
|
+
105, 105, 111, 111, 48, 49, 50, 97, 99, 101, 105, 111, 115, 116, -1,
|
347
|
+
-1, -1, -1, -1, -1, 32, 32, 32, 32, 32, 32, 32, 32, 37, 37,
|
348
|
+
37, 37, 37, 37, 37, 37, 99, 99, 99, 99, 101, 101, 101, 101, 105,
|
349
|
+
105, 105, 105, 111, 111, 111, 111, 115, 115, 116, 116, 32, 37, 45, 46,
|
350
|
+
47, 51, 52, 53, 54, 55, 56, 57, 61, 61, 61, 61, 61, 61, 61,
|
351
|
+
61, 65, 65, 65, 65, 65, 65, 65, 65, 115, 115, 115, 115, 116, 116,
|
352
|
+
116, 116, 32, 32, 37, 37, 45, 45, 46, 46, 61, 65, 95, 98, 100,
|
353
|
+
102, 103, 104, 108, 109, 110, 112, 114, 117, -1, -1, 58, 58, 58, 58,
|
354
|
+
58, 58, 58, 58, 66, 66, 66, 66, 66, 66, 66, 66, 47, 47, 51,
|
355
|
+
51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 61, 61,
|
356
|
+
65, 65, 95, 95, 98, 98, 100, 100, 102, 102, 103, 103, 104, 104, 108,
|
357
|
+
108, 109, 109, 110, 110, 112, 112, 114, 114, 117, 117, 58, 66, 67, 68,
|
358
|
+
69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
|
359
|
+
84, 85, 86, 87, 89, 106, 107, 113, 118, 119, 120, 121, 122, -1, -1,
|
360
|
+
-1, -1, 38, 38, 38, 38, 38, 38, 38, 38, 42, 42, 42, 42, 42,
|
361
|
+
42, 42, 42, 44, 44, 44, 44, 44, 44, 44, 44, 59, 59, 59, 59,
|
362
|
+
59, 59, 59, 59, 88, 88, 88, 88, 88, 88, 88, 88, 90, 90, 90,
|
363
|
+
90, 90, 90, 90, 90, 33, 33, 34, 34, 40, 40, 41, 41, 63, 63,
|
364
|
+
39, 43, 124, -1, -1, -1, 35, 35, 35, 35, 35, 35, 35, 35, 62,
|
365
|
+
62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 36, 36, 36, 36,
|
366
|
+
64, 64, 64, 64, 91, 91, 91, 91, 69, 69, 69, 69, 69, 69, 69,
|
367
|
+
69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71,
|
368
|
+
71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73,
|
369
|
+
73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75,
|
370
|
+
75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77,
|
371
|
+
77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79,
|
372
|
+
79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 81,
|
373
|
+
81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82,
|
374
|
+
83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84,
|
375
|
+
84, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86,
|
376
|
+
86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 89, 89, 89, 89, 89,
|
377
|
+
89, 89, 89, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107,
|
378
|
+
107, 107, 107, 107, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118,
|
379
|
+
118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120,
|
380
|
+
120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 122,
|
381
|
+
122, 122, 122, 122, 122, 122, 122, 38, 38, 38, 38, 42, 42, 42, 42,
|
382
|
+
44, 44, 44, 44, 59, 59, 59, 59, 88, 88, 88, 88, 90, 90, 90,
|
383
|
+
90, 33, 34, 40, 41, 63, -1, -1, -1, 39, 39, 39, 39, 39, 39,
|
384
|
+
39, 39, 43, 43, 43, 43, 43, 43, 43, 43, 124, 124, 124, 124, 124,
|
385
|
+
124, 124, 124, 35, 35, 35, 35, 62, 62, 62, 62, 0, 0, 36, 36,
|
386
|
+
64, 64, 91, 91, 93, 93, 126, 126, 94, 125, -1, -1, 60, 60, 60,
|
387
|
+
60, 60, 60, 60, 60, 96, 96, 96, 96, 96, 96, 96, 96, 123, 123,
|
388
|
+
123, 123, 123, 123, 123, 123, -1, -1, -1, -1, -1, -1, -1, -1, 92,
|
389
|
+
92, 92, 92, 92, 92, 92, 92, 195, 195, 195, 195, 195, 195, 195, 195,
|
390
|
+
208, 208, 208, 208, 208, 208, 208, 208, 128, 128, 128, 128, 130, 130, 130,
|
391
|
+
130, 131, 131, 131, 131, 162, 162, 162, 162, 184, 184, 184, 184, 194, 194,
|
392
|
+
194, 194, 224, 224, 224, 224, 226, 226, 226, 226, 153, 153, 161, 161, 167,
|
393
|
+
167, 172, 172, 176, 176, 177, 177, 179, 179, 209, 209, 216, 216, 217, 217,
|
394
|
+
227, 227, 229, 229, 230, 230, 129, 132, 133, 134, 136, 146, 154, 156, 160,
|
395
|
+
163, 164, 169, 170, 173, 178, 181, 185, 186, 187, 189, 190, 196, 198, 228,
|
396
|
+
232, 233, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 135,
|
397
|
+
135, 135, 135, 135, 135, 135, 135, 137, 137, 137, 137, 137, 137, 137, 137,
|
398
|
+
138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139,
|
399
|
+
139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141,
|
400
|
+
141, 141, 143, 143, 143, 143, 143, 143, 143, 143, 147, 147, 147, 147, 147,
|
401
|
+
147, 147, 147, 149, 149, 149, 149, 149, 149, 149, 149, 150, 150, 150, 150,
|
402
|
+
150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
|
403
|
+
152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 157, 157,
|
404
|
+
157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 165,
|
405
|
+
165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
|
406
|
+
168, 168, 168, 168, 168, 168, 168, 168, 174, 174, 174, 174, 174, 174, 174,
|
407
|
+
174, 175, 175, 175, 175, 175, 175, 175, 175, 180, 180, 180, 180, 180, 180,
|
408
|
+
180, 180, 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183,
|
409
|
+
183, 183, 183, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191,
|
410
|
+
191, 191, 191, 191, 197, 197, 197, 197, 197, 197, 197, 197, 231, 231, 231,
|
411
|
+
231, 231, 231, 231, 231, 239, 239, 239, 239, 239, 239, 239, 239, 9, 9,
|
412
|
+
9, 9, 142, 142, 142, 142, 144, 144, 144, 144, 145, 145, 145, 145, 148,
|
413
|
+
148, 148, 148, 159, 159, 159, 159, 171, 171, 171, 171, 206, 206, 206, 206,
|
414
|
+
215, 215, 215, 215, 225, 225, 225, 225, 236, 236, 236, 236, 237, 237, 237,
|
415
|
+
237, 199, 199, 207, 207, 234, 234, 235, 235, 192, 193, 200, 201, 202, 205,
|
416
|
+
210, 213, 218, 219, 238, 240, 242, 243, 255, -1, 203, 203, 203, 203, 203,
|
417
|
+
203, 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, 211, 211, 211, 211,
|
418
|
+
211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 214, 214, 214,
|
419
|
+
214, 214, 214, 214, 214, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222,
|
420
|
+
222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, 241,
|
421
|
+
241, 241, 241, 241, 241, 241, 241, 244, 244, 244, 244, 244, 244, 244, 244,
|
422
|
+
245, 245, 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246,
|
423
|
+
246, 247, 247, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, 248, 248,
|
424
|
+
248, 248, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251,
|
425
|
+
251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253,
|
426
|
+
253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 2, 2, 2,
|
427
|
+
2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
|
428
|
+
6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 11, 11, 11, 11, 12,
|
429
|
+
12, 12, 12, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
|
430
|
+
17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20,
|
431
|
+
20, 21, 21, 21, 21, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25,
|
432
|
+
25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29,
|
433
|
+
29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 127, 127, 127, 127,
|
434
|
+
220, 220, 220, 220, 249, 249, 249, 249, 10, 13, 22, 256, 93, 93, 93,
|
435
|
+
93, 126, 126, 126, 126, 94, 94, 125, 125, 60, 96, 123, -1, 92, 195,
|
436
|
+
208, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 128,
|
437
|
+
128, 128, 128, 128, 128, 128, 128, 130, 130, 130, 130, 130, 130, 130, 130,
|
438
|
+
131, 131, 131, 131, 131, 131, 131, 131, 162, 162, 162, 162, 162, 162, 162,
|
439
|
+
162, 184, 184, 184, 184, 184, 184, 184, 184, 194, 194, 194, 194, 194, 194,
|
440
|
+
194, 194, 224, 224, 224, 224, 224, 224, 224, 224, 226, 226, 226, 226, 226,
|
441
|
+
226, 226, 226, 153, 153, 153, 153, 161, 161, 161, 161, 167, 167, 167, 167,
|
442
|
+
172, 172, 172, 172, 176, 176, 176, 176, 177, 177, 177, 177, 179, 179, 179,
|
443
|
+
179, 209, 209, 209, 209, 216, 216, 216, 216, 217, 217, 217, 217, 227, 227,
|
444
|
+
227, 227, 229, 229, 229, 229, 230, 230, 230, 230, 129, 129, 132, 132, 133,
|
445
|
+
133, 134, 134, 136, 136, 146, 146, 154, 154, 156, 156, 160, 160, 163, 163,
|
446
|
+
164, 164, 169, 169, 170, 170, 173, 173, 178, 178, 181, 181, 185, 185, 186,
|
447
|
+
186, 187, 187, 189, 189, 190, 190, 196, 196, 198, 198, 228, 228, 232, 232,
|
448
|
+
233, 233, 1, 135, 137, 138, 139, 140, 141, 143, 147, 149, 150, 151, 152,
|
449
|
+
155, 157, 158, 165, 166, 168, 174, 175, 180, 182, 183, 188, 191, 197, 231,
|
450
|
+
239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, 9,
|
451
|
+
9, 9, 9, 9, 9, 142, 142, 142, 142, 142, 142, 142, 142, 144, 144,
|
452
|
+
144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 148,
|
453
|
+
148, 148, 148, 148, 148, 148, 148, 159, 159, 159, 159, 159, 159, 159, 159,
|
454
|
+
171, 171, 171, 171, 171, 171, 171, 171, 206, 206, 206, 206, 206, 206, 206,
|
455
|
+
206, 215, 215, 215, 215, 215, 215, 215, 215, 225, 225, 225, 225, 225, 225,
|
456
|
+
225, 225, 236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237,
|
457
|
+
237, 237, 237, 199, 199, 199, 199, 207, 207, 207, 207, 234, 234, 234, 234,
|
458
|
+
235, 235, 235, 235, 192, 192, 193, 193, 200, 200, 201, 201, 202, 202, 205,
|
459
|
+
205, 210, 210, 213, 213, 218, 218, 219, 219, 238, 238, 240, 240, 242, 242,
|
460
|
+
243, 243, 255, 255, 203, 204, 211, 212, 214, 221, 222, 223, 241, 244, 245,
|
461
|
+
246, 247, 248, 250, 251, 252, 253, 254, -1, -1, -1, -1, -1, -1, -1,
|
462
|
+
-1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2,
|
463
|
+
2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
|
464
|
+
4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
|
465
|
+
6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
|
466
|
+
8, 8, 8, 8, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12,
|
467
|
+
12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15,
|
468
|
+
15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17,
|
469
|
+
17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18,
|
470
|
+
19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20,
|
471
|
+
20, 21, 21, 21, 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, 23,
|
472
|
+
23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25,
|
473
|
+
25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27,
|
474
|
+
27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29,
|
475
|
+
29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31,
|
476
|
+
31, 31, 31, 31, 31, 31, 127, 127, 127, 127, 127, 127, 127, 127, 220,
|
477
|
+
220, 220, 220, 220, 220, 220, 220, 249, 249, 249, 249, 249, 249, 249, 249,
|
478
|
+
10, 10, 13, 13, 22, 22, 256, 256, 67, 67, 67, 67, 67, 67, 67,
|
479
|
+
67, 68, 68, 68, 68, 68, 68, 68, 68, 95, 95, 95, 95, 95, 95,
|
480
|
+
95, 95, 98, 98, 98, 98, 98, 98, 98, 98, 100, 100, 100, 100, 100,
|
481
|
+
100, 100, 100, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103,
|
482
|
+
103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 108, 108, 108,
|
483
|
+
108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110,
|
484
|
+
110, 110, 110, 110, 110, 110, 112, 112, 112, 112, 112, 112, 112, 112, 114,
|
485
|
+
114, 114, 114, 114, 114, 114, 114, 117, 117, 117, 117, 117, 117, 117, 117,
|
486
|
+
58, 58, 58, 58, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68,
|
487
|
+
68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72,
|
488
|
+
72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76,
|
489
|
+
76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79,
|
490
|
+
80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83,
|
491
|
+
83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87,
|
492
|
+
87, 87, 89, 89, 89, 89, 106, 106, 106, 106, 107, 107, 107, 107, 113,
|
493
|
+
113, 113, 113, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120,
|
494
|
+
121, 121, 121, 121, 122, 122, 122, 122, 38, 38, 42, 42, 44, 44, 59,
|
495
|
+
59, 88, 88, 90, 90, -1, -1, -1, -1, 33, 33, 33, 33, 33, 33,
|
496
|
+
33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 40, 40, 40, 40, 40,
|
497
|
+
40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 63, 63, 63, 63,
|
498
|
+
63, 63, 63, 63, 39, 39, 39, 39, 43, 43, 43, 43, 124, 124, 124,
|
499
|
+
124, 35, 35, 62, 62, 0, 36, 64, 91, 93, 126, -1, -1, 94, 94,
|
500
|
+
94, 94, 94, 94, 94, 94, 125, 125, 125, 125, 125, 125, 125, 125, 60,
|
501
|
+
60, 60, 60, 96, 96, 96, 96, 123, 123, 123, 123, -1, -1, -1, -1,
|
502
|
+
92, 92, 92, 92, 195, 195, 195, 195, 208, 208, 208, 208, 128, 128, 130,
|
503
|
+
130, 131, 131, 162, 162, 184, 184, 194, 194, 224, 224, 226, 226, 153, 161,
|
504
|
+
167, 172, 176, 177, 179, 209, 216, 217, 227, 229, 230, -1, -1, -1, -1,
|
505
|
+
-1, -1, -1, 129, 129, 129, 129, 129, 129, 129, 129, 132, 132, 132, 132,
|
506
|
+
132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
|
507
|
+
134, 134, 134, 134, 134, 136, 136, 136, 136, 136, 136, 136, 136, 146, 146,
|
508
|
+
146, 146, 146, 146, 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, 156,
|
509
|
+
156, 156, 156, 156, 156, 156, 156, 160, 160, 160, 160, 160, 160, 160, 160,
|
510
|
+
163, 163, 163, 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
|
511
|
+
164, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
|
512
|
+
170, 170, 173, 173, 173, 173, 173, 173, 173, 173, 178, 178, 178, 178, 178,
|
513
|
+
178, 178, 178, 181, 181, 181, 181, 181, 181, 181, 181, 185, 185, 185, 185,
|
514
|
+
185, 185, 185, 185, 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187,
|
515
|
+
187, 187, 187, 187, 187, 189, 189, 189, 189, 189, 189, 189, 189, 190, 190,
|
516
|
+
190, 190, 190, 190, 190, 190, 196, 196, 196, 196, 196, 196, 196, 196, 198,
|
517
|
+
198, 198, 198, 198, 198, 198, 198, 228, 228, 228, 228, 228, 228, 228, 228,
|
518
|
+
232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233,
|
519
|
+
233, 1, 1, 1, 1, 135, 135, 135, 135, 137, 137, 137, 137, 138, 138,
|
520
|
+
138, 138, 139, 139, 139, 139, 140, 140, 140, 140, 141, 141, 141, 141, 143,
|
521
|
+
143, 143, 143, 147, 147, 147, 147, 149, 149, 149, 149, 150, 150, 150, 150,
|
522
|
+
151, 151, 151, 151, 152, 152, 152, 152, 155, 155, 155, 155, 157, 157, 157,
|
523
|
+
157, 158, 158, 158, 158, 165, 165, 165, 165, 166, 166, 166, 166, 168, 168,
|
524
|
+
168, 168, 174, 174, 174, 174, 175, 175, 175, 175, 180, 180, 180, 180, 182,
|
525
|
+
182, 182, 182, 183, 183, 183, 183, 188, 188, 188, 188, 191, 191, 191, 191,
|
526
|
+
197, 197, 197, 197, 231, 231, 231, 231, 239, 239, 239, 239, 9, 9, 142,
|
527
|
+
142, 144, 144, 145, 145, 148, 148, 159, 159, 171, 171, 206, 206, 215, 215,
|
528
|
+
225, 225, 236, 236, 237, 237, 199, 207, 234, 235, 192, 192, 192, 192, 192,
|
529
|
+
192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 200, 200, 200, 200,
|
530
|
+
200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201, 202, 202, 202,
|
531
|
+
202, 202, 202, 202, 202, 205, 205, 205, 205, 205, 205, 205, 205, 210, 210,
|
532
|
+
210, 210, 210, 210, 210, 210, 213, 213, 213, 213, 213, 213, 213, 213, 218,
|
533
|
+
218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219,
|
534
|
+
238, 238, 238, 238, 238, 238, 238, 238, 240, 240, 240, 240, 240, 240, 240,
|
535
|
+
240, 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243,
|
536
|
+
243, 243, 255, 255, 255, 255, 255, 255, 255, 255, 203, 203, 203, 203, 204,
|
537
|
+
204, 204, 204, 211, 211, 211, 211, 212, 212, 212, 212, 214, 214, 214, 214,
|
538
|
+
221, 221, 221, 221, 222, 222, 222, 222, 223, 223, 223, 223, 241, 241, 241,
|
539
|
+
241, 244, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 246, 247, 247,
|
540
|
+
247, 247, 248, 248, 248, 248, 250, 250, 250, 250, 251, 251, 251, 251, 252,
|
541
|
+
252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 2, 2, 3, 3,
|
542
|
+
4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 11, 11, 12, 12, 14,
|
543
|
+
14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21,
|
544
|
+
23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
|
545
|
+
30, 31, 31, 127, 127, 220, 220, 249, 249, -1, -1, 10, 10, 10, 10,
|
546
|
+
10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 22, 22, 22,
|
547
|
+
22, 22, 22, 22, 22, 256, 256, 256, 256, 256, 256, 256, 256, 45, 45,
|
548
|
+
45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 47,
|
549
|
+
47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51,
|
550
|
+
52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53,
|
551
|
+
53, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55,
|
552
|
+
55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57,
|
553
|
+
57, 57, 57, 50, 50, 50, 50, 50, 50, 50, 50, 97, 97, 97, 97,
|
554
|
+
97, 97, 97, 97, 99, 99, 99, 99, 99, 99, 99, 99, 101, 101, 101,
|
555
|
+
101, 101, 101, 101, 101, 105, 105, 105, 105, 105, 105, 105, 105, 111, 111,
|
556
|
+
111, 111, 111, 111, 111, 111, 115, 115, 115, 115, 115, 115, 115, 115, 116,
|
557
|
+
116, 116, 116, 116, 116, 116, 116, 32, 32, 32, 32, 37, 37, 37, 37,
|
558
|
+
45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 51, 51, 51,
|
559
|
+
51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55,
|
560
|
+
55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 61, 61, 61, 61, 65,
|
561
|
+
65, 65, 65, 95, 95, 95, 95, 98, 98, 98, 98, 100, 100, 100, 100,
|
562
|
+
102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 108, 108, 108,
|
563
|
+
108, 109, 109, 109, 109, 110, 110, 110, 110, 112, 112, 112, 112, 114, 114,
|
564
|
+
114, 114, 117, 117, 117, 117, 58, 58, 66, 66, 67, 67, 68, 68, 69,
|
565
|
+
69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76,
|
566
|
+
77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84,
|
567
|
+
84, 85, 85, 86, 86, 87, 87, 89, 89, 106, 106, 107, 107, 113, 113,
|
568
|
+
118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 38, 42, 44, 59, 88,
|
569
|
+
90, -1, -1, 33, 33, 33, 33, 34, 34, 34, 34, 40, 40, 40, 40,
|
570
|
+
41, 41, 41, 41, 63, 63, 63, 63, 39, 39, 43, 43, 124, 124, 35,
|
571
|
+
62, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36,
|
572
|
+
36, 36, 36, 36, 36, 36, 64, 64, 64, 64, 64, 64, 64, 64, 91,
|
573
|
+
91, 91, 91, 91, 91, 91, 91, 93, 93, 93, 93, 93, 93, 93, 93,
|
574
|
+
126, 126, 126, 126, 126, 126, 126, 126, 94, 94, 94, 94, 125, 125, 125,
|
575
|
+
125, 60, 60, 96, 96, 123, 123, -1, -1, 92, 92, 195, 195, 208, 208,
|
576
|
+
128, 130, 131, 162, 184, 194, 224, 226, -1, -1, 153, 153, 153, 153, 153,
|
577
|
+
153, 153, 153, 161, 161, 161, 161, 161, 161, 161, 161, 167, 167, 167, 167,
|
578
|
+
167, 167, 167, 167, 172, 172, 172, 172, 172, 172, 172, 172, 176, 176, 176,
|
579
|
+
176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, 179, 179,
|
580
|
+
179, 179, 179, 179, 179, 179, 209, 209, 209, 209, 209, 209, 209, 209, 216,
|
581
|
+
216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217,
|
582
|
+
227, 227, 227, 227, 227, 227, 227, 227, 229, 229, 229, 229, 229, 229, 229,
|
583
|
+
229, 230, 230, 230, 230, 230, 230, 230, 230, 129, 129, 129, 129, 132, 132,
|
584
|
+
132, 132, 133, 133, 133, 133, 134, 134, 134, 134, 136, 136, 136, 136, 146,
|
585
|
+
146, 146, 146, 154, 154, 154, 154, 156, 156, 156, 156, 160, 160, 160, 160,
|
586
|
+
163, 163, 163, 163, 164, 164, 164, 164, 169, 169, 169, 169, 170, 170, 170,
|
587
|
+
170, 173, 173, 173, 173, 178, 178, 178, 178, 181, 181, 181, 181, 185, 185,
|
588
|
+
185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 189, 189, 189, 189, 190,
|
589
|
+
190, 190, 190, 196, 196, 196, 196, 198, 198, 198, 198, 228, 228, 228, 228,
|
590
|
+
232, 232, 232, 232, 233, 233, 233, 233, 1, 1, 135, 135, 137, 137, 138,
|
591
|
+
138, 139, 139, 140, 140, 141, 141, 143, 143, 147, 147, 149, 149, 150, 150,
|
592
|
+
151, 151, 152, 152, 155, 155, 157, 157, 158, 158, 165, 165, 166, 166, 168,
|
593
|
+
168, 174, 174, 175, 175, 180, 180, 182, 182, 183, 183, 188, 188, 191, 191,
|
594
|
+
197, 197, 231, 231, 239, 239, 9, 142, 144, 145, 148, 159, 171, 206, 215,
|
595
|
+
225, 236, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 199, 199,
|
596
|
+
199, 199, 199, 199, 199, 199, 207, 207, 207, 207, 207, 207, 207, 207, 234,
|
597
|
+
234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235,
|
598
|
+
192, 192, 192, 192, 193, 193, 193, 193, 200, 200, 200, 200, 201, 201, 201,
|
599
|
+
201, 202, 202, 202, 202, 205, 205, 205, 205, 210, 210, 210, 210, 213, 213,
|
600
|
+
213, 213, 218, 218, 218, 218, 219, 219, 219, 219, 238, 238, 238, 238, 240,
|
601
|
+
240, 240, 240, 242, 242, 242, 242, 243, 243, 243, 243, 255, 255, 255, 255,
|
602
|
+
203, 203, 204, 204, 211, 211, 212, 212, 214, 214, 221, 221, 222, 222, 223,
|
603
|
+
223, 241, 241, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 250, 250,
|
604
|
+
251, 251, 252, 252, 253, 253, 254, 254, 2, 3, 4, 5, 6, 7, 8,
|
605
|
+
11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27,
|
606
|
+
28, 29, 30, 31, 127, 220, 249, -1, 10, 10, 10, 10, 13, 13, 13,
|
607
|
+
13, 22, 22, 22, 22, 256, 256, 256, 256,
|
608
|
+
};
|
609
|
+
|
610
|
+
static const gpr_uint8 inverse_base64[256] = {
|
611
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
612
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
613
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255,
|
614
|
+
255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
|
615
|
+
255, 64, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
616
|
+
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
617
|
+
25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33,
|
618
|
+
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
|
619
|
+
49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
620
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
621
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
622
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
623
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
624
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
625
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
626
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
627
|
+
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
628
|
+
255,
|
629
|
+
};
|
630
|
+
|
631
|
+
/* emission helpers */
|
632
|
+
static int on_hdr(grpc_chttp2_hpack_parser *p, grpc_mdelem *md,
|
633
|
+
int add_to_table) {
|
634
|
+
if (add_to_table) {
|
635
|
+
if (!grpc_chttp2_hptbl_add(&p->table, md)) {
|
636
|
+
return 0;
|
637
|
+
}
|
638
|
+
}
|
639
|
+
p->on_header(p->on_header_user_data, md);
|
640
|
+
return 1;
|
641
|
+
}
|
642
|
+
|
643
|
+
static grpc_mdstr *take_string(grpc_chttp2_hpack_parser *p,
|
644
|
+
grpc_chttp2_hpack_parser_string *str) {
|
645
|
+
grpc_mdstr *s = grpc_mdstr_from_buffer((gpr_uint8 *)str->str, str->length);
|
646
|
+
str->length = 0;
|
647
|
+
return s;
|
648
|
+
}
|
649
|
+
|
650
|
+
/* jump to the next state */
|
651
|
+
static int parse_next(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
652
|
+
const gpr_uint8 *end) {
|
653
|
+
p->state = *p->next_state++;
|
654
|
+
return p->state(p, cur, end);
|
655
|
+
}
|
656
|
+
|
657
|
+
/* begin parsing a header: all functionality is encoded into lookup tables
|
658
|
+
above */
|
659
|
+
static int parse_begin(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
660
|
+
const gpr_uint8 *end) {
|
661
|
+
if (cur == end) {
|
662
|
+
p->state = parse_begin;
|
663
|
+
return 1;
|
664
|
+
}
|
665
|
+
|
666
|
+
return first_byte_action[first_byte_lut[*cur]](p, cur, end);
|
667
|
+
}
|
668
|
+
|
669
|
+
/* stream dependency and prioritization data: we just skip it */
|
670
|
+
static int parse_stream_weight(grpc_chttp2_hpack_parser *p,
|
671
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
672
|
+
if (cur == end) {
|
673
|
+
p->state = parse_stream_weight;
|
674
|
+
return 1;
|
675
|
+
}
|
676
|
+
|
677
|
+
return p->after_prioritization(p, cur + 1, end);
|
678
|
+
}
|
679
|
+
|
680
|
+
static int parse_stream_dep3(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
681
|
+
const gpr_uint8 *end) {
|
682
|
+
if (cur == end) {
|
683
|
+
p->state = parse_stream_dep3;
|
684
|
+
return 1;
|
685
|
+
}
|
686
|
+
|
687
|
+
return parse_stream_weight(p, cur + 1, end);
|
688
|
+
}
|
689
|
+
|
690
|
+
static int parse_stream_dep2(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
691
|
+
const gpr_uint8 *end) {
|
692
|
+
if (cur == end) {
|
693
|
+
p->state = parse_stream_dep2;
|
694
|
+
return 1;
|
695
|
+
}
|
696
|
+
|
697
|
+
return parse_stream_dep3(p, cur + 1, end);
|
698
|
+
}
|
699
|
+
|
700
|
+
static int parse_stream_dep1(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
701
|
+
const gpr_uint8 *end) {
|
702
|
+
if (cur == end) {
|
703
|
+
p->state = parse_stream_dep1;
|
704
|
+
return 1;
|
705
|
+
}
|
706
|
+
|
707
|
+
return parse_stream_dep2(p, cur + 1, end);
|
708
|
+
}
|
709
|
+
|
710
|
+
static int parse_stream_dep0(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
711
|
+
const gpr_uint8 *end) {
|
712
|
+
if (cur == end) {
|
713
|
+
p->state = parse_stream_dep0;
|
714
|
+
return 1;
|
715
|
+
}
|
716
|
+
|
717
|
+
return parse_stream_dep1(p, cur + 1, end);
|
718
|
+
}
|
719
|
+
|
720
|
+
/* emit an indexed field; for now just logs it to console; jumps to
|
721
|
+
begin the next field on completion */
|
722
|
+
static int finish_indexed_field(grpc_chttp2_hpack_parser *p,
|
723
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
724
|
+
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
725
|
+
if (md == NULL) {
|
726
|
+
gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index);
|
727
|
+
return 0;
|
728
|
+
}
|
729
|
+
GRPC_MDELEM_REF(md);
|
730
|
+
return on_hdr(p, md, 0) && parse_begin(p, cur, end);
|
731
|
+
}
|
732
|
+
|
733
|
+
/* parse an indexed field with index < 127 */
|
734
|
+
static int parse_indexed_field(grpc_chttp2_hpack_parser *p,
|
735
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
736
|
+
p->dynamic_table_update_allowed = 0;
|
737
|
+
p->index = (*cur) & 0x7f;
|
738
|
+
return finish_indexed_field(p, cur + 1, end);
|
739
|
+
}
|
740
|
+
|
741
|
+
/* parse an indexed field with index >= 127 */
|
742
|
+
static int parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
|
743
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
744
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
745
|
+
finish_indexed_field};
|
746
|
+
p->dynamic_table_update_allowed = 0;
|
747
|
+
p->next_state = and_then;
|
748
|
+
p->index = 0x7f;
|
749
|
+
p->parsing.value = &p->index;
|
750
|
+
return parse_value0(p, cur + 1, end);
|
751
|
+
}
|
752
|
+
|
753
|
+
/* finish a literal header with incremental indexing: just log, and jump to '
|
754
|
+
begin */
|
755
|
+
static int finish_lithdr_incidx(grpc_chttp2_hpack_parser *p,
|
756
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
757
|
+
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
758
|
+
GPR_ASSERT(md != NULL); /* handled in string parsing */
|
759
|
+
return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
|
760
|
+
take_string(p, &p->value)),
|
761
|
+
1) &&
|
762
|
+
parse_begin(p, cur, end);
|
763
|
+
}
|
764
|
+
|
765
|
+
/* finish a literal header with incremental indexing with no index */
|
766
|
+
static int finish_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
|
767
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
768
|
+
return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
|
769
|
+
take_string(p, &p->value)),
|
770
|
+
1) &&
|
771
|
+
parse_begin(p, cur, end);
|
772
|
+
}
|
773
|
+
|
774
|
+
/* parse a literal header with incremental indexing; index < 63 */
|
775
|
+
static int parse_lithdr_incidx(grpc_chttp2_hpack_parser *p,
|
776
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
777
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
778
|
+
parse_value_string_with_indexed_key, finish_lithdr_incidx};
|
779
|
+
p->dynamic_table_update_allowed = 0;
|
780
|
+
p->next_state = and_then;
|
781
|
+
p->index = (*cur) & 0x3f;
|
782
|
+
return parse_string_prefix(p, cur + 1, end);
|
783
|
+
}
|
784
|
+
|
785
|
+
/* parse a literal header with incremental indexing; index >= 63 */
|
786
|
+
static int parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
|
787
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
788
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
789
|
+
parse_string_prefix, parse_value_string_with_indexed_key,
|
790
|
+
finish_lithdr_incidx};
|
791
|
+
p->dynamic_table_update_allowed = 0;
|
792
|
+
p->next_state = and_then;
|
793
|
+
p->index = 0x3f;
|
794
|
+
p->parsing.value = &p->index;
|
795
|
+
return parse_value0(p, cur + 1, end);
|
796
|
+
}
|
797
|
+
|
798
|
+
/* parse a literal header with incremental indexing; index = 0 */
|
799
|
+
static int parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
|
800
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
801
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
802
|
+
parse_key_string, parse_string_prefix,
|
803
|
+
parse_value_string_with_literal_key, finish_lithdr_incidx_v};
|
804
|
+
p->dynamic_table_update_allowed = 0;
|
805
|
+
p->next_state = and_then;
|
806
|
+
return parse_string_prefix(p, cur + 1, end);
|
807
|
+
}
|
808
|
+
|
809
|
+
/* finish a literal header without incremental indexing */
|
810
|
+
static int finish_lithdr_notidx(grpc_chttp2_hpack_parser *p,
|
811
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
812
|
+
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
813
|
+
GPR_ASSERT(md != NULL); /* handled in string parsing */
|
814
|
+
return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
|
815
|
+
take_string(p, &p->value)),
|
816
|
+
0) &&
|
817
|
+
parse_begin(p, cur, end);
|
818
|
+
}
|
819
|
+
|
820
|
+
/* finish a literal header without incremental indexing with index = 0 */
|
821
|
+
static int finish_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
|
822
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
823
|
+
return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
|
824
|
+
take_string(p, &p->value)),
|
825
|
+
0) &&
|
826
|
+
parse_begin(p, cur, end);
|
827
|
+
}
|
828
|
+
|
829
|
+
/* parse a literal header without incremental indexing; index < 15 */
|
830
|
+
static int parse_lithdr_notidx(grpc_chttp2_hpack_parser *p,
|
831
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
832
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
833
|
+
parse_value_string_with_indexed_key, finish_lithdr_notidx};
|
834
|
+
p->dynamic_table_update_allowed = 0;
|
835
|
+
p->next_state = and_then;
|
836
|
+
p->index = (*cur) & 0xf;
|
837
|
+
return parse_string_prefix(p, cur + 1, end);
|
838
|
+
}
|
839
|
+
|
840
|
+
/* parse a literal header without incremental indexing; index >= 15 */
|
841
|
+
static int parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
|
842
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
843
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
844
|
+
parse_string_prefix, parse_value_string_with_indexed_key,
|
845
|
+
finish_lithdr_notidx};
|
846
|
+
p->dynamic_table_update_allowed = 0;
|
847
|
+
p->next_state = and_then;
|
848
|
+
p->index = 0xf;
|
849
|
+
p->parsing.value = &p->index;
|
850
|
+
return parse_value0(p, cur + 1, end);
|
851
|
+
}
|
852
|
+
|
853
|
+
/* parse a literal header without incremental indexing; index == 0 */
|
854
|
+
static int parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
|
855
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
856
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
857
|
+
parse_key_string, parse_string_prefix,
|
858
|
+
parse_value_string_with_literal_key, finish_lithdr_notidx_v};
|
859
|
+
p->dynamic_table_update_allowed = 0;
|
860
|
+
p->next_state = and_then;
|
861
|
+
return parse_string_prefix(p, cur + 1, end);
|
862
|
+
}
|
863
|
+
|
864
|
+
/* finish a literal header that is never indexed */
|
865
|
+
static int finish_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
|
866
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
867
|
+
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
868
|
+
GPR_ASSERT(md != NULL); /* handled in string parsing */
|
869
|
+
return on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
|
870
|
+
take_string(p, &p->value)),
|
871
|
+
0) &&
|
872
|
+
parse_begin(p, cur, end);
|
873
|
+
}
|
874
|
+
|
875
|
+
/* finish a literal header that is never indexed with an extra value */
|
876
|
+
static int finish_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
|
877
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
878
|
+
return on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
|
879
|
+
take_string(p, &p->value)),
|
880
|
+
0) &&
|
881
|
+
parse_begin(p, cur, end);
|
882
|
+
}
|
883
|
+
|
884
|
+
/* parse a literal header that is never indexed; index < 15 */
|
885
|
+
static int parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
|
886
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
887
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
888
|
+
parse_value_string_with_indexed_key, finish_lithdr_nvridx};
|
889
|
+
p->dynamic_table_update_allowed = 0;
|
890
|
+
p->next_state = and_then;
|
891
|
+
p->index = (*cur) & 0xf;
|
892
|
+
return parse_string_prefix(p, cur + 1, end);
|
893
|
+
}
|
894
|
+
|
895
|
+
/* parse a literal header that is never indexed; index >= 15 */
|
896
|
+
static int parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
|
897
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
898
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
899
|
+
parse_string_prefix, parse_value_string_with_indexed_key,
|
900
|
+
finish_lithdr_nvridx};
|
901
|
+
p->dynamic_table_update_allowed = 0;
|
902
|
+
p->next_state = and_then;
|
903
|
+
p->index = 0xf;
|
904
|
+
p->parsing.value = &p->index;
|
905
|
+
return parse_value0(p, cur + 1, end);
|
906
|
+
}
|
907
|
+
|
908
|
+
/* parse a literal header that is never indexed; index == 0 */
|
909
|
+
static int parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
|
910
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
911
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
912
|
+
parse_key_string, parse_string_prefix,
|
913
|
+
parse_value_string_with_literal_key, finish_lithdr_nvridx_v};
|
914
|
+
p->dynamic_table_update_allowed = 0;
|
915
|
+
p->next_state = and_then;
|
916
|
+
return parse_string_prefix(p, cur + 1, end);
|
917
|
+
}
|
918
|
+
|
919
|
+
/* finish parsing a max table size change */
|
920
|
+
static int finish_max_tbl_size(grpc_chttp2_hpack_parser *p,
|
921
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
922
|
+
gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
|
923
|
+
return grpc_chttp2_hptbl_set_current_table_size(&p->table, p->index) &&
|
924
|
+
parse_begin(p, cur, end);
|
925
|
+
}
|
926
|
+
|
927
|
+
/* parse a max table size change, max size < 15 */
|
928
|
+
static int parse_max_tbl_size(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
929
|
+
const gpr_uint8 *end) {
|
930
|
+
if (p->dynamic_table_update_allowed == 0) {
|
931
|
+
return 0;
|
932
|
+
}
|
933
|
+
p->dynamic_table_update_allowed--;
|
934
|
+
p->index = (*cur) & 0x1f;
|
935
|
+
return finish_max_tbl_size(p, cur + 1, end);
|
936
|
+
}
|
937
|
+
|
938
|
+
/* parse a max table size change, max size >= 15 */
|
939
|
+
static int parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
|
940
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
941
|
+
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
942
|
+
finish_max_tbl_size};
|
943
|
+
if (p->dynamic_table_update_allowed == 0) {
|
944
|
+
return 0;
|
945
|
+
}
|
946
|
+
p->dynamic_table_update_allowed--;
|
947
|
+
p->next_state = and_then;
|
948
|
+
p->index = 0x1f;
|
949
|
+
p->parsing.value = &p->index;
|
950
|
+
return parse_value0(p, cur + 1, end);
|
951
|
+
}
|
952
|
+
|
953
|
+
/* a parse error: jam the parse state into parse_error, and return error */
|
954
|
+
static int parse_error(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
955
|
+
const gpr_uint8 *end) {
|
956
|
+
p->state = parse_error;
|
957
|
+
return 0;
|
958
|
+
}
|
959
|
+
|
960
|
+
static int parse_illegal_op(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
961
|
+
const gpr_uint8 *end) {
|
962
|
+
GPR_ASSERT(cur != end);
|
963
|
+
gpr_log(GPR_DEBUG, "Illegal hpack op code %d", *cur);
|
964
|
+
return parse_error(p, cur, end);
|
965
|
+
}
|
966
|
+
|
967
|
+
/* parse the 1st byte of a varint into p->parsing.value
|
968
|
+
no overflow is possible */
|
969
|
+
static int parse_value0(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
970
|
+
const gpr_uint8 *end) {
|
971
|
+
if (cur == end) {
|
972
|
+
p->state = parse_value0;
|
973
|
+
return 1;
|
974
|
+
}
|
975
|
+
|
976
|
+
*p->parsing.value += (*cur) & 0x7f;
|
977
|
+
|
978
|
+
if ((*cur) & 0x80) {
|
979
|
+
return parse_value1(p, cur + 1, end);
|
980
|
+
} else {
|
981
|
+
return parse_next(p, cur + 1, end);
|
982
|
+
}
|
983
|
+
}
|
984
|
+
|
985
|
+
/* parse the 2nd byte of a varint into p->parsing.value
|
986
|
+
no overflow is possible */
|
987
|
+
static int parse_value1(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
988
|
+
const gpr_uint8 *end) {
|
989
|
+
if (cur == end) {
|
990
|
+
p->state = parse_value1;
|
991
|
+
return 1;
|
992
|
+
}
|
993
|
+
|
994
|
+
*p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 7;
|
995
|
+
|
996
|
+
if ((*cur) & 0x80) {
|
997
|
+
return parse_value2(p, cur + 1, end);
|
998
|
+
} else {
|
999
|
+
return parse_next(p, cur + 1, end);
|
1000
|
+
}
|
1001
|
+
}
|
1002
|
+
|
1003
|
+
/* parse the 3rd byte of a varint into p->parsing.value
|
1004
|
+
no overflow is possible */
|
1005
|
+
static int parse_value2(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1006
|
+
const gpr_uint8 *end) {
|
1007
|
+
if (cur == end) {
|
1008
|
+
p->state = parse_value2;
|
1009
|
+
return 1;
|
1010
|
+
}
|
1011
|
+
|
1012
|
+
*p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 14;
|
1013
|
+
|
1014
|
+
if ((*cur) & 0x80) {
|
1015
|
+
return parse_value3(p, cur + 1, end);
|
1016
|
+
} else {
|
1017
|
+
return parse_next(p, cur + 1, end);
|
1018
|
+
}
|
1019
|
+
}
|
1020
|
+
|
1021
|
+
/* parse the 4th byte of a varint into p->parsing.value
|
1022
|
+
no overflow is possible */
|
1023
|
+
static int parse_value3(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1024
|
+
const gpr_uint8 *end) {
|
1025
|
+
if (cur == end) {
|
1026
|
+
p->state = parse_value3;
|
1027
|
+
return 1;
|
1028
|
+
}
|
1029
|
+
|
1030
|
+
*p->parsing.value += (((gpr_uint32)*cur) & 0x7f) << 21;
|
1031
|
+
|
1032
|
+
if ((*cur) & 0x80) {
|
1033
|
+
return parse_value4(p, cur + 1, end);
|
1034
|
+
} else {
|
1035
|
+
return parse_next(p, cur + 1, end);
|
1036
|
+
}
|
1037
|
+
}
|
1038
|
+
|
1039
|
+
/* parse the 5th byte of a varint into p->parsing.value
|
1040
|
+
depending on the byte, we may overflow, and care must be taken */
|
1041
|
+
static int parse_value4(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1042
|
+
const gpr_uint8 *end) {
|
1043
|
+
gpr_uint8 c;
|
1044
|
+
gpr_uint32 cur_value;
|
1045
|
+
gpr_uint32 add_value;
|
1046
|
+
|
1047
|
+
if (cur == end) {
|
1048
|
+
p->state = parse_value4;
|
1049
|
+
return 1;
|
1050
|
+
}
|
1051
|
+
|
1052
|
+
c = (*cur) & 0x7f;
|
1053
|
+
if (c > 0xf) {
|
1054
|
+
goto error;
|
1055
|
+
}
|
1056
|
+
|
1057
|
+
cur_value = *p->parsing.value;
|
1058
|
+
add_value = ((gpr_uint32)c) << 28;
|
1059
|
+
if (add_value > 0xffffffffu - cur_value) {
|
1060
|
+
goto error;
|
1061
|
+
}
|
1062
|
+
|
1063
|
+
*p->parsing.value = cur_value + add_value;
|
1064
|
+
|
1065
|
+
if ((*cur) & 0x80) {
|
1066
|
+
return parse_value5up(p, cur + 1, end);
|
1067
|
+
} else {
|
1068
|
+
return parse_next(p, cur + 1, end);
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
error:
|
1072
|
+
gpr_log(GPR_ERROR,
|
1073
|
+
"integer overflow in hpack integer decoding: have 0x%08x, "
|
1074
|
+
"got byte 0x%02x on byte 5",
|
1075
|
+
*p->parsing.value, *cur);
|
1076
|
+
return parse_error(p, cur, end);
|
1077
|
+
}
|
1078
|
+
|
1079
|
+
/* parse any trailing bytes in a varint: it's possible to append an arbitrary
|
1080
|
+
number of 0x80's and not affect the value - a zero will terminate - and
|
1081
|
+
anything else will overflow */
|
1082
|
+
static int parse_value5up(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1083
|
+
const gpr_uint8 *end) {
|
1084
|
+
while (cur != end && *cur == 0x80) {
|
1085
|
+
++cur;
|
1086
|
+
}
|
1087
|
+
|
1088
|
+
if (cur == end) {
|
1089
|
+
p->state = parse_value5up;
|
1090
|
+
return 1;
|
1091
|
+
}
|
1092
|
+
|
1093
|
+
if (*cur == 0) {
|
1094
|
+
return parse_next(p, cur + 1, end);
|
1095
|
+
}
|
1096
|
+
|
1097
|
+
gpr_log(GPR_ERROR,
|
1098
|
+
"integer overflow in hpack integer decoding: have 0x%08x, "
|
1099
|
+
"got byte 0x%02x sometime after byte 5",
|
1100
|
+
*p->parsing.value, *cur);
|
1101
|
+
return parse_error(p, cur, end);
|
1102
|
+
}
|
1103
|
+
|
1104
|
+
/* parse a string prefix */
|
1105
|
+
static int parse_string_prefix(grpc_chttp2_hpack_parser *p,
|
1106
|
+
const gpr_uint8 *cur, const gpr_uint8 *end) {
|
1107
|
+
if (cur == end) {
|
1108
|
+
p->state = parse_string_prefix;
|
1109
|
+
return 1;
|
1110
|
+
}
|
1111
|
+
|
1112
|
+
p->strlen = (*cur) & 0x7f;
|
1113
|
+
p->huff = (*cur) >> 7;
|
1114
|
+
if (p->strlen == 0x7f) {
|
1115
|
+
p->parsing.value = &p->strlen;
|
1116
|
+
return parse_value0(p, cur + 1, end);
|
1117
|
+
} else {
|
1118
|
+
return parse_next(p, cur + 1, end);
|
1119
|
+
}
|
1120
|
+
}
|
1121
|
+
|
1122
|
+
/* append some bytes to a string */
|
1123
|
+
static void append_bytes(grpc_chttp2_hpack_parser_string *str,
|
1124
|
+
const gpr_uint8 *data, size_t length) {
|
1125
|
+
if (length + str->length > str->capacity) {
|
1126
|
+
GPR_ASSERT(str->length + length <= GPR_UINT32_MAX);
|
1127
|
+
str->capacity = (gpr_uint32)(str->length + length);
|
1128
|
+
str->str = gpr_realloc(str->str, str->capacity);
|
1129
|
+
}
|
1130
|
+
memcpy(str->str + str->length, data, length);
|
1131
|
+
GPR_ASSERT(length <= GPR_UINT32_MAX - str->length);
|
1132
|
+
str->length += (gpr_uint32)length;
|
1133
|
+
}
|
1134
|
+
|
1135
|
+
static int append_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1136
|
+
const gpr_uint8 *end) {
|
1137
|
+
grpc_chttp2_hpack_parser_string *str = p->parsing.str;
|
1138
|
+
gpr_uint32 bits;
|
1139
|
+
gpr_uint8 decoded[3];
|
1140
|
+
switch ((binary_state)p->binary) {
|
1141
|
+
case NOT_BINARY:
|
1142
|
+
append_bytes(str, cur, (size_t)(end - cur));
|
1143
|
+
return 1;
|
1144
|
+
b64_byte0:
|
1145
|
+
case B64_BYTE0:
|
1146
|
+
if (cur == end) {
|
1147
|
+
p->binary = B64_BYTE0;
|
1148
|
+
return 1;
|
1149
|
+
}
|
1150
|
+
bits = inverse_base64[*cur];
|
1151
|
+
++cur;
|
1152
|
+
if (bits == 255)
|
1153
|
+
return 0;
|
1154
|
+
else if (bits == 64)
|
1155
|
+
goto b64_byte0;
|
1156
|
+
p->base64_buffer = bits << 18;
|
1157
|
+
/* fallthrough */
|
1158
|
+
b64_byte1:
|
1159
|
+
case B64_BYTE1:
|
1160
|
+
if (cur == end) {
|
1161
|
+
p->binary = B64_BYTE1;
|
1162
|
+
return 1;
|
1163
|
+
}
|
1164
|
+
bits = inverse_base64[*cur];
|
1165
|
+
++cur;
|
1166
|
+
if (bits == 255)
|
1167
|
+
return 0;
|
1168
|
+
else if (bits == 64)
|
1169
|
+
goto b64_byte1;
|
1170
|
+
p->base64_buffer |= bits << 12;
|
1171
|
+
/* fallthrough */
|
1172
|
+
b64_byte2:
|
1173
|
+
case B64_BYTE2:
|
1174
|
+
if (cur == end) {
|
1175
|
+
p->binary = B64_BYTE2;
|
1176
|
+
return 1;
|
1177
|
+
}
|
1178
|
+
bits = inverse_base64[*cur];
|
1179
|
+
++cur;
|
1180
|
+
if (bits == 255)
|
1181
|
+
return 0;
|
1182
|
+
else if (bits == 64)
|
1183
|
+
goto b64_byte2;
|
1184
|
+
p->base64_buffer |= bits << 6;
|
1185
|
+
/* fallthrough */
|
1186
|
+
b64_byte3:
|
1187
|
+
case B64_BYTE3:
|
1188
|
+
if (cur == end) {
|
1189
|
+
p->binary = B64_BYTE3;
|
1190
|
+
return 1;
|
1191
|
+
}
|
1192
|
+
bits = inverse_base64[*cur];
|
1193
|
+
++cur;
|
1194
|
+
if (bits == 255)
|
1195
|
+
return 0;
|
1196
|
+
else if (bits == 64)
|
1197
|
+
goto b64_byte3;
|
1198
|
+
p->base64_buffer |= bits;
|
1199
|
+
bits = p->base64_buffer;
|
1200
|
+
decoded[0] = (gpr_uint8)(bits >> 16);
|
1201
|
+
decoded[1] = (gpr_uint8)(bits >> 8);
|
1202
|
+
decoded[2] = (gpr_uint8)(bits);
|
1203
|
+
append_bytes(str, decoded, 3);
|
1204
|
+
goto b64_byte0;
|
1205
|
+
}
|
1206
|
+
GPR_UNREACHABLE_CODE(return 1);
|
1207
|
+
}
|
1208
|
+
|
1209
|
+
/* append a null terminator to a string */
|
1210
|
+
static int finish_str(grpc_chttp2_hpack_parser *p) {
|
1211
|
+
gpr_uint8 terminator = 0;
|
1212
|
+
gpr_uint8 decoded[2];
|
1213
|
+
gpr_uint32 bits;
|
1214
|
+
grpc_chttp2_hpack_parser_string *str = p->parsing.str;
|
1215
|
+
switch ((binary_state)p->binary) {
|
1216
|
+
case NOT_BINARY:
|
1217
|
+
break;
|
1218
|
+
case B64_BYTE0:
|
1219
|
+
break;
|
1220
|
+
case B64_BYTE1:
|
1221
|
+
gpr_log(GPR_ERROR, "illegal base64 encoding");
|
1222
|
+
return 0; /* illegal encoding */
|
1223
|
+
case B64_BYTE2:
|
1224
|
+
bits = p->base64_buffer;
|
1225
|
+
if (bits & 0xffff) {
|
1226
|
+
gpr_log(GPR_ERROR, "trailing bits in base64 encoding: 0x%04x",
|
1227
|
+
bits & 0xffff);
|
1228
|
+
return 0;
|
1229
|
+
}
|
1230
|
+
decoded[0] = (gpr_uint8)(bits >> 16);
|
1231
|
+
append_bytes(str, decoded, 1);
|
1232
|
+
break;
|
1233
|
+
case B64_BYTE3:
|
1234
|
+
bits = p->base64_buffer;
|
1235
|
+
if (bits & 0xff) {
|
1236
|
+
gpr_log(GPR_ERROR, "trailing bits in base64 encoding: 0x%02x",
|
1237
|
+
bits & 0xff);
|
1238
|
+
return 0;
|
1239
|
+
}
|
1240
|
+
decoded[0] = (gpr_uint8)(bits >> 16);
|
1241
|
+
decoded[1] = (gpr_uint8)(bits >> 8);
|
1242
|
+
append_bytes(str, decoded, 2);
|
1243
|
+
break;
|
1244
|
+
}
|
1245
|
+
append_bytes(str, &terminator, 1);
|
1246
|
+
p->parsing.str->length--; /* don't actually count the null terminator */
|
1247
|
+
return 1;
|
1248
|
+
}
|
1249
|
+
|
1250
|
+
/* decode a nibble from a huffman encoded stream */
|
1251
|
+
static int huff_nibble(grpc_chttp2_hpack_parser *p, gpr_uint8 nibble) {
|
1252
|
+
gpr_int16 emit = emit_sub_tbl[16 * emit_tbl[p->huff_state] + nibble];
|
1253
|
+
gpr_int16 next = next_sub_tbl[16 * next_tbl[p->huff_state] + nibble];
|
1254
|
+
if (emit != -1) {
|
1255
|
+
if (emit >= 0 && emit < 256) {
|
1256
|
+
gpr_uint8 c = (gpr_uint8)emit;
|
1257
|
+
if (!append_string(p, &c, (&c) + 1)) return 0;
|
1258
|
+
} else {
|
1259
|
+
assert(emit == 256);
|
1260
|
+
}
|
1261
|
+
}
|
1262
|
+
p->huff_state = next;
|
1263
|
+
return 1;
|
1264
|
+
}
|
1265
|
+
|
1266
|
+
/* decode full bytes from a huffman encoded stream */
|
1267
|
+
static int add_huff_bytes(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1268
|
+
const gpr_uint8 *end) {
|
1269
|
+
for (; cur != end; ++cur) {
|
1270
|
+
if (!huff_nibble(p, *cur >> 4) || !huff_nibble(p, *cur & 0xf)) return 0;
|
1271
|
+
}
|
1272
|
+
return 1;
|
1273
|
+
}
|
1274
|
+
|
1275
|
+
/* decode some string bytes based on the current decoding mode
|
1276
|
+
(huffman or not) */
|
1277
|
+
static int add_str_bytes(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1278
|
+
const gpr_uint8 *end) {
|
1279
|
+
if (p->huff) {
|
1280
|
+
return add_huff_bytes(p, cur, end);
|
1281
|
+
} else {
|
1282
|
+
return append_string(p, cur, end);
|
1283
|
+
}
|
1284
|
+
}
|
1285
|
+
|
1286
|
+
/* parse a string - tries to do large chunks at a time */
|
1287
|
+
static int parse_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1288
|
+
const gpr_uint8 *end) {
|
1289
|
+
size_t remaining = p->strlen - p->strgot;
|
1290
|
+
size_t given = (size_t)(end - cur);
|
1291
|
+
if (remaining <= given) {
|
1292
|
+
return add_str_bytes(p, cur, cur + remaining) && finish_str(p) &&
|
1293
|
+
parse_next(p, cur + remaining, end);
|
1294
|
+
} else {
|
1295
|
+
if (!add_str_bytes(p, cur, cur + given)) return 0;
|
1296
|
+
GPR_ASSERT(given <= GPR_UINT32_MAX - p->strgot);
|
1297
|
+
p->strgot += (gpr_uint32)given;
|
1298
|
+
p->state = parse_string;
|
1299
|
+
return 1;
|
1300
|
+
}
|
1301
|
+
}
|
1302
|
+
|
1303
|
+
/* begin parsing a string - performs setup, calls parse_string */
|
1304
|
+
static int begin_parse_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1305
|
+
const gpr_uint8 *end, gpr_uint8 binary,
|
1306
|
+
grpc_chttp2_hpack_parser_string *str) {
|
1307
|
+
p->strgot = 0;
|
1308
|
+
str->length = 0;
|
1309
|
+
p->parsing.str = str;
|
1310
|
+
p->huff_state = 0;
|
1311
|
+
p->binary = binary;
|
1312
|
+
return parse_string(p, cur, end);
|
1313
|
+
}
|
1314
|
+
|
1315
|
+
/* parse the key string */
|
1316
|
+
static int parse_key_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1317
|
+
const gpr_uint8 *end) {
|
1318
|
+
return begin_parse_string(p, cur, end, NOT_BINARY, &p->key);
|
1319
|
+
}
|
1320
|
+
|
1321
|
+
/* check if a key represents a binary header or not */
|
1322
|
+
typedef enum { BINARY_HEADER, PLAINTEXT_HEADER, ERROR_HEADER } is_binary_header;
|
1323
|
+
|
1324
|
+
static is_binary_header is_binary_literal_header(grpc_chttp2_hpack_parser *p) {
|
1325
|
+
return grpc_is_binary_header(p->key.str, p->key.length) ? BINARY_HEADER
|
1326
|
+
: PLAINTEXT_HEADER;
|
1327
|
+
}
|
1328
|
+
|
1329
|
+
static is_binary_header is_binary_indexed_header(grpc_chttp2_hpack_parser *p) {
|
1330
|
+
grpc_mdelem *elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
1331
|
+
if (!elem) {
|
1332
|
+
gpr_log(GPR_ERROR, "Invalid HPACK index received: %d", p->index);
|
1333
|
+
return ERROR_HEADER;
|
1334
|
+
}
|
1335
|
+
return grpc_is_binary_header(
|
1336
|
+
(const char *)GPR_SLICE_START_PTR(elem->key->slice),
|
1337
|
+
GPR_SLICE_LENGTH(elem->key->slice))
|
1338
|
+
? BINARY_HEADER
|
1339
|
+
: PLAINTEXT_HEADER;
|
1340
|
+
}
|
1341
|
+
|
1342
|
+
/* parse the value string */
|
1343
|
+
static int parse_value_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
|
1344
|
+
const gpr_uint8 *end, is_binary_header type) {
|
1345
|
+
switch (type) {
|
1346
|
+
case BINARY_HEADER:
|
1347
|
+
return begin_parse_string(p, cur, end, B64_BYTE0, &p->value);
|
1348
|
+
case PLAINTEXT_HEADER:
|
1349
|
+
return begin_parse_string(p, cur, end, NOT_BINARY, &p->value);
|
1350
|
+
case ERROR_HEADER:
|
1351
|
+
return 0;
|
1352
|
+
}
|
1353
|
+
/* Add code to prevent return without value error */
|
1354
|
+
GPR_UNREACHABLE_CODE(return 0);
|
1355
|
+
}
|
1356
|
+
|
1357
|
+
static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p,
|
1358
|
+
const gpr_uint8 *cur,
|
1359
|
+
const gpr_uint8 *end) {
|
1360
|
+
return parse_value_string(p, cur, end, is_binary_indexed_header(p));
|
1361
|
+
}
|
1362
|
+
|
1363
|
+
static int parse_value_string_with_literal_key(grpc_chttp2_hpack_parser *p,
|
1364
|
+
const gpr_uint8 *cur,
|
1365
|
+
const gpr_uint8 *end) {
|
1366
|
+
return parse_value_string(p, cur, end, is_binary_literal_header(p));
|
1367
|
+
}
|
1368
|
+
|
1369
|
+
/* PUBLIC INTERFACE */
|
1370
|
+
|
1371
|
+
static void on_header_not_set(void *user_data, grpc_mdelem *md) {
|
1372
|
+
GPR_UNREACHABLE_CODE(return );
|
1373
|
+
}
|
1374
|
+
|
1375
|
+
void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p) {
|
1376
|
+
p->on_header = on_header_not_set;
|
1377
|
+
p->on_header_user_data = NULL;
|
1378
|
+
p->state = parse_begin;
|
1379
|
+
p->key.str = NULL;
|
1380
|
+
p->key.capacity = 0;
|
1381
|
+
p->key.length = 0;
|
1382
|
+
p->value.str = NULL;
|
1383
|
+
p->value.capacity = 0;
|
1384
|
+
p->value.length = 0;
|
1385
|
+
p->dynamic_table_update_allowed = 2;
|
1386
|
+
grpc_chttp2_hptbl_init(&p->table);
|
1387
|
+
}
|
1388
|
+
|
1389
|
+
void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) {
|
1390
|
+
p->after_prioritization = p->state;
|
1391
|
+
p->state = parse_stream_dep0;
|
1392
|
+
}
|
1393
|
+
|
1394
|
+
void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser *p) {
|
1395
|
+
grpc_chttp2_hptbl_destroy(&p->table);
|
1396
|
+
gpr_free(p->key.str);
|
1397
|
+
gpr_free(p->value.str);
|
1398
|
+
}
|
1399
|
+
|
1400
|
+
int grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p,
|
1401
|
+
const gpr_uint8 *beg, const gpr_uint8 *end) {
|
1402
|
+
/* TODO(ctiller): limit the distance of end from beg, and perform multiple
|
1403
|
+
steps in the event of a large chunk of data to limit
|
1404
|
+
stack space usage when no tail call optimization is
|
1405
|
+
available */
|
1406
|
+
return p->state(p, beg, end);
|
1407
|
+
}
|
1408
|
+
|
1409
|
+
grpc_chttp2_parse_error grpc_chttp2_header_parser_parse(
|
1410
|
+
grpc_exec_ctx *exec_ctx, void *hpack_parser,
|
1411
|
+
grpc_chttp2_transport_parsing *transport_parsing,
|
1412
|
+
grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last) {
|
1413
|
+
grpc_chttp2_hpack_parser *parser = hpack_parser;
|
1414
|
+
GPR_TIMER_BEGIN("grpc_chttp2_hpack_parser_parse", 0);
|
1415
|
+
if (!grpc_chttp2_hpack_parser_parse(parser, GPR_SLICE_START_PTR(slice),
|
1416
|
+
GPR_SLICE_END_PTR(slice))) {
|
1417
|
+
GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
|
1418
|
+
return GRPC_CHTTP2_CONNECTION_ERROR;
|
1419
|
+
}
|
1420
|
+
if (is_last) {
|
1421
|
+
if (parser->is_boundary && parser->state != parse_begin) {
|
1422
|
+
gpr_log(GPR_ERROR,
|
1423
|
+
"end of header frame not aligned with a hpack record boundary");
|
1424
|
+
GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
|
1425
|
+
return GRPC_CHTTP2_CONNECTION_ERROR;
|
1426
|
+
}
|
1427
|
+
/* need to check for null stream: this can occur if we receive an invalid
|
1428
|
+
stream id on a header */
|
1429
|
+
if (stream_parsing != NULL) {
|
1430
|
+
if (parser->is_boundary) {
|
1431
|
+
stream_parsing
|
1432
|
+
->got_metadata_on_parse[stream_parsing->header_frames_received] = 1;
|
1433
|
+
stream_parsing->header_frames_received++;
|
1434
|
+
grpc_chttp2_list_add_parsing_seen_stream(transport_parsing,
|
1435
|
+
stream_parsing);
|
1436
|
+
}
|
1437
|
+
if (parser->is_eof) {
|
1438
|
+
stream_parsing->received_close = 1;
|
1439
|
+
}
|
1440
|
+
}
|
1441
|
+
parser->on_header = on_header_not_set;
|
1442
|
+
parser->on_header_user_data = NULL;
|
1443
|
+
parser->is_boundary = 0xde;
|
1444
|
+
parser->is_eof = 0xde;
|
1445
|
+
parser->dynamic_table_update_allowed = 2;
|
1446
|
+
}
|
1447
|
+
GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
|
1448
|
+
return GRPC_CHTTP2_PARSE_OK;
|
1449
|
+
}
|