blob: db995943a961d0073021ead54b0c92aaf97777c4 [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080016 *
17 */
18
Craig Tiller9533d042016-03-25 17:11:06 -070019#include "src/core/lib/http/httpcli.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080020
21#include <string.h>
22
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080023#include <grpc/support/alloc.h>
24#include <grpc/support/log.h>
Masood Malekghassemi701af602015-06-03 15:01:17 -070025#include <grpc/support/string_util.h>
Craig Tiller6a64bfd2016-05-09 13:05:03 -070026#include <grpc/support/useful.h>
Craig Tiller1d7704d2016-02-25 14:07:29 -080027
Mark D. Roth8d5e60b2017-06-09 09:08:23 -070028#include "src/core/lib/channel/channel_args.h"
Craig Tiller9533d042016-03-25 17:11:06 -070029#include "src/core/lib/http/format_request.h"
30#include "src/core/lib/http/parser.h"
31#include "src/core/lib/iomgr/endpoint.h"
32#include "src/core/lib/iomgr/iomgr_internal.h"
33#include "src/core/lib/iomgr/resolve_address.h"
Craig Tiller6a64bfd2016-05-09 13:05:03 -070034#include "src/core/lib/iomgr/sockaddr_utils.h"
Craig Tiller9533d042016-03-25 17:11:06 -070035#include "src/core/lib/iomgr/tcp_client.h"
Craig Tillera59c16c2016-10-31 07:25:01 -070036#include "src/core/lib/slice/slice_internal.h"
Craig Tiller9533d042016-03-25 17:11:06 -070037#include "src/core/lib/support/string.h"
Craig Tiller69b093b2016-02-25 19:04:07 -080038
Craig Tillera82950e2015-09-22 12:33:20 -070039typedef struct {
Craig Tillerd41a4a72016-10-26 16:16:06 -070040 grpc_slice request_text;
Matthew Iselin1824f052016-02-10 12:16:06 +110041 grpc_http_parser parser;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080042 grpc_resolved_addresses *addresses;
43 size_t next_address;
44 grpc_endpoint *ep;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080045 char *host;
Craig Tillercc0535d2015-12-08 15:14:47 -080046 char *ssl_host_override;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080047 gpr_timespec deadline;
48 int have_read_byte;
Craig Tillerf53d9c82015-08-04 14:19:43 -070049 const grpc_httpcli_handshaker *handshaker;
Craig Tiller5b15afd2016-05-04 15:00:14 -070050 grpc_closure *on_done;
Craig Tillera0abe372015-06-01 11:31:08 -070051 grpc_httpcli_context *context;
David Garcia Quintas2a50dfe2016-05-31 15:09:12 -070052 grpc_polling_entity *pollent;
Craig Tillerf39f2d62015-06-06 14:43:06 -070053 grpc_iomgr_object iomgr_obj;
Craig Tillerd41a4a72016-10-26 16:16:06 -070054 grpc_slice_buffer incoming;
55 grpc_slice_buffer outgoing;
Craig Tiller33825112015-09-18 07:44:19 -070056 grpc_closure on_read;
57 grpc_closure done_write;
Craig Tillerd1bec032015-09-18 17:29:00 -070058 grpc_closure connected;
Craig Tiller6a64bfd2016-05-09 13:05:03 -070059 grpc_error *overall_error;
Craig Tiller20afa3d2016-10-17 14:52:14 -070060 grpc_resource_quota *resource_quota;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080061} internal_request;
62
ctiller40260c42014-12-17 17:03:15 -080063static grpc_httpcli_get_override g_get_override = NULL;
64static grpc_httpcli_post_override g_post_override = NULL;
65
Craig Tillera82950e2015-09-22 12:33:20 -070066static void plaintext_handshake(grpc_exec_ctx *exec_ctx, void *arg,
67 grpc_endpoint *endpoint, const char *host,
Craig Tiller449c64b2016-06-13 16:26:50 -070068 gpr_timespec deadline,
Craig Tillera82950e2015-09-22 12:33:20 -070069 void (*on_done)(grpc_exec_ctx *exec_ctx,
70 void *arg,
71 grpc_endpoint *endpoint)) {
72 on_done(exec_ctx, arg, endpoint);
Craig Tillerf53d9c82015-08-04 14:19:43 -070073}
74
Craig Tillera82950e2015-09-22 12:33:20 -070075const grpc_httpcli_handshaker grpc_httpcli_plaintext = {"http",
76 plaintext_handshake};
Craig Tillerf53d9c82015-08-04 14:19:43 -070077
Craig Tillera82950e2015-09-22 12:33:20 -070078void grpc_httpcli_context_init(grpc_httpcli_context *context) {
Craig Tiller69b093b2016-02-25 19:04:07 -080079 context->pollset_set = grpc_pollset_set_create();
Craig Tillera0abe372015-06-01 11:31:08 -070080}
81
Craig Tiller9e5ac1b2017-02-14 22:25:50 -080082void grpc_httpcli_context_destroy(grpc_exec_ctx *exec_ctx,
83 grpc_httpcli_context *context) {
84 grpc_pollset_set_destroy(exec_ctx, context->pollset_set);
Craig Tillera0abe372015-06-01 11:31:08 -070085}
86
Craig Tiller6a64bfd2016-05-09 13:05:03 -070087static void next_address(grpc_exec_ctx *exec_ctx, internal_request *req,
88 grpc_error *due_to_error);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080089
Craig Tillera82950e2015-09-22 12:33:20 -070090static void finish(grpc_exec_ctx *exec_ctx, internal_request *req,
Craig Tiller5b15afd2016-05-04 15:00:14 -070091 grpc_error *error) {
David Garcia Quintasc4d51122016-06-06 14:56:02 -070092 grpc_polling_entity_del_from_pollset_set(exec_ctx, req->pollent,
David Garcia Quintas69ff63d2016-06-06 16:39:47 -070093 req->context->pollset_set);
ncteisen274bbbe2017-06-08 14:57:11 -070094 GRPC_CLOSURE_SCHED(exec_ctx, req->on_done, error);
Matthew Iselin1824f052016-02-10 12:16:06 +110095 grpc_http_parser_destroy(&req->parser);
Craig Tillera82950e2015-09-22 12:33:20 -070096 if (req->addresses != NULL) {
97 grpc_resolved_addresses_destroy(req->addresses);
98 }
99 if (req->ep != NULL) {
100 grpc_endpoint_destroy(exec_ctx, req->ep);
101 }
Craig Tillera59c16c2016-10-31 07:25:01 -0700102 grpc_slice_unref_internal(exec_ctx, req->request_text);
Craig Tillera82950e2015-09-22 12:33:20 -0700103 gpr_free(req->host);
Craig Tillercc0535d2015-12-08 15:14:47 -0800104 gpr_free(req->ssl_host_override);
Craig Tillera82950e2015-09-22 12:33:20 -0700105 grpc_iomgr_unregister_object(&req->iomgr_obj);
Craig Tillera59c16c2016-10-31 07:25:01 -0700106 grpc_slice_buffer_destroy_internal(exec_ctx, &req->incoming);
107 grpc_slice_buffer_destroy_internal(exec_ctx, &req->outgoing);
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700108 GRPC_ERROR_UNREF(req->overall_error);
Craig Tillera59c16c2016-10-31 07:25:01 -0700109 grpc_resource_quota_unref_internal(exec_ctx, req->resource_quota);
Craig Tillera82950e2015-09-22 12:33:20 -0700110 gpr_free(req);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800111}
112
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700113static void append_error(internal_request *req, grpc_error *error) {
114 if (req->overall_error == GRPC_ERROR_NONE) {
ncteisen4b36a3d2017-03-13 19:08:06 -0700115 req->overall_error =
116 GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed HTTP/1 client request");
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700117 }
118 grpc_resolved_address *addr = &req->addresses->addrs[req->next_address - 1];
murgatroid997871f732016-09-23 13:49:05 -0700119 char *addr_text = grpc_sockaddr_to_uri(addr);
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700120 req->overall_error = grpc_error_add_child(
121 req->overall_error,
ncteisen4b36a3d2017-03-13 19:08:06 -0700122 grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS,
123 grpc_slice_from_copied_string(addr_text)));
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700124 gpr_free(addr_text);
125}
126
Craig Tillera82950e2015-09-22 12:33:20 -0700127static void do_read(grpc_exec_ctx *exec_ctx, internal_request *req) {
128 grpc_endpoint_read(exec_ctx, req->ep, &req->incoming, &req->on_read);
Craig Tillerb0298592015-08-27 07:38:01 -0700129}
130
Craig Tillerc027e772016-05-03 16:27:00 -0700131static void on_read(grpc_exec_ctx *exec_ctx, void *user_data,
132 grpc_error *error) {
Yash Tibrewal7cdd99c2017-09-08 16:04:12 -0700133 internal_request *req = (internal_request *)user_data;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800134 size_t i;
135
Craig Tillere6deeb12016-05-09 13:14:32 -0700136 for (i = 0; i < req->incoming.count; i++) {
Craig Tiller618e67d2016-10-26 21:08:10 -0700137 if (GRPC_SLICE_LENGTH(req->incoming.slices[i])) {
Craig Tillera82950e2015-09-22 12:33:20 -0700138 req->have_read_byte = 1;
Craig Tillere6deeb12016-05-09 13:14:32 -0700139 grpc_error *err =
Mark D. Roth714c7ec2016-08-04 12:58:16 -0700140 grpc_http_parser_parse(&req->parser, req->incoming.slices[i], NULL);
Craig Tillere6deeb12016-05-09 13:14:32 -0700141 if (err != GRPC_ERROR_NONE) {
142 finish(exec_ctx, req, err);
143 return;
144 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800145 }
Craig Tillera82950e2015-09-22 12:33:20 -0700146 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800147
Craig Tillerc027e772016-05-03 16:27:00 -0700148 if (error == GRPC_ERROR_NONE) {
Craig Tillera82950e2015-09-22 12:33:20 -0700149 do_read(exec_ctx, req);
150 } else if (!req->have_read_byte) {
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700151 next_address(exec_ctx, req, GRPC_ERROR_REF(error));
Craig Tillera82950e2015-09-22 12:33:20 -0700152 } else {
Craig Tillere6deeb12016-05-09 13:14:32 -0700153 finish(exec_ctx, req, grpc_http_parser_eof(&req->parser));
Craig Tillera82950e2015-09-22 12:33:20 -0700154 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800155}
156
Craig Tillera82950e2015-09-22 12:33:20 -0700157static void on_written(grpc_exec_ctx *exec_ctx, internal_request *req) {
158 do_read(exec_ctx, req);
Craig Tillerd1bec032015-09-18 17:29:00 -0700159}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800160
Craig Tillerc027e772016-05-03 16:27:00 -0700161static void done_write(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
Yash Tibrewal7cdd99c2017-09-08 16:04:12 -0700162 internal_request *req = (internal_request *)arg;
Craig Tillerc027e772016-05-03 16:27:00 -0700163 if (error == GRPC_ERROR_NONE) {
Craig Tillera82950e2015-09-22 12:33:20 -0700164 on_written(exec_ctx, req);
165 } else {
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700166 next_address(exec_ctx, req, GRPC_ERROR_REF(error));
Craig Tillera82950e2015-09-22 12:33:20 -0700167 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800168}
169
Craig Tillera82950e2015-09-22 12:33:20 -0700170static void start_write(grpc_exec_ctx *exec_ctx, internal_request *req) {
Craig Tillera59c16c2016-10-31 07:25:01 -0700171 grpc_slice_ref_internal(req->request_text);
Craig Tillerd41a4a72016-10-26 16:16:06 -0700172 grpc_slice_buffer_add(&req->outgoing, req->request_text);
Craig Tillera82950e2015-09-22 12:33:20 -0700173 grpc_endpoint_write(exec_ctx, req->ep, &req->outgoing, &req->done_write);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800174}
175
Craig Tillera82950e2015-09-22 12:33:20 -0700176static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
177 grpc_endpoint *ep) {
Yash Tibrewal7cdd99c2017-09-08 16:04:12 -0700178 internal_request *req = (internal_request *)arg;
Craig Tillerf53d9c82015-08-04 14:19:43 -0700179
Craig Tillera82950e2015-09-22 12:33:20 -0700180 if (!ep) {
ncteisen4b36a3d2017-03-13 19:08:06 -0700181 next_address(exec_ctx, req, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
182 "Unexplained handshake failure"));
Craig Tillera82950e2015-09-22 12:33:20 -0700183 return;
184 }
Craig Tillerf53d9c82015-08-04 14:19:43 -0700185
186 req->ep = ep;
Craig Tillera82950e2015-09-22 12:33:20 -0700187 start_write(exec_ctx, req);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800188}
189
Craig Tillerc027e772016-05-03 16:27:00 -0700190static void on_connected(grpc_exec_ctx *exec_ctx, void *arg,
191 grpc_error *error) {
Yash Tibrewal7cdd99c2017-09-08 16:04:12 -0700192 internal_request *req = (internal_request *)arg;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800193
Craig Tillera82950e2015-09-22 12:33:20 -0700194 if (!req->ep) {
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700195 next_address(exec_ctx, req, GRPC_ERROR_REF(error));
Craig Tillera82950e2015-09-22 12:33:20 -0700196 return;
197 }
Craig Tillercc0535d2015-12-08 15:14:47 -0800198 req->handshaker->handshake(
199 exec_ctx, req, req->ep,
200 req->ssl_host_override ? req->ssl_host_override : req->host,
Craig Tiller449c64b2016-06-13 16:26:50 -0700201 req->deadline, on_handshake_done);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800202}
203
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700204static void next_address(grpc_exec_ctx *exec_ctx, internal_request *req,
205 grpc_error *error) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800206 grpc_resolved_address *addr;
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700207 if (error != GRPC_ERROR_NONE) {
208 append_error(req, error);
209 }
Craig Tillera82950e2015-09-22 12:33:20 -0700210 if (req->next_address == req->addresses->naddrs) {
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700211 finish(exec_ctx, req,
ncteisen4b36a3d2017-03-13 19:08:06 -0700212 GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
213 "Failed HTTP requests to all targets", &req->overall_error, 1));
Craig Tillera82950e2015-09-22 12:33:20 -0700214 return;
215 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800216 addr = &req->addresses->addrs[req->next_address++];
ncteisen274bbbe2017-06-08 14:57:11 -0700217 GRPC_CLOSURE_INIT(&req->connected, on_connected, req,
Craig Tiller91031da2016-12-28 15:44:25 -0800218 grpc_schedule_on_exec_ctx);
Mark D. Roth8d5e60b2017-06-09 09:08:23 -0700219 grpc_arg arg = grpc_channel_arg_pointer_create(
Yash Tibrewal533d1182017-09-18 10:48:22 -0700220 (char *)GRPC_ARG_RESOURCE_QUOTA, req->resource_quota,
Mark D. Roth8d5e60b2017-06-09 09:08:23 -0700221 grpc_resource_quota_arg_vtable());
Craig Tiller86958762016-09-23 12:05:34 -0700222 grpc_channel_args args = {1, &arg};
murgatroid99dedb9232016-09-26 13:54:04 -0700223 grpc_tcp_client_connect(exec_ctx, &req->connected, &req->ep,
Craig Tiller3d357d92016-10-26 20:52:03 -0700224 req->context->pollset_set, &args, addr,
225 req->deadline);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800226}
227
Craig Tiller5b15afd2016-05-04 15:00:14 -0700228static void on_resolved(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
Yash Tibrewal7cdd99c2017-09-08 16:04:12 -0700229 internal_request *req = (internal_request *)arg;
Craig Tiller5b15afd2016-05-04 15:00:14 -0700230 if (error != GRPC_ERROR_NONE) {
Craig Tillerd6466872017-05-23 16:29:00 -0700231 finish(exec_ctx, req, GRPC_ERROR_REF(error));
Craig Tillera82950e2015-09-22 12:33:20 -0700232 return;
233 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800234 req->next_address = 0;
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700235 next_address(exec_ctx, req, GRPC_ERROR_NONE);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800236}
237
Craig Tiller5b15afd2016-05-04 15:00:14 -0700238static void internal_request_begin(grpc_exec_ctx *exec_ctx,
239 grpc_httpcli_context *context,
Craig Tillerc97065d2016-06-07 13:00:14 -0700240 grpc_polling_entity *pollent,
Craig Tiller20afa3d2016-10-17 14:52:14 -0700241 grpc_resource_quota *resource_quota,
Craig Tiller5b15afd2016-05-04 15:00:14 -0700242 const grpc_httpcli_request *request,
243 gpr_timespec deadline, grpc_closure *on_done,
244 grpc_httpcli_response *response,
Craig Tillerd41a4a72016-10-26 16:16:06 -0700245 const char *name, grpc_slice request_text) {
Yash Tibrewal7cdd99c2017-09-08 16:04:12 -0700246 internal_request *req =
247 (internal_request *)gpr_malloc(sizeof(internal_request));
Craig Tillera82950e2015-09-22 12:33:20 -0700248 memset(req, 0, sizeof(*req));
Craig Tiller47a708e2015-09-15 16:16:06 -0700249 req->request_text = request_text;
Craig Tiller5b15afd2016-05-04 15:00:14 -0700250 grpc_http_parser_init(&req->parser, GRPC_HTTP_RESPONSE, response);
251 req->on_done = on_done;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800252 req->deadline = deadline;
Craig Tillera82950e2015-09-22 12:33:20 -0700253 req->handshaker =
254 request->handshaker ? request->handshaker : &grpc_httpcli_plaintext;
Craig Tillera0abe372015-06-01 11:31:08 -0700255 req->context = context;
David Garcia Quintas2a50dfe2016-05-31 15:09:12 -0700256 req->pollent = pollent;
Craig Tiller6a64bfd2016-05-09 13:05:03 -0700257 req->overall_error = GRPC_ERROR_NONE;
Craig Tillera59c16c2016-10-31 07:25:01 -0700258 req->resource_quota = grpc_resource_quota_ref_internal(resource_quota);
ncteisen274bbbe2017-06-08 14:57:11 -0700259 GRPC_CLOSURE_INIT(&req->on_read, on_read, req, grpc_schedule_on_exec_ctx);
260 GRPC_CLOSURE_INIT(&req->done_write, done_write, req,
Craig Tiller91031da2016-12-28 15:44:25 -0800261 grpc_schedule_on_exec_ctx);
Craig Tillerd41a4a72016-10-26 16:16:06 -0700262 grpc_slice_buffer_init(&req->incoming);
263 grpc_slice_buffer_init(&req->outgoing);
Craig Tillera82950e2015-09-22 12:33:20 -0700264 grpc_iomgr_register_object(&req->iomgr_obj, name);
265 req->host = gpr_strdup(request->host);
Craig Tillercc0535d2015-12-08 15:14:47 -0800266 req->ssl_host_override = gpr_strdup(request->ssl_host_override);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800267
David Garcia Quintas2a50dfe2016-05-31 15:09:12 -0700268 GPR_ASSERT(pollent);
David Garcia Quintasc4d51122016-06-06 14:56:02 -0700269 grpc_polling_entity_add_to_pollset_set(exec_ctx, req->pollent,
David Garcia Quintas69ff63d2016-06-06 16:39:47 -0700270 req->context->pollset_set);
Craig Tiller91031da2016-12-28 15:44:25 -0800271 grpc_resolve_address(
272 exec_ctx, request->host, req->handshaker->default_port,
273 req->context->pollset_set,
ncteisen274bbbe2017-06-08 14:57:11 -0700274 GRPC_CLOSURE_CREATE(on_resolved, req, grpc_schedule_on_exec_ctx),
Craig Tiller91031da2016-12-28 15:44:25 -0800275 &req->addresses);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800276}
277
Craig Tillera82950e2015-09-22 12:33:20 -0700278void grpc_httpcli_get(grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
David Garcia Quintas2a50dfe2016-05-31 15:09:12 -0700279 grpc_polling_entity *pollent,
Craig Tiller20afa3d2016-10-17 14:52:14 -0700280 grpc_resource_quota *resource_quota,
Craig Tillera82950e2015-09-22 12:33:20 -0700281 const grpc_httpcli_request *request,
Craig Tiller5b15afd2016-05-04 15:00:14 -0700282 gpr_timespec deadline, grpc_closure *on_done,
283 grpc_httpcli_response *response) {
Craig Tiller47a708e2015-09-15 16:16:06 -0700284 char *name;
Craig Tillera82950e2015-09-22 12:33:20 -0700285 if (g_get_override &&
Craig Tiller5b15afd2016-05-04 15:00:14 -0700286 g_get_override(exec_ctx, request, deadline, on_done, response)) {
Craig Tillera82950e2015-09-22 12:33:20 -0700287 return;
288 }
Matthew Iselin1824f052016-02-10 12:16:06 +1100289 gpr_asprintf(&name, "HTTP:GET:%s:%s", request->host, request->http.path);
Craig Tiller20afa3d2016-10-17 14:52:14 -0700290 internal_request_begin(exec_ctx, context, pollent, resource_quota, request,
Craig Tillere34c2852016-09-23 09:43:32 -0700291 deadline, on_done, response, name,
Craig Tillera82950e2015-09-22 12:33:20 -0700292 grpc_httpcli_format_get_request(request));
293 gpr_free(name);
Craig Tiller47a708e2015-09-15 16:16:06 -0700294}
295
Craig Tillera82950e2015-09-22 12:33:20 -0700296void grpc_httpcli_post(grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
David Garcia Quintas2a50dfe2016-05-31 15:09:12 -0700297 grpc_polling_entity *pollent,
Craig Tiller20afa3d2016-10-17 14:52:14 -0700298 grpc_resource_quota *resource_quota,
Craig Tillera82950e2015-09-22 12:33:20 -0700299 const grpc_httpcli_request *request,
300 const char *body_bytes, size_t body_size,
Craig Tiller5b15afd2016-05-04 15:00:14 -0700301 gpr_timespec deadline, grpc_closure *on_done,
302 grpc_httpcli_response *response) {
Craig Tillerf39f2d62015-06-06 14:43:06 -0700303 char *name;
Craig Tillera82950e2015-09-22 12:33:20 -0700304 if (g_post_override &&
305 g_post_override(exec_ctx, request, body_bytes, body_size, deadline,
Craig Tiller5b15afd2016-05-04 15:00:14 -0700306 on_done, response)) {
Craig Tillera82950e2015-09-22 12:33:20 -0700307 return;
308 }
Matthew Iselin1824f052016-02-10 12:16:06 +1100309 gpr_asprintf(&name, "HTTP:POST:%s:%s", request->host, request->http.path);
Craig Tillera82950e2015-09-22 12:33:20 -0700310 internal_request_begin(
Craig Tiller20afa3d2016-10-17 14:52:14 -0700311 exec_ctx, context, pollent, resource_quota, request, deadline, on_done,
Craig Tillere34c2852016-09-23 09:43:32 -0700312 response, name,
Craig Tiller5b15afd2016-05-04 15:00:14 -0700313 grpc_httpcli_format_post_request(request, body_bytes, body_size));
Craig Tillera82950e2015-09-22 12:33:20 -0700314 gpr_free(name);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800315}
ctiller40260c42014-12-17 17:03:15 -0800316
Craig Tillera82950e2015-09-22 12:33:20 -0700317void grpc_httpcli_set_override(grpc_httpcli_get_override get,
318 grpc_httpcli_post_override post) {
ctiller40260c42014-12-17 17:03:15 -0800319 g_get_override = get;
320 g_post_override = post;
Craig Tiller190d3602015-02-18 09:23:38 -0800321}