mirror of https://github.com/grpc/grpc.git
reviewable/pr12708/r1
commit
1c285b9812
415 changed files with 13151 additions and 5058 deletions
@ -0,0 +1,156 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2017 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H |
||||||
|
#define GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H |
||||||
|
|
||||||
|
#include <grpc/impl/codegen/byte_buffer.h> |
||||||
|
|
||||||
|
#include <grpc++/impl/codegen/config.h> |
||||||
|
#include <grpc++/impl/codegen/core_codegen_interface.h> |
||||||
|
#include <grpc++/impl/codegen/serialization_traits.h> |
||||||
|
#include <grpc++/impl/codegen/slice.h> |
||||||
|
#include <grpc++/impl/codegen/status.h> |
||||||
|
|
||||||
|
#include <vector> |
||||||
|
|
||||||
|
namespace grpc { |
||||||
|
|
||||||
|
template <class R> |
||||||
|
class CallOpRecvMessage; |
||||||
|
class MethodHandler; |
||||||
|
template <class ServiceType, class RequestType, class ResponseType> |
||||||
|
class RpcMethodHandler; |
||||||
|
template <class ServiceType, class RequestType, class ResponseType> |
||||||
|
class ServerStreamingHandler; |
||||||
|
namespace CallOpGenericRecvMessageHelper { |
||||||
|
template <class R> |
||||||
|
class DeserializeFuncType; |
||||||
|
} // namespace CallOpGenericRecvMessageHelper
|
||||||
|
|
||||||
|
/// A sequence of bytes.
|
||||||
|
class ByteBuffer final { |
||||||
|
public: |
||||||
|
/// Constuct an empty buffer.
|
||||||
|
ByteBuffer() : buffer_(nullptr) {} |
||||||
|
|
||||||
|
/// Construct buffer from \a slices, of which there are \a nslices.
|
||||||
|
ByteBuffer(const Slice* slices, size_t nslices); |
||||||
|
|
||||||
|
/// Constuct a byte buffer by referencing elements of existing buffer
|
||||||
|
/// \a buf. Wrapper of core function grpc_byte_buffer_copy
|
||||||
|
ByteBuffer(const ByteBuffer& buf); |
||||||
|
|
||||||
|
~ByteBuffer() { |
||||||
|
if (buffer_) { |
||||||
|
g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ByteBuffer& operator=(const ByteBuffer&); |
||||||
|
|
||||||
|
/// Dump (read) the buffer contents into \a slices.
|
||||||
|
Status Dump(std::vector<Slice>* slices) const; |
||||||
|
|
||||||
|
/// Remove all data.
|
||||||
|
void Clear() { |
||||||
|
if (buffer_) { |
||||||
|
g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); |
||||||
|
buffer_ = nullptr; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// Make a duplicate copy of the internals of this byte
|
||||||
|
/// buffer so that we have our own owned version of it.
|
||||||
|
/// bbuf.Duplicate(); is equivalent to bbuf=bbuf; but is actually readable
|
||||||
|
void Duplicate() { |
||||||
|
buffer_ = g_core_codegen_interface->grpc_byte_buffer_copy(buffer_); |
||||||
|
} |
||||||
|
|
||||||
|
/// Forget underlying byte buffer without destroying
|
||||||
|
/// Use this only for un-owned byte buffers
|
||||||
|
void Release() { buffer_ = nullptr; } |
||||||
|
|
||||||
|
/// Buffer size in bytes.
|
||||||
|
size_t Length() const; |
||||||
|
|
||||||
|
/// Swap the state of *this and *other.
|
||||||
|
void Swap(ByteBuffer* other); |
||||||
|
|
||||||
|
/// Is this ByteBuffer valid?
|
||||||
|
bool Valid() const { return (buffer_ != nullptr); } |
||||||
|
|
||||||
|
private: |
||||||
|
friend class SerializationTraits<ByteBuffer, void>; |
||||||
|
friend class CallOpSendMessage; |
||||||
|
template <class R> |
||||||
|
friend class CallOpRecvMessage; |
||||||
|
friend class CallOpGenericRecvMessage; |
||||||
|
friend class MethodHandler; |
||||||
|
template <class ServiceType, class RequestType, class ResponseType> |
||||||
|
friend class RpcMethodHandler; |
||||||
|
template <class ServiceType, class RequestType, class ResponseType> |
||||||
|
friend class ServerStreamingHandler; |
||||||
|
template <class R> |
||||||
|
friend class CallOpGenericRecvMessageHelper::DeserializeFuncType; |
||||||
|
|
||||||
|
grpc_byte_buffer* buffer_; |
||||||
|
|
||||||
|
// takes ownership
|
||||||
|
void set_buffer(grpc_byte_buffer* buf) { |
||||||
|
if (buffer_) { |
||||||
|
Clear(); |
||||||
|
} |
||||||
|
buffer_ = buf; |
||||||
|
} |
||||||
|
|
||||||
|
grpc_byte_buffer* c_buffer() { return buffer_; } |
||||||
|
grpc_byte_buffer** c_buffer_ptr() { return &buffer_; } |
||||||
|
|
||||||
|
class ByteBufferPointer { |
||||||
|
public: |
||||||
|
ByteBufferPointer(const ByteBuffer* b) |
||||||
|
: bbuf_(const_cast<ByteBuffer*>(b)) {} |
||||||
|
operator ByteBuffer*() { return bbuf_; } |
||||||
|
operator grpc_byte_buffer*() { return bbuf_->buffer_; } |
||||||
|
operator grpc_byte_buffer**() { return &bbuf_->buffer_; } |
||||||
|
|
||||||
|
private: |
||||||
|
ByteBuffer* bbuf_; |
||||||
|
}; |
||||||
|
ByteBufferPointer bbuf_ptr() const { return ByteBufferPointer(this); } |
||||||
|
}; |
||||||
|
|
||||||
|
template <> |
||||||
|
class SerializationTraits<ByteBuffer, void> { |
||||||
|
public: |
||||||
|
static Status Deserialize(ByteBuffer* byte_buffer, ByteBuffer* dest) { |
||||||
|
dest->set_buffer(byte_buffer->buffer_); |
||||||
|
return Status::OK; |
||||||
|
} |
||||||
|
static Status Serialize(const ByteBuffer& source, ByteBuffer* buffer, |
||||||
|
bool* own_buffer) { |
||||||
|
*buffer = source; |
||||||
|
*own_buffer = true; |
||||||
|
return Status::OK; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace grpc
|
||||||
|
|
||||||
|
#endif // GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H
|
@ -0,0 +1,86 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_IMPL_CODEGEN_BYTE_BUFFER_H |
||||||
|
#define GRPC_IMPL_CODEGEN_BYTE_BUFFER_H |
||||||
|
|
||||||
|
#include <grpc/impl/codegen/grpc_types.h> |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
/** Returns a RAW byte buffer instance over the given slices (up to \a nslices).
|
||||||
|
* |
||||||
|
* Increases the reference count for all \a slices processed. The user is |
||||||
|
* responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ |
||||||
|
GRPCAPI grpc_byte_buffer *grpc_raw_byte_buffer_create(grpc_slice *slices, |
||||||
|
size_t nslices); |
||||||
|
|
||||||
|
/** Returns a *compressed* RAW byte buffer instance over the given slices (up to
|
||||||
|
* \a nslices). The \a compression argument defines the compression algorithm |
||||||
|
* used to generate the data in \a slices. |
||||||
|
* |
||||||
|
* Increases the reference count for all \a slices processed. The user is |
||||||
|
* responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ |
||||||
|
GRPCAPI grpc_byte_buffer *grpc_raw_compressed_byte_buffer_create( |
||||||
|
grpc_slice *slices, size_t nslices, grpc_compression_algorithm compression); |
||||||
|
|
||||||
|
/** Copies input byte buffer \a bb.
|
||||||
|
* |
||||||
|
* Increases the reference count of all the source slices. The user is |
||||||
|
* responsible for calling grpc_byte_buffer_destroy over the returned copy. */ |
||||||
|
GRPCAPI grpc_byte_buffer *grpc_byte_buffer_copy(grpc_byte_buffer *bb); |
||||||
|
|
||||||
|
/** Returns the size of the given byte buffer, in bytes. */ |
||||||
|
GRPCAPI size_t grpc_byte_buffer_length(grpc_byte_buffer *bb); |
||||||
|
|
||||||
|
/** Destroys \a byte_buffer deallocating all its memory. */ |
||||||
|
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *byte_buffer); |
||||||
|
|
||||||
|
/** Reader for byte buffers. Iterates over slices in the byte buffer */ |
||||||
|
struct grpc_byte_buffer_reader; |
||||||
|
typedef struct grpc_byte_buffer_reader grpc_byte_buffer_reader; |
||||||
|
|
||||||
|
/** Initialize \a reader to read over \a buffer.
|
||||||
|
* Returns 1 upon success, 0 otherwise. */ |
||||||
|
GRPCAPI int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader *reader, |
||||||
|
grpc_byte_buffer *buffer); |
||||||
|
|
||||||
|
/** Cleanup and destroy \a reader */ |
||||||
|
GRPCAPI void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader *reader); |
||||||
|
|
||||||
|
/** Updates \a slice with the next piece of data from from \a reader and returns
|
||||||
|
* 1. Returns 0 at the end of the stream. Caller is responsible for calling |
||||||
|
* grpc_slice_unref on the result. */ |
||||||
|
GRPCAPI int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader *reader, |
||||||
|
grpc_slice *slice); |
||||||
|
|
||||||
|
/** Merge all data from \a reader into single slice */ |
||||||
|
GRPCAPI grpc_slice |
||||||
|
grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader *reader); |
||||||
|
|
||||||
|
/** Returns a RAW byte buffer instance from the output of \a reader. */ |
||||||
|
GRPCAPI grpc_byte_buffer *grpc_raw_byte_buffer_from_reader( |
||||||
|
grpc_byte_buffer_reader *reader); |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif /* GRPC_IMPL_CODEGEN_BYTE_BUFFER_H */ |
@ -1 +0,0 @@ |
|||||||
@vjpai cpp_generator.cc |
|
@ -0,0 +1,228 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2017 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <grpc/support/alloc.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
|
||||||
|
#include "src/core/lib/compression/stream_compression_gzip.h" |
||||||
|
#include "src/core/lib/iomgr/exec_ctx.h" |
||||||
|
#include "src/core/lib/slice/slice_internal.h" |
||||||
|
|
||||||
|
#define OUTPUT_BLOCK_SIZE (1024) |
||||||
|
|
||||||
|
typedef struct grpc_stream_compression_context_gzip { |
||||||
|
grpc_stream_compression_context base; |
||||||
|
|
||||||
|
z_stream zs; |
||||||
|
int (*flate)(z_stream *zs, int flush); |
||||||
|
} grpc_stream_compression_context_gzip; |
||||||
|
|
||||||
|
static bool gzip_flate(grpc_stream_compression_context_gzip *ctx, |
||||||
|
grpc_slice_buffer *in, grpc_slice_buffer *out, |
||||||
|
size_t *output_size, size_t max_output_size, int flush, |
||||||
|
bool *end_of_context) { |
||||||
|
GPR_ASSERT(flush == 0 || flush == Z_SYNC_FLUSH || flush == Z_FINISH); |
||||||
|
/* Full flush is not allowed when inflating. */ |
||||||
|
GPR_ASSERT(!(ctx->flate == inflate && (flush == Z_FINISH))); |
||||||
|
|
||||||
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; |
||||||
|
int r; |
||||||
|
bool eoc = false; |
||||||
|
size_t original_max_output_size = max_output_size; |
||||||
|
while (max_output_size > 0 && (in->length > 0 || flush) && !eoc) { |
||||||
|
size_t slice_size = max_output_size < OUTPUT_BLOCK_SIZE ? max_output_size |
||||||
|
: OUTPUT_BLOCK_SIZE; |
||||||
|
grpc_slice slice_out = GRPC_SLICE_MALLOC(slice_size); |
||||||
|
ctx->zs.avail_out = (uInt)slice_size; |
||||||
|
ctx->zs.next_out = GRPC_SLICE_START_PTR(slice_out); |
||||||
|
while (ctx->zs.avail_out > 0 && in->length > 0 && !eoc) { |
||||||
|
grpc_slice slice = grpc_slice_buffer_take_first(in); |
||||||
|
ctx->zs.avail_in = (uInt)GRPC_SLICE_LENGTH(slice); |
||||||
|
ctx->zs.next_in = GRPC_SLICE_START_PTR(slice); |
||||||
|
r = ctx->flate(&ctx->zs, Z_NO_FLUSH); |
||||||
|
if (r < 0 && r != Z_BUF_ERROR) { |
||||||
|
gpr_log(GPR_ERROR, "zlib error (%d)", r); |
||||||
|
grpc_slice_unref_internal(&exec_ctx, slice_out); |
||||||
|
grpc_exec_ctx_finish(&exec_ctx); |
||||||
|
return false; |
||||||
|
} else if (r == Z_STREAM_END && ctx->flate == inflate) { |
||||||
|
eoc = true; |
||||||
|
} |
||||||
|
if (ctx->zs.avail_in > 0) { |
||||||
|
grpc_slice_buffer_undo_take_first( |
||||||
|
in, |
||||||
|
grpc_slice_sub(slice, GRPC_SLICE_LENGTH(slice) - ctx->zs.avail_in, |
||||||
|
GRPC_SLICE_LENGTH(slice))); |
||||||
|
} |
||||||
|
grpc_slice_unref_internal(&exec_ctx, slice); |
||||||
|
} |
||||||
|
if (flush != 0 && ctx->zs.avail_out > 0 && !eoc) { |
||||||
|
GPR_ASSERT(in->length == 0); |
||||||
|
r = ctx->flate(&ctx->zs, flush); |
||||||
|
if (flush == Z_SYNC_FLUSH) { |
||||||
|
switch (r) { |
||||||
|
case Z_OK: |
||||||
|
/* Maybe flush is not complete; just made some partial progress. */ |
||||||
|
if (ctx->zs.avail_out > 0) { |
||||||
|
flush = 0; |
||||||
|
} |
||||||
|
break; |
||||||
|
case Z_BUF_ERROR: |
||||||
|
case Z_STREAM_END: |
||||||
|
flush = 0; |
||||||
|
break; |
||||||
|
default: |
||||||
|
gpr_log(GPR_ERROR, "zlib error (%d)", r); |
||||||
|
grpc_slice_unref_internal(&exec_ctx, slice_out); |
||||||
|
grpc_exec_ctx_finish(&exec_ctx); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} else if (flush == Z_FINISH) { |
||||||
|
switch (r) { |
||||||
|
case Z_OK: |
||||||
|
case Z_BUF_ERROR: |
||||||
|
/* Wait for the next loop to assign additional output space. */ |
||||||
|
GPR_ASSERT(ctx->zs.avail_out == 0); |
||||||
|
break; |
||||||
|
case Z_STREAM_END: |
||||||
|
flush = 0; |
||||||
|
break; |
||||||
|
default: |
||||||
|
gpr_log(GPR_ERROR, "zlib error (%d)", r); |
||||||
|
grpc_slice_unref_internal(&exec_ctx, slice_out); |
||||||
|
grpc_exec_ctx_finish(&exec_ctx); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (ctx->zs.avail_out == 0) { |
||||||
|
grpc_slice_buffer_add(out, slice_out); |
||||||
|
} else if (ctx->zs.avail_out < slice_size) { |
||||||
|
slice_out.data.refcounted.length -= ctx->zs.avail_out; |
||||||
|
grpc_slice_buffer_add(out, slice_out); |
||||||
|
} else { |
||||||
|
grpc_slice_unref_internal(&exec_ctx, slice_out); |
||||||
|
} |
||||||
|
max_output_size -= (slice_size - ctx->zs.avail_out); |
||||||
|
} |
||||||
|
grpc_exec_ctx_finish(&exec_ctx); |
||||||
|
if (end_of_context) { |
||||||
|
*end_of_context = eoc; |
||||||
|
} |
||||||
|
if (output_size) { |
||||||
|
*output_size = original_max_output_size - max_output_size; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
static bool grpc_stream_compress_gzip(grpc_stream_compression_context *ctx, |
||||||
|
grpc_slice_buffer *in, |
||||||
|
grpc_slice_buffer *out, |
||||||
|
size_t *output_size, |
||||||
|
size_t max_output_size, |
||||||
|
grpc_stream_compression_flush flush) { |
||||||
|
if (ctx == NULL) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
grpc_stream_compression_context_gzip *gzip_ctx = |
||||||
|
(grpc_stream_compression_context_gzip *)ctx; |
||||||
|
GPR_ASSERT(gzip_ctx->flate == deflate); |
||||||
|
int gzip_flush; |
||||||
|
switch (flush) { |
||||||
|
case GRPC_STREAM_COMPRESSION_FLUSH_NONE: |
||||||
|
gzip_flush = 0; |
||||||
|
break; |
||||||
|
case GRPC_STREAM_COMPRESSION_FLUSH_SYNC: |
||||||
|
gzip_flush = Z_SYNC_FLUSH; |
||||||
|
break; |
||||||
|
case GRPC_STREAM_COMPRESSION_FLUSH_FINISH: |
||||||
|
gzip_flush = Z_FINISH; |
||||||
|
break; |
||||||
|
default: |
||||||
|
gzip_flush = 0; |
||||||
|
} |
||||||
|
return gzip_flate(gzip_ctx, in, out, output_size, max_output_size, gzip_flush, |
||||||
|
NULL); |
||||||
|
} |
||||||
|
|
||||||
|
static bool grpc_stream_decompress_gzip(grpc_stream_compression_context *ctx, |
||||||
|
grpc_slice_buffer *in, |
||||||
|
grpc_slice_buffer *out, |
||||||
|
size_t *output_size, |
||||||
|
size_t max_output_size, |
||||||
|
bool *end_of_context) { |
||||||
|
if (ctx == NULL) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
grpc_stream_compression_context_gzip *gzip_ctx = |
||||||
|
(grpc_stream_compression_context_gzip *)ctx; |
||||||
|
GPR_ASSERT(gzip_ctx->flate == inflate); |
||||||
|
return gzip_flate(gzip_ctx, in, out, output_size, max_output_size, |
||||||
|
Z_SYNC_FLUSH, end_of_context); |
||||||
|
} |
||||||
|
|
||||||
|
static grpc_stream_compression_context * |
||||||
|
grpc_stream_compression_context_create_gzip( |
||||||
|
grpc_stream_compression_method method) { |
||||||
|
GPR_ASSERT(method == GRPC_STREAM_COMPRESSION_GZIP_COMPRESS || |
||||||
|
method == GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS); |
||||||
|
grpc_stream_compression_context_gzip *gzip_ctx = |
||||||
|
(grpc_stream_compression_context_gzip *)gpr_zalloc( |
||||||
|
sizeof(grpc_stream_compression_context_gzip)); |
||||||
|
int r; |
||||||
|
if (gzip_ctx == NULL) { |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
if (method == GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS) { |
||||||
|
r = inflateInit2(&gzip_ctx->zs, 0x1F); |
||||||
|
gzip_ctx->flate = inflate; |
||||||
|
} else { |
||||||
|
r = deflateInit2(&gzip_ctx->zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 0x1F, 8, |
||||||
|
Z_DEFAULT_STRATEGY); |
||||||
|
gzip_ctx->flate = deflate; |
||||||
|
} |
||||||
|
if (r != Z_OK) { |
||||||
|
gpr_free(gzip_ctx); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
gzip_ctx->base.vtable = &grpc_stream_compression_gzip_vtable; |
||||||
|
return (grpc_stream_compression_context *)gzip_ctx; |
||||||
|
} |
||||||
|
|
||||||
|
static void grpc_stream_compression_context_destroy_gzip( |
||||||
|
grpc_stream_compression_context *ctx) { |
||||||
|
if (ctx == NULL) { |
||||||
|
return; |
||||||
|
} |
||||||
|
grpc_stream_compression_context_gzip *gzip_ctx = |
||||||
|
(grpc_stream_compression_context_gzip *)ctx; |
||||||
|
if (gzip_ctx->flate == inflate) { |
||||||
|
inflateEnd(&gzip_ctx->zs); |
||||||
|
} else { |
||||||
|
deflateEnd(&gzip_ctx->zs); |
||||||
|
} |
||||||
|
gpr_free(ctx); |
||||||
|
} |
||||||
|
|
||||||
|
const grpc_stream_compression_vtable grpc_stream_compression_gzip_vtable = { |
||||||
|
.compress = grpc_stream_compress_gzip, |
||||||
|
.decompress = grpc_stream_decompress_gzip, |
||||||
|
.context_create = grpc_stream_compression_context_create_gzip, |
||||||
|
.context_destroy = grpc_stream_compression_context_destroy_gzip}; |
@ -0,0 +1,26 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2017 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_CORE_LIB_COMPRESSION_STREAM_COMPRESSION_GZIP_H |
||||||
|
#define GRPC_CORE_LIB_COMPRESSION_STREAM_COMPRESSION_GZIP_H |
||||||
|
|
||||||
|
#include "src/core/lib/compression/stream_compression.h" |
||||||
|
|
||||||
|
extern const grpc_stream_compression_vtable grpc_stream_compression_gzip_vtable; |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,94 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2017 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <grpc/support/alloc.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
|
||||||
|
#include "src/core/lib/compression/stream_compression_identity.h" |
||||||
|
#include "src/core/lib/iomgr/exec_ctx.h" |
||||||
|
#include "src/core/lib/slice/slice_internal.h" |
||||||
|
|
||||||
|
#define OUTPUT_BLOCK_SIZE (1024) |
||||||
|
|
||||||
|
/* Singleton context used for all identity streams. */ |
||||||
|
static grpc_stream_compression_context identity_ctx = { |
||||||
|
.vtable = &grpc_stream_compression_identity_vtable}; |
||||||
|
|
||||||
|
static void grpc_stream_compression_pass_through(grpc_slice_buffer *in, |
||||||
|
grpc_slice_buffer *out, |
||||||
|
size_t *output_size, |
||||||
|
size_t max_output_size) { |
||||||
|
if (max_output_size >= in->length) { |
||||||
|
if (output_size) { |
||||||
|
*output_size = in->length; |
||||||
|
} |
||||||
|
grpc_slice_buffer_move_into(in, out); |
||||||
|
} else { |
||||||
|
if (output_size) { |
||||||
|
*output_size = max_output_size; |
||||||
|
} |
||||||
|
grpc_slice_buffer_move_first(in, max_output_size, out); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static bool grpc_stream_compress_identity(grpc_stream_compression_context *ctx, |
||||||
|
grpc_slice_buffer *in, |
||||||
|
grpc_slice_buffer *out, |
||||||
|
size_t *output_size, |
||||||
|
size_t max_output_size, |
||||||
|
grpc_stream_compression_flush flush) { |
||||||
|
if (ctx == NULL) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
grpc_stream_compression_pass_through(in, out, output_size, max_output_size); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
static bool grpc_stream_decompress_identity( |
||||||
|
grpc_stream_compression_context *ctx, grpc_slice_buffer *in, |
||||||
|
grpc_slice_buffer *out, size_t *output_size, size_t max_output_size, |
||||||
|
bool *end_of_context) { |
||||||
|
if (ctx == NULL) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
grpc_stream_compression_pass_through(in, out, output_size, max_output_size); |
||||||
|
if (end_of_context) { |
||||||
|
*end_of_context = false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
static grpc_stream_compression_context * |
||||||
|
grpc_stream_compression_context_create_identity( |
||||||
|
grpc_stream_compression_method method) { |
||||||
|
GPR_ASSERT(method == GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS || |
||||||
|
method == GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS); |
||||||
|
/* No context needed in this case. Use fake context instead. */ |
||||||
|
return (grpc_stream_compression_context *)&identity_ctx; |
||||||
|
} |
||||||
|
|
||||||
|
static void grpc_stream_compression_context_destroy_identity( |
||||||
|
grpc_stream_compression_context *ctx) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
const grpc_stream_compression_vtable grpc_stream_compression_identity_vtable = { |
||||||
|
.compress = grpc_stream_compress_identity, |
||||||
|
.decompress = grpc_stream_decompress_identity, |
||||||
|
.context_create = grpc_stream_compression_context_create_identity, |
||||||
|
.context_destroy = grpc_stream_compression_context_destroy_identity}; |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue