Index: third_party/grpc/tools/codegen/core/gen_header_frame.py |
diff --git a/third_party/grpc/tools/codegen/core/gen_header_frame.py b/third_party/grpc/tools/codegen/core/gen_header_frame.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..96e6c67fa668a5863d2ada60ae8ae3d2ae883fb7 |
--- /dev/null |
+++ b/third_party/grpc/tools/codegen/core/gen_header_frame.py |
@@ -0,0 +1,105 @@ |
+#!/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. |
+ |
+"""Read from stdin a set of colon separated http headers: |
+ :path: /foo/bar |
+ content-type: application/grpc |
+ Write a set of strings containing a hpack encoded http2 frame that |
+ represents said headers.""" |
+ |
+import json |
+import sys |
+ |
+# parse input, fill in vals |
+vals = [] |
+for line in sys.stdin: |
+ line = line.strip() |
+ if line == '': continue |
+ if line[0] == '#': continue |
+ key_tail, value = line[1:].split(':') |
+ key = (line[0] + key_tail).strip() |
+ value = value.strip() |
+ vals.append((key, value)) |
+ |
+# generate frame payload binary data |
+payload_bytes = [[]] # reserve space for header |
+payload_len = 0 |
+for key, value in vals: |
+ payload_line = [] |
+ payload_line.append(0x10) |
+ assert(len(key) <= 126) |
+ payload_line.append(len(key)) |
+ payload_line.extend(ord(c) for c in key) |
+ assert(len(value) <= 126) |
+ payload_line.append(len(value)) |
+ payload_line.extend(ord(c) for c in value) |
+ payload_len += len(payload_line) |
+ payload_bytes.append(payload_line) |
+ |
+# fill in header |
+payload_bytes[0].extend([ |
+ (payload_len >> 16) & 0xff, |
+ (payload_len >> 8) & 0xff, |
+ (payload_len) & 0xff, |
+ # header frame |
+ 0x01, |
+ # flags |
+ 0x04, |
+ # stream id |
+ 0x00, |
+ 0x00, |
+ 0x00, |
+ 0x01 |
+]) |
+ |
+hex_bytes = [ord(c) for c in "abcdefABCDEF0123456789"] |
+ |
+def esc_c(line): |
+ out = "\"" |
+ last_was_hex = False |
+ for c in line: |
+ if 32 <= c < 127: |
+ if c in hex_bytes and last_was_hex: |
+ out += "\"\"" |
+ if c != ord('"'): |
+ out += chr(c) |
+ else: |
+ out += "\\\"" |
+ last_was_hex = False |
+ else: |
+ out += "\\x%02x" % c |
+ last_was_hex = True |
+ return out + "\"" |
+ |
+# dump bytes |
+for line in payload_bytes: |
+ print esc_c(line) |
+ |