aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mark D. Roth <roth@google.com>2017-01-10 14:10:12 -0800
committerGravatar GitHub <noreply@github.com>2017-01-10 14:10:12 -0800
commita0433d4ea6fca0d003243ffdf659d3161e76b40e (patch)
treec0b7118a7538a923456580b7b9347f2774a834d5
parent2f390676be5a096ac46121cb8be9dd83c6af546d (diff)
parentbf07d75311b5b5a988913572853ec6dc75cd07c0 (diff)
Merge pull request #9284 from markdroth/http_connect_headers
Add support for sending custom headers in HTTP CONNECT request.
-rw-r--r--src/core/ext/client_channel/http_connect_handshaker.c26
-rw-r--r--src/core/ext/client_channel/http_connect_handshaker.h5
-rw-r--r--tools/doxygen/Doxyfile.c++38
-rw-r--r--tools/doxygen/Doxyfile.c++.internal36
-rw-r--r--tools/doxygen/Doxyfile.core34
-rw-r--r--tools/doxygen/Doxyfile.core.internal44
6 files changed, 103 insertions, 80 deletions
diff --git a/src/core/ext/client_channel/http_connect_handshaker.c b/src/core/ext/client_channel/http_connect_handshaker.c
index ace804c47f..fba32561ac 100644
--- a/src/core/ext/client_channel/http_connect_handshaker.c
+++ b/src/core/ext/client_channel/http_connect_handshaker.c
@@ -55,6 +55,8 @@ typedef struct http_connect_handshaker {
grpc_handshaker base;
char* proxy_server;
+ grpc_http_header* headers;
+ size_t num_headers;
gpr_refcount refcount;
gpr_mu mu;
@@ -90,6 +92,11 @@ static void http_connect_handshaker_unref(grpc_exec_ctx* exec_ctx,
gpr_free(handshaker->read_buffer_to_destroy);
}
gpr_free(handshaker->proxy_server);
+ for (size_t i = 0; i < handshaker->num_headers; ++i) {
+ gpr_free(handshaker->headers[i].key);
+ gpr_free(handshaker->headers[i].value);
+ }
+ gpr_free(handshaker->headers);
grpc_slice_buffer_destroy_internal(exec_ctx, &handshaker->write_buffer);
grpc_http_parser_destroy(&handshaker->http_parser);
grpc_http_response_destroy(&handshaker->http_response);
@@ -290,6 +297,8 @@ static void http_connect_handshaker_do_handshake(
request.host = server_name;
request.http.method = "CONNECT";
request.http.path = server_name;
+ request.http.hdrs = handshaker->headers;
+ request.http.hdr_count = handshaker->num_headers;
request.handshaker = &grpc_httpcli_plaintext;
grpc_slice request_slice = grpc_httpcli_format_connect_request(&request);
grpc_slice_buffer_add(&handshaker->write_buffer, request_slice);
@@ -307,7 +316,9 @@ static const grpc_handshaker_vtable http_connect_handshaker_vtable = {
http_connect_handshaker_destroy, http_connect_handshaker_shutdown,
http_connect_handshaker_do_handshake};
-grpc_handshaker* grpc_http_connect_handshaker_create(const char* proxy_server) {
+grpc_handshaker* grpc_http_connect_handshaker_create(const char* proxy_server,
+ grpc_http_header* headers,
+ size_t num_headers) {
GPR_ASSERT(proxy_server != NULL);
http_connect_handshaker* handshaker = gpr_malloc(sizeof(*handshaker));
memset(handshaker, 0, sizeof(*handshaker));
@@ -315,6 +326,14 @@ grpc_handshaker* grpc_http_connect_handshaker_create(const char* proxy_server) {
gpr_mu_init(&handshaker->mu);
gpr_ref_init(&handshaker->refcount, 1);
handshaker->proxy_server = gpr_strdup(proxy_server);
+ if (num_headers > 0) {
+ handshaker->headers = gpr_malloc(sizeof(grpc_http_header) * num_headers);
+ for (size_t i = 0; i < num_headers; ++i) {
+ handshaker->headers[i].key = gpr_strdup(headers[i].key);
+ handshaker->headers[i].value = gpr_strdup(headers[i].value);
+ }
+ handshaker->num_headers = num_headers;
+ }
grpc_slice_buffer_init(&handshaker->write_buffer);
grpc_closure_init(&handshaker->request_done_closure, on_write_done,
handshaker, grpc_schedule_on_exec_ctx);
@@ -358,8 +377,9 @@ static void handshaker_factory_add_handshakers(
const grpc_channel_args* args, grpc_handshake_manager* handshake_mgr) {
char* proxy_name = grpc_get_http_proxy_server();
if (proxy_name != NULL) {
- grpc_handshake_manager_add(handshake_mgr,
- grpc_http_connect_handshaker_create(proxy_name));
+ grpc_handshake_manager_add(
+ handshake_mgr,
+ grpc_http_connect_handshaker_create(proxy_name, NULL, 0));
gpr_free(proxy_name);
}
}
diff --git a/src/core/ext/client_channel/http_connect_handshaker.h b/src/core/ext/client_channel/http_connect_handshaker.h
index 56485f1373..c2e68de716 100644
--- a/src/core/ext/client_channel/http_connect_handshaker.h
+++ b/src/core/ext/client_channel/http_connect_handshaker.h
@@ -35,9 +35,12 @@
#define GRPC_CORE_EXT_CLIENT_CHANNEL_HTTP_CONNECT_HANDSHAKER_H
#include "src/core/lib/channel/handshaker.h"
+#include "src/core/lib/http/parser.h"
/// Creates a new HTTP CONNECT handshaker.
-grpc_handshaker* grpc_http_connect_handshaker_create(const char* proxy_server);
+grpc_handshaker* grpc_http_connect_handshaker_create(const char* proxy_server,
+ grpc_http_header* headers,
+ size_t num_headers);
/// Returns the name of the proxy to use, or NULL if no proxy is configured.
/// Caller takes ownership of result.
diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++
index 6539f96565..eef7ff4d5d 100644
--- a/tools/doxygen/Doxyfile.c++
+++ b/tools/doxygen/Doxyfile.c++
@@ -848,34 +848,34 @@ include/grpc/impl/codegen/sync.h \
include/grpc/impl/codegen/sync_generic.h \
include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \
+doc/fail_fast.md \
+doc/g_stands_for.md \
+doc/wait-for-ready.md \
doc/binary-logging.md \
-doc/c-style-guide.md \
-doc/command_line_tool.md \
doc/compression.md \
+doc/c-style-guide.md \
+doc/PROTOCOL-WEB.md \
+doc/cpp-style-guide.md \
+doc/server_reflection_tutorial.md \
+doc/server-reflection.md \
+doc/interop-test-descriptions.md \
+doc/PROTOCOL-HTTP2.md \
doc/compression_cookbook.md \
-doc/connection-backoff-interop-test-description.md \
doc/connection-backoff.md \
-doc/connectivity-semantics-and-api.md \
-doc/cpp-style-guide.md \
-doc/environment_variables.md \
doc/epoll-polling-engine.md \
-doc/fail_fast.md \
-doc/g_stands_for.md \
-doc/health-checking.md \
-doc/http-grpc-status-mapping.md \
-doc/interop-test-descriptions.md \
+doc/connectivity-semantics-and-api.md \
doc/load-balancing.md \
+doc/environment_variables.md \
doc/naming.md \
+doc/stress_test_framework.md \
+doc/http-grpc-status-mapping.md \
+doc/health-checking.md \
+doc/connection-backoff-interop-test-description.md \
doc/negative-http2-interop-test-descriptions.md \
-doc/PROTOCOL-HTTP2.md \
-doc/PROTOCOL-WEB.md \
-doc/server-reflection.md \
-doc/server_reflection_tutorial.md \
+doc/command_line_tool.md \
doc/statuscodes.md \
-doc/stress_test_framework.md \
-doc/wait-for-ready.md \
-doc/cpp/pending_api_cleanups.md \
-doc/cpp/perf_notes.md
+doc/cpp/perf_notes.md \
+doc/cpp/pending_api_cleanups.md
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index ffef534fe2..e8c47237ca 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -894,34 +894,34 @@ src/cpp/util/status.cc \
src/cpp/util/string_ref.cc \
src/cpp/util/time_cc.cc \
src/cpp/codegen/codegen_init.cc \
+doc/fail_fast.md \
+doc/g_stands_for.md \
+doc/wait-for-ready.md \
doc/binary-logging.md \
-doc/c-style-guide.md \
-doc/command_line_tool.md \
doc/compression.md \
+doc/c-style-guide.md \
+doc/PROTOCOL-WEB.md \
+doc/cpp-style-guide.md \
+doc/server_reflection_tutorial.md \
+doc/server-reflection.md \
+doc/interop-test-descriptions.md \
+doc/PROTOCOL-HTTP2.md \
doc/compression_cookbook.md \
-doc/connection-backoff-interop-test-description.md \
doc/connection-backoff.md \
-doc/connectivity-semantics-and-api.md \
-doc/cpp-style-guide.md \
-doc/environment_variables.md \
doc/epoll-polling-engine.md \
-doc/fail_fast.md \
-doc/g_stands_for.md \
-doc/health-checking.md \
-doc/http-grpc-status-mapping.md \
-doc/interop-test-descriptions.md \
+doc/connectivity-semantics-and-api.md \
doc/load-balancing.md \
+doc/environment_variables.md \
doc/naming.md \
+doc/stress_test_framework.md \
+doc/http-grpc-status-mapping.md \
+doc/health-checking.md \
+doc/connection-backoff-interop-test-description.md \
doc/negative-http2-interop-test-descriptions.md \
-doc/PROTOCOL-HTTP2.md \
-doc/PROTOCOL-WEB.md \
-doc/server-reflection.md \
-doc/server_reflection_tutorial.md \
+doc/command_line_tool.md \
doc/statuscodes.md \
-doc/stress_test_framework.md \
-doc/wait-for-ready.md \
-doc/cpp/pending_api_cleanups.md \
doc/cpp/perf_notes.md \
+doc/cpp/pending_api_cleanups.md \
src/cpp/README.md
# This tag can be used to specify the character encoding of the source files
diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core
index f8a3970416..92b57610dc 100644
--- a/tools/doxygen/Doxyfile.core
+++ b/tools/doxygen/Doxyfile.core
@@ -826,32 +826,32 @@ include/grpc/impl/codegen/sync.h \
include/grpc/impl/codegen/sync_generic.h \
include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \
+doc/fail_fast.md \
+doc/g_stands_for.md \
+doc/wait-for-ready.md \
doc/binary-logging.md \
-doc/c-style-guide.md \
-doc/command_line_tool.md \
doc/compression.md \
+doc/c-style-guide.md \
+doc/PROTOCOL-WEB.md \
+doc/cpp-style-guide.md \
+doc/server_reflection_tutorial.md \
+doc/server-reflection.md \
+doc/interop-test-descriptions.md \
+doc/PROTOCOL-HTTP2.md \
doc/compression_cookbook.md \
-doc/connection-backoff-interop-test-description.md \
doc/connection-backoff.md \
-doc/connectivity-semantics-and-api.md \
-doc/cpp-style-guide.md \
-doc/environment_variables.md \
doc/epoll-polling-engine.md \
-doc/fail_fast.md \
-doc/g_stands_for.md \
-doc/health-checking.md \
-doc/http-grpc-status-mapping.md \
-doc/interop-test-descriptions.md \
+doc/connectivity-semantics-and-api.md \
doc/load-balancing.md \
+doc/environment_variables.md \
doc/naming.md \
+doc/stress_test_framework.md \
+doc/http-grpc-status-mapping.md \
+doc/health-checking.md \
+doc/connection-backoff-interop-test-description.md \
doc/negative-http2-interop-test-descriptions.md \
-doc/PROTOCOL-HTTP2.md \
-doc/PROTOCOL-WEB.md \
-doc/server-reflection.md \
-doc/server_reflection_tutorial.md \
+doc/command_line_tool.md \
doc/statuscodes.md \
-doc/stress_test_framework.md \
-doc/wait-for-ready.md \
doc/core/pending_api_cleanups.md
# This tag can be used to specify the character encoding of the source files
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 1a945bec49..04acd4ff1e 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -1281,41 +1281,39 @@ src/core/lib/support/tmpfile_msys.c \
src/core/lib/support/tmpfile_posix.c \
src/core/lib/support/tmpfile_windows.c \
src/core/lib/support/wrap_memcpy.c \
+doc/fail_fast.md \
+doc/g_stands_for.md \
+doc/wait-for-ready.md \
doc/binary-logging.md \
-doc/c-style-guide.md \
-doc/command_line_tool.md \
doc/compression.md \
+doc/c-style-guide.md \
+doc/PROTOCOL-WEB.md \
+doc/cpp-style-guide.md \
+doc/server_reflection_tutorial.md \
+doc/server-reflection.md \
+doc/interop-test-descriptions.md \
+doc/PROTOCOL-HTTP2.md \
doc/compression_cookbook.md \
-doc/connection-backoff-interop-test-description.md \
doc/connection-backoff.md \
-doc/connectivity-semantics-and-api.md \
-doc/cpp-style-guide.md \
-doc/environment_variables.md \
doc/epoll-polling-engine.md \
-doc/fail_fast.md \
-doc/g_stands_for.md \
-doc/health-checking.md \
-doc/http-grpc-status-mapping.md \
-doc/interop-test-descriptions.md \
+doc/connectivity-semantics-and-api.md \
doc/load-balancing.md \
+doc/environment_variables.md \
doc/naming.md \
+doc/stress_test_framework.md \
+doc/http-grpc-status-mapping.md \
+doc/health-checking.md \
+doc/connection-backoff-interop-test-description.md \
doc/negative-http2-interop-test-descriptions.md \
-doc/PROTOCOL-HTTP2.md \
-doc/PROTOCOL-WEB.md \
-doc/server-reflection.md \
-doc/server_reflection_tutorial.md \
+doc/command_line_tool.md \
doc/statuscodes.md \
-doc/stress_test_framework.md \
-doc/wait-for-ready.md \
doc/core/pending_api_cleanups.md \
src/core/README.md \
src/core/ext/README.md \
-src/core/ext/census/README.md \
-src/core/ext/census/gen/README.md \
-src/core/ext/client_channel/README.md \
src/core/ext/resolver/README.md \
src/core/ext/resolver/dns/native/README.md \
src/core/ext/resolver/sockaddr/README.md \
+src/core/ext/client_channel/README.md \
src/core/ext/transport/README.md \
src/core/ext/transport/chttp2/README.md \
src/core/ext/transport/chttp2/client/insecure/README.md \
@@ -1323,12 +1321,14 @@ src/core/ext/transport/chttp2/client/secure/README.md \
src/core/ext/transport/chttp2/server/insecure/README.md \
src/core/ext/transport/chttp2/server/secure/README.md \
src/core/ext/transport/chttp2/transport/README.md \
+src/core/ext/census/README.md \
+src/core/ext/census/gen/README.md \
src/core/lib/README.md \
-src/core/lib/channel/README.md \
src/core/lib/iomgr/README.md \
+src/core/lib/tsi/README.md \
src/core/lib/surface/README.md \
src/core/lib/transport/README.md \
-src/core/lib/tsi/README.md
+src/core/lib/channel/README.md
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses