mirror of https://github.com/grpc/grpc.git
commit
408ef6bf25
199 changed files with 4896 additions and 6518 deletions
@ -0,0 +1,133 @@ |
|||||||
|
# gRPC (Core) Compression Cookbook |
||||||
|
|
||||||
|
## Introduction |
||||||
|
|
||||||
|
This document describes compression as implemented by the gRPC C core. See [the |
||||||
|
full compression specification](compression.md) for details. |
||||||
|
|
||||||
|
### Intended Audience |
||||||
|
|
||||||
|
Wrapped languages developers, for the purposes of supporting compression by |
||||||
|
interacting with the C core. |
||||||
|
|
||||||
|
## Criteria for GA readiness |
||||||
|
|
||||||
|
1. Be able to set compression at [channel](#per-channel-settings), |
||||||
|
[call](#per-call-settings) and [message](#per-message-settings) level. |
||||||
|
In principle this API should be based on _compression levels_ as opposed to |
||||||
|
algorithms. See the discussion [below](#level-vs-algorithms). |
||||||
|
1. Have unit tests covering [the cases from the |
||||||
|
spec](https://github.com/grpc/grpc/blob/master/doc/compression.md#test-cases). |
||||||
|
1. Interop tests implemented and passing on Jenkins. The two relevant interop |
||||||
|
test cases are |
||||||
|
[large_compressed_unary](https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md#large_compressed_unary) |
||||||
|
and |
||||||
|
[server_compressed_streaming](https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md#server_compressed_streaming). |
||||||
|
|
||||||
|
## Summary Flowcharts |
||||||
|
|
||||||
|
The following flowcharts depict the evolution of a message, both _incoming_ and |
||||||
|
_outgoing_, irrespective of the client/server character of the call. Aspects |
||||||
|
still not symmetric between clients and servers (e.g. the [use of compression |
||||||
|
levels](https://github.com/grpc/grpc/blob/master/doc/compression.md#compression-levels-and-algorithms)) |
||||||
|
are explicitly marked. The in-detail textual description for the different |
||||||
|
scenarios is described in subsequent sections. |
||||||
|
|
||||||
|
## Incoming Messages |
||||||
|
|
||||||
|
![image](images/compression_cookbook_incoming.png) |
||||||
|
|
||||||
|
## Outgoing Messages |
||||||
|
|
||||||
|
![image](images/compression_cookbook_outgoing.png) |
||||||
|
|
||||||
|
## Levels vs Algorithms |
||||||
|
|
||||||
|
As mentioned in [the relevant discussion on the spec |
||||||
|
document](https://github.com/grpc/grpc/blob/master/doc/compression.md#compression-levels-and-algorithms), |
||||||
|
compression _levels_ are the primary mechanism for compression selection _at the |
||||||
|
server side_. In the future, it'll also be at the client side. The use of levels |
||||||
|
abstracts away the intricacies of selecting a concrete algorithm supported by a |
||||||
|
peer, on top of removing the burden of choice from the developer. |
||||||
|
As of this writing (Q2 2016), clients can only specify compression _algorithms_. |
||||||
|
Clients will support levels as soon as an automatic retry/negotiation mechanism |
||||||
|
is in place. |
||||||
|
|
||||||
|
## Per Channel Settings |
||||||
|
|
||||||
|
Compression may be configured at channel creation. This is a convenience to |
||||||
|
avoid having to repeatedly configure compression for every call. Note that any |
||||||
|
compression setting on individual [calls](#per-call-settings) or |
||||||
|
[messages](#per-message-settings) overrides channel settings. |
||||||
|
|
||||||
|
The following aspects can be configured at channel-creation time via channel arguments: |
||||||
|
|
||||||
|
#### Disable Compression _Algorithms_ |
||||||
|
|
||||||
|
Use the channel argument key |
||||||
|
`GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET` (from |
||||||
|
[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), |
||||||
|
takes a 32 bit bitset value. A set bit means the algorithm with that enum value |
||||||
|
according to `grpc_compression_algorithm` is _enabled_. |
||||||
|
For example, `GRPC_COMPRESS_GZIP` currently has a numeric value of 2. To |
||||||
|
enable/disable GZIP for a channel, one would set/clear the 3rd LSB (eg, 0b100 = |
||||||
|
0x4). Note that setting/clearing 0th position, that corresponding to |
||||||
|
`GRPC_COMPRESS_NONE`, has no effect, as no-compression (a.k.a. _identity_) is |
||||||
|
always supported. |
||||||
|
Incoming messages compressed (ie, encoded) with a disabled algorithm will result |
||||||
|
in the call being closed with `GRPC_STATUS_UNIMPLEMENTED`. |
||||||
|
|
||||||
|
#### Default Compression _Level_ |
||||||
|
|
||||||
|
**(currently, Q2 2016, only applicable for server side channels. It's ignored |
||||||
|
for clients.)** |
||||||
|
Use the channel argument key `GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL` (from |
||||||
|
[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), |
||||||
|
valued by an integer corresponding to a value from the `grpc_compression_level` |
||||||
|
enum. |
||||||
|
|
||||||
|
#### Default Compression _Algorithm_ |
||||||
|
|
||||||
|
Use the channel argument key `GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM` (from |
||||||
|
[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), |
||||||
|
valued by an integer corresponding to a value from the `grpc_compression_level` |
||||||
|
enum. |
||||||
|
|
||||||
|
## Per Call Settings |
||||||
|
|
||||||
|
### Compression **Level** in Call Responses |
||||||
|
|
||||||
|
The server requests a compression level via initial metadata. The |
||||||
|
`send_initial_metadata` `grpc_op` contains a `maybe_compression_level` field |
||||||
|
with two fields, `is_set` and `compression_level`. The former must be set when |
||||||
|
actively choosing a level to disambiguate the default value of zero (no |
||||||
|
compression) from the proactive selection of no compression. |
||||||
|
|
||||||
|
The core will receive the request for the compression level and automatically |
||||||
|
choose a compression algorithm based on its knowledge about the peer |
||||||
|
(communicated by the client via the `grpc-accept-encoding` header. Note that the |
||||||
|
absence of this header means no compression is supported by the client/peer). |
||||||
|
|
||||||
|
### Compression **Algorithm** in Call Responses |
||||||
|
|
||||||
|
**Server should avoid setting the compression algorithm directly**. Prefer |
||||||
|
setting compression levels unless there's a _very_ compelling reason to choose |
||||||
|
specific algorithms (benchmarking, testing). |
||||||
|
|
||||||
|
Selection of concrete compression algorithms is performed by adding a |
||||||
|
`(GRPC_COMPRESS_REQUEST_ALGORITHM_KEY, <algorithm-name>)` key-value pair to the |
||||||
|
initial metadata, where `GRPC_COMPRESS_REQUEST_ALGORITHM_KEY` is defined in |
||||||
|
[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), |
||||||
|
and `<algorithm-name>` is the human readable name of the algorithm as given in |
||||||
|
[the HTTP2 spec](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md) |
||||||
|
for `Message-Encoding` (e.g. gzip, identity, etc.). See |
||||||
|
[`grpc_compression_algorithm_name`](https://github.com/grpc/grpc/blob/master/src/core/lib/compression/compression.c) |
||||||
|
for the mapping between the `grpc_compression_algorithm` enum values and their |
||||||
|
textual representation. |
||||||
|
|
||||||
|
## Per Message Settings |
||||||
|
|
||||||
|
To disable compression for a specific message, the `flags` field of `grpc_op` |
||||||
|
instances of type `GRPC_OP_SEND_MESSAGE` must have its `GRPC_WRITE_NO_COMPRESS` |
||||||
|
bit set. Refer to |
||||||
|
[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 120 KiB |
@ -1,11 +1,43 @@ |
|||||||
source 'https://github.com/CocoaPods/Specs.git' |
source 'https://github.com/CocoaPods/Specs.git' |
||||||
platform :ios, '8.0' |
platform :ios, '8.0' |
||||||
|
|
||||||
pod 'Protobuf', :path => "../../../third_party/protobuf" |
install! 'cocoapods', :deterministic_uuids => false |
||||||
pod 'BoringSSL', :podspec => "../../../src/objective-c" |
|
||||||
pod 'gRPC', :path => "../../.." |
# Location of gRPC's repo root relative to this file. |
||||||
|
GRPC_LOCAL_SRC = '../../..' |
||||||
|
|
||||||
target 'HelloWorld' do |
target 'HelloWorld' do |
||||||
# Depend on the generated HelloWorld library. |
# Depend on the generated HelloWorld library. |
||||||
pod 'HelloWorld', :path => '.' |
pod 'HelloWorld', :path => '.' |
||||||
|
|
||||||
|
# Use the local versions of Protobuf, BoringSSL, and gRPC. You don't need any of the following |
||||||
|
# lines in your application. |
||||||
|
pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf" |
||||||
|
|
||||||
|
pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c" |
||||||
|
|
||||||
|
pod 'gRPC', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-Core', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-ProtoRPC', :path => GRPC_LOCAL_SRC |
||||||
|
end |
||||||
|
|
||||||
|
# This pre_install hook is only needed to use the local version of gRPC-Core. You don't need it in |
||||||
|
# your application. |
||||||
|
pre_install do |installer| |
||||||
|
# This is the gRPC-Core podspec object, as initialized by its podspec file. |
||||||
|
grpc_core_spec = installer.pod_targets.find{|t| t.name == 'gRPC-Core'}.root_spec |
||||||
|
|
||||||
|
# Copied from gRPC-Core.podspec, except for the adjusted src_root: |
||||||
|
src_root = "$(PODS_ROOT)/../#{GRPC_LOCAL_SRC}" |
||||||
|
grpc_core_spec.pod_target_xcconfig = { |
||||||
|
'GRPC_SRC_ROOT' => src_root, |
||||||
|
'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', |
||||||
|
'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', |
||||||
|
# If we don't set these two settings, `include/grpc/support/time.h` and |
||||||
|
# `src/core/lib/support/string.h` shadow the system `<time.h>` and `<string.h>`, breaking the |
||||||
|
# build. |
||||||
|
'USE_HEADERMAP' => 'NO', |
||||||
|
'ALWAYS_SEARCH_USER_PATHS' => 'NO', |
||||||
|
} |
||||||
end |
end |
||||||
|
@ -1,10 +1,43 @@ |
|||||||
source 'https://github.com/CocoaPods/Specs.git' |
source 'https://github.com/CocoaPods/Specs.git' |
||||||
platform :ios, '8.0' |
platform :ios, '8.0' |
||||||
|
|
||||||
|
install! 'cocoapods', :deterministic_uuids => false |
||||||
|
|
||||||
|
# Location of gRPC's repo root relative to this file. |
||||||
|
GRPC_LOCAL_SRC = '../../..' |
||||||
|
|
||||||
target 'RouteGuideClient' do |
target 'RouteGuideClient' do |
||||||
pod 'Protobuf', :path => "../../../third_party/protobuf" |
|
||||||
pod 'BoringSSL', :podspec => "../../../src/objective-c" |
|
||||||
pod 'gRPC', :path => "../../.." |
|
||||||
# Depend on the generated RouteGuide library. |
# Depend on the generated RouteGuide library. |
||||||
pod 'RouteGuide', :path => '.' |
pod 'RouteGuide', :path => '.' |
||||||
|
|
||||||
|
# Use the local versions of Protobuf, BoringSSL, and gRPC. You don't need any of the following |
||||||
|
# lines in your application. |
||||||
|
pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf" |
||||||
|
|
||||||
|
pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c" |
||||||
|
|
||||||
|
pod 'gRPC', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-Core', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-ProtoRPC', :path => GRPC_LOCAL_SRC |
||||||
|
end |
||||||
|
|
||||||
|
# This pre_install hook is only needed to use the local version of gRPC-Core. You don't need it in |
||||||
|
# your application. |
||||||
|
pre_install do |installer| |
||||||
|
# This is the gRPC-Core podspec object, as initialized by its podspec file. |
||||||
|
grpc_core_spec = installer.pod_targets.find{|t| t.name == 'gRPC-Core'}.root_spec |
||||||
|
|
||||||
|
# Copied from gRPC-Core.podspec, except for the adjusted src_root: |
||||||
|
src_root = "$(PODS_ROOT)/../#{GRPC_LOCAL_SRC}" |
||||||
|
grpc_core_spec.pod_target_xcconfig = { |
||||||
|
'GRPC_SRC_ROOT' => src_root, |
||||||
|
'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', |
||||||
|
'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', |
||||||
|
# If we don't set these two settings, `include/grpc/support/time.h` and |
||||||
|
# `src/core/lib/support/string.h` shadow the system `<time.h>` and `<string.h>`, breaking the |
||||||
|
# build. |
||||||
|
'USE_HEADERMAP' => 'NO', |
||||||
|
'ALWAYS_SEARCH_USER_PATHS' => 'NO', |
||||||
|
} |
||||||
end |
end |
||||||
|
@ -0,0 +1,762 @@ |
|||||||
|
# GRPC CocoaPods podspec |
||||||
|
# This file has been automatically generated from a template file. Please make modifications to |
||||||
|
# `templates/gRPC-Core.podspec.template` instead. This file can be regenerated from the template by |
||||||
|
# running `tools/buildgen/generate_projects.sh`. |
||||||
|
|
||||||
|
# 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. |
||||||
|
|
||||||
|
|
||||||
|
Pod::Spec.new do |s| |
||||||
|
s.name = 'gRPC-Core' |
||||||
|
version = '0.14.0' |
||||||
|
s.version = version |
||||||
|
s.summary = 'Core cross-platform gRPC library, written in C' |
||||||
|
s.homepage = 'http://www.grpc.io' |
||||||
|
s.license = 'New BSD' |
||||||
|
s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } |
||||||
|
|
||||||
|
s.source = { |
||||||
|
:git => 'https://github.com/grpc/grpc.git', |
||||||
|
:tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}", |
||||||
|
# TODO(jcanizales): Depend explicitly on the nanopb pod, and disable submodules. |
||||||
|
:submodules => true, |
||||||
|
} |
||||||
|
|
||||||
|
s.ios.deployment_target = '7.1' |
||||||
|
s.osx.deployment_target = '10.9' |
||||||
|
s.requires_arc = false |
||||||
|
|
||||||
|
name = 'grpc' |
||||||
|
|
||||||
|
# When creating a dynamic framework, name it grpc.framework instead of gRPC-Core.framework. |
||||||
|
# This lets users write their includes like `#include <grpc/grpc.h>` as opposed to `#include |
||||||
|
# <gRPC-Core/grpc.h>`. |
||||||
|
s.module_name = name |
||||||
|
|
||||||
|
# When creating a dynamic framework, copy the headers under `include/grpc/` into the root of |
||||||
|
# the `Headers/` directory of the framework (i.e., not under `Headers/include/grpc`). |
||||||
|
# |
||||||
|
# TODO(jcanizales): Debug why this doesn't work on macOS. |
||||||
|
s.header_mappings_dir = 'include/grpc' |
||||||
|
|
||||||
|
# The above has an undesired effect when creating a static library: It forces users to write |
||||||
|
# includes like `#include <gRPC-Core/grpc.h>`. `s.header_dir` adds a path prefix to that, and |
||||||
|
# because Cocoapods lets omit the pod name when including headers of static libraries, the |
||||||
|
# following lets users write `#include <grpc/grpc.h>`. |
||||||
|
s.header_dir = name |
||||||
|
|
||||||
|
# The module map created automatically by Cocoapods doesn't work for C libraries like gRPC-Core. |
||||||
|
s.module_map = 'include/grpc/module.modulemap' |
||||||
|
|
||||||
|
# To compile the library, we need the user headers search path (quoted includes) to point to the |
||||||
|
# root of the repo, and the system headers search path (angled includes) to point to `include/`. |
||||||
|
# Cocoapods effectively clones the repo under `<Podfile dir>/Pods/gRPC-Core/`, and sets a build |
||||||
|
# variable called `$(PODS_ROOT)` to `<Podfile dir>/Pods/`, so we use that. |
||||||
|
# |
||||||
|
# Relying on the file structure under $(PODS_ROOT) isn't officially supported in Cocoapods, as it |
||||||
|
# is taken as an implementation detail. We've asked for an alternative, and have been told that |
||||||
|
# what we're doing should keep working: https://github.com/CocoaPods/CocoaPods/issues/4386 |
||||||
|
# |
||||||
|
# The `src_root` value of `$(PODS_ROOT)/gRPC-Core` assumes Cocoapods is installing this pod from |
||||||
|
# its remote repo. For local development of this library, enabled by using `:path` in the Podfile, |
||||||
|
# that assumption is wrong. In such case, the following settings need to be reset with the |
||||||
|
# appropriate value of `src_root`. This can be accomplished in the `pre_install` hook of the |
||||||
|
# Podfile; see `src/objective-c/tests/Podfile` for an example. |
||||||
|
src_root = '$(PODS_ROOT)/gRPC-Core' |
||||||
|
s.pod_target_xcconfig = { |
||||||
|
'GRPC_SRC_ROOT' => src_root, |
||||||
|
'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', |
||||||
|
'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', |
||||||
|
# If we don't set these two settings, `include/grpc/support/time.h` and |
||||||
|
# `src/core/lib/support/string.h` shadow the system `<time.h>` and `<string.h>`, breaking the |
||||||
|
# build. |
||||||
|
'USE_HEADERMAP' => 'NO', |
||||||
|
'ALWAYS_SEARCH_USER_PATHS' => 'NO', |
||||||
|
} |
||||||
|
|
||||||
|
# Like many other C libraries, gRPC-Core has its public headers under `include/<libname>/` and its |
||||||
|
# sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't |
||||||
|
# allow any header to be listed outside the `header_mappings_dir` (even though doing so works in |
||||||
|
# practice). Because we need our `header_mappings_dir` to be `include/grpc/` for the reason |
||||||
|
# mentioned above, we work around the linter limitation by dividing the pod into two subspecs, one |
||||||
|
# for public headers and the other for implementation. Each gets its own `header_mappings_dir`, |
||||||
|
# making the linter happy. |
||||||
|
# |
||||||
|
# The list of source files is generated by a template: `templates/gRPC-Core.podspec.template`. It |
||||||
|
# can be regenerated from the template by running `tools/buildgen/generate_projects.sh`. |
||||||
|
s.subspec 'Interface' do |ss| |
||||||
|
ss.header_mappings_dir = 'include/grpc' |
||||||
|
|
||||||
|
ss.source_files = 'include/grpc/support/alloc.h', |
||||||
|
'include/grpc/support/atm.h', |
||||||
|
'include/grpc/support/atm_gcc_atomic.h', |
||||||
|
'include/grpc/support/atm_gcc_sync.h', |
||||||
|
'include/grpc/support/atm_windows.h', |
||||||
|
'include/grpc/support/avl.h', |
||||||
|
'include/grpc/support/cmdline.h', |
||||||
|
'include/grpc/support/cpu.h', |
||||||
|
'include/grpc/support/histogram.h', |
||||||
|
'include/grpc/support/host_port.h', |
||||||
|
'include/grpc/support/log.h', |
||||||
|
'include/grpc/support/log_windows.h', |
||||||
|
'include/grpc/support/port_platform.h', |
||||||
|
'include/grpc/support/slice.h', |
||||||
|
'include/grpc/support/slice_buffer.h', |
||||||
|
'include/grpc/support/string_util.h', |
||||||
|
'include/grpc/support/subprocess.h', |
||||||
|
'include/grpc/support/sync.h', |
||||||
|
'include/grpc/support/sync_generic.h', |
||||||
|
'include/grpc/support/sync_posix.h', |
||||||
|
'include/grpc/support/sync_windows.h', |
||||||
|
'include/grpc/support/thd.h', |
||||||
|
'include/grpc/support/time.h', |
||||||
|
'include/grpc/support/tls.h', |
||||||
|
'include/grpc/support/tls_gcc.h', |
||||||
|
'include/grpc/support/tls_msvc.h', |
||||||
|
'include/grpc/support/tls_pthread.h', |
||||||
|
'include/grpc/support/useful.h', |
||||||
|
'include/grpc/impl/codegen/alloc.h', |
||||||
|
'include/grpc/impl/codegen/atm.h', |
||||||
|
'include/grpc/impl/codegen/atm_gcc_atomic.h', |
||||||
|
'include/grpc/impl/codegen/atm_gcc_sync.h', |
||||||
|
'include/grpc/impl/codegen/atm_windows.h', |
||||||
|
'include/grpc/impl/codegen/log.h', |
||||||
|
'include/grpc/impl/codegen/port_platform.h', |
||||||
|
'include/grpc/impl/codegen/slice.h', |
||||||
|
'include/grpc/impl/codegen/slice_buffer.h', |
||||||
|
'include/grpc/impl/codegen/sync.h', |
||||||
|
'include/grpc/impl/codegen/sync_generic.h', |
||||||
|
'include/grpc/impl/codegen/sync_posix.h', |
||||||
|
'include/grpc/impl/codegen/sync_windows.h', |
||||||
|
'include/grpc/impl/codegen/time.h', |
||||||
|
'include/grpc/byte_buffer.h', |
||||||
|
'include/grpc/byte_buffer_reader.h', |
||||||
|
'include/grpc/compression.h', |
||||||
|
'include/grpc/grpc.h', |
||||||
|
'include/grpc/grpc_posix.h', |
||||||
|
'include/grpc/status.h', |
||||||
|
'include/grpc/impl/codegen/byte_buffer.h', |
||||||
|
'include/grpc/impl/codegen/byte_buffer_reader.h', |
||||||
|
'include/grpc/impl/codegen/compression_types.h', |
||||||
|
'include/grpc/impl/codegen/connectivity_state.h', |
||||||
|
'include/grpc/impl/codegen/grpc_types.h', |
||||||
|
'include/grpc/impl/codegen/propagation_bits.h', |
||||||
|
'include/grpc/impl/codegen/status.h', |
||||||
|
'include/grpc/impl/codegen/alloc.h', |
||||||
|
'include/grpc/impl/codegen/atm.h', |
||||||
|
'include/grpc/impl/codegen/atm_gcc_atomic.h', |
||||||
|
'include/grpc/impl/codegen/atm_gcc_sync.h', |
||||||
|
'include/grpc/impl/codegen/atm_windows.h', |
||||||
|
'include/grpc/impl/codegen/log.h', |
||||||
|
'include/grpc/impl/codegen/port_platform.h', |
||||||
|
'include/grpc/impl/codegen/slice.h', |
||||||
|
'include/grpc/impl/codegen/slice_buffer.h', |
||||||
|
'include/grpc/impl/codegen/sync.h', |
||||||
|
'include/grpc/impl/codegen/sync_generic.h', |
||||||
|
'include/grpc/impl/codegen/sync_posix.h', |
||||||
|
'include/grpc/impl/codegen/sync_windows.h', |
||||||
|
'include/grpc/impl/codegen/time.h', |
||||||
|
'include/grpc/grpc_security.h', |
||||||
|
'include/grpc/grpc_security_constants.h', |
||||||
|
'include/grpc/census.h' |
||||||
|
end |
||||||
|
s.subspec 'Implementation' do |ss| |
||||||
|
ss.header_mappings_dir = '.' |
||||||
|
ss.libraries = 'z' |
||||||
|
ss.dependency "#{s.name}/Interface", version |
||||||
|
ss.dependency 'BoringSSL', '~> 4.0' |
||||||
|
|
||||||
|
# To save you from scrolling, this is the last part of the podspec. |
||||||
|
ss.source_files = 'src/core/lib/profiling/timers.h', |
||||||
|
'src/core/lib/support/backoff.h', |
||||||
|
'src/core/lib/support/block_annotate.h', |
||||||
|
'src/core/lib/support/env.h', |
||||||
|
'src/core/lib/support/murmur_hash.h', |
||||||
|
'src/core/lib/support/stack_lockfree.h', |
||||||
|
'src/core/lib/support/string.h', |
||||||
|
'src/core/lib/support/string_windows.h', |
||||||
|
'src/core/lib/support/thd_internal.h', |
||||||
|
'src/core/lib/support/time_precise.h', |
||||||
|
'src/core/lib/support/tmpfile.h', |
||||||
|
'src/core/lib/profiling/basic_timers.c', |
||||||
|
'src/core/lib/profiling/stap_timers.c', |
||||||
|
'src/core/lib/support/alloc.c', |
||||||
|
'src/core/lib/support/avl.c', |
||||||
|
'src/core/lib/support/backoff.c', |
||||||
|
'src/core/lib/support/cmdline.c', |
||||||
|
'src/core/lib/support/cpu_iphone.c', |
||||||
|
'src/core/lib/support/cpu_linux.c', |
||||||
|
'src/core/lib/support/cpu_posix.c', |
||||||
|
'src/core/lib/support/cpu_windows.c', |
||||||
|
'src/core/lib/support/env_linux.c', |
||||||
|
'src/core/lib/support/env_posix.c', |
||||||
|
'src/core/lib/support/env_windows.c', |
||||||
|
'src/core/lib/support/histogram.c', |
||||||
|
'src/core/lib/support/host_port.c', |
||||||
|
'src/core/lib/support/log.c', |
||||||
|
'src/core/lib/support/log_android.c', |
||||||
|
'src/core/lib/support/log_linux.c', |
||||||
|
'src/core/lib/support/log_posix.c', |
||||||
|
'src/core/lib/support/log_windows.c', |
||||||
|
'src/core/lib/support/murmur_hash.c', |
||||||
|
'src/core/lib/support/slice.c', |
||||||
|
'src/core/lib/support/slice_buffer.c', |
||||||
|
'src/core/lib/support/stack_lockfree.c', |
||||||
|
'src/core/lib/support/string.c', |
||||||
|
'src/core/lib/support/string_posix.c', |
||||||
|
'src/core/lib/support/string_util_windows.c', |
||||||
|
'src/core/lib/support/string_windows.c', |
||||||
|
'src/core/lib/support/subprocess_posix.c', |
||||||
|
'src/core/lib/support/subprocess_windows.c', |
||||||
|
'src/core/lib/support/sync.c', |
||||||
|
'src/core/lib/support/sync_posix.c', |
||||||
|
'src/core/lib/support/sync_windows.c', |
||||||
|
'src/core/lib/support/thd.c', |
||||||
|
'src/core/lib/support/thd_posix.c', |
||||||
|
'src/core/lib/support/thd_windows.c', |
||||||
|
'src/core/lib/support/time.c', |
||||||
|
'src/core/lib/support/time_posix.c', |
||||||
|
'src/core/lib/support/time_precise.c', |
||||||
|
'src/core/lib/support/time_windows.c', |
||||||
|
'src/core/lib/support/tls_pthread.c', |
||||||
|
'src/core/lib/support/tmpfile_msys.c', |
||||||
|
'src/core/lib/support/tmpfile_posix.c', |
||||||
|
'src/core/lib/support/tmpfile_windows.c', |
||||||
|
'src/core/lib/support/wrap_memcpy.c', |
||||||
|
'src/core/lib/channel/channel_args.h', |
||||||
|
'src/core/lib/channel/channel_stack.h', |
||||||
|
'src/core/lib/channel/channel_stack_builder.h', |
||||||
|
'src/core/lib/channel/compress_filter.h', |
||||||
|
'src/core/lib/channel/connected_channel.h', |
||||||
|
'src/core/lib/channel/context.h', |
||||||
|
'src/core/lib/channel/http_client_filter.h', |
||||||
|
'src/core/lib/channel/http_server_filter.h', |
||||||
|
'src/core/lib/compression/algorithm_metadata.h', |
||||||
|
'src/core/lib/compression/message_compress.h', |
||||||
|
'src/core/lib/debug/trace.h', |
||||||
|
'src/core/lib/http/format_request.h', |
||||||
|
'src/core/lib/http/httpcli.h', |
||||||
|
'src/core/lib/http/parser.h', |
||||||
|
'src/core/lib/iomgr/closure.h', |
||||||
|
'src/core/lib/iomgr/endpoint.h', |
||||||
|
'src/core/lib/iomgr/endpoint_pair.h', |
||||||
|
'src/core/lib/iomgr/error.h', |
||||||
|
'src/core/lib/iomgr/ev_epoll_linux.h', |
||||||
|
'src/core/lib/iomgr/ev_poll_and_epoll_posix.h', |
||||||
|
'src/core/lib/iomgr/ev_poll_posix.h', |
||||||
|
'src/core/lib/iomgr/ev_posix.h', |
||||||
|
'src/core/lib/iomgr/exec_ctx.h', |
||||||
|
'src/core/lib/iomgr/executor.h', |
||||||
|
'src/core/lib/iomgr/iocp_windows.h', |
||||||
|
'src/core/lib/iomgr/iomgr.h', |
||||||
|
'src/core/lib/iomgr/iomgr_internal.h', |
||||||
|
'src/core/lib/iomgr/iomgr_posix.h', |
||||||
|
'src/core/lib/iomgr/load_file.h', |
||||||
|
'src/core/lib/iomgr/network_status_tracker.h', |
||||||
|
'src/core/lib/iomgr/polling_entity.h', |
||||||
|
'src/core/lib/iomgr/pollset.h', |
||||||
|
'src/core/lib/iomgr/pollset_set.h', |
||||||
|
'src/core/lib/iomgr/pollset_set_windows.h', |
||||||
|
'src/core/lib/iomgr/pollset_windows.h', |
||||||
|
'src/core/lib/iomgr/resolve_address.h', |
||||||
|
'src/core/lib/iomgr/sockaddr.h', |
||||||
|
'src/core/lib/iomgr/sockaddr_posix.h', |
||||||
|
'src/core/lib/iomgr/sockaddr_utils.h', |
||||||
|
'src/core/lib/iomgr/sockaddr_windows.h', |
||||||
|
'src/core/lib/iomgr/socket_utils_posix.h', |
||||||
|
'src/core/lib/iomgr/socket_windows.h', |
||||||
|
'src/core/lib/iomgr/tcp_client.h', |
||||||
|
'src/core/lib/iomgr/tcp_posix.h', |
||||||
|
'src/core/lib/iomgr/tcp_server.h', |
||||||
|
'src/core/lib/iomgr/tcp_windows.h', |
||||||
|
'src/core/lib/iomgr/time_averaged_stats.h', |
||||||
|
'src/core/lib/iomgr/timer.h', |
||||||
|
'src/core/lib/iomgr/timer_heap.h', |
||||||
|
'src/core/lib/iomgr/udp_server.h', |
||||||
|
'src/core/lib/iomgr/unix_sockets_posix.h', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_pipe.h', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_posix.h', |
||||||
|
'src/core/lib/iomgr/workqueue.h', |
||||||
|
'src/core/lib/iomgr/workqueue_posix.h', |
||||||
|
'src/core/lib/iomgr/workqueue_windows.h', |
||||||
|
'src/core/lib/json/json.h', |
||||||
|
'src/core/lib/json/json_common.h', |
||||||
|
'src/core/lib/json/json_reader.h', |
||||||
|
'src/core/lib/json/json_writer.h', |
||||||
|
'src/core/lib/surface/api_trace.h', |
||||||
|
'src/core/lib/surface/call.h', |
||||||
|
'src/core/lib/surface/call_test_only.h', |
||||||
|
'src/core/lib/surface/channel.h', |
||||||
|
'src/core/lib/surface/channel_init.h', |
||||||
|
'src/core/lib/surface/channel_stack_type.h', |
||||||
|
'src/core/lib/surface/completion_queue.h', |
||||||
|
'src/core/lib/surface/event_string.h', |
||||||
|
'src/core/lib/surface/init.h', |
||||||
|
'src/core/lib/surface/lame_client.h', |
||||||
|
'src/core/lib/surface/server.h', |
||||||
|
'src/core/lib/transport/byte_stream.h', |
||||||
|
'src/core/lib/transport/connectivity_state.h', |
||||||
|
'src/core/lib/transport/metadata.h', |
||||||
|
'src/core/lib/transport/metadata_batch.h', |
||||||
|
'src/core/lib/transport/static_metadata.h', |
||||||
|
'src/core/lib/transport/transport.h', |
||||||
|
'src/core/lib/transport/transport_impl.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/bin_decoder.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/bin_encoder.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/chttp2_transport.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_data.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_goaway.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_ping.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_rst_stream.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_settings.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_window_update.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_encoder.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_parser.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_table.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/http2_errors.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/huffsyms.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/incoming_metadata.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/internal.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/status_conversion.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/stream_map.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/timeout_encoding.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/varint.h', |
||||||
|
'src/core/ext/transport/chttp2/alpn/alpn.h', |
||||||
|
'src/core/lib/security/context/security_context.h', |
||||||
|
'src/core/lib/security/credentials/composite/composite_credentials.h', |
||||||
|
'src/core/lib/security/credentials/credentials.h', |
||||||
|
'src/core/lib/security/credentials/fake/fake_credentials.h', |
||||||
|
'src/core/lib/security/credentials/google_default/google_default_credentials.h', |
||||||
|
'src/core/lib/security/credentials/iam/iam_credentials.h', |
||||||
|
'src/core/lib/security/credentials/jwt/json_token.h', |
||||||
|
'src/core/lib/security/credentials/jwt/jwt_credentials.h', |
||||||
|
'src/core/lib/security/credentials/jwt/jwt_verifier.h', |
||||||
|
'src/core/lib/security/credentials/oauth2/oauth2_credentials.h', |
||||||
|
'src/core/lib/security/credentials/plugin/plugin_credentials.h', |
||||||
|
'src/core/lib/security/credentials/ssl/ssl_credentials.h', |
||||||
|
'src/core/lib/security/transport/auth_filters.h', |
||||||
|
'src/core/lib/security/transport/handshake.h', |
||||||
|
'src/core/lib/security/transport/secure_endpoint.h', |
||||||
|
'src/core/lib/security/transport/security_connector.h', |
||||||
|
'src/core/lib/security/transport/tsi_error.h', |
||||||
|
'src/core/lib/security/util/b64.h', |
||||||
|
'src/core/lib/security/util/json_util.h', |
||||||
|
'src/core/lib/tsi/fake_transport_security.h', |
||||||
|
'src/core/lib/tsi/ssl_transport_security.h', |
||||||
|
'src/core/lib/tsi/ssl_types.h', |
||||||
|
'src/core/lib/tsi/transport_security.h', |
||||||
|
'src/core/lib/tsi/transport_security_interface.h', |
||||||
|
'src/core/ext/client_config/client_channel.h', |
||||||
|
'src/core/ext/client_config/client_channel_factory.h', |
||||||
|
'src/core/ext/client_config/client_config.h', |
||||||
|
'src/core/ext/client_config/connector.h', |
||||||
|
'src/core/ext/client_config/initial_connect_string.h', |
||||||
|
'src/core/ext/client_config/lb_policy.h', |
||||||
|
'src/core/ext/client_config/lb_policy_factory.h', |
||||||
|
'src/core/ext/client_config/lb_policy_registry.h', |
||||||
|
'src/core/ext/client_config/parse_address.h', |
||||||
|
'src/core/ext/client_config/resolver.h', |
||||||
|
'src/core/ext/client_config/resolver_factory.h', |
||||||
|
'src/core/ext/client_config/resolver_registry.h', |
||||||
|
'src/core/ext/client_config/subchannel.h', |
||||||
|
'src/core/ext/client_config/subchannel_call_holder.h', |
||||||
|
'src/core/ext/client_config/subchannel_index.h', |
||||||
|
'src/core/ext/client_config/uri_parser.h', |
||||||
|
'src/core/ext/lb_policy/grpclb/load_balancer_api.h', |
||||||
|
'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h', |
||||||
|
'third_party/nanopb/pb.h', |
||||||
|
'third_party/nanopb/pb_common.h', |
||||||
|
'third_party/nanopb/pb_decode.h', |
||||||
|
'third_party/nanopb/pb_encode.h', |
||||||
|
'src/core/ext/load_reporting/load_reporting.h', |
||||||
|
'src/core/ext/load_reporting/load_reporting_filter.h', |
||||||
|
'src/core/ext/census/aggregation.h', |
||||||
|
'src/core/ext/census/census_interface.h', |
||||||
|
'src/core/ext/census/census_rpc_stats.h', |
||||||
|
'src/core/ext/census/gen/census.pb.h', |
||||||
|
'src/core/ext/census/grpc_filter.h', |
||||||
|
'src/core/ext/census/mlog.h', |
||||||
|
'src/core/ext/census/rpc_metric_id.h', |
||||||
|
'src/core/lib/surface/init.c', |
||||||
|
'src/core/lib/channel/channel_args.c', |
||||||
|
'src/core/lib/channel/channel_stack.c', |
||||||
|
'src/core/lib/channel/channel_stack_builder.c', |
||||||
|
'src/core/lib/channel/compress_filter.c', |
||||||
|
'src/core/lib/channel/connected_channel.c', |
||||||
|
'src/core/lib/channel/http_client_filter.c', |
||||||
|
'src/core/lib/channel/http_server_filter.c', |
||||||
|
'src/core/lib/compression/compression.c', |
||||||
|
'src/core/lib/compression/message_compress.c', |
||||||
|
'src/core/lib/debug/trace.c', |
||||||
|
'src/core/lib/http/format_request.c', |
||||||
|
'src/core/lib/http/httpcli.c', |
||||||
|
'src/core/lib/http/parser.c', |
||||||
|
'src/core/lib/iomgr/closure.c', |
||||||
|
'src/core/lib/iomgr/endpoint.c', |
||||||
|
'src/core/lib/iomgr/endpoint_pair_posix.c', |
||||||
|
'src/core/lib/iomgr/endpoint_pair_windows.c', |
||||||
|
'src/core/lib/iomgr/error.c', |
||||||
|
'src/core/lib/iomgr/ev_epoll_linux.c', |
||||||
|
'src/core/lib/iomgr/ev_poll_and_epoll_posix.c', |
||||||
|
'src/core/lib/iomgr/ev_poll_posix.c', |
||||||
|
'src/core/lib/iomgr/ev_posix.c', |
||||||
|
'src/core/lib/iomgr/exec_ctx.c', |
||||||
|
'src/core/lib/iomgr/executor.c', |
||||||
|
'src/core/lib/iomgr/iocp_windows.c', |
||||||
|
'src/core/lib/iomgr/iomgr.c', |
||||||
|
'src/core/lib/iomgr/iomgr_posix.c', |
||||||
|
'src/core/lib/iomgr/iomgr_windows.c', |
||||||
|
'src/core/lib/iomgr/load_file.c', |
||||||
|
'src/core/lib/iomgr/network_status_tracker.c', |
||||||
|
'src/core/lib/iomgr/polling_entity.c', |
||||||
|
'src/core/lib/iomgr/pollset_set_windows.c', |
||||||
|
'src/core/lib/iomgr/pollset_windows.c', |
||||||
|
'src/core/lib/iomgr/resolve_address_posix.c', |
||||||
|
'src/core/lib/iomgr/resolve_address_windows.c', |
||||||
|
'src/core/lib/iomgr/sockaddr_utils.c', |
||||||
|
'src/core/lib/iomgr/socket_utils_common_posix.c', |
||||||
|
'src/core/lib/iomgr/socket_utils_linux.c', |
||||||
|
'src/core/lib/iomgr/socket_utils_posix.c', |
||||||
|
'src/core/lib/iomgr/socket_windows.c', |
||||||
|
'src/core/lib/iomgr/tcp_client_posix.c', |
||||||
|
'src/core/lib/iomgr/tcp_client_windows.c', |
||||||
|
'src/core/lib/iomgr/tcp_posix.c', |
||||||
|
'src/core/lib/iomgr/tcp_server_posix.c', |
||||||
|
'src/core/lib/iomgr/tcp_server_windows.c', |
||||||
|
'src/core/lib/iomgr/tcp_windows.c', |
||||||
|
'src/core/lib/iomgr/time_averaged_stats.c', |
||||||
|
'src/core/lib/iomgr/timer.c', |
||||||
|
'src/core/lib/iomgr/timer_heap.c', |
||||||
|
'src/core/lib/iomgr/udp_server.c', |
||||||
|
'src/core/lib/iomgr/unix_sockets_posix.c', |
||||||
|
'src/core/lib/iomgr/unix_sockets_posix_noop.c', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_eventfd.c', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_nospecial.c', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_pipe.c', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_posix.c', |
||||||
|
'src/core/lib/iomgr/workqueue_posix.c', |
||||||
|
'src/core/lib/iomgr/workqueue_windows.c', |
||||||
|
'src/core/lib/json/json.c', |
||||||
|
'src/core/lib/json/json_reader.c', |
||||||
|
'src/core/lib/json/json_string.c', |
||||||
|
'src/core/lib/json/json_writer.c', |
||||||
|
'src/core/lib/surface/alarm.c', |
||||||
|
'src/core/lib/surface/api_trace.c', |
||||||
|
'src/core/lib/surface/byte_buffer.c', |
||||||
|
'src/core/lib/surface/byte_buffer_reader.c', |
||||||
|
'src/core/lib/surface/call.c', |
||||||
|
'src/core/lib/surface/call_details.c', |
||||||
|
'src/core/lib/surface/call_log_batch.c', |
||||||
|
'src/core/lib/surface/channel.c', |
||||||
|
'src/core/lib/surface/channel_init.c', |
||||||
|
'src/core/lib/surface/channel_ping.c', |
||||||
|
'src/core/lib/surface/channel_stack_type.c', |
||||||
|
'src/core/lib/surface/completion_queue.c', |
||||||
|
'src/core/lib/surface/event_string.c', |
||||||
|
'src/core/lib/surface/lame_client.c', |
||||||
|
'src/core/lib/surface/metadata_array.c', |
||||||
|
'src/core/lib/surface/server.c', |
||||||
|
'src/core/lib/surface/validate_metadata.c', |
||||||
|
'src/core/lib/surface/version.c', |
||||||
|
'src/core/lib/transport/byte_stream.c', |
||||||
|
'src/core/lib/transport/connectivity_state.c', |
||||||
|
'src/core/lib/transport/metadata.c', |
||||||
|
'src/core/lib/transport/metadata_batch.c', |
||||||
|
'src/core/lib/transport/static_metadata.c', |
||||||
|
'src/core/lib/transport/transport.c', |
||||||
|
'src/core/lib/transport/transport_op_string.c', |
||||||
|
'src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/bin_decoder.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/bin_encoder.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/chttp2_plugin.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/chttp2_transport.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_data.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_goaway.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_ping.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_rst_stream.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_settings.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_window_update.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_encoder.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_parser.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_table.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/huffsyms.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/incoming_metadata.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/parsing.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/status_conversion.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/stream_lists.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/stream_map.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/timeout_encoding.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/varint.c', |
||||||
|
'src/core/ext/transport/chttp2/transport/writing.c', |
||||||
|
'src/core/ext/transport/chttp2/alpn/alpn.c', |
||||||
|
'src/core/lib/http/httpcli_security_connector.c', |
||||||
|
'src/core/lib/security/context/security_context.c', |
||||||
|
'src/core/lib/security/credentials/composite/composite_credentials.c', |
||||||
|
'src/core/lib/security/credentials/credentials.c', |
||||||
|
'src/core/lib/security/credentials/credentials_metadata.c', |
||||||
|
'src/core/lib/security/credentials/fake/fake_credentials.c', |
||||||
|
'src/core/lib/security/credentials/google_default/credentials_posix.c', |
||||||
|
'src/core/lib/security/credentials/google_default/credentials_windows.c', |
||||||
|
'src/core/lib/security/credentials/google_default/google_default_credentials.c', |
||||||
|
'src/core/lib/security/credentials/iam/iam_credentials.c', |
||||||
|
'src/core/lib/security/credentials/jwt/json_token.c', |
||||||
|
'src/core/lib/security/credentials/jwt/jwt_credentials.c', |
||||||
|
'src/core/lib/security/credentials/jwt/jwt_verifier.c', |
||||||
|
'src/core/lib/security/credentials/oauth2/oauth2_credentials.c', |
||||||
|
'src/core/lib/security/credentials/plugin/plugin_credentials.c', |
||||||
|
'src/core/lib/security/credentials/ssl/ssl_credentials.c', |
||||||
|
'src/core/lib/security/transport/client_auth_filter.c', |
||||||
|
'src/core/lib/security/transport/handshake.c', |
||||||
|
'src/core/lib/security/transport/secure_endpoint.c', |
||||||
|
'src/core/lib/security/transport/security_connector.c', |
||||||
|
'src/core/lib/security/transport/server_auth_filter.c', |
||||||
|
'src/core/lib/security/transport/tsi_error.c', |
||||||
|
'src/core/lib/security/util/b64.c', |
||||||
|
'src/core/lib/security/util/json_util.c', |
||||||
|
'src/core/lib/surface/init_secure.c', |
||||||
|
'src/core/lib/tsi/fake_transport_security.c', |
||||||
|
'src/core/lib/tsi/ssl_transport_security.c', |
||||||
|
'src/core/lib/tsi/transport_security.c', |
||||||
|
'src/core/ext/transport/chttp2/client/secure/secure_channel_create.c', |
||||||
|
'src/core/ext/client_config/channel_connectivity.c', |
||||||
|
'src/core/ext/client_config/client_channel.c', |
||||||
|
'src/core/ext/client_config/client_channel_factory.c', |
||||||
|
'src/core/ext/client_config/client_config.c', |
||||||
|
'src/core/ext/client_config/client_config_plugin.c', |
||||||
|
'src/core/ext/client_config/connector.c', |
||||||
|
'src/core/ext/client_config/default_initial_connect_string.c', |
||||||
|
'src/core/ext/client_config/initial_connect_string.c', |
||||||
|
'src/core/ext/client_config/lb_policy.c', |
||||||
|
'src/core/ext/client_config/lb_policy_factory.c', |
||||||
|
'src/core/ext/client_config/lb_policy_registry.c', |
||||||
|
'src/core/ext/client_config/parse_address.c', |
||||||
|
'src/core/ext/client_config/resolver.c', |
||||||
|
'src/core/ext/client_config/resolver_factory.c', |
||||||
|
'src/core/ext/client_config/resolver_registry.c', |
||||||
|
'src/core/ext/client_config/subchannel.c', |
||||||
|
'src/core/ext/client_config/subchannel_call_holder.c', |
||||||
|
'src/core/ext/client_config/subchannel_index.c', |
||||||
|
'src/core/ext/client_config/uri_parser.c', |
||||||
|
'src/core/ext/transport/chttp2/server/insecure/server_chttp2.c', |
||||||
|
'src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c', |
||||||
|
'src/core/ext/transport/chttp2/client/insecure/channel_create.c', |
||||||
|
'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c', |
||||||
|
'src/core/ext/lb_policy/grpclb/load_balancer_api.c', |
||||||
|
'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c', |
||||||
|
'third_party/nanopb/pb_common.c', |
||||||
|
'third_party/nanopb/pb_decode.c', |
||||||
|
'third_party/nanopb/pb_encode.c', |
||||||
|
'src/core/ext/lb_policy/pick_first/pick_first.c', |
||||||
|
'src/core/ext/lb_policy/round_robin/round_robin.c', |
||||||
|
'src/core/ext/resolver/dns/native/dns_resolver.c', |
||||||
|
'src/core/ext/resolver/sockaddr/sockaddr_resolver.c', |
||||||
|
'src/core/ext/load_reporting/load_reporting.c', |
||||||
|
'src/core/ext/load_reporting/load_reporting_filter.c', |
||||||
|
'src/core/ext/census/context.c', |
||||||
|
'src/core/ext/census/gen/census.pb.c', |
||||||
|
'src/core/ext/census/grpc_context.c', |
||||||
|
'src/core/ext/census/grpc_filter.c', |
||||||
|
'src/core/ext/census/grpc_plugin.c', |
||||||
|
'src/core/ext/census/initialize.c', |
||||||
|
'src/core/ext/census/mlog.c', |
||||||
|
'src/core/ext/census/operation.c', |
||||||
|
'src/core/ext/census/placeholders.c', |
||||||
|
'src/core/ext/census/tracing.c', |
||||||
|
'src/core/plugin_registry/grpc_plugin_registry.c' |
||||||
|
|
||||||
|
ss.private_header_files = 'src/core/lib/profiling/timers.h', |
||||||
|
'src/core/lib/support/backoff.h', |
||||||
|
'src/core/lib/support/block_annotate.h', |
||||||
|
'src/core/lib/support/env.h', |
||||||
|
'src/core/lib/support/murmur_hash.h', |
||||||
|
'src/core/lib/support/stack_lockfree.h', |
||||||
|
'src/core/lib/support/string.h', |
||||||
|
'src/core/lib/support/string_windows.h', |
||||||
|
'src/core/lib/support/thd_internal.h', |
||||||
|
'src/core/lib/support/time_precise.h', |
||||||
|
'src/core/lib/support/tmpfile.h', |
||||||
|
'src/core/lib/channel/channel_args.h', |
||||||
|
'src/core/lib/channel/channel_stack.h', |
||||||
|
'src/core/lib/channel/channel_stack_builder.h', |
||||||
|
'src/core/lib/channel/compress_filter.h', |
||||||
|
'src/core/lib/channel/connected_channel.h', |
||||||
|
'src/core/lib/channel/context.h', |
||||||
|
'src/core/lib/channel/http_client_filter.h', |
||||||
|
'src/core/lib/channel/http_server_filter.h', |
||||||
|
'src/core/lib/compression/algorithm_metadata.h', |
||||||
|
'src/core/lib/compression/message_compress.h', |
||||||
|
'src/core/lib/debug/trace.h', |
||||||
|
'src/core/lib/http/format_request.h', |
||||||
|
'src/core/lib/http/httpcli.h', |
||||||
|
'src/core/lib/http/parser.h', |
||||||
|
'src/core/lib/iomgr/closure.h', |
||||||
|
'src/core/lib/iomgr/endpoint.h', |
||||||
|
'src/core/lib/iomgr/endpoint_pair.h', |
||||||
|
'src/core/lib/iomgr/error.h', |
||||||
|
'src/core/lib/iomgr/ev_epoll_linux.h', |
||||||
|
'src/core/lib/iomgr/ev_poll_and_epoll_posix.h', |
||||||
|
'src/core/lib/iomgr/ev_poll_posix.h', |
||||||
|
'src/core/lib/iomgr/ev_posix.h', |
||||||
|
'src/core/lib/iomgr/exec_ctx.h', |
||||||
|
'src/core/lib/iomgr/executor.h', |
||||||
|
'src/core/lib/iomgr/iocp_windows.h', |
||||||
|
'src/core/lib/iomgr/iomgr.h', |
||||||
|
'src/core/lib/iomgr/iomgr_internal.h', |
||||||
|
'src/core/lib/iomgr/iomgr_posix.h', |
||||||
|
'src/core/lib/iomgr/load_file.h', |
||||||
|
'src/core/lib/iomgr/network_status_tracker.h', |
||||||
|
'src/core/lib/iomgr/polling_entity.h', |
||||||
|
'src/core/lib/iomgr/pollset.h', |
||||||
|
'src/core/lib/iomgr/pollset_set.h', |
||||||
|
'src/core/lib/iomgr/pollset_set_windows.h', |
||||||
|
'src/core/lib/iomgr/pollset_windows.h', |
||||||
|
'src/core/lib/iomgr/resolve_address.h', |
||||||
|
'src/core/lib/iomgr/sockaddr.h', |
||||||
|
'src/core/lib/iomgr/sockaddr_posix.h', |
||||||
|
'src/core/lib/iomgr/sockaddr_utils.h', |
||||||
|
'src/core/lib/iomgr/sockaddr_windows.h', |
||||||
|
'src/core/lib/iomgr/socket_utils_posix.h', |
||||||
|
'src/core/lib/iomgr/socket_windows.h', |
||||||
|
'src/core/lib/iomgr/tcp_client.h', |
||||||
|
'src/core/lib/iomgr/tcp_posix.h', |
||||||
|
'src/core/lib/iomgr/tcp_server.h', |
||||||
|
'src/core/lib/iomgr/tcp_windows.h', |
||||||
|
'src/core/lib/iomgr/time_averaged_stats.h', |
||||||
|
'src/core/lib/iomgr/timer.h', |
||||||
|
'src/core/lib/iomgr/timer_heap.h', |
||||||
|
'src/core/lib/iomgr/udp_server.h', |
||||||
|
'src/core/lib/iomgr/unix_sockets_posix.h', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_pipe.h', |
||||||
|
'src/core/lib/iomgr/wakeup_fd_posix.h', |
||||||
|
'src/core/lib/iomgr/workqueue.h', |
||||||
|
'src/core/lib/iomgr/workqueue_posix.h', |
||||||
|
'src/core/lib/iomgr/workqueue_windows.h', |
||||||
|
'src/core/lib/json/json.h', |
||||||
|
'src/core/lib/json/json_common.h', |
||||||
|
'src/core/lib/json/json_reader.h', |
||||||
|
'src/core/lib/json/json_writer.h', |
||||||
|
'src/core/lib/surface/api_trace.h', |
||||||
|
'src/core/lib/surface/call.h', |
||||||
|
'src/core/lib/surface/call_test_only.h', |
||||||
|
'src/core/lib/surface/channel.h', |
||||||
|
'src/core/lib/surface/channel_init.h', |
||||||
|
'src/core/lib/surface/channel_stack_type.h', |
||||||
|
'src/core/lib/surface/completion_queue.h', |
||||||
|
'src/core/lib/surface/event_string.h', |
||||||
|
'src/core/lib/surface/init.h', |
||||||
|
'src/core/lib/surface/lame_client.h', |
||||||
|
'src/core/lib/surface/server.h', |
||||||
|
'src/core/lib/transport/byte_stream.h', |
||||||
|
'src/core/lib/transport/connectivity_state.h', |
||||||
|
'src/core/lib/transport/metadata.h', |
||||||
|
'src/core/lib/transport/metadata_batch.h', |
||||||
|
'src/core/lib/transport/static_metadata.h', |
||||||
|
'src/core/lib/transport/transport.h', |
||||||
|
'src/core/lib/transport/transport_impl.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/bin_decoder.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/bin_encoder.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/chttp2_transport.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_data.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_goaway.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_ping.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_rst_stream.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_settings.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/frame_window_update.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_encoder.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_parser.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/hpack_table.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/http2_errors.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/huffsyms.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/incoming_metadata.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/internal.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/status_conversion.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/stream_map.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/timeout_encoding.h', |
||||||
|
'src/core/ext/transport/chttp2/transport/varint.h', |
||||||
|
'src/core/ext/transport/chttp2/alpn/alpn.h', |
||||||
|
'src/core/lib/security/context/security_context.h', |
||||||
|
'src/core/lib/security/credentials/composite/composite_credentials.h', |
||||||
|
'src/core/lib/security/credentials/credentials.h', |
||||||
|
'src/core/lib/security/credentials/fake/fake_credentials.h', |
||||||
|
'src/core/lib/security/credentials/google_default/google_default_credentials.h', |
||||||
|
'src/core/lib/security/credentials/iam/iam_credentials.h', |
||||||
|
'src/core/lib/security/credentials/jwt/json_token.h', |
||||||
|
'src/core/lib/security/credentials/jwt/jwt_credentials.h', |
||||||
|
'src/core/lib/security/credentials/jwt/jwt_verifier.h', |
||||||
|
'src/core/lib/security/credentials/oauth2/oauth2_credentials.h', |
||||||
|
'src/core/lib/security/credentials/plugin/plugin_credentials.h', |
||||||
|
'src/core/lib/security/credentials/ssl/ssl_credentials.h', |
||||||
|
'src/core/lib/security/transport/auth_filters.h', |
||||||
|
'src/core/lib/security/transport/handshake.h', |
||||||
|
'src/core/lib/security/transport/secure_endpoint.h', |
||||||
|
'src/core/lib/security/transport/security_connector.h', |
||||||
|
'src/core/lib/security/transport/tsi_error.h', |
||||||
|
'src/core/lib/security/util/b64.h', |
||||||
|
'src/core/lib/security/util/json_util.h', |
||||||
|
'src/core/lib/tsi/fake_transport_security.h', |
||||||
|
'src/core/lib/tsi/ssl_transport_security.h', |
||||||
|
'src/core/lib/tsi/ssl_types.h', |
||||||
|
'src/core/lib/tsi/transport_security.h', |
||||||
|
'src/core/lib/tsi/transport_security_interface.h', |
||||||
|
'src/core/ext/client_config/client_channel.h', |
||||||
|
'src/core/ext/client_config/client_channel_factory.h', |
||||||
|
'src/core/ext/client_config/client_config.h', |
||||||
|
'src/core/ext/client_config/connector.h', |
||||||
|
'src/core/ext/client_config/initial_connect_string.h', |
||||||
|
'src/core/ext/client_config/lb_policy.h', |
||||||
|
'src/core/ext/client_config/lb_policy_factory.h', |
||||||
|
'src/core/ext/client_config/lb_policy_registry.h', |
||||||
|
'src/core/ext/client_config/parse_address.h', |
||||||
|
'src/core/ext/client_config/resolver.h', |
||||||
|
'src/core/ext/client_config/resolver_factory.h', |
||||||
|
'src/core/ext/client_config/resolver_registry.h', |
||||||
|
'src/core/ext/client_config/subchannel.h', |
||||||
|
'src/core/ext/client_config/subchannel_call_holder.h', |
||||||
|
'src/core/ext/client_config/subchannel_index.h', |
||||||
|
'src/core/ext/client_config/uri_parser.h', |
||||||
|
'src/core/ext/lb_policy/grpclb/load_balancer_api.h', |
||||||
|
'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h', |
||||||
|
'third_party/nanopb/pb.h', |
||||||
|
'third_party/nanopb/pb_common.h', |
||||||
|
'third_party/nanopb/pb_decode.h', |
||||||
|
'third_party/nanopb/pb_encode.h', |
||||||
|
'src/core/ext/load_reporting/load_reporting.h', |
||||||
|
'src/core/ext/load_reporting/load_reporting_filter.h', |
||||||
|
'src/core/ext/census/aggregation.h', |
||||||
|
'src/core/ext/census/census_interface.h', |
||||||
|
'src/core/ext/census/census_rpc_stats.h', |
||||||
|
'src/core/ext/census/gen/census.pb.h', |
||||||
|
'src/core/ext/census/grpc_filter.h', |
||||||
|
'src/core/ext/census/mlog.h', |
||||||
|
'src/core/ext/census/rpc_metric_id.h' |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,69 @@ |
|||||||
|
# GRPC CocoaPods podspec |
||||||
|
# This file has been automatically generated from a template file. |
||||||
|
# Please look at the templates directory instead. |
||||||
|
# This file can be regenerated from the template by running |
||||||
|
# tools/buildgen/generate_projects.sh |
||||||
|
|
||||||
|
# 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. |
||||||
|
|
||||||
|
|
||||||
|
Pod::Spec.new do |s| |
||||||
|
s.name = 'gRPC-ProtoRPC' |
||||||
|
version = '0.14.0' |
||||||
|
s.version = version |
||||||
|
s.summary = 'RPC library for Protocol Buffers, based on gRPC' |
||||||
|
s.homepage = 'http://www.grpc.io' |
||||||
|
s.license = 'New BSD' |
||||||
|
s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } |
||||||
|
|
||||||
|
s.source = { |
||||||
|
:git => 'https://github.com/grpc/grpc.git', |
||||||
|
:tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}", |
||||||
|
} |
||||||
|
|
||||||
|
s.ios.deployment_target = '7.1' |
||||||
|
s.osx.deployment_target = '10.9' |
||||||
|
|
||||||
|
name = 'ProtoRPC' |
||||||
|
s.module_name = name |
||||||
|
s.header_dir = name |
||||||
|
|
||||||
|
src_dir = 'src/objective-c/ProtoRPC' |
||||||
|
s.source_files = "#{src_dir}/*.{h,m}" |
||||||
|
s.header_mappings_dir = "#{src_dir}" |
||||||
|
|
||||||
|
s.dependency 'gRPC', version |
||||||
|
s.dependency 'gRPC-RxLibrary', version |
||||||
|
s.dependency 'Protobuf', '~> 3.0.0-beta-3.1' |
||||||
|
# This is needed by all pods that depend on Protobuf: |
||||||
|
s.pod_target_xcconfig = { |
||||||
|
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1', |
||||||
|
} |
||||||
|
end |
@ -0,0 +1,62 @@ |
|||||||
|
# GRPC CocoaPods podspec |
||||||
|
# This file has been automatically generated from a template file. |
||||||
|
# Please look at the templates directory instead. |
||||||
|
# This file can be regenerated from the template by running |
||||||
|
# tools/buildgen/generate_projects.sh |
||||||
|
|
||||||
|
# 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. |
||||||
|
|
||||||
|
|
||||||
|
Pod::Spec.new do |s| |
||||||
|
s.name = 'gRPC-RxLibrary' |
||||||
|
version = '0.14.0' |
||||||
|
s.version = version |
||||||
|
s.summary = 'Reactive Extensions library for iOS/OSX.' |
||||||
|
s.homepage = 'http://www.grpc.io' |
||||||
|
s.license = 'New BSD' |
||||||
|
s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } |
||||||
|
|
||||||
|
s.source = { |
||||||
|
:git => 'https://github.com/grpc/grpc.git', |
||||||
|
:tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}", |
||||||
|
} |
||||||
|
|
||||||
|
s.ios.deployment_target = '7.1' |
||||||
|
s.osx.deployment_target = '10.9' |
||||||
|
|
||||||
|
name = 'RxLibrary' |
||||||
|
s.module_name = name |
||||||
|
s.header_dir = name |
||||||
|
|
||||||
|
src_dir = 'src/objective-c/RxLibrary' |
||||||
|
s.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}" |
||||||
|
s.private_header_files = "#{src_dir}/private/*.h" |
||||||
|
s.header_mappings_dir = "#{src_dir}" |
||||||
|
end |
@ -0,0 +1,5 @@ |
|||||||
|
framework module grpc { |
||||||
|
umbrella header "grpc.h" |
||||||
|
export * |
||||||
|
module * { export * } |
||||||
|
} |
@ -1,357 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* 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. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "src/core/lib/http/parser.h" |
|
||||||
|
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#include <grpc/support/alloc.h> |
|
||||||
#include <grpc/support/log.h> |
|
||||||
#include <grpc/support/useful.h> |
|
||||||
|
|
||||||
int grpc_http1_trace = 0; |
|
||||||
|
|
||||||
static char *buf2str(void *buffer, size_t length) { |
|
||||||
char *out = gpr_malloc(length + 1); |
|
||||||
memcpy(out, buffer, length); |
|
||||||
out[length] = 0; |
|
||||||
return out; |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_error *handle_response_line(grpc_http_parser *parser) { |
|
||||||
uint8_t *beg = parser->cur_line; |
|
||||||
uint8_t *cur = beg; |
|
||||||
uint8_t *end = beg + parser->cur_line_length; |
|
||||||
|
|
||||||
if (cur == end || *cur++ != 'H') return GRPC_ERROR_CREATE("Expected 'H'"); |
|
||||||
if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); |
|
||||||
if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); |
|
||||||
if (cur == end || *cur++ != 'P') return GRPC_ERROR_CREATE("Expected 'P'"); |
|
||||||
if (cur == end || *cur++ != '/') return GRPC_ERROR_CREATE("Expected '/'"); |
|
||||||
if (cur == end || *cur++ != '1') return GRPC_ERROR_CREATE("Expected '1'"); |
|
||||||
if (cur == end || *cur++ != '.') return GRPC_ERROR_CREATE("Expected '.'"); |
|
||||||
if (cur == end || *cur < '0' || *cur++ > '1') { |
|
||||||
return GRPC_ERROR_CREATE("Expected HTTP/1.0 or HTTP/1.1"); |
|
||||||
} |
|
||||||
if (cur == end || *cur++ != ' ') return GRPC_ERROR_CREATE("Expected ' '"); |
|
||||||
if (cur == end || *cur < '1' || *cur++ > '9') |
|
||||||
return GRPC_ERROR_CREATE("Expected status code"); |
|
||||||
if (cur == end || *cur < '0' || *cur++ > '9') |
|
||||||
return GRPC_ERROR_CREATE("Expected status code"); |
|
||||||
if (cur == end || *cur < '0' || *cur++ > '9') |
|
||||||
return GRPC_ERROR_CREATE("Expected status code"); |
|
||||||
parser->http.response->status = |
|
||||||
(cur[-3] - '0') * 100 + (cur[-2] - '0') * 10 + (cur[-1] - '0'); |
|
||||||
if (cur == end || *cur++ != ' ') return GRPC_ERROR_CREATE("Expected ' '"); |
|
||||||
|
|
||||||
/* we don't really care about the status code message */ |
|
||||||
|
|
||||||
return GRPC_ERROR_NONE; |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_error *handle_request_line(grpc_http_parser *parser) { |
|
||||||
uint8_t *beg = parser->cur_line; |
|
||||||
uint8_t *cur = beg; |
|
||||||
uint8_t *end = beg + parser->cur_line_length; |
|
||||||
uint8_t vers_major = 0; |
|
||||||
uint8_t vers_minor = 0; |
|
||||||
|
|
||||||
while (cur != end && *cur++ != ' ') |
|
||||||
; |
|
||||||
if (cur == end) return GRPC_ERROR_CREATE("No method on HTTP request line"); |
|
||||||
parser->http.request->method = buf2str(beg, (size_t)(cur - beg - 1)); |
|
||||||
|
|
||||||
beg = cur; |
|
||||||
while (cur != end && *cur++ != ' ') |
|
||||||
; |
|
||||||
if (cur == end) return GRPC_ERROR_CREATE("No path on HTTP request line"); |
|
||||||
parser->http.request->path = buf2str(beg, (size_t)(cur - beg - 1)); |
|
||||||
|
|
||||||
if (cur == end || *cur++ != 'H') return GRPC_ERROR_CREATE("Expected 'H'"); |
|
||||||
if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); |
|
||||||
if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); |
|
||||||
if (cur == end || *cur++ != 'P') return GRPC_ERROR_CREATE("Expected 'P'"); |
|
||||||
if (cur == end || *cur++ != '/') return GRPC_ERROR_CREATE("Expected '/'"); |
|
||||||
vers_major = (uint8_t)(*cur++ - '1' + 1); |
|
||||||
++cur; |
|
||||||
if (cur == end) |
|
||||||
return GRPC_ERROR_CREATE("End of line in HTTP version string"); |
|
||||||
vers_minor = (uint8_t)(*cur++ - '1' + 1); |
|
||||||
|
|
||||||
if (vers_major == 1) { |
|
||||||
if (vers_minor == 0) { |
|
||||||
parser->http.request->version = GRPC_HTTP_HTTP10; |
|
||||||
} else if (vers_minor == 1) { |
|
||||||
parser->http.request->version = GRPC_HTTP_HTTP11; |
|
||||||
} else { |
|
||||||
return GRPC_ERROR_CREATE( |
|
||||||
"Expected one of HTTP/1.0, HTTP/1.1, or HTTP/2.0"); |
|
||||||
} |
|
||||||
} else if (vers_major == 2) { |
|
||||||
if (vers_minor == 0) { |
|
||||||
parser->http.request->version = GRPC_HTTP_HTTP20; |
|
||||||
} else { |
|
||||||
return GRPC_ERROR_CREATE( |
|
||||||
"Expected one of HTTP/1.0, HTTP/1.1, or HTTP/2.0"); |
|
||||||
} |
|
||||||
} else { |
|
||||||
return GRPC_ERROR_CREATE("Expected one of HTTP/1.0, HTTP/1.1, or HTTP/2.0"); |
|
||||||
} |
|
||||||
|
|
||||||
return GRPC_ERROR_NONE; |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_error *handle_first_line(grpc_http_parser *parser) { |
|
||||||
switch (parser->type) { |
|
||||||
case GRPC_HTTP_REQUEST: |
|
||||||
return handle_request_line(parser); |
|
||||||
case GRPC_HTTP_RESPONSE: |
|
||||||
return handle_response_line(parser); |
|
||||||
} |
|
||||||
GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_error *add_header(grpc_http_parser *parser) { |
|
||||||
uint8_t *beg = parser->cur_line; |
|
||||||
uint8_t *cur = beg; |
|
||||||
uint8_t *end = beg + parser->cur_line_length; |
|
||||||
size_t *hdr_count = NULL; |
|
||||||
grpc_http_header **hdrs = NULL; |
|
||||||
grpc_http_header hdr = {NULL, NULL}; |
|
||||||
grpc_error *error = GRPC_ERROR_NONE; |
|
||||||
|
|
||||||
GPR_ASSERT(cur != end); |
|
||||||
|
|
||||||
if (*cur == ' ' || *cur == '\t') { |
|
||||||
error = GRPC_ERROR_CREATE("Continued header lines not supported yet"); |
|
||||||
goto done; |
|
||||||
} |
|
||||||
|
|
||||||
while (cur != end && *cur != ':') { |
|
||||||
cur++; |
|
||||||
} |
|
||||||
if (cur == end) { |
|
||||||
<<<<<<< HEAD |
|
||||||
error = GRPC_ERROR_CREATE("Didn't find ':' in header string"); |
|
||||||
goto done; |
|
||||||
======= |
|
||||||
if (grpc_http1_trace) { |
|
||||||
gpr_log(GPR_ERROR, "Didn't find ':' in header string"); |
|
||||||
} |
|
||||||
goto error; |
|
||||||
>>>>>>> a709afe241d8b264a1c326315f757b4a8d330207 |
|
||||||
} |
|
||||||
GPR_ASSERT(cur >= beg); |
|
||||||
hdr.key = buf2str(beg, (size_t)(cur - beg)); |
|
||||||
cur++; /* skip : */ |
|
||||||
|
|
||||||
while (cur != end && (*cur == ' ' || *cur == '\t')) { |
|
||||||
cur++; |
|
||||||
} |
|
||||||
GPR_ASSERT((size_t)(end - cur) >= parser->cur_line_end_length); |
|
||||||
hdr.value = buf2str(cur, (size_t)(end - cur) - parser->cur_line_end_length); |
|
||||||
|
|
||||||
switch (parser->type) { |
|
||||||
case GRPC_HTTP_RESPONSE: |
|
||||||
hdr_count = &parser->http.response->hdr_count; |
|
||||||
hdrs = &parser->http.response->hdrs; |
|
||||||
break; |
|
||||||
case GRPC_HTTP_REQUEST: |
|
||||||
hdr_count = &parser->http.request->hdr_count; |
|
||||||
hdrs = &parser->http.request->hdrs; |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
if (*hdr_count == parser->hdr_capacity) { |
|
||||||
parser->hdr_capacity = |
|
||||||
GPR_MAX(parser->hdr_capacity + 1, parser->hdr_capacity * 3 / 2); |
|
||||||
*hdrs = gpr_realloc(*hdrs, parser->hdr_capacity * sizeof(**hdrs)); |
|
||||||
} |
|
||||||
(*hdrs)[(*hdr_count)++] = hdr; |
|
||||||
|
|
||||||
done: |
|
||||||
if (error != GRPC_ERROR_NONE) { |
|
||||||
gpr_free(hdr.key); |
|
||||||
gpr_free(hdr.value); |
|
||||||
} |
|
||||||
return error; |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_error *finish_line(grpc_http_parser *parser) { |
|
||||||
grpc_error *err; |
|
||||||
switch (parser->state) { |
|
||||||
case GRPC_HTTP_FIRST_LINE: |
|
||||||
err = handle_first_line(parser); |
|
||||||
if (err != GRPC_ERROR_NONE) return err; |
|
||||||
parser->state = GRPC_HTTP_HEADERS; |
|
||||||
break; |
|
||||||
case GRPC_HTTP_HEADERS: |
|
||||||
if (parser->cur_line_length == parser->cur_line_end_length) { |
|
||||||
parser->state = GRPC_HTTP_BODY; |
|
||||||
break; |
|
||||||
} |
|
||||||
err = add_header(parser); |
|
||||||
if (err != GRPC_ERROR_NONE) { |
|
||||||
return err; |
|
||||||
} |
|
||||||
break; |
|
||||||
case GRPC_HTTP_BODY: |
|
||||||
GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); |
|
||||||
} |
|
||||||
|
|
||||||
parser->cur_line_length = 0; |
|
||||||
return GRPC_ERROR_NONE; |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_error *addbyte_body(grpc_http_parser *parser, uint8_t byte) { |
|
||||||
size_t *body_length = NULL; |
|
||||||
char **body = NULL; |
|
||||||
|
|
||||||
if (parser->type == GRPC_HTTP_RESPONSE) { |
|
||||||
body_length = &parser->http.response->body_length; |
|
||||||
body = &parser->http.response->body; |
|
||||||
} else if (parser->type == GRPC_HTTP_REQUEST) { |
|
||||||
body_length = &parser->http.request->body_length; |
|
||||||
body = &parser->http.request->body; |
|
||||||
} else { |
|
||||||
GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); |
|
||||||
} |
|
||||||
|
|
||||||
if (*body_length == parser->body_capacity) { |
|
||||||
parser->body_capacity = GPR_MAX(8, parser->body_capacity * 3 / 2); |
|
||||||
*body = gpr_realloc((void *)*body, parser->body_capacity); |
|
||||||
} |
|
||||||
(*body)[*body_length] = (char)byte; |
|
||||||
(*body_length)++; |
|
||||||
|
|
||||||
return GRPC_ERROR_NONE; |
|
||||||
} |
|
||||||
|
|
||||||
static bool check_line(grpc_http_parser *parser) { |
|
||||||
if (parser->cur_line_length >= 2 && |
|
||||||
parser->cur_line[parser->cur_line_length - 2] == '\r' && |
|
||||||
parser->cur_line[parser->cur_line_length - 1] == '\n') { |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
// HTTP request with \n\r line termiantors.
|
|
||||||
else if (parser->cur_line_length >= 2 && |
|
||||||
parser->cur_line[parser->cur_line_length - 2] == '\n' && |
|
||||||
parser->cur_line[parser->cur_line_length - 1] == '\r') { |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
// HTTP request with only \n line terminators.
|
|
||||||
else if (parser->cur_line_length >= 1 && |
|
||||||
parser->cur_line[parser->cur_line_length - 1] == '\n') { |
|
||||||
parser->cur_line_end_length = 1; |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_error *addbyte(grpc_http_parser *parser, uint8_t byte) { |
|
||||||
switch (parser->state) { |
|
||||||
case GRPC_HTTP_FIRST_LINE: |
|
||||||
case GRPC_HTTP_HEADERS: |
|
||||||
if (parser->cur_line_length >= GRPC_HTTP_PARSER_MAX_HEADER_LENGTH) { |
|
||||||
if (grpc_http1_trace) |
|
||||||
gpr_log(GPR_ERROR, "HTTP client max line length (%d) exceeded", |
|
||||||
GRPC_HTTP_PARSER_MAX_HEADER_LENGTH); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
parser->cur_line[parser->cur_line_length] = byte; |
|
||||||
parser->cur_line_length++; |
|
||||||
if (check_line(parser)) { |
|
||||||
return finish_line(parser); |
|
||||||
} else { |
|
||||||
return GRPC_ERROR_NONE; |
|
||||||
} |
|
||||||
GPR_UNREACHABLE_CODE(return 0); |
|
||||||
case GRPC_HTTP_BODY: |
|
||||||
return addbyte_body(parser, byte); |
|
||||||
} |
|
||||||
GPR_UNREACHABLE_CODE(return 0); |
|
||||||
} |
|
||||||
|
|
||||||
void grpc_http_parser_init(grpc_http_parser *parser, grpc_http_type type, |
|
||||||
void *request_or_response) { |
|
||||||
memset(parser, 0, sizeof(*parser)); |
|
||||||
parser->state = GRPC_HTTP_FIRST_LINE; |
|
||||||
parser->type = type; |
|
||||||
parser->http.request_or_response = request_or_response; |
|
||||||
parser->cur_line_end_length = 2; |
|
||||||
} |
|
||||||
|
|
||||||
void grpc_http_parser_destroy(grpc_http_parser *parser) {} |
|
||||||
|
|
||||||
void grpc_http_request_destroy(grpc_http_request *request) { |
|
||||||
size_t i; |
|
||||||
gpr_free(request->body); |
|
||||||
for (i = 0; i < request->hdr_count; i++) { |
|
||||||
gpr_free(request->hdrs[i].key); |
|
||||||
gpr_free(request->hdrs[i].value); |
|
||||||
} |
|
||||||
gpr_free(request->hdrs); |
|
||||||
gpr_free(request->method); |
|
||||||
gpr_free(request->path); |
|
||||||
} |
|
||||||
|
|
||||||
void grpc_http_response_destroy(grpc_http_response *response) { |
|
||||||
size_t i; |
|
||||||
gpr_free(response->body); |
|
||||||
for (i = 0; i < response->hdr_count; i++) { |
|
||||||
gpr_free(response->hdrs[i].key); |
|
||||||
gpr_free(response->hdrs[i].value); |
|
||||||
} |
|
||||||
gpr_free(response->hdrs); |
|
||||||
} |
|
||||||
|
|
||||||
grpc_error *grpc_http_parser_parse(grpc_http_parser *parser, gpr_slice slice) { |
|
||||||
size_t i; |
|
||||||
|
|
||||||
for (i = 0; i < GPR_SLICE_LENGTH(slice); i++) { |
|
||||||
grpc_error *err = addbyte(parser, GPR_SLICE_START_PTR(slice)[i]); |
|
||||||
if (err != GRPC_ERROR_NONE) return err; |
|
||||||
} |
|
||||||
|
|
||||||
return GRPC_ERROR_NONE; |
|
||||||
} |
|
||||||
|
|
||||||
grpc_error *grpc_http_parser_eof(grpc_http_parser *parser) { |
|
||||||
if (parser->state != GRPC_HTTP_BODY) { |
|
||||||
return GRPC_ERROR_CREATE("Did not finish headers"); |
|
||||||
} |
|
||||||
return GRPC_ERROR_NONE; |
|
||||||
} |
|
@ -0,0 +1,28 @@ |
|||||||
|
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. |
@ -0,0 +1,37 @@ |
|||||||
|
/* |
||||||
|
* |
||||||
|
* Copyright 2016, 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. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
/* This exists solely to allow the generated code to import the grpc module |
||||||
|
* without using a relative path */ |
||||||
|
|
||||||
|
module.exports = require('../..'); |
@ -0,0 +1,29 @@ |
|||||||
|
{ |
||||||
|
"name": "grpc-health-check", |
||||||
|
"version": "1.1.0-dev", |
||||||
|
"author": "Google Inc.", |
||||||
|
"description": "Health check service for use with gRPC", |
||||||
|
"repository": { |
||||||
|
"type": "git", |
||||||
|
"url": "https://github.com/grpc/grpc.git" |
||||||
|
}, |
||||||
|
"bugs": "https://github.com/grpc/grpc/issues", |
||||||
|
"contributors": [ |
||||||
|
{ |
||||||
|
"name": "Michael Lumish", |
||||||
|
"email": "mlumish@google.com" |
||||||
|
} |
||||||
|
], |
||||||
|
"dependencies": { |
||||||
|
"grpc": "^0.15.0", |
||||||
|
"lodash": "^3.9.3", |
||||||
|
"google-protobuf": "^3.0.0-alpha.5" |
||||||
|
}, |
||||||
|
"files": { |
||||||
|
"LICENSE", |
||||||
|
"health.js", |
||||||
|
"v1" |
||||||
|
}, |
||||||
|
"main": "src/node/index.js", |
||||||
|
"license": "BSD-3-Clause" |
||||||
|
} |
@ -0,0 +1,342 @@ |
|||||||
|
/** |
||||||
|
* @fileoverview |
||||||
|
* @enhanceable |
||||||
|
* @public |
||||||
|
*/ |
||||||
|
// GENERATED CODE -- DO NOT EDIT!
|
||||||
|
|
||||||
|
var jspb = require('google-protobuf'); |
||||||
|
var goog = jspb; |
||||||
|
var global = Function('return this')(); |
||||||
|
|
||||||
|
goog.exportSymbol('proto.grpc.health.v1.HealthCheckRequest', null, global); |
||||||
|
goog.exportSymbol('proto.grpc.health.v1.HealthCheckResponse', null, global); |
||||||
|
goog.exportSymbol('proto.grpc.health.v1.HealthCheckResponse.ServingStatus', null, global); |
||||||
|
|
||||||
|
/** |
||||||
|
* Generated by JsPbCodeGenerator. |
||||||
|
* @param {Array=} opt_data Optional initial data array, typically from a |
||||||
|
* server response, or constructed directly in Javascript. The array is used |
||||||
|
* in place and becomes part of the constructed object. It is not cloned. |
||||||
|
* If no data is provided, the constructed object will be empty, but still |
||||||
|
* valid. |
||||||
|
* @extends {jspb.Message} |
||||||
|
* @constructor |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest = function(opt_data) { |
||||||
|
jspb.Message.initialize(this, opt_data, 0, -1, null, null); |
||||||
|
}; |
||||||
|
goog.inherits(proto.grpc.health.v1.HealthCheckRequest, jspb.Message); |
||||||
|
if (goog.DEBUG && !COMPILED) { |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.displayName = 'proto.grpc.health.v1.HealthCheckRequest'; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
if (jspb.Message.GENERATE_TO_OBJECT) { |
||||||
|
/** |
||||||
|
* Creates an object representation of this proto suitable for use in Soy templates. |
||||||
|
* Field names that are reserved in JavaScript and will be renamed to pb_name. |
||||||
|
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. |
||||||
|
* For the list of reserved names please see: |
||||||
|
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. |
||||||
|
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance |
||||||
|
* for transitional soy proto support: http://goto/soy-param-migration
|
||||||
|
* @return {!Object} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.prototype.toObject = function(opt_includeInstance) { |
||||||
|
return proto.grpc.health.v1.HealthCheckRequest.toObject(opt_includeInstance, this); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Static version of the {@see toObject} method. |
||||||
|
* @param {boolean|undefined} includeInstance Whether to include the JSPB |
||||||
|
* instance for transitional soy proto support: |
||||||
|
* http://goto/soy-param-migration
|
||||||
|
* @param {!proto.grpc.health.v1.HealthCheckRequest} msg The msg instance to transform. |
||||||
|
* @return {!Object} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.toObject = function(includeInstance, msg) { |
||||||
|
var f, obj = { |
||||||
|
service: msg.getService() |
||||||
|
}; |
||||||
|
|
||||||
|
if (includeInstance) { |
||||||
|
obj.$jspbMessageInstance = msg; |
||||||
|
} |
||||||
|
return obj; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Deserializes binary data (in protobuf wire format). |
||||||
|
* @param {jspb.ByteSource} bytes The bytes to deserialize. |
||||||
|
* @return {!proto.grpc.health.v1.HealthCheckRequest} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.deserializeBinary = function(bytes) { |
||||||
|
var reader = new jspb.BinaryReader(bytes); |
||||||
|
var msg = new proto.grpc.health.v1.HealthCheckRequest; |
||||||
|
return proto.grpc.health.v1.HealthCheckRequest.deserializeBinaryFromReader(msg, reader); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Deserializes binary data (in protobuf wire format) from the |
||||||
|
* given reader into the given message object. |
||||||
|
* @param {!proto.grpc.health.v1.HealthCheckRequest} msg The message object to deserialize into. |
||||||
|
* @param {!jspb.BinaryReader} reader The BinaryReader to use. |
||||||
|
* @return {!proto.grpc.health.v1.HealthCheckRequest} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.deserializeBinaryFromReader = function(msg, reader) { |
||||||
|
while (reader.nextField()) { |
||||||
|
if (reader.isEndGroup()) { |
||||||
|
break; |
||||||
|
} |
||||||
|
var field = reader.getFieldNumber(); |
||||||
|
switch (field) { |
||||||
|
case 1: |
||||||
|
var value = /** @type {string} */ (reader.readString()); |
||||||
|
msg.setService(value); |
||||||
|
break; |
||||||
|
default: |
||||||
|
reader.skipField(); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return msg; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Class method variant: serializes the given message to binary data |
||||||
|
* (in protobuf wire format), writing to the given BinaryWriter. |
||||||
|
* @param {!proto.grpc.health.v1.HealthCheckRequest} message |
||||||
|
* @param {!jspb.BinaryWriter} writer |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.serializeBinaryToWriter = function(message, writer) { |
||||||
|
message.serializeBinaryToWriter(writer); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Serializes the message to binary data (in protobuf wire format). |
||||||
|
* @return {!Uint8Array} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.prototype.serializeBinary = function() { |
||||||
|
var writer = new jspb.BinaryWriter(); |
||||||
|
this.serializeBinaryToWriter(writer); |
||||||
|
return writer.getResultBuffer(); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Serializes the message to binary data (in protobuf wire format), |
||||||
|
* writing to the given BinaryWriter. |
||||||
|
* @param {!jspb.BinaryWriter} writer |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.prototype.serializeBinaryToWriter = function (writer) { |
||||||
|
var f = undefined; |
||||||
|
f = this.getService(); |
||||||
|
if (f.length > 0) { |
||||||
|
writer.writeString( |
||||||
|
1, |
||||||
|
f |
||||||
|
); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a deep clone of this proto. No data is shared with the original. |
||||||
|
* @return {!proto.grpc.health.v1.HealthCheckRequest} The clone. |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.prototype.cloneMessage = function() { |
||||||
|
return /** @type {!proto.grpc.health.v1.HealthCheckRequest} */ (jspb.Message.cloneMessage(this)); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* optional string service = 1; |
||||||
|
* @return {string} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.prototype.getService = function() { |
||||||
|
return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, "")); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** @param {string} value */ |
||||||
|
proto.grpc.health.v1.HealthCheckRequest.prototype.setService = function(value) { |
||||||
|
jspb.Message.setField(this, 1, value); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Generated by JsPbCodeGenerator. |
||||||
|
* @param {Array=} opt_data Optional initial data array, typically from a |
||||||
|
* server response, or constructed directly in Javascript. The array is used |
||||||
|
* in place and becomes part of the constructed object. It is not cloned. |
||||||
|
* If no data is provided, the constructed object will be empty, but still |
||||||
|
* valid. |
||||||
|
* @extends {jspb.Message} |
||||||
|
* @constructor |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse = function(opt_data) { |
||||||
|
jspb.Message.initialize(this, opt_data, 0, -1, null, null); |
||||||
|
}; |
||||||
|
goog.inherits(proto.grpc.health.v1.HealthCheckResponse, jspb.Message); |
||||||
|
if (goog.DEBUG && !COMPILED) { |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.displayName = 'proto.grpc.health.v1.HealthCheckResponse'; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
if (jspb.Message.GENERATE_TO_OBJECT) { |
||||||
|
/** |
||||||
|
* Creates an object representation of this proto suitable for use in Soy templates. |
||||||
|
* Field names that are reserved in JavaScript and will be renamed to pb_name. |
||||||
|
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. |
||||||
|
* For the list of reserved names please see: |
||||||
|
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. |
||||||
|
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance |
||||||
|
* for transitional soy proto support: http://goto/soy-param-migration
|
||||||
|
* @return {!Object} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.prototype.toObject = function(opt_includeInstance) { |
||||||
|
return proto.grpc.health.v1.HealthCheckResponse.toObject(opt_includeInstance, this); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Static version of the {@see toObject} method. |
||||||
|
* @param {boolean|undefined} includeInstance Whether to include the JSPB |
||||||
|
* instance for transitional soy proto support: |
||||||
|
* http://goto/soy-param-migration
|
||||||
|
* @param {!proto.grpc.health.v1.HealthCheckResponse} msg The msg instance to transform. |
||||||
|
* @return {!Object} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.toObject = function(includeInstance, msg) { |
||||||
|
var f, obj = { |
||||||
|
status: msg.getStatus() |
||||||
|
}; |
||||||
|
|
||||||
|
if (includeInstance) { |
||||||
|
obj.$jspbMessageInstance = msg; |
||||||
|
} |
||||||
|
return obj; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Deserializes binary data (in protobuf wire format). |
||||||
|
* @param {jspb.ByteSource} bytes The bytes to deserialize. |
||||||
|
* @return {!proto.grpc.health.v1.HealthCheckResponse} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.deserializeBinary = function(bytes) { |
||||||
|
var reader = new jspb.BinaryReader(bytes); |
||||||
|
var msg = new proto.grpc.health.v1.HealthCheckResponse; |
||||||
|
return proto.grpc.health.v1.HealthCheckResponse.deserializeBinaryFromReader(msg, reader); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Deserializes binary data (in protobuf wire format) from the |
||||||
|
* given reader into the given message object. |
||||||
|
* @param {!proto.grpc.health.v1.HealthCheckResponse} msg The message object to deserialize into. |
||||||
|
* @param {!jspb.BinaryReader} reader The BinaryReader to use. |
||||||
|
* @return {!proto.grpc.health.v1.HealthCheckResponse} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.deserializeBinaryFromReader = function(msg, reader) { |
||||||
|
while (reader.nextField()) { |
||||||
|
if (reader.isEndGroup()) { |
||||||
|
break; |
||||||
|
} |
||||||
|
var field = reader.getFieldNumber(); |
||||||
|
switch (field) { |
||||||
|
case 1: |
||||||
|
var value = /** @type {!proto.grpc.health.v1.HealthCheckResponse.ServingStatus} */ (reader.readEnum()); |
||||||
|
msg.setStatus(value); |
||||||
|
break; |
||||||
|
default: |
||||||
|
reader.skipField(); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return msg; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Class method variant: serializes the given message to binary data |
||||||
|
* (in protobuf wire format), writing to the given BinaryWriter. |
||||||
|
* @param {!proto.grpc.health.v1.HealthCheckResponse} message |
||||||
|
* @param {!jspb.BinaryWriter} writer |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.serializeBinaryToWriter = function(message, writer) { |
||||||
|
message.serializeBinaryToWriter(writer); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Serializes the message to binary data (in protobuf wire format). |
||||||
|
* @return {!Uint8Array} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.prototype.serializeBinary = function() { |
||||||
|
var writer = new jspb.BinaryWriter(); |
||||||
|
this.serializeBinaryToWriter(writer); |
||||||
|
return writer.getResultBuffer(); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Serializes the message to binary data (in protobuf wire format), |
||||||
|
* writing to the given BinaryWriter. |
||||||
|
* @param {!jspb.BinaryWriter} writer |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.prototype.serializeBinaryToWriter = function (writer) { |
||||||
|
var f = undefined; |
||||||
|
f = this.getStatus(); |
||||||
|
if (f !== 0.0) { |
||||||
|
writer.writeEnum( |
||||||
|
1, |
||||||
|
f |
||||||
|
); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a deep clone of this proto. No data is shared with the original. |
||||||
|
* @return {!proto.grpc.health.v1.HealthCheckResponse} The clone. |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.prototype.cloneMessage = function() { |
||||||
|
return /** @type {!proto.grpc.health.v1.HealthCheckResponse} */ (jspb.Message.cloneMessage(this)); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* optional ServingStatus status = 1; |
||||||
|
* @return {!proto.grpc.health.v1.HealthCheckResponse.ServingStatus} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.prototype.getStatus = function() { |
||||||
|
return /** @type {!proto.grpc.health.v1.HealthCheckResponse.ServingStatus} */ (jspb.Message.getFieldProto3(this, 1, 0)); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** @param {!proto.grpc.health.v1.HealthCheckResponse.ServingStatus} value */ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.prototype.setStatus = function(value) { |
||||||
|
jspb.Message.setField(this, 1, value); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @enum {number} |
||||||
|
*/ |
||||||
|
proto.grpc.health.v1.HealthCheckResponse.ServingStatus = { |
||||||
|
UNKNOWN: 0, |
||||||
|
SERVING: 1, |
||||||
|
NOT_SERVING: 2 |
||||||
|
}; |
||||||
|
|
||||||
|
goog.object.extend(exports, proto.grpc.health.v1); |
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,43 @@ |
|||||||
source 'https://github.com/CocoaPods/Specs.git' |
source 'https://github.com/CocoaPods/Specs.git' |
||||||
platform :ios, '8.0' |
platform :ios, '8.0' |
||||||
|
|
||||||
pod 'Protobuf', :path => "../../../../third_party/protobuf" |
install! 'cocoapods', :deterministic_uuids => false |
||||||
pod 'BoringSSL', :podspec => "../.." |
|
||||||
pod 'gRPC', :path => "../../../.." |
# Location of gRPC's repo root relative to this file. |
||||||
pod 'RemoteTest', :path => "../RemoteTestClient" |
GRPC_LOCAL_SRC = '../../../..' |
||||||
|
|
||||||
target 'Sample' do |
target 'Sample' do |
||||||
|
# Depend on the generated RemoteTestClient library |
||||||
|
pod 'RemoteTest', :path => "../RemoteTestClient" |
||||||
|
|
||||||
|
# Use the local versions of Protobuf, BoringSSL, and gRPC. You don't need any of the following |
||||||
|
# lines in your application. |
||||||
|
pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf" |
||||||
|
|
||||||
|
pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c" |
||||||
|
|
||||||
|
pod 'gRPC', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-Core', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-ProtoRPC', :path => GRPC_LOCAL_SRC |
||||||
|
end |
||||||
|
|
||||||
|
# This pre_install hook is only needed to use the local version of gRPC-Core. You don't need it in |
||||||
|
# your application. |
||||||
|
pre_install do |installer| |
||||||
|
# This is the gRPC-Core podspec object, as initialized by its podspec file. |
||||||
|
grpc_core_spec = installer.pod_targets.find{|t| t.name == 'gRPC-Core'}.root_spec |
||||||
|
|
||||||
|
# Copied from gRPC-Core.podspec, except for the adjusted src_root: |
||||||
|
src_root = "$(PODS_ROOT)/../#{GRPC_LOCAL_SRC}" |
||||||
|
grpc_core_spec.pod_target_xcconfig = { |
||||||
|
'GRPC_SRC_ROOT' => src_root, |
||||||
|
'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', |
||||||
|
'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', |
||||||
|
# If we don't set these two settings, `include/grpc/support/time.h` and |
||||||
|
# `src/core/lib/support/string.h` shadow the system `<time.h>` and `<string.h>`, breaking the |
||||||
|
# build. |
||||||
|
'USE_HEADERMAP' => 'NO', |
||||||
|
'ALWAYS_SEARCH_USER_PATHS' => 'NO', |
||||||
|
} |
||||||
end |
end |
||||||
|
@ -1,10 +1,43 @@ |
|||||||
source 'https://github.com/CocoaPods/Specs.git' |
source 'https://github.com/CocoaPods/Specs.git' |
||||||
platform :ios, '8.0' |
platform :ios, '8.0' |
||||||
|
|
||||||
pod 'Protobuf', :path => "../../../../third_party/protobuf" |
install! 'cocoapods', :deterministic_uuids => false |
||||||
pod 'BoringSSL', :podspec => "../.." |
|
||||||
pod 'gRPC', :path => "../../../.." |
# Location of gRPC's repo root relative to this file. |
||||||
pod 'RemoteTest', :path => "../RemoteTestClient" |
GRPC_LOCAL_SRC = '../../../..' |
||||||
|
|
||||||
target 'SwiftSample' do |
target 'SwiftSample' do |
||||||
|
# Depend on the generated RemoteTestClient library |
||||||
|
pod 'RemoteTest', :path => "../RemoteTestClient" |
||||||
|
|
||||||
|
# Use the local versions of Protobuf, BoringSSL, and gRPC. You don't need any of the following |
||||||
|
# lines in your application. |
||||||
|
pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf" |
||||||
|
|
||||||
|
pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c" |
||||||
|
|
||||||
|
pod 'gRPC', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-Core', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'gRPC-ProtoRPC', :path => GRPC_LOCAL_SRC |
||||||
|
end |
||||||
|
|
||||||
|
# This pre_install hook is only needed to use the local version of gRPC-Core. You don't need it in |
||||||
|
# your application. |
||||||
|
pre_install do |installer| |
||||||
|
# This is the gRPC-Core podspec object, as initialized by its podspec file. |
||||||
|
grpc_core_spec = installer.pod_targets.find{|t| t.name == 'gRPC-Core'}.root_spec |
||||||
|
|
||||||
|
# Copied from gRPC-Core.podspec, except for the adjusted src_root: |
||||||
|
src_root = "$(PODS_ROOT)/../#{GRPC_LOCAL_SRC}" |
||||||
|
grpc_core_spec.pod_target_xcconfig = { |
||||||
|
'GRPC_SRC_ROOT' => src_root, |
||||||
|
'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', |
||||||
|
'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', |
||||||
|
# If we don't set these two settings, `include/grpc/support/time.h` and |
||||||
|
# `src/core/lib/support/string.h` shadow the system `<time.h>` and `<string.h>`, breaking the |
||||||
|
# build. |
||||||
|
'USE_HEADERMAP' => 'NO', |
||||||
|
'ALWAYS_SEARCH_USER_PATHS' => 'NO', |
||||||
|
} |
||||||
end |
end |
||||||
|
@ -0,0 +1,16 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11129.15" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> |
||||||
|
<dependencies> |
||||||
|
<deployment identifier="iOS"/> |
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11103.10"/> |
||||||
|
</dependencies> |
||||||
|
<scenes> |
||||||
|
<!--View Controller--> |
||||||
|
<scene sceneID="tne-QT-ifu"> |
||||||
|
<objects> |
||||||
|
<viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController"/> |
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> |
||||||
|
</objects> |
||||||
|
</scene> |
||||||
|
</scenes> |
||||||
|
</document> |
@ -0,0 +1,353 @@ |
|||||||
|
// !$*UTF8*$! |
||||||
|
{ |
||||||
|
archiveVersion = 1; |
||||||
|
classes = { |
||||||
|
}; |
||||||
|
objectVersion = 46; |
||||||
|
objects = { |
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */ |
||||||
|
500A4E0AC9D489EB214D1ED4 /* libPods-ConnectivityTestingApp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C2AF815D8242A2172891621D /* libPods-ConnectivityTestingApp.a */; }; |
||||||
|
63BFB9CC1D2478DD00E17927 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 63BFB9CB1D2478DD00E17927 /* main.m */; }; |
||||||
|
63BFB9D21D2478DD00E17927 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63BFB9D11D2478DD00E17927 /* ViewController.m */; }; |
||||||
|
63BFB9D51D2478DD00E17927 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 63BFB9D31D2478DD00E17927 /* Main.storyboard */; }; |
||||||
|
/* End PBXBuildFile section */ |
||||||
|
|
||||||
|
/* Begin PBXFileReference section */ |
||||||
|
63BFB9C71D2478DD00E17927 /* ConnectivityTestingApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ConnectivityTestingApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; |
||||||
|
63BFB9CB1D2478DD00E17927 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = SOURCE_ROOT; }; |
||||||
|
63BFB9D11D2478DD00E17927 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = SOURCE_ROOT; }; |
||||||
|
63BFB9D41D2478DD00E17927 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; |
||||||
|
63BFB9DB1D2478DD00E17927 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; |
||||||
|
BA96CBC1612BD2F70E66246C /* Pods-ConnectivityTestingApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConnectivityTestingApp.release.xcconfig"; path = "Pods/Target Support Files/Pods-ConnectivityTestingApp/Pods-ConnectivityTestingApp.release.xcconfig"; sourceTree = "<group>"; }; |
||||||
|
C2AF815D8242A2172891621D /* libPods-ConnectivityTestingApp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ConnectivityTestingApp.a"; sourceTree = BUILT_PRODUCTS_DIR; }; |
||||||
|
FC9BD3AE427396EDB4CD13E3 /* Pods-ConnectivityTestingApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConnectivityTestingApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ConnectivityTestingApp/Pods-ConnectivityTestingApp.debug.xcconfig"; sourceTree = "<group>"; }; |
||||||
|
/* End PBXFileReference section */ |
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */ |
||||||
|
63BFB9C41D2478DD00E17927 /* Frameworks */ = { |
||||||
|
isa = PBXFrameworksBuildPhase; |
||||||
|
buildActionMask = 2147483647; |
||||||
|
files = ( |
||||||
|
500A4E0AC9D489EB214D1ED4 /* libPods-ConnectivityTestingApp.a in Frameworks */, |
||||||
|
); |
||||||
|
runOnlyForDeploymentPostprocessing = 0; |
||||||
|
}; |
||||||
|
/* End PBXFrameworksBuildPhase section */ |
||||||
|
|
||||||
|
/* Begin PBXGroup section */ |
||||||
|
16E6C67F2E48B42376DFFD2A /* Pods */ = { |
||||||
|
isa = PBXGroup; |
||||||
|
children = ( |
||||||
|
FC9BD3AE427396EDB4CD13E3 /* Pods-ConnectivityTestingApp.debug.xcconfig */, |
||||||
|
BA96CBC1612BD2F70E66246C /* Pods-ConnectivityTestingApp.release.xcconfig */, |
||||||
|
); |
||||||
|
name = Pods; |
||||||
|
sourceTree = "<group>"; |
||||||
|
}; |
||||||
|
48F8EC18C66D3416A41F76F5 /* Frameworks */ = { |
||||||
|
isa = PBXGroup; |
||||||
|
children = ( |
||||||
|
C2AF815D8242A2172891621D /* libPods-ConnectivityTestingApp.a */, |
||||||
|
); |
||||||
|
name = Frameworks; |
||||||
|
sourceTree = "<group>"; |
||||||
|
}; |
||||||
|
63BFB9BE1D2478DD00E17927 = { |
||||||
|
isa = PBXGroup; |
||||||
|
children = ( |
||||||
|
63BFB9D11D2478DD00E17927 /* ViewController.m */, |
||||||
|
63BFB9D31D2478DD00E17927 /* Main.storyboard */, |
||||||
|
63BFB9DB1D2478DD00E17927 /* Info.plist */, |
||||||
|
63BFB9CB1D2478DD00E17927 /* main.m */, |
||||||
|
63BFB9C81D2478DD00E17927 /* Products */, |
||||||
|
16E6C67F2E48B42376DFFD2A /* Pods */, |
||||||
|
48F8EC18C66D3416A41F76F5 /* Frameworks */, |
||||||
|
); |
||||||
|
sourceTree = "<group>"; |
||||||
|
}; |
||||||
|
63BFB9C81D2478DD00E17927 /* Products */ = { |
||||||
|
isa = PBXGroup; |
||||||
|
children = ( |
||||||
|
63BFB9C71D2478DD00E17927 /* ConnectivityTestingApp.app */, |
||||||
|
); |
||||||
|
name = Products; |
||||||
|
sourceTree = "<group>"; |
||||||
|
}; |
||||||
|
/* End PBXGroup section */ |
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */ |
||||||
|
63BFB9C61D2478DD00E17927 /* ConnectivityTestingApp */ = { |
||||||
|
isa = PBXNativeTarget; |
||||||
|
buildConfigurationList = 63BFB9DE1D2478DD00E17927 /* Build configuration list for PBXNativeTarget "ConnectivityTestingApp" */; |
||||||
|
buildPhases = ( |
||||||
|
4DCA2703A0AA5DC1BD2751B8 /* [CP] Check Pods Manifest.lock */, |
||||||
|
63BFB9C31D2478DD00E17927 /* Sources */, |
||||||
|
63BFB9C41D2478DD00E17927 /* Frameworks */, |
||||||
|
63BFB9C51D2478DD00E17927 /* Resources */, |
||||||
|
8593A2388A8F7BF5A7E98D26 /* [CP] Embed Pods Frameworks */, |
||||||
|
5347BF6C41E7888C1C05CD88 /* [CP] Copy Pods Resources */, |
||||||
|
); |
||||||
|
buildRules = ( |
||||||
|
); |
||||||
|
dependencies = ( |
||||||
|
); |
||||||
|
name = ConnectivityTestingApp; |
||||||
|
productName = ConnectivityTestingApp; |
||||||
|
productReference = 63BFB9C71D2478DD00E17927 /* ConnectivityTestingApp.app */; |
||||||
|
productType = "com.apple.product-type.application"; |
||||||
|
}; |
||||||
|
/* End PBXNativeTarget section */ |
||||||
|
|
||||||
|
/* Begin PBXProject section */ |
||||||
|
63BFB9BF1D2478DD00E17927 /* Project object */ = { |
||||||
|
isa = PBXProject; |
||||||
|
attributes = { |
||||||
|
LastUpgradeCheck = 0800; |
||||||
|
ORGANIZATIONNAME = gRPC; |
||||||
|
TargetAttributes = { |
||||||
|
63BFB9C61D2478DD00E17927 = { |
||||||
|
CreatedOnToolsVersion = 8.0; |
||||||
|
DevelopmentTeam = EQHXZ8M8AV; |
||||||
|
DevelopmentTeamName = "Google, Inc."; |
||||||
|
ProvisioningStyle = Automatic; |
||||||
|
}; |
||||||
|
}; |
||||||
|
}; |
||||||
|
buildConfigurationList = 63BFB9C21D2478DD00E17927 /* Build configuration list for PBXProject "ConnectivityTestingApp" */; |
||||||
|
compatibilityVersion = "Xcode 3.2"; |
||||||
|
developmentRegion = English; |
||||||
|
hasScannedForEncodings = 0; |
||||||
|
knownRegions = ( |
||||||
|
en, |
||||||
|
Base, |
||||||
|
); |
||||||
|
mainGroup = 63BFB9BE1D2478DD00E17927; |
||||||
|
productRefGroup = 63BFB9C81D2478DD00E17927 /* Products */; |
||||||
|
projectDirPath = ""; |
||||||
|
projectRoot = ""; |
||||||
|
targets = ( |
||||||
|
63BFB9C61D2478DD00E17927 /* ConnectivityTestingApp */, |
||||||
|
); |
||||||
|
}; |
||||||
|
/* End PBXProject section */ |
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */ |
||||||
|
63BFB9C51D2478DD00E17927 /* Resources */ = { |
||||||
|
isa = PBXResourcesBuildPhase; |
||||||
|
buildActionMask = 2147483647; |
||||||
|
files = ( |
||||||
|
63BFB9D51D2478DD00E17927 /* Main.storyboard in Resources */, |
||||||
|
); |
||||||
|
runOnlyForDeploymentPostprocessing = 0; |
||||||
|
}; |
||||||
|
/* End PBXResourcesBuildPhase section */ |
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */ |
||||||
|
4DCA2703A0AA5DC1BD2751B8 /* [CP] Check Pods Manifest.lock */ = { |
||||||
|
isa = PBXShellScriptBuildPhase; |
||||||
|
buildActionMask = 2147483647; |
||||||
|
files = ( |
||||||
|
); |
||||||
|
inputPaths = ( |
||||||
|
); |
||||||
|
name = "[CP] Check Pods Manifest.lock"; |
||||||
|
outputPaths = ( |
||||||
|
); |
||||||
|
runOnlyForDeploymentPostprocessing = 0; |
||||||
|
shellPath = /bin/sh; |
||||||
|
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; |
||||||
|
showEnvVarsInLog = 0; |
||||||
|
}; |
||||||
|
5347BF6C41E7888C1C05CD88 /* [CP] Copy Pods Resources */ = { |
||||||
|
isa = PBXShellScriptBuildPhase; |
||||||
|
buildActionMask = 2147483647; |
||||||
|
files = ( |
||||||
|
); |
||||||
|
inputPaths = ( |
||||||
|
); |
||||||
|
name = "[CP] Copy Pods Resources"; |
||||||
|
outputPaths = ( |
||||||
|
); |
||||||
|
runOnlyForDeploymentPostprocessing = 0; |
||||||
|
shellPath = /bin/sh; |
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ConnectivityTestingApp/Pods-ConnectivityTestingApp-resources.sh\"\n"; |
||||||
|
showEnvVarsInLog = 0; |
||||||
|
}; |
||||||
|
8593A2388A8F7BF5A7E98D26 /* [CP] Embed Pods Frameworks */ = { |
||||||
|
isa = PBXShellScriptBuildPhase; |
||||||
|
buildActionMask = 2147483647; |
||||||
|
files = ( |
||||||
|
); |
||||||
|
inputPaths = ( |
||||||
|
); |
||||||
|
name = "[CP] Embed Pods Frameworks"; |
||||||
|
outputPaths = ( |
||||||
|
); |
||||||
|
runOnlyForDeploymentPostprocessing = 0; |
||||||
|
shellPath = /bin/sh; |
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ConnectivityTestingApp/Pods-ConnectivityTestingApp-frameworks.sh\"\n"; |
||||||
|
showEnvVarsInLog = 0; |
||||||
|
}; |
||||||
|
/* End PBXShellScriptBuildPhase section */ |
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */ |
||||||
|
63BFB9C31D2478DD00E17927 /* Sources */ = { |
||||||
|
isa = PBXSourcesBuildPhase; |
||||||
|
buildActionMask = 2147483647; |
||||||
|
files = ( |
||||||
|
63BFB9D21D2478DD00E17927 /* ViewController.m in Sources */, |
||||||
|
63BFB9CC1D2478DD00E17927 /* main.m in Sources */, |
||||||
|
); |
||||||
|
runOnlyForDeploymentPostprocessing = 0; |
||||||
|
}; |
||||||
|
/* End PBXSourcesBuildPhase section */ |
||||||
|
|
||||||
|
/* Begin PBXVariantGroup section */ |
||||||
|
63BFB9D31D2478DD00E17927 /* Main.storyboard */ = { |
||||||
|
isa = PBXVariantGroup; |
||||||
|
children = ( |
||||||
|
63BFB9D41D2478DD00E17927 /* Base */, |
||||||
|
); |
||||||
|
name = Main.storyboard; |
||||||
|
path = .; |
||||||
|
sourceTree = SOURCE_ROOT; |
||||||
|
}; |
||||||
|
/* End PBXVariantGroup section */ |
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */ |
||||||
|
63BFB9DC1D2478DD00E17927 /* Debug */ = { |
||||||
|
isa = XCBuildConfiguration; |
||||||
|
buildSettings = { |
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO; |
||||||
|
CLANG_ANALYZER_NONNULL = YES; |
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; |
||||||
|
CLANG_CXX_LIBRARY = "libc++"; |
||||||
|
CLANG_ENABLE_MODULES = YES; |
||||||
|
CLANG_ENABLE_OBJC_ARC = YES; |
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES; |
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES; |
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; |
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; |
||||||
|
CLANG_WARN_EMPTY_BODY = YES; |
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES; |
||||||
|
CLANG_WARN_INT_CONVERSION = YES; |
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; |
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES; |
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; |
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; |
||||||
|
COPY_PHASE_STRIP = NO; |
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf; |
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES; |
||||||
|
ENABLE_TESTABILITY = YES; |
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99; |
||||||
|
GCC_DYNAMIC_NO_PIC = NO; |
||||||
|
GCC_NO_COMMON_BLOCKS = YES; |
||||||
|
GCC_OPTIMIZATION_LEVEL = 0; |
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = ( |
||||||
|
"DEBUG=1", |
||||||
|
"$(inherited)", |
||||||
|
); |
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; |
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; |
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES; |
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES; |
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES; |
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 10.0; |
||||||
|
MTL_ENABLE_DEBUG_INFO = YES; |
||||||
|
ONLY_ACTIVE_ARCH = YES; |
||||||
|
SDKROOT = iphoneos; |
||||||
|
}; |
||||||
|
name = Debug; |
||||||
|
}; |
||||||
|
63BFB9DD1D2478DD00E17927 /* Release */ = { |
||||||
|
isa = XCBuildConfiguration; |
||||||
|
buildSettings = { |
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO; |
||||||
|
CLANG_ANALYZER_NONNULL = YES; |
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; |
||||||
|
CLANG_CXX_LIBRARY = "libc++"; |
||||||
|
CLANG_ENABLE_MODULES = YES; |
||||||
|
CLANG_ENABLE_OBJC_ARC = YES; |
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES; |
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES; |
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; |
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; |
||||||
|
CLANG_WARN_EMPTY_BODY = YES; |
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES; |
||||||
|
CLANG_WARN_INT_CONVERSION = YES; |
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; |
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES; |
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; |
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; |
||||||
|
COPY_PHASE_STRIP = NO; |
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; |
||||||
|
ENABLE_NS_ASSERTIONS = NO; |
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES; |
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99; |
||||||
|
GCC_NO_COMMON_BLOCKS = YES; |
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; |
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; |
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES; |
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES; |
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES; |
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 10.0; |
||||||
|
MTL_ENABLE_DEBUG_INFO = NO; |
||||||
|
SDKROOT = iphoneos; |
||||||
|
VALIDATE_PRODUCT = YES; |
||||||
|
}; |
||||||
|
name = Release; |
||||||
|
}; |
||||||
|
63BFB9DF1D2478DD00E17927 /* Debug */ = { |
||||||
|
isa = XCBuildConfiguration; |
||||||
|
baseConfigurationReference = FC9BD3AE427396EDB4CD13E3 /* Pods-ConnectivityTestingApp.debug.xcconfig */; |
||||||
|
buildSettings = { |
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
||||||
|
INFOPLIST_FILE = Info.plist; |
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 9.3; |
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; |
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = io.grpc.ConnectivityTestingApp; |
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||||
|
}; |
||||||
|
name = Debug; |
||||||
|
}; |
||||||
|
63BFB9E01D2478DD00E17927 /* Release */ = { |
||||||
|
isa = XCBuildConfiguration; |
||||||
|
baseConfigurationReference = BA96CBC1612BD2F70E66246C /* Pods-ConnectivityTestingApp.release.xcconfig */; |
||||||
|
buildSettings = { |
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
||||||
|
INFOPLIST_FILE = Info.plist; |
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 9.3; |
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; |
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = io.grpc.ConnectivityTestingApp; |
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||||
|
}; |
||||||
|
name = Release; |
||||||
|
}; |
||||||
|
/* End XCBuildConfiguration section */ |
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */ |
||||||
|
63BFB9C21D2478DD00E17927 /* Build configuration list for PBXProject "ConnectivityTestingApp" */ = { |
||||||
|
isa = XCConfigurationList; |
||||||
|
buildConfigurations = ( |
||||||
|
63BFB9DC1D2478DD00E17927 /* Debug */, |
||||||
|
63BFB9DD1D2478DD00E17927 /* Release */, |
||||||
|
); |
||||||
|
defaultConfigurationIsVisible = 0; |
||||||
|
defaultConfigurationName = Release; |
||||||
|
}; |
||||||
|
63BFB9DE1D2478DD00E17927 /* Build configuration list for PBXNativeTarget "ConnectivityTestingApp" */ = { |
||||||
|
isa = XCConfigurationList; |
||||||
|
buildConfigurations = ( |
||||||
|
63BFB9DF1D2478DD00E17927 /* Debug */, |
||||||
|
63BFB9E01D2478DD00E17927 /* Release */, |
||||||
|
); |
||||||
|
defaultConfigurationIsVisible = 0; |
||||||
|
defaultConfigurationName = Release; |
||||||
|
}; |
||||||
|
/* End XCConfigurationList section */ |
||||||
|
}; |
||||||
|
rootObject = 63BFB9BF1D2478DD00E17927 /* Project object */; |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<Workspace |
||||||
|
version = "1.0"> |
||||||
|
<FileRef |
||||||
|
location = "self:ConnectivityTestingApp.xcodeproj"> |
||||||
|
</FileRef> |
||||||
|
</Workspace> |
@ -0,0 +1,40 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
||||||
|
<plist version="1.0"> |
||||||
|
<dict> |
||||||
|
<key>CFBundleDevelopmentRegion</key> |
||||||
|
<string>en</string> |
||||||
|
<key>CFBundleExecutable</key> |
||||||
|
<string>$(EXECUTABLE_NAME)</string> |
||||||
|
<key>CFBundleIdentifier</key> |
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> |
||||||
|
<key>CFBundleInfoDictionaryVersion</key> |
||||||
|
<string>6.0</string> |
||||||
|
<key>CFBundleName</key> |
||||||
|
<string>$(PRODUCT_NAME)</string> |
||||||
|
<key>CFBundlePackageType</key> |
||||||
|
<string>APPL</string> |
||||||
|
<key>CFBundleShortVersionString</key> |
||||||
|
<string>1.0</string> |
||||||
|
<key>CFBundleSignature</key> |
||||||
|
<string>????</string> |
||||||
|
<key>CFBundleVersion</key> |
||||||
|
<string>1</string> |
||||||
|
<key>LSRequiresIPhoneOS</key> |
||||||
|
<true/> |
||||||
|
<key>UILaunchStoryboardName</key> |
||||||
|
<string>Main</string> |
||||||
|
<key>UIMainStoryboardFile</key> |
||||||
|
<string>Main</string> |
||||||
|
<key>UIRequiredDeviceCapabilities</key> |
||||||
|
<array> |
||||||
|
<string>armv7</string> |
||||||
|
</array> |
||||||
|
<key>UISupportedInterfaceOrientations</key> |
||||||
|
<array> |
||||||
|
<string>UIInterfaceOrientationPortrait</string> |
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string> |
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string> |
||||||
|
</array> |
||||||
|
</dict> |
||||||
|
</plist> |
@ -0,0 +1,10 @@ |
|||||||
|
install! 'cocoapods', :deterministic_uuids => false |
||||||
|
|
||||||
|
# Location of gRPC's repo root relative to this file. |
||||||
|
GRPC_LOCAL_SRC = '../../../..' |
||||||
|
|
||||||
|
target 'ConnectivityTestingApp' do |
||||||
|
pod 'gRPC', :path => GRPC_LOCAL_SRC |
||||||
|
pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf" |
||||||
|
pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c" |
||||||
|
end |
@ -0,0 +1,16 @@ |
|||||||
|
This app can be used to manually test gRPC under changing network conditions. |
||||||
|
|
||||||
|
It makes RPCs in a loop, logging when the request is sent and the response is received. |
||||||
|
|
||||||
|
To test on the simulator, run `pod install`, open the workspace created by Cocoapods, and run the app. |
||||||
|
Once running, disable WiFi (or ethernet) _in your computer_, then enable it again after a while. Don't |
||||||
|
bother with the simulator's WiFi or cell settings, as they have no effect: Simulator apps are just Mac |
||||||
|
apps running within the simulator UI. |
||||||
|
|
||||||
|
The expected result is to never see a "hanged" RPC: success or failure should happen almost immediately |
||||||
|
after sending the request. Symptom of a hanged RPC is a log like the following being the last in your |
||||||
|
console: |
||||||
|
|
||||||
|
``` |
||||||
|
2016-06-29 16:51:29.443 ConnectivityTestingApp[73129:3567949] Sending request. |
||||||
|
``` |
@ -0,0 +1,82 @@ |
|||||||
|
/* |
||||||
|
* |
||||||
|
* Copyright 2016, 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 <UIKit/UIKit.h> |
||||||
|
|
||||||
|
#import <GRPCClient/GRPCCall.h> |
||||||
|
#import <ProtoRPC/ProtoMethod.h> |
||||||
|
#import <RxLibrary/GRXWriter+Immediate.h> |
||||||
|
#import <RxLibrary/GRXWriter+Transformations.h> |
||||||
|
|
||||||
|
@interface ViewController : UIViewController |
||||||
|
@end |
||||||
|
|
||||||
|
@implementation ViewController |
||||||
|
- (void)viewDidLoad { |
||||||
|
[super viewDidLoad]; |
||||||
|
|
||||||
|
NSString *host = @"grpc-test.sandbox.googleapis.com"; |
||||||
|
|
||||||
|
GRPCProtoMethod *method = [[GRPCProtoMethod alloc] initWithPackage:@"grpc.testing" |
||||||
|
service:@"TestService" |
||||||
|
method:@"StreamingOutputCall"]; |
||||||
|
|
||||||
|
__block void (^startCall)() = ^{ |
||||||
|
GRXWriter *loggingRequestWriter = [[GRXWriter writerWithValue:[NSData data]] map:^id(id value) { |
||||||
|
NSLog(@"Sending request."); |
||||||
|
return value; |
||||||
|
}]; |
||||||
|
|
||||||
|
GRPCCall *call = [[GRPCCall alloc] initWithHost:host |
||||||
|
path:method.HTTPPath |
||||||
|
requestsWriter:loggingRequestWriter]; |
||||||
|
|
||||||
|
[call startWithWriteable:[GRXWriteable writeableWithEventHandler:^(BOOL done, id value, |
||||||
|
NSError *error) { |
||||||
|
if (!done) { |
||||||
|
return; |
||||||
|
} |
||||||
|
if (error) { |
||||||
|
NSLog(@"Finished with error %@", error); |
||||||
|
} else { |
||||||
|
NSLog(@"Finished successfully."); |
||||||
|
} |
||||||
|
|
||||||
|
dispatch_time_t oneSecond = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)); |
||||||
|
dispatch_after(oneSecond, dispatch_get_main_queue(), startCall); |
||||||
|
}]]; |
||||||
|
}; |
||||||
|
|
||||||
|
startCall(); |
||||||
|
} |
||||||
|
@end |
@ -0,0 +1,46 @@ |
|||||||
|
/* |
||||||
|
* |
||||||
|
* 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 <UIKit/UIKit.h> |
||||||
|
|
||||||
|
@interface AppDelegate : UIResponder <UIApplicationDelegate> |
||||||
|
@property (strong, nonatomic) UIWindow *window; |
||||||
|
@end |
||||||
|
@implementation AppDelegate |
||||||
|
@end |
||||||
|
|
||||||
|
int main(int argc, char * argv[]) { |
||||||
|
@autoreleasepool { |
||||||
|
return UIApplicationMain(argc, argv, nil, NSStringFromClass(AppDelegate.class)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,121 @@ |
|||||||
|
# Copyright 2016, 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. |
||||||
|
|
||||||
|
"""Covers inadequacies in distutils.""" |
||||||
|
|
||||||
|
from distutils import ccompiler |
||||||
|
from distutils import errors |
||||||
|
from distutils import unixccompiler |
||||||
|
import os |
||||||
|
import os.path |
||||||
|
import shutil |
||||||
|
import sys |
||||||
|
import tempfile |
||||||
|
|
||||||
|
|
||||||
|
def _unix_piecemeal_link( |
||||||
|
self, target_desc, objects, output_filename, output_dir=None, |
||||||
|
libraries=None, library_dirs=None, runtime_library_dirs=None, |
||||||
|
export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, |
||||||
|
build_temp=None, target_lang=None): |
||||||
|
"""`link` externalized method taken almost verbatim from UnixCCompiler. |
||||||
|
|
||||||
|
Modifies the link command for unix-like compilers by using a command file so |
||||||
|
that long command line argument strings don't break the command shell's |
||||||
|
ARG_MAX character limit. |
||||||
|
""" |
||||||
|
objects, output_dir = self._fix_object_args(objects, output_dir) |
||||||
|
libraries, library_dirs, runtime_library_dirs = self._fix_lib_args( |
||||||
|
libraries, library_dirs, runtime_library_dirs) |
||||||
|
# filter out standard library paths, which are not explicitely needed |
||||||
|
# for linking |
||||||
|
library_dirs = [dir for dir in library_dirs |
||||||
|
if not dir in ('/lib', '/lib64', '/usr/lib', '/usr/lib64')] |
||||||
|
runtime_library_dirs = [dir for dir in runtime_library_dirs |
||||||
|
if not dir in ('/lib', '/lib64', '/usr/lib', '/usr/lib64')] |
||||||
|
lib_opts = ccompiler.gen_lib_options(self, library_dirs, runtime_library_dirs, |
||||||
|
libraries) |
||||||
|
if (not (isinstance(output_dir, str) or isinstance(output_dir, bytes)) |
||||||
|
and output_dir is not None): |
||||||
|
raise TypeError("'output_dir' must be a string or None") |
||||||
|
if output_dir is not None: |
||||||
|
output_filename = os.path.join(output_dir, output_filename) |
||||||
|
|
||||||
|
if self._need_link(objects, output_filename): |
||||||
|
ld_args = (objects + self.objects + |
||||||
|
lib_opts + ['-o', output_filename]) |
||||||
|
if debug: |
||||||
|
ld_args[:0] = ['-g'] |
||||||
|
if extra_preargs: |
||||||
|
ld_args[:0] = extra_preargs |
||||||
|
if extra_postargs: |
||||||
|
ld_args.extend(extra_postargs) |
||||||
|
self.mkpath(os.path.dirname(output_filename)) |
||||||
|
try: |
||||||
|
if target_desc == ccompiler.CCompiler.EXECUTABLE: |
||||||
|
linker = self.linker_exe[:] |
||||||
|
else: |
||||||
|
linker = self.linker_so[:] |
||||||
|
if target_lang == "c++" and self.compiler_cxx: |
||||||
|
# skip over environment variable settings if /usr/bin/env |
||||||
|
# is used to set up the linker's environment. |
||||||
|
# This is needed on OSX. Note: this assumes that the |
||||||
|
# normal and C++ compiler have the same environment |
||||||
|
# settings. |
||||||
|
i = 0 |
||||||
|
if os.path.basename(linker[0]) == "env": |
||||||
|
i = 1 |
||||||
|
while '=' in linker[i]: |
||||||
|
i = i + 1 |
||||||
|
|
||||||
|
linker[i] = self.compiler_cxx[i] |
||||||
|
|
||||||
|
if sys.platform == 'darwin': |
||||||
|
import _osx_support |
||||||
|
linker = _osx_support.compiler_fixup(linker, ld_args) |
||||||
|
|
||||||
|
temporary_directory = tempfile.mkdtemp() |
||||||
|
command_filename = os.path.abspath( |
||||||
|
os.path.join(temporary_directory, 'command')) |
||||||
|
with open(command_filename, 'w') as command_file: |
||||||
|
escaped_ld_args = [arg.replace('\\', '\\\\') for arg in ld_args] |
||||||
|
command_file.write(' '.join(escaped_ld_args)) |
||||||
|
self.spawn(linker + ['@{}'.format(command_filename)]) |
||||||
|
except errors.DistutilsExecError: |
||||||
|
raise ccompiler.LinkError |
||||||
|
else: |
||||||
|
log.debug("skipping %s (up-to-date)", output_filename) |
||||||
|
|
||||||
|
# TODO(atash) try replacing this monkeypatch of the compiler harness' link |
||||||
|
# operation with a monkeypatch of the distutils `spawn` that applies |
||||||
|
# command-argument-file hacks where it can. Might be cleaner. |
||||||
|
def monkeypatch_unix_compiler(): |
||||||
|
"""Monkeypatching is dumb, but it's either that or we become maintainers of |
||||||
|
something much, much bigger.""" |
||||||
|
unixccompiler.UnixCCompiler.link = _unix_piecemeal_link |
@ -0,0 +1,48 @@ |
|||||||
|
# Copyright 2016, 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. |
||||||
|
|
||||||
|
from grpc._cython import cygrpc |
||||||
|
|
||||||
|
|
||||||
|
def _call(call_credentialses): |
||||||
|
call_credentials_iterator = iter(call_credentialses) |
||||||
|
composition = next(call_credentials_iterator) |
||||||
|
for additional_call_credentials in call_credentials_iterator: |
||||||
|
composition = cygrpc.call_credentials_composite( |
||||||
|
composition, additional_call_credentials) |
||||||
|
return composition |
||||||
|
|
||||||
|
|
||||||
|
def call(call_credentialses): |
||||||
|
return _call(call_credentialses) |
||||||
|
|
||||||
|
|
||||||
|
def channel(channel_credentials, call_credentialses): |
||||||
|
return cygrpc.channel_credentials_composite( |
||||||
|
channel_credentials, _call(call_credentialses)) |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue