| 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)
|
| +
|
|
|