1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2019 the gRPC authors. 2*cc02d7e2SAndroid Build Coastguard Worker# 3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*cc02d7e2SAndroid Build Coastguard Worker# 7*cc02d7e2SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*cc02d7e2SAndroid Build Coastguard Worker# 9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License. 14*cc02d7e2SAndroid Build Coastguard Worker"""An example of compression on the server side with gRPC.""" 15*cc02d7e2SAndroid Build Coastguard Worker 16*cc02d7e2SAndroid Build Coastguard Workerfrom __future__ import absolute_import 17*cc02d7e2SAndroid Build Coastguard Workerfrom __future__ import division 18*cc02d7e2SAndroid Build Coastguard Workerfrom __future__ import print_function 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard Workerimport argparse 21*cc02d7e2SAndroid Build Coastguard Workerfrom concurrent import futures 22*cc02d7e2SAndroid Build Coastguard Workerimport logging 23*cc02d7e2SAndroid Build Coastguard Workerimport threading 24*cc02d7e2SAndroid Build Coastguard Worker 25*cc02d7e2SAndroid Build Coastguard Workerimport grpc 26*cc02d7e2SAndroid Build Coastguard Workerimport helloworld_pb2 27*cc02d7e2SAndroid Build Coastguard Workerimport helloworld_pb2_grpc 28*cc02d7e2SAndroid Build Coastguard Worker 29*cc02d7e2SAndroid Build Coastguard Worker_DESCRIPTION = "A server capable of compression." 30*cc02d7e2SAndroid Build Coastguard Worker_COMPRESSION_OPTIONS = { 31*cc02d7e2SAndroid Build Coastguard Worker "none": grpc.Compression.NoCompression, 32*cc02d7e2SAndroid Build Coastguard Worker "deflate": grpc.Compression.Deflate, 33*cc02d7e2SAndroid Build Coastguard Worker "gzip": grpc.Compression.Gzip, 34*cc02d7e2SAndroid Build Coastguard Worker} 35*cc02d7e2SAndroid Build Coastguard Worker_LOGGER = logging.getLogger(__name__) 36*cc02d7e2SAndroid Build Coastguard Worker 37*cc02d7e2SAndroid Build Coastguard Worker_SERVER_HOST = "localhost" 38*cc02d7e2SAndroid Build Coastguard Worker 39*cc02d7e2SAndroid Build Coastguard Worker 40*cc02d7e2SAndroid Build Coastguard Workerclass Greeter(helloworld_pb2_grpc.GreeterServicer): 41*cc02d7e2SAndroid Build Coastguard Worker def __init__(self, no_compress_every_n): 42*cc02d7e2SAndroid Build Coastguard Worker super(Greeter, self).__init__() 43*cc02d7e2SAndroid Build Coastguard Worker self._no_compress_every_n = no_compress_every_n 44*cc02d7e2SAndroid Build Coastguard Worker self._request_counter = 0 45*cc02d7e2SAndroid Build Coastguard Worker self._counter_lock = threading.RLock() 46*cc02d7e2SAndroid Build Coastguard Worker 47*cc02d7e2SAndroid Build Coastguard Worker def _should_suppress_compression(self): 48*cc02d7e2SAndroid Build Coastguard Worker suppress_compression = False 49*cc02d7e2SAndroid Build Coastguard Worker with self._counter_lock: 50*cc02d7e2SAndroid Build Coastguard Worker if ( 51*cc02d7e2SAndroid Build Coastguard Worker self._no_compress_every_n 52*cc02d7e2SAndroid Build Coastguard Worker and self._request_counter % self._no_compress_every_n == 0 53*cc02d7e2SAndroid Build Coastguard Worker ): 54*cc02d7e2SAndroid Build Coastguard Worker suppress_compression = True 55*cc02d7e2SAndroid Build Coastguard Worker self._request_counter += 1 56*cc02d7e2SAndroid Build Coastguard Worker return suppress_compression 57*cc02d7e2SAndroid Build Coastguard Worker 58*cc02d7e2SAndroid Build Coastguard Worker def SayHello(self, request, context): 59*cc02d7e2SAndroid Build Coastguard Worker if self._should_suppress_compression(): 60*cc02d7e2SAndroid Build Coastguard Worker context.set_compression(grpc.Compression.NoCompression) 61*cc02d7e2SAndroid Build Coastguard Worker return helloworld_pb2.HelloReply(message="Hello, %s!" % request.name) 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard Worker 64*cc02d7e2SAndroid Build Coastguard Workerdef run_server(server_compression, no_compress_every_n, port): 65*cc02d7e2SAndroid Build Coastguard Worker server = grpc.server( 66*cc02d7e2SAndroid Build Coastguard Worker futures.ThreadPoolExecutor(), 67*cc02d7e2SAndroid Build Coastguard Worker compression=server_compression, 68*cc02d7e2SAndroid Build Coastguard Worker options=(("grpc.so_reuseport", 1),), 69*cc02d7e2SAndroid Build Coastguard Worker ) 70*cc02d7e2SAndroid Build Coastguard Worker helloworld_pb2_grpc.add_GreeterServicer_to_server( 71*cc02d7e2SAndroid Build Coastguard Worker Greeter(no_compress_every_n), server 72*cc02d7e2SAndroid Build Coastguard Worker ) 73*cc02d7e2SAndroid Build Coastguard Worker address = "{}:{}".format(_SERVER_HOST, port) 74*cc02d7e2SAndroid Build Coastguard Worker server.add_insecure_port(address) 75*cc02d7e2SAndroid Build Coastguard Worker server.start() 76*cc02d7e2SAndroid Build Coastguard Worker print("Server listening at '{}'".format(address)) 77*cc02d7e2SAndroid Build Coastguard Worker server.wait_for_termination() 78*cc02d7e2SAndroid Build Coastguard Worker 79*cc02d7e2SAndroid Build Coastguard Worker 80*cc02d7e2SAndroid Build Coastguard Workerdef main(): 81*cc02d7e2SAndroid Build Coastguard Worker parser = argparse.ArgumentParser(description=_DESCRIPTION) 82*cc02d7e2SAndroid Build Coastguard Worker parser.add_argument( 83*cc02d7e2SAndroid Build Coastguard Worker "--server_compression", 84*cc02d7e2SAndroid Build Coastguard Worker default="none", 85*cc02d7e2SAndroid Build Coastguard Worker nargs="?", 86*cc02d7e2SAndroid Build Coastguard Worker choices=_COMPRESSION_OPTIONS.keys(), 87*cc02d7e2SAndroid Build Coastguard Worker help="The default compression method for the server.", 88*cc02d7e2SAndroid Build Coastguard Worker ) 89*cc02d7e2SAndroid Build Coastguard Worker parser.add_argument( 90*cc02d7e2SAndroid Build Coastguard Worker "--no_compress_every_n", 91*cc02d7e2SAndroid Build Coastguard Worker type=int, 92*cc02d7e2SAndroid Build Coastguard Worker default=0, 93*cc02d7e2SAndroid Build Coastguard Worker nargs="?", 94*cc02d7e2SAndroid Build Coastguard Worker help="If set, every nth reply will be uncompressed.", 95*cc02d7e2SAndroid Build Coastguard Worker ) 96*cc02d7e2SAndroid Build Coastguard Worker parser.add_argument( 97*cc02d7e2SAndroid Build Coastguard Worker "--port", 98*cc02d7e2SAndroid Build Coastguard Worker type=int, 99*cc02d7e2SAndroid Build Coastguard Worker default=50051, 100*cc02d7e2SAndroid Build Coastguard Worker nargs="?", 101*cc02d7e2SAndroid Build Coastguard Worker help="The port on which the server will listen.", 102*cc02d7e2SAndroid Build Coastguard Worker ) 103*cc02d7e2SAndroid Build Coastguard Worker args = parser.parse_args() 104*cc02d7e2SAndroid Build Coastguard Worker run_server( 105*cc02d7e2SAndroid Build Coastguard Worker _COMPRESSION_OPTIONS[args.server_compression], 106*cc02d7e2SAndroid Build Coastguard Worker args.no_compress_every_n, 107*cc02d7e2SAndroid Build Coastguard Worker args.port, 108*cc02d7e2SAndroid Build Coastguard Worker ) 109*cc02d7e2SAndroid Build Coastguard Worker 110*cc02d7e2SAndroid Build Coastguard Worker 111*cc02d7e2SAndroid Build Coastguard Workerif __name__ == "__main__": 112*cc02d7e2SAndroid Build Coastguard Worker logging.basicConfig() 113*cc02d7e2SAndroid Build Coastguard Worker main() 114