From 2e7687c5ef7fa8bb3faf18f55a1b1817c546f25c Mon Sep 17 00:00:00 2001 From: Craig Tiller <ctiller@google.com> Date: Wed, 18 Nov 2015 14:56:46 -0800 Subject: [PATCH] Static metadata declarations --- BUILD | 6 + Makefile | 2 + binding.gyp | 1 + build.yaml | 2 + gRPC.podspec | 3 + src/core/transport/static_metadata.c | 127 +++++++ src/core/transport/static_metadata.h | 334 ++++++++++++++++++ tools/codegen/core/gen_static_metadata.py | 266 ++++++++++++++ tools/doxygen/Doxyfile.core.internal | 2 + tools/run_tests/sources_and_headers.json | 6 + vsprojects/vcxproj/grpc/grpc.vcxproj | 3 + vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 6 + .../grpc_unsecure/grpc_unsecure.vcxproj | 3 + .../grpc_unsecure.vcxproj.filters | 6 + 14 files changed, 767 insertions(+) create mode 100644 src/core/transport/static_metadata.c create mode 100644 src/core/transport/static_metadata.h create mode 100755 tools/codegen/core/gen_static_metadata.py diff --git a/BUILD b/BUILD index b66becf290..9f378ae990 100644 --- a/BUILD +++ b/BUILD @@ -260,6 +260,7 @@ cc_library( "src/core/transport/connectivity_state.h", "src/core/transport/metadata.h", "src/core/transport/metadata_batch.h", + "src/core/transport/static_metadata.h", "src/core/transport/transport.h", "src/core/transport/transport_impl.h", "src/core/census/aggregation.h", @@ -408,6 +409,7 @@ cc_library( "src/core/transport/connectivity_state.c", "src/core/transport/metadata.c", "src/core/transport/metadata_batch.c", + "src/core/transport/static_metadata.c", "src/core/transport/transport.c", "src/core/transport/transport_op_string.c", "src/core/census/context.c", @@ -550,6 +552,7 @@ cc_library( "src/core/transport/connectivity_state.h", "src/core/transport/metadata.h", "src/core/transport/metadata_batch.h", + "src/core/transport/static_metadata.h", "src/core/transport/transport.h", "src/core/transport/transport_impl.h", "src/core/census/aggregation.h", @@ -678,6 +681,7 @@ cc_library( "src/core/transport/connectivity_state.c", "src/core/transport/metadata.c", "src/core/transport/metadata_batch.c", + "src/core/transport/static_metadata.c", "src/core/transport/transport.c", "src/core/transport/transport_op_string.c", "src/core/census/context.c", @@ -1207,6 +1211,7 @@ objc_library( "src/core/transport/connectivity_state.c", "src/core/transport/metadata.c", "src/core/transport/metadata_batch.c", + "src/core/transport/static_metadata.c", "src/core/transport/transport.c", "src/core/transport/transport_op_string.c", "src/core/census/context.c", @@ -1346,6 +1351,7 @@ objc_library( "src/core/transport/connectivity_state.h", "src/core/transport/metadata.h", "src/core/transport/metadata_batch.h", + "src/core/transport/static_metadata.h", "src/core/transport/transport.h", "src/core/transport/transport_impl.h", "src/core/census/aggregation.h", diff --git a/Makefile b/Makefile index 53d0696a20..a20cfc720b 100644 --- a/Makefile +++ b/Makefile @@ -4558,6 +4558,7 @@ LIBGRPC_SRC = \ src/core/transport/connectivity_state.c \ src/core/transport/metadata.c \ src/core/transport/metadata_batch.c \ + src/core/transport/static_metadata.c \ src/core/transport/transport.c \ src/core/transport/transport_op_string.c \ src/core/census/context.c \ @@ -4841,6 +4842,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/transport/connectivity_state.c \ src/core/transport/metadata.c \ src/core/transport/metadata_batch.c \ + src/core/transport/static_metadata.c \ src/core/transport/transport.c \ src/core/transport/transport_op_string.c \ src/core/census/context.c \ diff --git a/binding.gyp b/binding.gyp index 502b9d7a73..430c218e9c 100644 --- a/binding.gyp +++ b/binding.gyp @@ -294,6 +294,7 @@ 'src/core/transport/connectivity_state.c', 'src/core/transport/metadata.c', 'src/core/transport/metadata_batch.c', + 'src/core/transport/static_metadata.c', 'src/core/transport/transport.c', 'src/core/transport/transport_op_string.c', 'src/core/census/context.c', diff --git a/build.yaml b/build.yaml index bd93a16bcb..e4b13a1f8e 100644 --- a/build.yaml +++ b/build.yaml @@ -216,6 +216,7 @@ filegroups: - src/core/transport/connectivity_state.h - src/core/transport/metadata.h - src/core/transport/metadata_batch.h + - src/core/transport/static_metadata.h - src/core/transport/transport.h - src/core/transport/transport_impl.h src: @@ -341,6 +342,7 @@ filegroups: - src/core/transport/connectivity_state.c - src/core/transport/metadata.c - src/core/transport/metadata_batch.c + - src/core/transport/static_metadata.c - src/core/transport/transport.c - src/core/transport/transport_op_string.c - name: grpc_test_util_base diff --git a/gRPC.podspec b/gRPC.podspec index 6bc17f3008..1e248f58fd 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -264,6 +264,7 @@ Pod::Spec.new do |s| 'src/core/transport/connectivity_state.h', 'src/core/transport/metadata.h', 'src/core/transport/metadata_batch.h', + 'src/core/transport/static_metadata.h', 'src/core/transport/transport.h', 'src/core/transport/transport_impl.h', 'src/core/census/aggregation.h', @@ -419,6 +420,7 @@ Pod::Spec.new do |s| 'src/core/transport/connectivity_state.c', 'src/core/transport/metadata.c', 'src/core/transport/metadata_batch.c', + 'src/core/transport/static_metadata.c', 'src/core/transport/transport.c', 'src/core/transport/transport_op_string.c', 'src/core/census/context.c', @@ -560,6 +562,7 @@ Pod::Spec.new do |s| 'src/core/transport/connectivity_state.h', 'src/core/transport/metadata.h', 'src/core/transport/metadata_batch.h', + 'src/core/transport/static_metadata.h', 'src/core/transport/transport.h', 'src/core/transport/transport_impl.h', 'src/core/census/aggregation.h', diff --git a/src/core/transport/static_metadata.c b/src/core/transport/static_metadata.c new file mode 100644 index 0000000000..b77a488b91 --- /dev/null +++ b/src/core/transport/static_metadata.c @@ -0,0 +1,127 @@ +/* + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * WARNING: Auto-generated code. + * + * To make changes to this file, change tools/codegen/core/gen_static_metadata.py, + * and then re-run it. + */ + +#include "src/core/transport/static_metadata.h" + +grpc_mdstr grpc_static_mdstr_table[GRPC_STATIC_MDSTR_COUNT]; + +grpc_mdelem grpc_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT]; + +gpr_uint8 grpc_static_metadata_elem_indices[GRPC_STATIC_MDELEM_COUNT*2] = { +9,28,8,28,10,28,10,40,11,28,12,28,13,28,14,28,15,28,16,28,17,28,18,28,19,28,20,28,21,28,22,28,23,28,24,28,25,28,26,28,27,28,29,28,30,28,31,28,32,28,38,0,41,28,44,28,45,28,46,28,47,28,48,28,49,28,50,28,51,28,52,28,53,33,53,55,54,65,54,66,56,28,57,28,58,28,59,28,60,28,61,28,62,34,62,42,62,43,63,28,64,28,67,1,67,2,67,3,67,4,67,5,67,6,67,7,68,28,69,70,71,28,72,28,73,28,74,28,75,28 +}; + +const char *grpc_static_metadata_strings[GRPC_STATIC_MDSTR_COUNT] = { + "0", + "200", + "204", + "206", + "304", + "400", + "404", + "500", + "accept", + "accept-charset", + "accept-encoding", + "accept-language", + "accept-ranges", + "access-control-allow-origin", + "age", + "allow", + ":authority", + "authorization", + "cache-control", + "content-disposition", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-range", + "content-type", + "cookie", + "date", + "", + "etag", + "expect", + "expires", + "from", + "GET", + "grpc", + "grpc-accept-encoding", + "grpc-encoding", + "grpc-message", + "grpc-status", + "grpc-timeout", + "gzip, deflate", + "host", + "http", + "https", + "if-match", + "if-modified-since", + "if-none-match", + "if-range", + "if-unmodified-since", + "last-modified", + "link", + "location", + "max-forwards", + ":method", + ":path", + "POST", + "proxy-authenticate", + "proxy-authorization", + "range", + "referer", + "refresh", + "retry-after", + ":scheme", + "server", + "set-cookie", + "/", + "/index.html", + ":status", + "strict-transport-security", + "te", + "trailers", + "transfer-encoding", + "user-agent", + "vary", + "via", + "www-authenticate" +}; + diff --git a/src/core/transport/static_metadata.h b/src/core/transport/static_metadata.h new file mode 100644 index 0000000000..b72a1962f1 --- /dev/null +++ b/src/core/transport/static_metadata.h @@ -0,0 +1,334 @@ +/* + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * WARNING: Auto-generated code. + * + * To make changes to this file, change tools/codegen/core/gen_static_metadata.py, + * and then re-run it. + */ + +#ifndef GRPC_INTERNAL_CORE_TRANSPORT_STATIC_METADATA_H +#define GRPC_INTERNAL_CORE_TRANSPORT_STATIC_METADATA_H + +#include "src/core/transport/metadata.h" + +#define GRPC_STATIC_MDSTR_COUNT 76 +extern grpc_mdstr grpc_static_mdstr_table[GRPC_STATIC_MDSTR_COUNT]; +/* "0" */ +#define GRPC_MDSTR_0 (&grpc_static_mdstr_table[0]) +/* "200" */ +#define GRPC_MDSTR_200 (&grpc_static_mdstr_table[1]) +/* "204" */ +#define GRPC_MDSTR_204 (&grpc_static_mdstr_table[2]) +/* "206" */ +#define GRPC_MDSTR_206 (&grpc_static_mdstr_table[3]) +/* "304" */ +#define GRPC_MDSTR_304 (&grpc_static_mdstr_table[4]) +/* "400" */ +#define GRPC_MDSTR_400 (&grpc_static_mdstr_table[5]) +/* "404" */ +#define GRPC_MDSTR_404 (&grpc_static_mdstr_table[6]) +/* "500" */ +#define GRPC_MDSTR_500 (&grpc_static_mdstr_table[7]) +/* "accept" */ +#define GRPC_MDSTR_ACCEPT (&grpc_static_mdstr_table[8]) +/* "accept-charset" */ +#define GRPC_MDSTR_ACCEPT_CHARSET (&grpc_static_mdstr_table[9]) +/* "accept-encoding" */ +#define GRPC_MDSTR_ACCEPT_ENCODING (&grpc_static_mdstr_table[10]) +/* "accept-language" */ +#define GRPC_MDSTR_ACCEPT_LANGUAGE (&grpc_static_mdstr_table[11]) +/* "accept-ranges" */ +#define GRPC_MDSTR_ACCEPT_RANGES (&grpc_static_mdstr_table[12]) +/* "access-control-allow-origin" */ +#define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN (&grpc_static_mdstr_table[13]) +/* "age" */ +#define GRPC_MDSTR_AGE (&grpc_static_mdstr_table[14]) +/* "allow" */ +#define GRPC_MDSTR_ALLOW (&grpc_static_mdstr_table[15]) +/* ":authority" */ +#define GRPC_MDSTR_AUTHORITY (&grpc_static_mdstr_table[16]) +/* "authorization" */ +#define GRPC_MDSTR_AUTHORIZATION (&grpc_static_mdstr_table[17]) +/* "cache-control" */ +#define GRPC_MDSTR_CACHE_CONTROL (&grpc_static_mdstr_table[18]) +/* "content-disposition" */ +#define GRPC_MDSTR_CONTENT_DISPOSITION (&grpc_static_mdstr_table[19]) +/* "content-encoding" */ +#define GRPC_MDSTR_CONTENT_ENCODING (&grpc_static_mdstr_table[20]) +/* "content-language" */ +#define GRPC_MDSTR_CONTENT_LANGUAGE (&grpc_static_mdstr_table[21]) +/* "content-length" */ +#define GRPC_MDSTR_CONTENT_LENGTH (&grpc_static_mdstr_table[22]) +/* "content-location" */ +#define GRPC_MDSTR_CONTENT_LOCATION (&grpc_static_mdstr_table[23]) +/* "content-range" */ +#define GRPC_MDSTR_CONTENT_RANGE (&grpc_static_mdstr_table[24]) +/* "content-type" */ +#define GRPC_MDSTR_CONTENT_TYPE (&grpc_static_mdstr_table[25]) +/* "cookie" */ +#define GRPC_MDSTR_COOKIE (&grpc_static_mdstr_table[26]) +/* "date" */ +#define GRPC_MDSTR_DATE (&grpc_static_mdstr_table[27]) +/* "" */ +#define GRPC_MDSTR_EMPTY (&grpc_static_mdstr_table[28]) +/* "etag" */ +#define GRPC_MDSTR_ETAG (&grpc_static_mdstr_table[29]) +/* "expect" */ +#define GRPC_MDSTR_EXPECT (&grpc_static_mdstr_table[30]) +/* "expires" */ +#define GRPC_MDSTR_EXPIRES (&grpc_static_mdstr_table[31]) +/* "from" */ +#define GRPC_MDSTR_FROM (&grpc_static_mdstr_table[32]) +/* "GET" */ +#define GRPC_MDSTR_GET (&grpc_static_mdstr_table[33]) +/* "grpc" */ +#define GRPC_MDSTR_GRPC (&grpc_static_mdstr_table[34]) +/* "grpc-accept-encoding" */ +#define GRPC_MDSTR_GRPC_ACCEPT_ENCODING (&grpc_static_mdstr_table[35]) +/* "grpc-encoding" */ +#define GRPC_MDSTR_GRPC_ENCODING (&grpc_static_mdstr_table[36]) +/* "grpc-message" */ +#define GRPC_MDSTR_GRPC_MESSAGE (&grpc_static_mdstr_table[37]) +/* "grpc-status" */ +#define GRPC_MDSTR_GRPC_STATUS (&grpc_static_mdstr_table[38]) +/* "grpc-timeout" */ +#define GRPC_MDSTR_GRPC_TIMEOUT (&grpc_static_mdstr_table[39]) +/* "gzip, deflate" */ +#define GRPC_MDSTR_GZIP_COMMA_DEFLATE (&grpc_static_mdstr_table[40]) +/* "host" */ +#define GRPC_MDSTR_HOST (&grpc_static_mdstr_table[41]) +/* "http" */ +#define GRPC_MDSTR_HTTP (&grpc_static_mdstr_table[42]) +/* "https" */ +#define GRPC_MDSTR_HTTPS (&grpc_static_mdstr_table[43]) +/* "if-match" */ +#define GRPC_MDSTR_IF_MATCH (&grpc_static_mdstr_table[44]) +/* "if-modified-since" */ +#define GRPC_MDSTR_IF_MODIFIED_SINCE (&grpc_static_mdstr_table[45]) +/* "if-none-match" */ +#define GRPC_MDSTR_IF_NONE_MATCH (&grpc_static_mdstr_table[46]) +/* "if-range" */ +#define GRPC_MDSTR_IF_RANGE (&grpc_static_mdstr_table[47]) +/* "if-unmodified-since" */ +#define GRPC_MDSTR_IF_UNMODIFIED_SINCE (&grpc_static_mdstr_table[48]) +/* "last-modified" */ +#define GRPC_MDSTR_LAST_MODIFIED (&grpc_static_mdstr_table[49]) +/* "link" */ +#define GRPC_MDSTR_LINK (&grpc_static_mdstr_table[50]) +/* "location" */ +#define GRPC_MDSTR_LOCATION (&grpc_static_mdstr_table[51]) +/* "max-forwards" */ +#define GRPC_MDSTR_MAX_FORWARDS (&grpc_static_mdstr_table[52]) +/* ":method" */ +#define GRPC_MDSTR_METHOD (&grpc_static_mdstr_table[53]) +/* ":path" */ +#define GRPC_MDSTR_PATH (&grpc_static_mdstr_table[54]) +/* "POST" */ +#define GRPC_MDSTR_POST (&grpc_static_mdstr_table[55]) +/* "proxy-authenticate" */ +#define GRPC_MDSTR_PROXY_AUTHENTICATE (&grpc_static_mdstr_table[56]) +/* "proxy-authorization" */ +#define GRPC_MDSTR_PROXY_AUTHORIZATION (&grpc_static_mdstr_table[57]) +/* "range" */ +#define GRPC_MDSTR_RANGE (&grpc_static_mdstr_table[58]) +/* "referer" */ +#define GRPC_MDSTR_REFERER (&grpc_static_mdstr_table[59]) +/* "refresh" */ +#define GRPC_MDSTR_REFRESH (&grpc_static_mdstr_table[60]) +/* "retry-after" */ +#define GRPC_MDSTR_RETRY_AFTER (&grpc_static_mdstr_table[61]) +/* ":scheme" */ +#define GRPC_MDSTR_SCHEME (&grpc_static_mdstr_table[62]) +/* "server" */ +#define GRPC_MDSTR_SERVER (&grpc_static_mdstr_table[63]) +/* "set-cookie" */ +#define GRPC_MDSTR_SET_COOKIE (&grpc_static_mdstr_table[64]) +/* "/" */ +#define GRPC_MDSTR_SLASH (&grpc_static_mdstr_table[65]) +/* "/index.html" */ +#define GRPC_MDSTR_SLASH_INDEX_DOT_HTML (&grpc_static_mdstr_table[66]) +/* ":status" */ +#define GRPC_MDSTR_STATUS (&grpc_static_mdstr_table[67]) +/* "strict-transport-security" */ +#define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY (&grpc_static_mdstr_table[68]) +/* "te" */ +#define GRPC_MDSTR_TE (&grpc_static_mdstr_table[69]) +/* "trailers" */ +#define GRPC_MDSTR_TRAILERS (&grpc_static_mdstr_table[70]) +/* "transfer-encoding" */ +#define GRPC_MDSTR_TRANSFER_ENCODING (&grpc_static_mdstr_table[71]) +/* "user-agent" */ +#define GRPC_MDSTR_USER_AGENT (&grpc_static_mdstr_table[72]) +/* "vary" */ +#define GRPC_MDSTR_VARY (&grpc_static_mdstr_table[73]) +/* "via" */ +#define GRPC_MDSTR_VIA (&grpc_static_mdstr_table[74]) +/* "www-authenticate" */ +#define GRPC_MDSTR_WWW_AUTHENTICATE (&grpc_static_mdstr_table[75]) + +#define GRPC_STATIC_MDELEM_COUNT 65 +extern grpc_mdelem grpc_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT]; +/* "accept-charset": "" */ +#define GRPC_MDELEM_ACCEPT_CHARSET_EMPTY (&grpc_static_mdelem_table[0]) +/* "accept": "" */ +#define GRPC_MDELEM_ACCEPT_EMPTY (&grpc_static_mdelem_table[1]) +/* "accept-encoding": "" */ +#define GRPC_MDELEM_ACCEPT_ENCODING_EMPTY (&grpc_static_mdelem_table[2]) +/* "accept-encoding": "gzip, deflate" */ +#define GRPC_MDELEM_ACCEPT_ENCODING_GZIP_COMMA_DEFLATE (&grpc_static_mdelem_table[3]) +/* "accept-language": "" */ +#define GRPC_MDELEM_ACCEPT_LANGUAGE_EMPTY (&grpc_static_mdelem_table[4]) +/* "accept-ranges": "" */ +#define GRPC_MDELEM_ACCEPT_RANGES_EMPTY (&grpc_static_mdelem_table[5]) +/* "access-control-allow-origin": "" */ +#define GRPC_MDELEM_ACCESS_CONTROL_ALLOW_ORIGIN_EMPTY (&grpc_static_mdelem_table[6]) +/* "age": "" */ +#define GRPC_MDELEM_AGE_EMPTY (&grpc_static_mdelem_table[7]) +/* "allow": "" */ +#define GRPC_MDELEM_ALLOW_EMPTY (&grpc_static_mdelem_table[8]) +/* ":authority": "" */ +#define GRPC_MDELEM_AUTHORITY_EMPTY (&grpc_static_mdelem_table[9]) +/* "authorization": "" */ +#define GRPC_MDELEM_AUTHORIZATION_EMPTY (&grpc_static_mdelem_table[10]) +/* "cache-control": "" */ +#define GRPC_MDELEM_CACHE_CONTROL_EMPTY (&grpc_static_mdelem_table[11]) +/* "content-disposition": "" */ +#define GRPC_MDELEM_CONTENT_DISPOSITION_EMPTY (&grpc_static_mdelem_table[12]) +/* "content-encoding": "" */ +#define GRPC_MDELEM_CONTENT_ENCODING_EMPTY (&grpc_static_mdelem_table[13]) +/* "content-language": "" */ +#define GRPC_MDELEM_CONTENT_LANGUAGE_EMPTY (&grpc_static_mdelem_table[14]) +/* "content-length": "" */ +#define GRPC_MDELEM_CONTENT_LENGTH_EMPTY (&grpc_static_mdelem_table[15]) +/* "content-location": "" */ +#define GRPC_MDELEM_CONTENT_LOCATION_EMPTY (&grpc_static_mdelem_table[16]) +/* "content-range": "" */ +#define GRPC_MDELEM_CONTENT_RANGE_EMPTY (&grpc_static_mdelem_table[17]) +/* "content-type": "" */ +#define GRPC_MDELEM_CONTENT_TYPE_EMPTY (&grpc_static_mdelem_table[18]) +/* "cookie": "" */ +#define GRPC_MDELEM_COOKIE_EMPTY (&grpc_static_mdelem_table[19]) +/* "date": "" */ +#define GRPC_MDELEM_DATE_EMPTY (&grpc_static_mdelem_table[20]) +/* "etag": "" */ +#define GRPC_MDELEM_ETAG_EMPTY (&grpc_static_mdelem_table[21]) +/* "expect": "" */ +#define GRPC_MDELEM_EXPECT_EMPTY (&grpc_static_mdelem_table[22]) +/* "expires": "" */ +#define GRPC_MDELEM_EXPIRES_EMPTY (&grpc_static_mdelem_table[23]) +/* "from": "" */ +#define GRPC_MDELEM_FROM_EMPTY (&grpc_static_mdelem_table[24]) +/* "grpc-status": "0" */ +#define GRPC_MDELEM_GRPC_STATUS_0 (&grpc_static_mdelem_table[25]) +/* "host": "" */ +#define GRPC_MDELEM_HOST_EMPTY (&grpc_static_mdelem_table[26]) +/* "if-match": "" */ +#define GRPC_MDELEM_IF_MATCH_EMPTY (&grpc_static_mdelem_table[27]) +/* "if-modified-since": "" */ +#define GRPC_MDELEM_IF_MODIFIED_SINCE_EMPTY (&grpc_static_mdelem_table[28]) +/* "if-none-match": "" */ +#define GRPC_MDELEM_IF_NONE_MATCH_EMPTY (&grpc_static_mdelem_table[29]) +/* "if-range": "" */ +#define GRPC_MDELEM_IF_RANGE_EMPTY (&grpc_static_mdelem_table[30]) +/* "if-unmodified-since": "" */ +#define GRPC_MDELEM_IF_UNMODIFIED_SINCE_EMPTY (&grpc_static_mdelem_table[31]) +/* "last-modified": "" */ +#define GRPC_MDELEM_LAST_MODIFIED_EMPTY (&grpc_static_mdelem_table[32]) +/* "link": "" */ +#define GRPC_MDELEM_LINK_EMPTY (&grpc_static_mdelem_table[33]) +/* "location": "" */ +#define GRPC_MDELEM_LOCATION_EMPTY (&grpc_static_mdelem_table[34]) +/* "max-forwards": "" */ +#define GRPC_MDELEM_MAX_FORWARDS_EMPTY (&grpc_static_mdelem_table[35]) +/* ":method": "GET" */ +#define GRPC_MDELEM_METHOD_GET (&grpc_static_mdelem_table[36]) +/* ":method": "POST" */ +#define GRPC_MDELEM_METHOD_POST (&grpc_static_mdelem_table[37]) +/* ":path": "/" */ +#define GRPC_MDELEM_PATH_SLASH (&grpc_static_mdelem_table[38]) +/* ":path": "/index.html" */ +#define GRPC_MDELEM_PATH_SLASH_INDEX_DOT_HTML (&grpc_static_mdelem_table[39]) +/* "proxy-authenticate": "" */ +#define GRPC_MDELEM_PROXY_AUTHENTICATE_EMPTY (&grpc_static_mdelem_table[40]) +/* "proxy-authorization": "" */ +#define GRPC_MDELEM_PROXY_AUTHORIZATION_EMPTY (&grpc_static_mdelem_table[41]) +/* "range": "" */ +#define GRPC_MDELEM_RANGE_EMPTY (&grpc_static_mdelem_table[42]) +/* "referer": "" */ +#define GRPC_MDELEM_REFERER_EMPTY (&grpc_static_mdelem_table[43]) +/* "refresh": "" */ +#define GRPC_MDELEM_REFRESH_EMPTY (&grpc_static_mdelem_table[44]) +/* "retry-after": "" */ +#define GRPC_MDELEM_RETRY_AFTER_EMPTY (&grpc_static_mdelem_table[45]) +/* ":scheme": "grpc" */ +#define GRPC_MDELEM_SCHEME_GRPC (&grpc_static_mdelem_table[46]) +/* ":scheme": "http" */ +#define GRPC_MDELEM_SCHEME_HTTP (&grpc_static_mdelem_table[47]) +/* ":scheme": "https" */ +#define GRPC_MDELEM_SCHEME_HTTPS (&grpc_static_mdelem_table[48]) +/* "server": "" */ +#define GRPC_MDELEM_SERVER_EMPTY (&grpc_static_mdelem_table[49]) +/* "set-cookie": "" */ +#define GRPC_MDELEM_SET_COOKIE_EMPTY (&grpc_static_mdelem_table[50]) +/* ":status": "200" */ +#define GRPC_MDELEM_STATUS_200 (&grpc_static_mdelem_table[51]) +/* ":status": "204" */ +#define GRPC_MDELEM_STATUS_204 (&grpc_static_mdelem_table[52]) +/* ":status": "206" */ +#define GRPC_MDELEM_STATUS_206 (&grpc_static_mdelem_table[53]) +/* ":status": "304" */ +#define GRPC_MDELEM_STATUS_304 (&grpc_static_mdelem_table[54]) +/* ":status": "400" */ +#define GRPC_MDELEM_STATUS_400 (&grpc_static_mdelem_table[55]) +/* ":status": "404" */ +#define GRPC_MDELEM_STATUS_404 (&grpc_static_mdelem_table[56]) +/* ":status": "500" */ +#define GRPC_MDELEM_STATUS_500 (&grpc_static_mdelem_table[57]) +/* "strict-transport-security": "" */ +#define GRPC_MDELEM_STRICT_TRANSPORT_SECURITY_EMPTY (&grpc_static_mdelem_table[58]) +/* "te": "trailers" */ +#define GRPC_MDELEM_TE_TRAILERS (&grpc_static_mdelem_table[59]) +/* "transfer-encoding": "" */ +#define GRPC_MDELEM_TRANSFER_ENCODING_EMPTY (&grpc_static_mdelem_table[60]) +/* "user-agent": "" */ +#define GRPC_MDELEM_USER_AGENT_EMPTY (&grpc_static_mdelem_table[61]) +/* "vary": "" */ +#define GRPC_MDELEM_VARY_EMPTY (&grpc_static_mdelem_table[62]) +/* "via": "" */ +#define GRPC_MDELEM_VIA_EMPTY (&grpc_static_mdelem_table[63]) +/* "www-authenticate": "" */ +#define GRPC_MDELEM_WWW_AUTHENTICATE_EMPTY (&grpc_static_mdelem_table[64]) + +gpr_uint8 grpc_static_metadata_elem_indices[GRPC_STATIC_MDELEM_COUNT*2]; +const char *grpc_static_metadata_strings[GRPC_STATIC_MDSTR_COUNT]; +#endif /* GRPC_INTERNAL_CORE_TRANSPORT_STATIC_METADATA_H */ diff --git a/tools/codegen/core/gen_static_metadata.py b/tools/codegen/core/gen_static_metadata.py new file mode 100755 index 0000000000..f1492d5574 --- /dev/null +++ b/tools/codegen/core/gen_static_metadata.py @@ -0,0 +1,266 @@ +#!/usr/bin/env python2.7 + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import hashlib +import itertools +import os +import sys + +# configuration: a list of either strings or 2-tuples of strings +# a single string represents a static grpc_mdstr +# a 2-tuple represents a static grpc_mdelem (and appropriate grpc_mdstrs will +# also be created) + +CONFIG = [ + 'grpc-timeout', + ':path', + 'grpc-encoding', + 'grpc-accept-encoding', + 'user-agent', + ':authority', + 'host', + 'grpc-message', + 'grpc-status', + '', + ('grpc-status', '0'), + ('te', 'trailers'), + (':method', 'POST'), + (':status', '200'), + (':status', '404'), + (':scheme', 'http'), + (':scheme', 'https'), + (':scheme', 'grpc'), + (':authority', ''), + (':method', 'GET'), + (':path', '/'), + (':path', '/index.html'), + (':status', '204'), + (':status', '206'), + (':status', '304'), + (':status', '400'), + (':status', '500'), + ('accept-charset', ''), + ('accept-encoding', ''), + ('accept-encoding', 'gzip, deflate'), + ('accept-language', ''), + ('accept-ranges', ''), + ('accept', ''), + ('access-control-allow-origin', ''), + ('age', ''), + ('allow', ''), + ('authorization', ''), + ('cache-control', ''), + ('content-disposition', ''), + ('content-encoding', ''), + ('content-language', ''), + ('content-length', ''), + ('content-location', ''), + ('content-range', ''), + ('content-type', ''), + ('cookie', ''), + ('date', ''), + ('etag', ''), + ('expect', ''), + ('expires', ''), + ('from', ''), + ('host', ''), + ('if-match', ''), + ('if-modified-since', ''), + ('if-none-match', ''), + ('if-range', ''), + ('if-unmodified-since', ''), + ('last-modified', ''), + ('link', ''), + ('location', ''), + ('max-forwards', ''), + ('proxy-authenticate', ''), + ('proxy-authorization', ''), + ('range', ''), + ('referer', ''), + ('refresh', ''), + ('retry-after', ''), + ('server', ''), + ('set-cookie', ''), + ('strict-transport-security', ''), + ('transfer-encoding', ''), + ('user-agent', ''), + ('vary', ''), + ('via', ''), + ('www-authenticate', ''), +] + +# utility: mangle the name of a config +def mangle(elem): + xl = { + '-': '_', + ':': '', + '/': 'slash', + '.': 'dot', + ',': 'comma', + ' ': '_', + } + def m0(x): + if not x: return 'empty' + r = '' + for c in x: + put = xl.get(c, c.lower()) + if not put: continue + last_is_underscore = r[-1] == '_' if r else True + if last_is_underscore and put == '_': continue + elif len(put) > 1: + if not last_is_underscore: r += '_' + r += put + r += '_' + else: + r += put + if r[-1] == '_': r = r[:-1] + return r + if isinstance(elem, tuple): + return 'grpc_mdelem_%s_%s' % (m0(elem[0]), m0(elem[1])) + else: + return 'grpc_mdstr_%s' % (m0(elem)) + +# utility: generate some hash value for a string +def fake_hash(elem): + return hashlib.md5(elem).hexdigest()[0:8] + +# utility: print a big comment block into a set of files +def put_banner(files, banner): + for f in files: + print >>f, '/*' + for line in banner: + print >>f, ' * %s' % line + print >>f, ' */' + print >>f + +# build a list of all the strings we need +all_strs = set() +all_elems = set() +for elem in CONFIG: + if isinstance(elem, tuple): + all_strs.add(elem[0]) + all_strs.add(elem[1]) + all_elems.add(elem) + else: + all_strs.add(elem) +all_strs = sorted(list(all_strs), key=mangle) +all_elems = sorted(list(all_elems), key=mangle) + +# output configuration +args = sys.argv[1:] +H = None +C = None +if args: + if 'header' in args: + H = sys.stdout + else: + H = open('/dev/null', 'w') + if 'source' in args: + C = sys.stdout + else: + C = open('/dev/null', 'w') +else: + H = open(os.path.join( + os.path.dirname(sys.argv[0]), '../../../src/core/transport/static_metadata.h'), 'w') + C = open(os.path.join( + os.path.dirname(sys.argv[0]), '../../../src/core/transport/static_metadata.c'), 'w') + +# copy-paste copyright notice from this file +with open(sys.argv[0]) as my_source: + copyright = [] + for line in my_source: + if line[0] != '#': break + for line in my_source: + if line[0] == '#': + copyright.append(line) + break + for line in my_source: + if line[0] != '#': + break + copyright.append(line) + put_banner([H,C], [line[1:].strip() for line in copyright]) + +put_banner([H,C], +"""WARNING: Auto-generated code. + +To make changes to this file, change tools/codegen/core/gen_static_metadata.py, +and then re-run it. +""".splitlines()) + +print >>H, '#ifndef GRPC_INTERNAL_CORE_TRANSPORT_STATIC_METADATA_H' +print >>H, '#define GRPC_INTERNAL_CORE_TRANSPORT_STATIC_METADATA_H' +print >>H +print >>H, '#include "src/core/transport/metadata.h"' +print >>H + +print >>C, '#include "src/core/transport/static_metadata.h"' +print >>C + +print >>H, '#define GRPC_STATIC_MDSTR_COUNT %d' % len(all_strs) +print >>H, 'extern grpc_mdstr grpc_static_mdstr_table[GRPC_STATIC_MDSTR_COUNT];' +for i, elem in enumerate(all_strs): + print >>H, '/* "%s" */' % elem + print >>H, '#define %s (&grpc_static_mdstr_table[%d])' % (mangle(elem).upper(), i) +print >>H +print >>C, 'grpc_mdstr grpc_static_mdstr_table[GRPC_STATIC_MDSTR_COUNT];' +print >>C + +print >>H, '#define GRPC_STATIC_MDELEM_COUNT %d' % len(all_elems) +print >>H, 'extern grpc_mdelem grpc_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];' +for i, elem in enumerate(all_elems): + print >>H, '/* "%s": "%s" */' % elem + print >>H, '#define %s (&grpc_static_mdelem_table[%d])' % (mangle(elem).upper(), i) +print >>H +print >>C, 'grpc_mdelem grpc_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];' +print >>C + +def str_idx(s): + for i, s2 in enumerate(all_strs): + if s == s2: + return i + +print >>H, 'gpr_uint8 grpc_static_metadata_elem_indices[GRPC_STATIC_MDELEM_COUNT*2];' +print >>C, 'gpr_uint8 grpc_static_metadata_elem_indices[GRPC_STATIC_MDELEM_COUNT*2] = {' +print >>C, ','.join('%d' % str_idx(x) for x in itertools.chain.from_iterable([a,b] for a, b in all_elems)) +print >>C, '};' +print >>C + +print >>H, 'const char *grpc_static_metadata_strings[GRPC_STATIC_MDSTR_COUNT];' +print >>C, 'const char *grpc_static_metadata_strings[GRPC_STATIC_MDSTR_COUNT] = {' +print >>C, '%s' % ',\n'.join(' "%s"' % s for s in all_strs) +print >>C, '};' +print >>C + +print >>H, '#endif /* GRPC_INTERNAL_CORE_TRANSPORT_STATIC_METADATA_H */' + +H.close() +C.close() + diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 4ce48b4790..e3dc181511 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -891,6 +891,7 @@ src/core/transport/chttp2_transport.h \ src/core/transport/connectivity_state.h \ src/core/transport/metadata.h \ src/core/transport/metadata_batch.h \ +src/core/transport/static_metadata.h \ src/core/transport/transport.h \ src/core/transport/transport_impl.h \ src/core/census/aggregation.h \ @@ -1039,6 +1040,7 @@ src/core/transport/chttp2_transport.c \ src/core/transport/connectivity_state.c \ src/core/transport/metadata.c \ src/core/transport/metadata_batch.c \ +src/core/transport/static_metadata.c \ src/core/transport/transport.c \ src/core/transport/transport_op_string.c \ src/core/census/context.c \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index d3493bbe2c..485fe870d0 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -14123,6 +14123,7 @@ "src/core/transport/connectivity_state.h", "src/core/transport/metadata.h", "src/core/transport/metadata_batch.h", + "src/core/transport/static_metadata.h", "src/core/transport/transport.h", "src/core/transport/transport_impl.h", "src/core/tsi/fake_transport_security.h", @@ -14407,6 +14408,8 @@ "src/core/transport/metadata.h", "src/core/transport/metadata_batch.c", "src/core/transport/metadata_batch.h", + "src/core/transport/static_metadata.c", + "src/core/transport/static_metadata.h", "src/core/transport/transport.c", "src/core/transport/transport.h", "src/core/transport/transport_impl.h", @@ -14626,6 +14629,7 @@ "src/core/transport/connectivity_state.h", "src/core/transport/metadata.h", "src/core/transport/metadata_batch.h", + "src/core/transport/static_metadata.h", "src/core/transport/transport.h", "src/core/transport/transport_impl.h" ], @@ -14879,6 +14883,8 @@ "src/core/transport/metadata.h", "src/core/transport/metadata_batch.c", "src/core/transport/metadata_batch.h", + "src/core/transport/static_metadata.c", + "src/core/transport/static_metadata.h", "src/core/transport/transport.c", "src/core/transport/transport.h", "src/core/transport/transport_impl.h", diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index 0ca87340ec..2345f8569e 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -377,6 +377,7 @@ <ClInclude Include="..\..\..\src\core\transport\connectivity_state.h" /> <ClInclude Include="..\..\..\src\core\transport\metadata.h" /> <ClInclude Include="..\..\..\src\core\transport\metadata_batch.h" /> + <ClInclude Include="..\..\..\src\core\transport\static_metadata.h" /> <ClInclude Include="..\..\..\src\core\transport\transport.h" /> <ClInclude Include="..\..\..\src\core\transport\transport_impl.h" /> <ClInclude Include="..\..\..\src\core\census\aggregation.h" /> @@ -670,6 +671,8 @@ </ClCompile> <ClCompile Include="..\..\..\src\core\transport\metadata_batch.c"> </ClCompile> + <ClCompile Include="..\..\..\src\core\transport\static_metadata.c"> + </ClCompile> <ClCompile Include="..\..\..\src\core\transport\transport.c"> </ClCompile> <ClCompile Include="..\..\..\src\core\transport\transport_op_string.c"> diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index daace3083e..16d7d8aaed 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -430,6 +430,9 @@ <ClCompile Include="..\..\..\src\core\transport\metadata_batch.c"> <Filter>src\core\transport</Filter> </ClCompile> + <ClCompile Include="..\..\..\src\core\transport\static_metadata.c"> + <Filter>src\core\transport</Filter> + </ClCompile> <ClCompile Include="..\..\..\src\core\transport\transport.c"> <Filter>src\core\transport</Filter> </ClCompile> @@ -845,6 +848,9 @@ <ClInclude Include="..\..\..\src\core\transport\metadata_batch.h"> <Filter>src\core\transport</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\core\transport\static_metadata.h"> + <Filter>src\core\transport</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\core\transport\transport.h"> <Filter>src\core\transport</Filter> </ClInclude> diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index 617e0d1396..efc99fee73 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -356,6 +356,7 @@ <ClInclude Include="..\..\..\src\core\transport\connectivity_state.h" /> <ClInclude Include="..\..\..\src\core\transport\metadata.h" /> <ClInclude Include="..\..\..\src\core\transport\metadata_batch.h" /> + <ClInclude Include="..\..\..\src\core\transport\static_metadata.h" /> <ClInclude Include="..\..\..\src\core\transport\transport.h" /> <ClInclude Include="..\..\..\src\core\transport\transport_impl.h" /> <ClInclude Include="..\..\..\src\core\census\aggregation.h" /> @@ -609,6 +610,8 @@ </ClCompile> <ClCompile Include="..\..\..\src\core\transport\metadata_batch.c"> </ClCompile> + <ClCompile Include="..\..\..\src\core\transport\static_metadata.c"> + </ClCompile> <ClCompile Include="..\..\..\src\core\transport\transport.c"> </ClCompile> <ClCompile Include="..\..\..\src\core\transport\transport_op_string.c"> diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index f23bd66463..2eb7849bec 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -370,6 +370,9 @@ <ClCompile Include="..\..\..\src\core\transport\metadata_batch.c"> <Filter>src\core\transport</Filter> </ClCompile> + <ClCompile Include="..\..\..\src\core\transport\static_metadata.c"> + <Filter>src\core\transport</Filter> + </ClCompile> <ClCompile Include="..\..\..\src\core\transport\transport.c"> <Filter>src\core\transport</Filter> </ClCompile> @@ -743,6 +746,9 @@ <ClInclude Include="..\..\..\src\core\transport\metadata_batch.h"> <Filter>src\core\transport</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\core\transport\static_metadata.h"> + <Filter>src\core\transport</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\core\transport\transport.h"> <Filter>src\core\transport</Filter> </ClInclude> -- GitLab