Capture :path, and send it separately
diff --git a/src/core/channel/http_server_filter.c b/src/core/channel/http_server_filter.c
index 19b9606..8290ead 100644
--- a/src/core/channel/http_server_filter.c
+++ b/src/core/channel/http_server_filter.c
@@ -37,10 +37,11 @@
#include <grpc/support/log.h>
typedef struct call_data {
- int sent_status;
- int seen_scheme;
- int seen_method;
- int seen_te_trailers;
+ gpr_uint8 sent_status;
+ gpr_uint8 seen_scheme;
+ gpr_uint8 seen_method;
+ gpr_uint8 seen_te_trailers;
+ grpc_mdelem *path;
} call_data;
typedef struct channel_data {
@@ -52,6 +53,7 @@
grpc_mdelem *grpc_scheme;
grpc_mdelem *content_type;
grpc_mdelem *status;
+ grpc_mdstr *path_key;
} channel_data;
/* used to silence 'variable not used' warnings */
@@ -120,6 +122,13 @@
grpc_mdelem_unref(op->data.metadata);
op->done_cb(op->user_data, GRPC_OP_OK);
grpc_call_element_send_cancel(elem);
+ } else if (op->data.metadata->key == channeld->path_key) {
+ if (calld->path != NULL) {
+ gpr_log(GPR_ERROR, "Received :path twice");
+ grpc_mdelem_unref(calld->path);
+ }
+ calld->path = grpc_mdelem_ref(op->data.metadata);
+ op->done_cb(op->user_data, GRPC_OP_OK);
} else {
/* pass the event up */
grpc_call_next_op(elem, op);
@@ -129,7 +138,10 @@
/* Have we seen the required http2 transport headers?
(:method, :scheme, content-type, with :path and :authority covered
at the channel level right now) */
- if (calld->seen_method && calld->seen_scheme && calld->seen_te_trailers) {
+ if (calld->seen_method && calld->seen_scheme && calld->seen_te_trailers &&
+ calld->path) {
+ grpc_call_element_recv_metadata(elem, calld->path);
+ calld->path = NULL;
grpc_call_next_op(elem, op);
} else {
if (!calld->seen_method) {
@@ -189,6 +201,7 @@
ignore_unused(channeld);
/* initialize members */
+ calld->path = NULL;
calld->sent_status = 0;
calld->seen_scheme = 0;
calld->seen_method = 0;
@@ -201,8 +214,11 @@
call_data *calld = elem->call_data;
channel_data *channeld = elem->channel_data;
- ignore_unused(calld);
ignore_unused(channeld);
+
+ if (calld->path) {
+ grpc_mdelem_unref(calld->path);
+ }
}
/* Constructor for channel_data */
@@ -225,6 +241,7 @@
channeld->http_scheme = grpc_mdelem_from_strings(mdctx, ":scheme", "http");
channeld->https_scheme = grpc_mdelem_from_strings(mdctx, ":scheme", "https");
channeld->grpc_scheme = grpc_mdelem_from_strings(mdctx, ":scheme", "grpc");
+ channeld->path_key = grpc_mdstr_from_string(mdctx, ":path");
channeld->content_type =
grpc_mdelem_from_strings(mdctx, "content-type", "application/grpc");
}
@@ -241,6 +258,7 @@
grpc_mdelem_unref(channeld->https_scheme);
grpc_mdelem_unref(channeld->grpc_scheme);
grpc_mdelem_unref(channeld->content_type);
+ grpc_mdstr_unref(channeld->path_key);
}
const grpc_channel_filter grpc_http_server_filter = {