Conflicts: src/cpp/client/channel.cc vsprojects/vs2010/grpc++.vcxproj vsprojects/vs2013/grpc++.vcxproj.filterspull/1227/head
commit
23be280366
384 changed files with 48828 additions and 27285 deletions
@ -1,79 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// 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. |
|
||||||
|
|
||||||
// Labels provide a way to associate user-defined metadata with various |
|
||||||
// objects. Labels may be used to organize objects into non-hierarchical |
|
||||||
// groups; think metadata tags attached to mp3s. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
package tech.label; |
|
||||||
|
|
||||||
// A key-value pair applied to a given object. |
|
||||||
message Label { |
|
||||||
// The key of a label is a syntactically valid URL (as per RFC 1738) with |
|
||||||
// the "scheme" and initial slashes omitted and with the additional |
|
||||||
// restrictions noted below. Each key should be globally unique. The |
|
||||||
// "host" portion is called the "namespace" and is not necessarily |
|
||||||
// resolvable to a network endpoint. Instead, the namespace indicates what |
|
||||||
// system or entity defines the semantics of the label. Namespaces do not |
|
||||||
// restrict the set of objects to which a label may be associated. |
|
||||||
// |
|
||||||
// Keys are defined by the following grammar: |
|
||||||
// |
|
||||||
// key = hostname "/" kpath |
|
||||||
// kpath = ksegment *[ "/" ksegment ] |
|
||||||
// ksegment = alphadigit | *[ alphadigit | "-" | "_" | "." ] |
|
||||||
// |
|
||||||
// where "hostname" and "alphadigit" are defined as in RFC 1738. |
|
||||||
// |
|
||||||
// Example key: |
|
||||||
// spanner.google.com/universe |
|
||||||
required string key = 1; |
|
||||||
|
|
||||||
// The value of the label. |
|
||||||
oneof value { |
|
||||||
// A string value. |
|
||||||
string str_value = 2; |
|
||||||
// An integer value. |
|
||||||
int64 num_value = 3; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A collection of labels, such as the set of all labels attached to an |
|
||||||
// object. Each label in the set must have a different key. |
|
||||||
// |
|
||||||
// Users should prefer to embed "repeated Label" directly when possible. |
|
||||||
// This message should only be used in cases where that isn't possible (e.g. |
|
||||||
// with oneof). |
|
||||||
message Labels { |
|
||||||
repeated Label label = 1; |
|
||||||
} |
|
@ -1,729 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// 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. |
|
||||||
|
|
||||||
|
|
||||||
// Specification of the Pubsub API. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
import "examples/pubsub/empty.proto"; |
|
||||||
import "examples/pubsub/label.proto"; |
|
||||||
|
|
||||||
package tech.pubsub; |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Overview of the Pubsub API |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// This file describes an API for a Pubsub system. This system provides a |
|
||||||
// reliable many-to-many communication mechanism between independently written |
|
||||||
// publishers and subscribers where the publisher publishes messages to "topics" |
|
||||||
// and each subscriber creates a "subscription" and consumes messages from it. |
|
||||||
// |
|
||||||
// (a) The pubsub system maintains bindings between topics and subscriptions. |
|
||||||
// (b) A publisher publishes messages into a topic. |
|
||||||
// (c) The pubsub system delivers messages from topics into relevant |
|
||||||
// subscriptions. |
|
||||||
// (d) A subscriber receives pending messages from its subscription and |
|
||||||
// acknowledges or nacks each one to the pubsub system. |
|
||||||
// (e) The pubsub system removes acknowledged messages from that subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Data Model |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The data model consists of the following: |
|
||||||
// |
|
||||||
// * Topic: A topic is a resource to which messages are published by publishers. |
|
||||||
// Topics are named, and the name of the topic is unique within the pubsub |
|
||||||
// system. |
|
||||||
// |
|
||||||
// * Subscription: A subscription records the subscriber's interest in a topic. |
|
||||||
// It can optionally include a query to select a subset of interesting |
|
||||||
// messages. The pubsub system maintains a logical cursor tracking the |
|
||||||
// matching messages which still need to be delivered and acked so that |
|
||||||
// they can retried as needed. The set of messages that have not been |
|
||||||
// acknowledged is called the subscription backlog. |
|
||||||
// |
|
||||||
// * Message: A message is a unit of data that flows in the system. It contains |
|
||||||
// opaque data from the publisher along with its labels. |
|
||||||
// |
|
||||||
// * Message Labels (optional): A set of opaque key, value pairs assigned |
|
||||||
// by the publisher which the subscriber can use for filtering out messages |
|
||||||
// in the topic. For example, a label with key "foo.com/device_type" and |
|
||||||
// value "mobile" may be added for messages that are only relevant for a |
|
||||||
// mobile subscriber; a subscriber on a phone may decide to create a |
|
||||||
// subscription only for messages that have this label. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Publisher Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// A publisher publishes messages to the topic using the Publish request: |
|
||||||
// |
|
||||||
// PubsubMessage message; |
|
||||||
// message.set_data("...."); |
|
||||||
// Label label; |
|
||||||
// label.set_key("foo.com/key1"); |
|
||||||
// label.set_str_value("value1"); |
|
||||||
// message.add_label(label); |
|
||||||
// PublishRequest request; |
|
||||||
// request.set_topic("topicName"); |
|
||||||
// request.set_message(message); |
|
||||||
// PublisherService.Publish(request); |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Subscriber Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The subscriber part of the API is richer than the publisher part and has a |
|
||||||
// number of concepts w.r.t. subscription creation and monitoring: |
|
||||||
// |
|
||||||
// (1) A subscriber creates a subscription using the CreateSubscription call. |
|
||||||
// It may specify an optional "query" to indicate that it wants to receive |
|
||||||
// only messages with a certain set of labels using the label query syntax. |
|
||||||
// It may also specify an optional truncation policy to indicate when old |
|
||||||
// messages from the subcription can be removed. |
|
||||||
// |
|
||||||
// (2) A subscriber receives messages in one of two ways: via push or pull. |
|
||||||
// |
|
||||||
// (a) To receive messages via push, the PushConfig field must be specified in |
|
||||||
// the Subscription parameter when creating a subscription. The PushConfig |
|
||||||
// specifies an endpoint at which the subscriber must expose the |
|
||||||
// PushEndpointService. Messages are received via the HandlePubsubEvent |
|
||||||
// method. The push subscriber responds to the HandlePubsubEvent method |
|
||||||
// with a result code that indicates one of three things: Ack (the message |
|
||||||
// has been successfully processed and the Pubsub system may delete it), |
|
||||||
// Nack (the message has been rejected, the Pubsub system should resend it |
|
||||||
// at a later time), or Push-Back (this is a Nack with the additional |
|
||||||
// semantics that the subscriber is overloaded and the pubsub system should |
|
||||||
// back off on the rate at which it is invoking HandlePubsubEvent). The |
|
||||||
// endpoint may be a load balancer for better scalability. |
|
||||||
// |
|
||||||
// (b) To receive messages via pull a subscriber calls the Pull method on the |
|
||||||
// SubscriberService to get messages from the subscription. For each |
|
||||||
// individual message, the subscriber may use the ack_id received in the |
|
||||||
// PullResponse to Ack the message, Nack the message, or modify the ack |
|
||||||
// deadline with ModifyAckDeadline. See the |
|
||||||
// Subscription.ack_deadline_seconds field documentation for details on the |
|
||||||
// ack deadline behavior. |
|
||||||
// |
|
||||||
// Note: Messages may be consumed in parallel by multiple subscribers making |
|
||||||
// Pull calls to the same subscription; this will result in the set of |
|
||||||
// messages from the subscription being shared and each subscriber |
|
||||||
// receiving a subset of the messages. |
|
||||||
// |
|
||||||
// (4) The subscriber can explicitly truncate the current subscription. |
|
||||||
// |
|
||||||
// (5) "Truncated" events are delivered when a subscription is |
|
||||||
// truncated, whether due to the subscription's truncation policy |
|
||||||
// or an explicit request from the subscriber. |
|
||||||
// |
|
||||||
// Subscription creation: |
|
||||||
// |
|
||||||
// Subscription subscription; |
|
||||||
// subscription.set_topic("topicName"); |
|
||||||
// subscription.set_name("subscriptionName"); |
|
||||||
// subscription.push_config().set_push_endpoint("machinename:8888"); |
|
||||||
// SubscriberService.CreateSubscription(subscription); |
|
||||||
// |
|
||||||
// Consuming messages via push: |
|
||||||
// |
|
||||||
// The port 'machinename:8888' must be bound to a server that implements |
|
||||||
// the PushEndpointService with the following method: |
|
||||||
// |
|
||||||
// int HandlePubsubEvent(PubsubEvent event) { |
|
||||||
// if (event.subscription().equals("subscriptionName")) { |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// } |
|
||||||
// return OK; // This return code implies an acknowledgment |
|
||||||
// } |
|
||||||
// |
|
||||||
// Consuming messages via pull: |
|
||||||
// |
|
||||||
// The subscription must be created without setting the push_config field. |
|
||||||
// |
|
||||||
// PullRequest pull_request; |
|
||||||
// pull_request.set_subscription("subscriptionName"); |
|
||||||
// pull_request.set_return_immediately(false); |
|
||||||
// while (true) { |
|
||||||
// PullResponse pull_response; |
|
||||||
// if (SubscriberService.Pull(pull_request, pull_response) == OK) { |
|
||||||
// PubsubEvent event = pull_response.pubsub_event(); |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// AcknowledgeRequest ack_request; |
|
||||||
// ackRequest.set_subscription("subscriptionName"); |
|
||||||
// ackRequest.set_ack_id(pull_response.ack_id()); |
|
||||||
// SubscriberService.Acknowledge(ack_request); |
|
||||||
// } |
|
||||||
// } |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Reliability Semantics |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// When a subscriber successfully creates a subscription using |
|
||||||
// Subscriber.CreateSubscription, it establishes a "subscription point" with |
|
||||||
// respect to that subscription - the subscriber is guaranteed to receive any |
|
||||||
// message published after this subscription point that matches the |
|
||||||
// subscription's query. Note that messages published before the Subscription |
|
||||||
// point may or may not be delivered. |
|
||||||
// |
|
||||||
// If the system truncates the subscription according to the specified |
|
||||||
// truncation policy, the system delivers a subscription status event with the |
|
||||||
// "truncated" field set to true. We refer to such events as "truncation |
|
||||||
// events". A truncation event: |
|
||||||
// |
|
||||||
// * Informs the subscriber that part of the subscription messages have been |
|
||||||
// discarded. The subscriber may want to recover from the message loss, e.g., |
|
||||||
// by resyncing its state with its backend. |
|
||||||
// * Establishes a new subscription point, i.e., the subscriber is guaranteed to |
|
||||||
// receive all changes published after the trunction event is received (or |
|
||||||
// until another truncation event is received). |
|
||||||
// |
|
||||||
// Note that messages are not delivered in any particular order by the pubsub |
|
||||||
// system. Furthermore, the system guarantees at-least-once delivery |
|
||||||
// of each message or truncation events until acked. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Deletion |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Both topics and subscriptions may be deleted. Deletion of a topic implies |
|
||||||
// deletion of all attached subscriptions. |
|
||||||
// |
|
||||||
// When a subscription is deleted directly by calling DeleteSubscription, all |
|
||||||
// messages are immediately dropped. If it is a pull subscriber, future pull |
|
||||||
// requests will return NOT_FOUND. |
|
||||||
// |
|
||||||
// When a topic is deleted all corresponding subscriptions are immediately |
|
||||||
// deleted, and subscribers experience the same behavior as directly deleting |
|
||||||
// the subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Publisher service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate topics, and to send |
|
||||||
// messages to a topic. |
|
||||||
service PublisherService { |
|
||||||
|
|
||||||
// Creates the given topic with the given name. |
|
||||||
rpc CreateTopic(Topic) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds a message to the topic. Returns NOT_FOUND if the topic does not |
|
||||||
// exist. |
|
||||||
rpc Publish(PublishRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds one or more messages to the topic. Returns NOT_FOUND if the topic does |
|
||||||
// not exist. |
|
||||||
rpc PublishBatch(PublishBatchRequest) returns (PublishBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration of a topic. Since the topic only has the name |
|
||||||
// attribute, this method is only useful to check the existence of a topic. |
|
||||||
// If other attributes are added in the future, they will be returned here. |
|
||||||
rpc GetTopic(GetTopicRequest) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching topics. |
|
||||||
rpc ListTopics(ListTopicsRequest) returns (ListTopicsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes the topic with the given name. All subscriptions to this topic |
|
||||||
// are also deleted. Returns NOT_FOUND if the topic does not exist. |
|
||||||
// After a topic is deleted, a new topic may be created with the same name. |
|
||||||
rpc DeleteTopic(DeleteTopicRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A topic resource. |
|
||||||
message Topic { |
|
||||||
// Name of the topic. |
|
||||||
optional string name = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// A message data and its labels. |
|
||||||
message PubsubMessage { |
|
||||||
// The message payload. |
|
||||||
optional bytes data = 1; |
|
||||||
|
|
||||||
// Optional list of labels for this message. Keys in this collection must |
|
||||||
// be unique. |
|
||||||
repeated tech.label.Label label = 2; |
|
||||||
|
|
||||||
// ID of this message assigned by the server at publication time. Guaranteed |
|
||||||
// to be unique within the topic. This value may be read by a subscriber |
|
||||||
// that receives a PubsubMessage via a Pull call or a push delivery. It must |
|
||||||
// not be populated by a publisher in a Publish call. |
|
||||||
optional string message_id = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetTopic method. |
|
||||||
message GetTopicRequest { |
|
||||||
// The name of the topic to get. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Publish method. |
|
||||||
message PublishRequest { |
|
||||||
// The message in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The message to publish. |
|
||||||
optional PubsubMessage message = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PublishBatch method. |
|
||||||
message PublishBatchRequest { |
|
||||||
// The messages in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The messages to publish. |
|
||||||
repeated PubsubMessage messages = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PublishBatch method. |
|
||||||
message PublishBatchResponse { |
|
||||||
// The server-assigned ID of each published message, in the same order as |
|
||||||
// the messages in the request. IDs are guaranteed to be unique within |
|
||||||
// the topic. |
|
||||||
repeated string message_ids = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListTopics method. |
|
||||||
message ListTopicsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// (-- Which labels are required or supported is implementation-specific. --) |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of topics to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 2; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListTopicsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 3; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListTopics method. |
|
||||||
message ListTopicsResponse { |
|
||||||
// The resulting topics. |
|
||||||
repeated Topic topic = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more topics that match the request, |
|
||||||
// and this value should be passed to the next <code>ListTopicsRequest</code> |
|
||||||
// to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Delete method. |
|
||||||
message DeleteTopicRequest { |
|
||||||
// Name of the topic to delete. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Subscriber service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate subscriptions and to |
|
||||||
// consume messages from a subscription via the pull method. |
|
||||||
service SubscriberService { |
|
||||||
|
|
||||||
// Creates a subscription on a given topic for a given subscriber. |
|
||||||
// If the subscription already exists, returns ALREADY_EXISTS. |
|
||||||
// If the corresponding topic doesn't exist, returns NOT_FOUND. |
|
||||||
// |
|
||||||
// If the name is not provided in the request, the server will assign a random |
|
||||||
// name for this subscription on the same project as the topic. |
|
||||||
rpc CreateSubscription(Subscription) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration details of a subscription. |
|
||||||
rpc GetSubscription(GetSubscriptionRequest) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching subscriptions. |
|
||||||
rpc ListSubscriptions(ListSubscriptionsRequest) |
|
||||||
returns (ListSubscriptionsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes an existing subscription. All pending messages in the subscription |
|
||||||
// are immediately dropped. Calls to Pull after deletion will return |
|
||||||
// NOT_FOUND. |
|
||||||
rpc DeleteSubscription(DeleteSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Removes all the pending messages in the subscription and releases the |
|
||||||
// storage associated with them. Results in a truncation event to be sent to |
|
||||||
// the subscriber. Messages added after this call returns are stored in the |
|
||||||
// subscription as before. |
|
||||||
rpc TruncateSubscription(TruncateSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Push subscriber calls. |
|
||||||
// |
|
||||||
|
|
||||||
// Modifies the <code>PushConfig</code> for a specified subscription. |
|
||||||
// This method can be used to suspend the flow of messages to an endpoint |
|
||||||
// by clearing the <code>PushConfig</code> field in the request. Messages |
|
||||||
// will be accumulated for delivery even if no push configuration is |
|
||||||
// defined or while the configuration is modified. |
|
||||||
rpc ModifyPushConfig(ModifyPushConfigRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Pull Subscriber calls |
|
||||||
// |
|
||||||
|
|
||||||
// Pulls a single message from the server. |
|
||||||
// If return_immediately is true, and no messages are available in the |
|
||||||
// subscription, this method returns FAILED_PRECONDITION. The system is free |
|
||||||
// to return an UNAVAILABLE error if no messages are available in a |
|
||||||
// reasonable amount of time (to reduce system load). |
|
||||||
rpc Pull(PullRequest) returns (PullResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Pulls messages from the server. Returns an empty list if there are no |
|
||||||
// messages available in the backlog. The system is free to return UNAVAILABLE |
|
||||||
// if there are too many pull requests outstanding for the given subscription. |
|
||||||
rpc PullBatch(PullBatchRequest) returns (PullBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Modifies the Ack deadline for a message received from a pull request. |
|
||||||
rpc ModifyAckDeadline(ModifyAckDeadlineRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Acknowledges a particular received message: the Pub/Sub system can remove |
|
||||||
// the given message from the subscription. Acknowledging a message whose |
|
||||||
// Ack deadline has expired may succeed, but the message could have been |
|
||||||
// already redelivered. Acknowledging a message more than once will not |
|
||||||
// result in an error. This is only used for messages received via pull. |
|
||||||
rpc Acknowledge(AcknowledgeRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Refuses processing a particular received message. The system will |
|
||||||
// redeliver this message to some consumer of the subscription at some |
|
||||||
// future time. This is only used for messages received via pull. |
|
||||||
rpc Nack(NackRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A subscription resource. |
|
||||||
message Subscription { |
|
||||||
// Name of the subscription. |
|
||||||
optional string name = 1; |
|
||||||
|
|
||||||
// The name of the topic from which this subscription is receiving messages. |
|
||||||
optional string topic = 2; |
|
||||||
|
|
||||||
// If <code>query</code> is non-empty, only messages on the subscriber's |
|
||||||
// topic whose labels match the query will be returned. Otherwise all |
|
||||||
// messages on the topic will be returned. |
|
||||||
// (-- The query syntax is described in label_query.proto --) |
|
||||||
optional string query = 3; |
|
||||||
|
|
||||||
// The subscriber may specify requirements for truncating unacknowledged |
|
||||||
// subscription entries. The system will honor the |
|
||||||
// <code>CreateSubscription</code> request only if it can meet these |
|
||||||
// requirements. If this field is not specified, messages are never truncated |
|
||||||
// by the system. |
|
||||||
optional TruncationPolicy truncation_policy = 4; |
|
||||||
|
|
||||||
// Specifies which messages can be truncated by the system. |
|
||||||
message TruncationPolicy { |
|
||||||
oneof policy { |
|
||||||
// If <code>max_bytes</code> is specified, the system is allowed to drop |
|
||||||
// old messages to keep the combined size of stored messages under |
|
||||||
// <code>max_bytes</code>. This is a hint; the system may keep more than |
|
||||||
// this many bytes, but will make a best effort to keep the size from |
|
||||||
// growing much beyond this parameter. |
|
||||||
int64 max_bytes = 1; |
|
||||||
|
|
||||||
// If <code>max_age_seconds</code> is specified, the system is allowed to |
|
||||||
// drop messages that have been stored for at least this many seconds. |
|
||||||
// This is a hint; the system may keep these messages, but will make a |
|
||||||
// best effort to remove them when their maximum age is reached. |
|
||||||
int64 max_age_seconds = 2; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// If push delivery is used with this subscription, this field is |
|
||||||
// used to configure it. |
|
||||||
optional PushConfig push_config = 5; |
|
||||||
|
|
||||||
// For either push or pull delivery, the value is the maximum time after a |
|
||||||
// subscriber receives a message before the subscriber should acknowledge or |
|
||||||
// Nack the message. If the Ack deadline for a message passes without an |
|
||||||
// Ack or a Nack, the Pub/Sub system will eventually redeliver the message. |
|
||||||
// If a subscriber acknowledges after the deadline, the Pub/Sub system may |
|
||||||
// accept the Ack, but it is possible that the message has been already |
|
||||||
// delivered again. Multiple Acks to the message are allowed and will |
|
||||||
// succeed. |
|
||||||
// |
|
||||||
// For push delivery, this value is used to set the request timeout for |
|
||||||
// the call to the push endpoint. |
|
||||||
// |
|
||||||
// For pull delivery, this value is used as the initial value for the Ack |
|
||||||
// deadline. It may be overridden for a specific pull request (message) with |
|
||||||
// <code>ModifyAckDeadline</code>. |
|
||||||
// While a message is outstanding (i.e. it has been delivered to a pull |
|
||||||
// subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub |
|
||||||
// system will not deliver that message to another pull subscriber |
|
||||||
// (on a best-effort basis). |
|
||||||
optional int32 ack_deadline_seconds = 6; |
|
||||||
|
|
||||||
// If this parameter is set to n, the system is allowed to (but not required |
|
||||||
// to) delete the subscription when at least n seconds have elapsed since the |
|
||||||
// client presence was detected. (Presence is detected through any |
|
||||||
// interaction using the subscription ID, including Pull(), Get(), or |
|
||||||
// acknowledging a message.) |
|
||||||
// |
|
||||||
// If this parameter is not set, the subscription will stay live until |
|
||||||
// explicitly deleted. |
|
||||||
// |
|
||||||
// Clients can detect such garbage collection when a Get call or a Pull call |
|
||||||
// (for pull subscribers only) returns NOT_FOUND. |
|
||||||
optional int64 garbage_collect_seconds = 7; |
|
||||||
} |
|
||||||
|
|
||||||
// Configuration for a push delivery endpoint. |
|
||||||
message PushConfig { |
|
||||||
// A URL locating the endpoint to which messages should be pushed. |
|
||||||
// For example, a Webhook endpoint might use "https://example.com/push". |
|
||||||
// (-- An Android application might use "gcm:<REGID>", where <REGID> is a |
|
||||||
// GCM registration id allocated for pushing messages to the application. --) |
|
||||||
optional string push_endpoint = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// An event indicating a received message or truncation event. |
|
||||||
message PubsubEvent { |
|
||||||
// The subscription that received the event. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
oneof type { |
|
||||||
// A received message. |
|
||||||
PubsubMessage message = 2; |
|
||||||
|
|
||||||
// Indicates that this subscription has been truncated. |
|
||||||
bool truncated = 3; |
|
||||||
|
|
||||||
// Indicates that this subscription has been deleted. (Note that pull |
|
||||||
// subscribers will always receive NOT_FOUND in response in their pull |
|
||||||
// request on the subscription, rather than seeing this boolean.) |
|
||||||
bool deleted = 4; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetSubscription method. |
|
||||||
message GetSubscriptionRequest { |
|
||||||
// The name of the subscription to get. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// (-- Which labels are required or supported is implementation-specific. |
|
||||||
// TODO(eschapira): This method must support to query by topic. We must |
|
||||||
// define the key URI for the "topic" label. --) |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of subscriptions to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 3; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListSubscriptionsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 4; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsResponse { |
|
||||||
// The subscriptions that match the request. |
|
||||||
repeated Subscription subscription = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more subscriptions that match the |
|
||||||
// request and this value should be passed to the next |
|
||||||
// <code>ListSubscriptionsRequest</code> to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the TruncateSubscription method. |
|
||||||
message TruncateSubscriptionRequest { |
|
||||||
// The subscription that is being truncated. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the DeleteSubscription method. |
|
||||||
message DeleteSubscriptionRequest { |
|
||||||
// The subscription to delete. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyPushConfig method. |
|
||||||
message ModifyPushConfigRequest { |
|
||||||
// The name of the subscription. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// An empty <code>push_config</code> indicates that the Pub/Sub system should |
|
||||||
// pause pushing messages from the given subscription. |
|
||||||
optional PushConfig push_config = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The protos used by a pull subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Request for the Pull method. |
|
||||||
message PullRequest { |
|
||||||
// The subscription from which a message should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning FAILED_PRECONDITION. The client may cancel the request if |
|
||||||
// it does not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Either a <code>PubsubMessage</code> or a truncation event. One of these two |
|
||||||
// must be populated. |
|
||||||
message PullResponse { |
|
||||||
// This ID must be used to acknowledge the received event or message. |
|
||||||
optional string ack_id = 1; |
|
||||||
|
|
||||||
// A pubsub message or truncation event. |
|
||||||
optional PubsubEvent pubsub_event = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PullBatch method. |
|
||||||
message PullBatchRequest { |
|
||||||
// The subscription from which messages should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning no messages. The client may cancel the request if it does |
|
||||||
// not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
|
|
||||||
// The maximum number of PubsubEvents returned for this request. The Pub/Sub |
|
||||||
// system may return fewer than the number of events specified. |
|
||||||
optional int32 max_events = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PullBatch method. |
|
||||||
message PullBatchResponse { |
|
||||||
|
|
||||||
// Received Pub/Sub messages or status events. The Pub/Sub system will return |
|
||||||
// zero messages if there are no more messages available in the backlog. The |
|
||||||
// Pub/Sub system may return fewer than the max_events requested even if |
|
||||||
// there are more messages available in the backlog. |
|
||||||
repeated PullResponse pull_responses = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyAckDeadline method. |
|
||||||
message ModifyAckDeadlineRequest { |
|
||||||
// The name of the subscription from which messages are being pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID. |
|
||||||
optional string ack_id = 2; |
|
||||||
|
|
||||||
// The new Ack deadline. Must be >= 0. |
|
||||||
optional int32 ack_deadline_seconds = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Acknowledge method. |
|
||||||
message AcknowledgeRequest { |
|
||||||
// The subscription whose message is being acknowledged. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being acknowledged. This was |
|
||||||
// returned by the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Nack method. |
|
||||||
message NackRequest { |
|
||||||
// The subscription whose message is being Nacked. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being refused. This was returned by |
|
||||||
// the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The service and protos used by a push subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that a subscriber uses to handle messages sent via push |
|
||||||
// delivery. |
|
||||||
// This service is not currently exported for HTTP clients. |
|
||||||
// TODO(eschapira): Explain HTTP subscribers. |
|
||||||
service PushEndpointService { |
|
||||||
// Sends a <code>PubsubMessage</code> or a subscription status event to a |
|
||||||
// push endpoint. |
|
||||||
// The push endpoint responds with an empty message and a code from |
|
||||||
// util/task/codes.proto. The following codes have a particular meaning to the |
|
||||||
// Pub/Sub system: |
|
||||||
// OK - This is interpreted by Pub/Sub as Ack. |
|
||||||
// ABORTED - This is intepreted by Pub/Sub as a Nack, without implying |
|
||||||
// pushback for congestion control. The Pub/Sub system will |
|
||||||
// retry this message at a later time. |
|
||||||
// UNAVAILABLE - This is intepreted by Pub/Sub as a Nack, with the additional |
|
||||||
// semantics of push-back. The Pub/Sub system will use an AIMD |
|
||||||
// congestion control algorithm to backoff the rate of sending |
|
||||||
// messages from this subscription. |
|
||||||
// Any other code, or a failure to respond, will be interpreted in the same |
|
||||||
// way as ABORTED; i.e. the system will retry the message at a later time to |
|
||||||
// ensure reliable delivery. |
|
||||||
rpc HandlePubsubEvent(PubsubEvent) returns (proto2.Empty); |
|
||||||
} |
|
@ -0,0 +1,88 @@ |
|||||||
|
Pod::Spec.new do |s| |
||||||
|
s.name = 'gRPC' |
||||||
|
s.version = '0.0.1' |
||||||
|
s.summary = 'Generic gRPC client library for iOS' |
||||||
|
s.homepage = 'https://www.grpc.io' |
||||||
|
s.license = 'New BSD' |
||||||
|
s.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
# s.source = { :git => 'https://github.com/grpc/grpc.git', :tag => 'release-0_5_0' } |
||||||
|
|
||||||
|
s.platform = :ios |
||||||
|
s.ios.deployment_target = '6.0' |
||||||
|
s.requires_arc = true |
||||||
|
|
||||||
|
s.subspec 'RxLibrary' do |rs| |
||||||
|
rs.summary = 'Reactive Extensions library for iOS.' |
||||||
|
rs.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
rs.source_files = 'src/objective-c/RxLibrary/*.{h,m}', 'src/objective-c/RxLibrary/transformations/*.{h,m}', 'src/objective-c/RxLibrary/private/*.{h,m}' |
||||||
|
rs.private_header_files = 'src/objective-c/RxLibrary/private/*.h' |
||||||
|
end |
||||||
|
|
||||||
|
s.subspec 'C-Core' do |cs| |
||||||
|
cs.summary = 'Core cross-platform gRPC library, written in C.' |
||||||
|
cs.authors = { 'Craig Tiller' => 'ctiller@google.com', |
||||||
|
'David Klempner' => 'klempner@google.com', |
||||||
|
'Nicolas Noble' => 'nnoble@google.com', |
||||||
|
'Vijay Pai' => 'vpai@google.com', |
||||||
|
'Yang Gao' => 'yangg@google.com' } |
||||||
|
|
||||||
|
cs.source_files = 'src/core/**/*.{h,c}', 'include/grpc/*.h', 'include/grpc/**/*.h' |
||||||
|
cs.private_header_files = 'src/core/**/*.h' |
||||||
|
cs.header_mappings_dir = '.' |
||||||
|
cs.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Build/gRPC" "$(PODS_ROOT)/Headers/Build/gRPC/include"' } |
||||||
|
|
||||||
|
cs.requires_arc = false |
||||||
|
cs.libraries = 'z' |
||||||
|
cs.dependency 'OpenSSL', '~> 1.0.200' |
||||||
|
|
||||||
|
# This is a workaround for Cocoapods Issue #1437. |
||||||
|
# It renames time.h and string.h to grpc_time.h and grpc_string.h. |
||||||
|
cs.prepare_command = <<-CMD |
||||||
|
DIR_TIME="grpc/support" |
||||||
|
BAD_TIME="$DIR_TIME/time.h" |
||||||
|
GOOD_TIME="$DIR_TIME/grpc_time.h" |
||||||
|
if [ -f "include/$BAD_TIME" ]; |
||||||
|
then |
||||||
|
grep -rl "$BAD_TIME" include/grpc src/core | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g |
||||||
|
mv "include/$BAD_TIME" "include/$GOOD_TIME" |
||||||
|
fi |
||||||
|
|
||||||
|
DIR_STRING="src/core/support" |
||||||
|
BAD_STRING="$DIR_STRING/string.h" |
||||||
|
GOOD_STRING="$DIR_STRING/grpc_string.h" |
||||||
|
if [ -f "$BAD_STRING" ]; |
||||||
|
then |
||||||
|
grep -rl "$BAD_STRING" include/grpc src/core | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g |
||||||
|
mv "$BAD_STRING" "$GOOD_STRING" |
||||||
|
fi |
||||||
|
CMD |
||||||
|
end |
||||||
|
|
||||||
|
s.subspec 'GRPCClient' do |gs| |
||||||
|
gs.summary = 'Objective-C wrapper around the core gRPC library.' |
||||||
|
gs.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
gs.source_files = 'src/objective-c/GRPCClient/*.{h,m}', 'src/objective-c/GRPCClient/private/*.{h,m}' |
||||||
|
gs.private_header_files = 'src/objective-c/GRPCClient/private/*.h' |
||||||
|
|
||||||
|
gs.dependency 'gRPC/C-Core' |
||||||
|
# Is this needed in all dependents? |
||||||
|
gs.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Public/gRPC/include"' } |
||||||
|
gs.dependency 'gRPC/RxLibrary' |
||||||
|
|
||||||
|
# Certificates, to be able to establish TLS connections: |
||||||
|
gs.resource_bundles = { 'gRPC' => ['etc/roots.pem'] } |
||||||
|
end |
||||||
|
|
||||||
|
s.subspec 'ProtoRPC' do |ps| |
||||||
|
ps.summary = 'RPC library for ProtocolBuffers, based on gRPC' |
||||||
|
ps.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
ps.source_files = 'src/objective-c/ProtoRPC/*.{h,m}' |
||||||
|
|
||||||
|
ps.dependency 'gRPC/GRPCClient' |
||||||
|
ps.dependency 'gRPC/RxLibrary' |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,52 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_SUPPORT_TLS_GCC_H |
||||||
|
#define GRPC_SUPPORT_TLS_GCC_H |
||||||
|
|
||||||
|
/* Thread local storage based on gcc compiler primitives.
|
||||||
|
#include tls.h to use this - and see that file for documentation */ |
||||||
|
|
||||||
|
struct gpr_gcc_thread_local { |
||||||
|
gpr_intptr value; |
||||||
|
}; |
||||||
|
|
||||||
|
#define GPR_TLS_DECL(name) \ |
||||||
|
static __thread struct gpr_gcc_thread_local name = {0} |
||||||
|
|
||||||
|
#define gpr_tls_init(tls) do {} while (0) |
||||||
|
#define gpr_tls_destroy(tls) do {} while (0) |
||||||
|
#define gpr_tls_set(tls, new_value) (((tls)->value) = (new_value)) |
||||||
|
#define gpr_tls_get(tls) ((tls)->value) |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,52 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_SUPPORT_TLS_GCC_H |
||||||
|
#define GRPC_SUPPORT_TLS_GCC_H |
||||||
|
|
||||||
|
/* Thread local storage based on ms visual c compiler primitives.
|
||||||
|
#include tls.h to use this - and see that file for documentation */ |
||||||
|
|
||||||
|
struct gpr_msvc_thread_local { |
||||||
|
gpr_intptr value; |
||||||
|
}; |
||||||
|
|
||||||
|
#define GPR_TLS_DECL(name) \ |
||||||
|
static __thread struct gpr_msvc_thread_local name = {0} |
||||||
|
|
||||||
|
#define gpr_tls_init(tls) do {} while (0) |
||||||
|
#define gpr_tls_destroy(tls) do {} while (0) |
||||||
|
#define gpr_tls_set(tls, new_value) (((tls)->value) = (new_value)) |
||||||
|
#define gpr_tls_get(tls) ((tls)->value) |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,53 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_SUPPORT_TLS_PTHREAD_H |
||||||
|
#define GRPC_SUPPORT_TLS_PTHREAD_H |
||||||
|
|
||||||
|
/* Thread local storage based on pthread library calls.
|
||||||
|
#include tls.h to use this - and see that file for documentation */ |
||||||
|
|
||||||
|
struct gpr_pthread_thread_local { |
||||||
|
pthread_key_t key; |
||||||
|
}; |
||||||
|
|
||||||
|
#define GPR_TLS_DECL(name) \ |
||||||
|
static struct gpr_pthread_thread_local name = {0} |
||||||
|
|
||||||
|
#define gpr_tls_init(tls) GPR_ASSERT(0 == pthread_key_create(&(tls)->key, NULL)) |
||||||
|
#define gpr_tls_destroy(tls) pthread_key_delete((tls)->key) |
||||||
|
#define gpr_tls_set(tls, new_value) \ |
||||||
|
GPR_ASSERT(pthread_setspecific((tls)->key, (void*)(new_value)) == 0) |
||||||
|
#define gpr_tls_get(tls) ((gpr_intptr)pthread_getspecific((tls)->key)) |
||||||
|
|
||||||
|
#endif |
@ -1,149 +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/channel/metadata_buffer.h" |
|
||||||
#include <grpc/support/alloc.h> |
|
||||||
#include <grpc/support/log.h> |
|
||||||
#include <grpc/support/useful.h> |
|
||||||
|
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#define INITIAL_ELEM_CAP 8 |
|
||||||
|
|
||||||
/* One queued call; we track offsets to string data in a shared buffer to
|
|
||||||
reduce allocations. See grpc_metadata_buffer_impl for the memory use |
|
||||||
strategy */ |
|
||||||
typedef struct { |
|
||||||
grpc_mdelem *md; |
|
||||||
void (*cb)(void *user_data, grpc_op_error error); |
|
||||||
void *user_data; |
|
||||||
gpr_uint32 flags; |
|
||||||
} qelem; |
|
||||||
|
|
||||||
/* Memory layout:
|
|
||||||
|
|
||||||
grpc_metadata_buffer_impl |
|
||||||
followed by an array of qelem */ |
|
||||||
struct grpc_metadata_buffer_impl { |
|
||||||
/* number of elements in q */ |
|
||||||
size_t elems; |
|
||||||
/* capacity of q */ |
|
||||||
size_t elem_cap; |
|
||||||
}; |
|
||||||
|
|
||||||
#define ELEMS(buffer) ((qelem *)((buffer) + 1)) |
|
||||||
|
|
||||||
void grpc_metadata_buffer_init(grpc_metadata_buffer *buffer) { |
|
||||||
/* start buffer as NULL, indicating no elements */ |
|
||||||
*buffer = NULL; |
|
||||||
} |
|
||||||
|
|
||||||
void grpc_metadata_buffer_destroy(grpc_metadata_buffer *buffer, |
|
||||||
grpc_op_error error) { |
|
||||||
size_t i; |
|
||||||
qelem *qe; |
|
||||||
if (*buffer) { |
|
||||||
for (i = 0; i < (*buffer)->elems; i++) { |
|
||||||
qe = &ELEMS(*buffer)[i]; |
|
||||||
grpc_mdelem_unref(qe->md); |
|
||||||
qe->cb(qe->user_data, error); |
|
||||||
} |
|
||||||
gpr_free(*buffer); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void grpc_metadata_buffer_queue(grpc_metadata_buffer *buffer, |
|
||||||
grpc_call_op *op) { |
|
||||||
grpc_metadata_buffer_impl *impl = *buffer; |
|
||||||
qelem *qe; |
|
||||||
size_t bytes; |
|
||||||
|
|
||||||
GPR_ASSERT(op->type == GRPC_SEND_METADATA || op->type == GRPC_RECV_METADATA); |
|
||||||
|
|
||||||
if (!impl) { |
|
||||||
/* this is the first element: allocate enough space to hold the
|
|
||||||
header object and the initial element capacity of qelems */ |
|
||||||
bytes = |
|
||||||
sizeof(grpc_metadata_buffer_impl) + INITIAL_ELEM_CAP * sizeof(qelem); |
|
||||||
impl = gpr_malloc(bytes); |
|
||||||
/* initialize the header object */ |
|
||||||
impl->elems = 0; |
|
||||||
impl->elem_cap = INITIAL_ELEM_CAP; |
|
||||||
} else if (impl->elems == impl->elem_cap) { |
|
||||||
/* more qelems than what we can deal with: grow by doubling size */ |
|
||||||
impl->elem_cap *= 2; |
|
||||||
bytes = sizeof(grpc_metadata_buffer_impl) + impl->elem_cap * sizeof(qelem); |
|
||||||
impl = gpr_realloc(impl, bytes); |
|
||||||
} |
|
||||||
|
|
||||||
/* append an element to the queue */ |
|
||||||
qe = &ELEMS(impl)[impl->elems]; |
|
||||||
impl->elems++; |
|
||||||
|
|
||||||
qe->md = op->data.metadata; |
|
||||||
qe->cb = op->done_cb; |
|
||||||
qe->user_data = op->user_data; |
|
||||||
qe->flags = op->flags; |
|
||||||
|
|
||||||
/* header object may have changed location: store it back */ |
|
||||||
*buffer = impl; |
|
||||||
} |
|
||||||
|
|
||||||
void grpc_metadata_buffer_flush(grpc_metadata_buffer *buffer, |
|
||||||
grpc_call_element *elem) { |
|
||||||
grpc_metadata_buffer_impl *impl = *buffer; |
|
||||||
grpc_call_op op; |
|
||||||
qelem *qe; |
|
||||||
size_t i; |
|
||||||
|
|
||||||
if (!impl) { |
|
||||||
/* nothing to send */ |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
/* construct call_op's, and push them down the stack */ |
|
||||||
op.type = GRPC_SEND_METADATA; |
|
||||||
op.dir = GRPC_CALL_DOWN; |
|
||||||
for (i = 0; i < impl->elems; i++) { |
|
||||||
qe = &ELEMS(impl)[i]; |
|
||||||
op.done_cb = qe->cb; |
|
||||||
op.user_data = qe->user_data; |
|
||||||
op.flags = qe->flags; |
|
||||||
op.data.metadata = qe->md; |
|
||||||
grpc_call_next_op(elem, &op); |
|
||||||
} |
|
||||||
|
|
||||||
/* free data structures and reset to NULL: we can only flush once */ |
|
||||||
gpr_free(impl); |
|
||||||
*buffer = NULL; |
|
||||||
} |
|
@ -1,70 +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. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef GRPC_INTERNAL_CORE_CHANNEL_METADATA_BUFFER_H |
|
||||||
#define GRPC_INTERNAL_CORE_CHANNEL_METADATA_BUFFER_H |
|
||||||
|
|
||||||
#include "src/core/channel/channel_stack.h" |
|
||||||
|
|
||||||
/* Utility code to buffer GRPC_SEND_METADATA calls and pass them down the stack
|
|
||||||
all at once at some otherwise-determined time. Useful for implementing |
|
||||||
filters that want to queue metadata until a START event chooses some |
|
||||||
underlying filter stack to send an rpc on. */ |
|
||||||
|
|
||||||
/* Clients should declare a member of grpc_metadata_buffer. This may at some
|
|
||||||
point become a typedef for a struct, but for now a pointer suffices */ |
|
||||||
typedef struct grpc_metadata_buffer_impl grpc_metadata_buffer_impl; |
|
||||||
typedef grpc_metadata_buffer_impl *grpc_metadata_buffer; |
|
||||||
|
|
||||||
/* Initializes the metadata buffer. Allocates no memory. */ |
|
||||||
void grpc_metadata_buffer_init(grpc_metadata_buffer *buffer); |
|
||||||
/* Destroy the metadata buffer. */ |
|
||||||
void grpc_metadata_buffer_destroy(grpc_metadata_buffer *buffer, |
|
||||||
grpc_op_error error); |
|
||||||
/* Append a call to the end of a metadata buffer: may allocate memory */ |
|
||||||
void grpc_metadata_buffer_queue(grpc_metadata_buffer *buffer, grpc_call_op *op); |
|
||||||
/* Flush all queued operations from the metadata buffer to the element below
|
|
||||||
self */ |
|
||||||
void grpc_metadata_buffer_flush(grpc_metadata_buffer *buffer, |
|
||||||
grpc_call_element *self); |
|
||||||
/* Count the number of queued elements in the buffer. */ |
|
||||||
size_t grpc_metadata_buffer_count(const grpc_metadata_buffer *buffer); |
|
||||||
/* Extract elements as a grpc_metadata*, for presentation to applications.
|
|
||||||
The returned buffer must be freed with |
|
||||||
grpc_metadata_buffer_cleanup_elements. |
|
||||||
Clears the metadata buffer (this is a one-shot operation) */ |
|
||||||
grpc_metadata *grpc_metadata_buffer_extract_elements( |
|
||||||
grpc_metadata_buffer *buffer); |
|
||||||
void grpc_metadata_buffer_cleanup_elements(void *elements, grpc_op_error error); |
|
||||||
|
|
||||||
#endif /* GRPC_INTERNAL_CORE_CHANNEL_METADATA_BUFFER_H */ |
|
@ -0,0 +1,85 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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 <grpc/support/port_platform.h> |
||||||
|
|
||||||
|
#ifdef GPR_WINSOCK_SOCKET |
||||||
|
#include "src/core/iomgr/sockaddr_utils.h" |
||||||
|
#include "src/core/iomgr/endpoint_pair.h" |
||||||
|
|
||||||
|
#include <errno.h> |
||||||
|
#include <fcntl.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
#include "src/core/iomgr/tcp_windows.h" |
||||||
|
#include "src/core/iomgr/socket_windows.h" |
||||||
|
#include <grpc/support/log.h> |
||||||
|
|
||||||
|
static void create_sockets(SOCKET sv[2]) { |
||||||
|
SOCKET svr_sock = INVALID_SOCKET; |
||||||
|
SOCKET lst_sock = INVALID_SOCKET; |
||||||
|
SOCKET cli_sock = INVALID_SOCKET; |
||||||
|
SOCKADDR_IN addr; |
||||||
|
int addr_len; |
||||||
|
|
||||||
|
lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); |
||||||
|
GPR_ASSERT(lst_sock != INVALID_SOCKET); |
||||||
|
|
||||||
|
memset(&addr, 0, sizeof(addr)); |
||||||
|
GPR_ASSERT(bind(lst_sock, (struct sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR); |
||||||
|
GPR_ASSERT(listen(lst_sock, SOMAXCONN) != SOCKET_ERROR); |
||||||
|
GPR_ASSERT(getsockname(lst_sock, (struct sockaddr*)&addr, &addr_len) != SOCKET_ERROR); |
||||||
|
|
||||||
|
cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); |
||||||
|
GPR_ASSERT(cli_sock != INVALID_SOCKET); |
||||||
|
|
||||||
|
GPR_ASSERT(WSAConnect(cli_sock, (struct sockaddr*)&addr, addr_len, NULL, NULL, NULL, NULL) == 0); |
||||||
|
svr_sock = accept(lst_sock, (struct sockaddr*)&addr, &addr_len); |
||||||
|
GPR_ASSERT(svr_sock != INVALID_SOCKET); |
||||||
|
|
||||||
|
closesocket(lst_sock); |
||||||
|
|
||||||
|
sv[1] = cli_sock; |
||||||
|
sv[0] = svr_sock; |
||||||
|
} |
||||||
|
|
||||||
|
grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(size_t read_slice_size) { |
||||||
|
SOCKET sv[2]; |
||||||
|
grpc_endpoint_pair p; |
||||||
|
create_sockets(sv); |
||||||
|
p.client = grpc_tcp_create(grpc_winsocket_create(sv[1])); |
||||||
|
p.server = grpc_tcp_create(grpc_winsocket_create(sv[0])); |
||||||
|
return p; |
||||||
|
} |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,138 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifdef GRPC_LATENCY_PROFILER |
||||||
|
|
||||||
|
#include "src/core/profiling/timers.h" |
||||||
|
#include "src/core/profiling/timers_preciseclock.h" |
||||||
|
|
||||||
|
#include <grpc/support/alloc.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
#include <grpc/support/time.h> |
||||||
|
#include <grpc/support/sync.h> |
||||||
|
#include <stdio.h> |
||||||
|
|
||||||
|
typedef struct grpc_timer_entry { |
||||||
|
grpc_precise_clock tm; |
||||||
|
const char* tag; |
||||||
|
void* id; |
||||||
|
const char* file; |
||||||
|
int line; |
||||||
|
} grpc_timer_entry; |
||||||
|
|
||||||
|
struct grpc_timers_log { |
||||||
|
gpr_mu mu; |
||||||
|
grpc_timer_entry* log; |
||||||
|
int num_entries; |
||||||
|
int capacity; |
||||||
|
int capacity_limit; |
||||||
|
FILE* fp; |
||||||
|
}; |
||||||
|
|
||||||
|
grpc_timers_log* grpc_timers_log_global = NULL; |
||||||
|
|
||||||
|
grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE* dump) { |
||||||
|
grpc_timers_log* log = gpr_malloc(sizeof(*log)); |
||||||
|
|
||||||
|
/* TODO (vpai): Allow allocation below limit */ |
||||||
|
log->log = gpr_malloc(capacity_limit * sizeof(*log->log)); |
||||||
|
|
||||||
|
/* TODO (vpai): Improve concurrency, do per-thread logging? */ |
||||||
|
gpr_mu_init(&log->mu); |
||||||
|
|
||||||
|
log->num_entries = 0; |
||||||
|
log->capacity = log->capacity_limit = capacity_limit; |
||||||
|
|
||||||
|
log->fp = dump; |
||||||
|
|
||||||
|
return log; |
||||||
|
} |
||||||
|
|
||||||
|
static void log_report_locked(grpc_timers_log* log) { |
||||||
|
FILE* fp = log->fp; |
||||||
|
int i; |
||||||
|
for (i = 0; i < log->num_entries; i++) { |
||||||
|
grpc_timer_entry* entry = &(log->log[i]); |
||||||
|
fprintf(fp, "GRPC_LAT_PROF "); |
||||||
|
grpc_precise_clock_print(&entry->tm, fp); |
||||||
|
fprintf(fp, " %s %p %s %d\n", entry->tag, entry->id, entry->file, |
||||||
|
entry->line); |
||||||
|
} |
||||||
|
|
||||||
|
/* Now clear out the log */ |
||||||
|
log->num_entries = 0; |
||||||
|
} |
||||||
|
|
||||||
|
void grpc_timers_log_destroy(grpc_timers_log* log) { |
||||||
|
gpr_mu_lock(&log->mu); |
||||||
|
log_report_locked(log); |
||||||
|
gpr_mu_unlock(&log->mu); |
||||||
|
|
||||||
|
gpr_free(log->log); |
||||||
|
gpr_mu_destroy(&log->mu); |
||||||
|
|
||||||
|
gpr_free(log); |
||||||
|
} |
||||||
|
|
||||||
|
void grpc_timers_log_add(grpc_timers_log* log, const char* tag, void* id, |
||||||
|
const char* file, int line) { |
||||||
|
grpc_timer_entry* entry; |
||||||
|
|
||||||
|
/* TODO (vpai) : Improve concurrency */ |
||||||
|
gpr_mu_lock(&log->mu); |
||||||
|
if (log->num_entries == log->capacity_limit) { |
||||||
|
log_report_locked(log); |
||||||
|
} |
||||||
|
|
||||||
|
entry = &log->log[log->num_entries++]; |
||||||
|
|
||||||
|
grpc_precise_clock_now(&entry->tm); |
||||||
|
entry->tag = tag; |
||||||
|
entry->id = id; |
||||||
|
entry->file = file; |
||||||
|
entry->line = line; |
||||||
|
|
||||||
|
gpr_mu_unlock(&log->mu); |
||||||
|
} |
||||||
|
|
||||||
|
void grpc_timers_log_global_init(void) { |
||||||
|
grpc_timers_log_global = grpc_timers_log_create(100000, stdout); |
||||||
|
} |
||||||
|
|
||||||
|
void grpc_timers_log_global_destroy(void) { |
||||||
|
grpc_timers_log_destroy(grpc_timers_log_global); |
||||||
|
} |
||||||
|
#else /* !GRPC_LATENCY_PROFILER */ |
||||||
|
void grpc_timers_log_global_init(void) {} |
||||||
|
void grpc_timers_log_global_destroy(void) {} |
||||||
|
#endif /* GRPC_LATENCY_PROFILER */ |
@ -0,0 +1,71 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_CORE_PROFILING_TIMERS_H |
||||||
|
#define GRPC_CORE_PROFILING_TIMERS_H |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifdef GRPC_LATENCY_PROFILER |
||||||
|
|
||||||
|
typedef struct grpc_timers_log grpc_timers_log; |
||||||
|
|
||||||
|
grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE* dump); |
||||||
|
void grpc_timers_log_add(grpc_timers_log*, const char* tag, void* id, |
||||||
|
const char* file, int line); |
||||||
|
void grpc_timers_log_destroy(grpc_timers_log *); |
||||||
|
|
||||||
|
extern grpc_timers_log *grpc_timers_log_global; |
||||||
|
|
||||||
|
#define GRPC_TIMER_MARK(x, s) \ |
||||||
|
grpc_timers_log_add(grpc_timers_log_global, #x, ((void *)(gpr_intptr)(s)), \
|
||||||
|
__FILE__, __LINE__) |
||||||
|
|
||||||
|
#else /* !GRPC_LATENCY_PROFILER */ |
||||||
|
#define GRPC_TIMER_MARK(x, s) \ |
||||||
|
do { \
|
||||||
|
} while (0) |
||||||
|
#endif /* GRPC_LATENCY_PROFILER */ |
||||||
|
|
||||||
|
void grpc_timers_log_global_init(void); |
||||||
|
void grpc_timers_log_global_destroy(void); |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif /* GRPC_CORE_PROFILING_TIMERS_H */ |
@ -0,0 +1,201 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONNECTOR_H |
||||||
|
#define GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONNECTOR_H |
||||||
|
|
||||||
|
#include <grpc/grpc_security.h> |
||||||
|
#include "src/core/iomgr/endpoint.h" |
||||||
|
#include "src/core/tsi/transport_security_interface.h" |
||||||
|
|
||||||
|
/* --- status enum. --- */ |
||||||
|
|
||||||
|
typedef enum { |
||||||
|
GRPC_SECURITY_OK = 0, |
||||||
|
GRPC_SECURITY_PENDING, |
||||||
|
GRPC_SECURITY_ERROR |
||||||
|
} grpc_security_status; |
||||||
|
|
||||||
|
/* --- URL schemes. --- */ |
||||||
|
|
||||||
|
#define GRPC_SSL_URL_SCHEME "https" |
||||||
|
#define GRPC_FAKE_SECURITY_URL_SCHEME "http+fake_security" |
||||||
|
|
||||||
|
/* --- security_connector object. ---
|
||||||
|
|
||||||
|
A security connector object represents away to configure the underlying |
||||||
|
transport security mechanism and check the resulting trusted peer. */ |
||||||
|
|
||||||
|
typedef struct grpc_security_connector grpc_security_connector; |
||||||
|
|
||||||
|
#define GRPC_SECURITY_CONNECTOR_ARG "grpc.security_connector" |
||||||
|
|
||||||
|
typedef void (*grpc_security_check_cb)(void *user_data, |
||||||
|
grpc_security_status status); |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
void (*destroy)(grpc_security_connector *sc); |
||||||
|
grpc_security_status (*create_handshaker)(grpc_security_connector *sc, |
||||||
|
tsi_handshaker **handshaker); |
||||||
|
grpc_security_status (*check_peer)(grpc_security_connector *sc, tsi_peer peer, |
||||||
|
grpc_security_check_cb cb, |
||||||
|
void *user_data); |
||||||
|
} grpc_security_connector_vtable; |
||||||
|
|
||||||
|
struct grpc_security_connector { |
||||||
|
const grpc_security_connector_vtable *vtable; |
||||||
|
gpr_refcount refcount; |
||||||
|
int is_client_side; |
||||||
|
const char *url_scheme; |
||||||
|
}; |
||||||
|
|
||||||
|
/* Increments the refcount. */ |
||||||
|
grpc_security_connector *grpc_security_connector_ref( |
||||||
|
grpc_security_connector *sc); |
||||||
|
|
||||||
|
/* Decrements the refcount and destroys the object if it reaches 0. */ |
||||||
|
void grpc_security_connector_unref(grpc_security_connector *sc); |
||||||
|
|
||||||
|
/* Handshake creation. */ |
||||||
|
grpc_security_status grpc_security_connector_create_handshaker( |
||||||
|
grpc_security_connector *sc, tsi_handshaker **handshaker); |
||||||
|
|
||||||
|
/* Check the peer.
|
||||||
|
Implementations can choose to check the peer either synchronously or |
||||||
|
asynchronously. In the first case, a successful call will return |
||||||
|
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
||||||
|
GRPC_SECURITY_PENDING unless an error is detected early on. |
||||||
|
Ownership of the peer is transfered. |
||||||
|
*/ |
||||||
|
grpc_security_status grpc_security_connector_check_peer( |
||||||
|
grpc_security_connector *sc, tsi_peer peer, grpc_security_check_cb cb, |
||||||
|
void *user_data); |
||||||
|
|
||||||
|
/* Util to encapsulate the connector in a channel arg. */ |
||||||
|
grpc_arg grpc_security_connector_to_arg(grpc_security_connector *sc); |
||||||
|
|
||||||
|
/* Util to get the connector from a channel arg. */ |
||||||
|
grpc_security_connector *grpc_security_connector_from_arg(const grpc_arg *arg); |
||||||
|
|
||||||
|
/* Util to find the connector from channel args. */ |
||||||
|
grpc_security_connector *grpc_find_security_connector_in_args( |
||||||
|
const grpc_channel_args *args); |
||||||
|
|
||||||
|
/* --- channel_security_connector object. ---
|
||||||
|
|
||||||
|
A channel security connector object represents away to configure the |
||||||
|
underlying transport security mechanism on the client side. */ |
||||||
|
|
||||||
|
typedef struct grpc_channel_security_connector grpc_channel_security_connector; |
||||||
|
|
||||||
|
struct grpc_channel_security_connector { |
||||||
|
grpc_security_connector base; /* requires is_client_side to be non 0. */ |
||||||
|
grpc_credentials *request_metadata_creds; |
||||||
|
grpc_security_status (*check_call_host)(grpc_channel_security_connector *sc, |
||||||
|
const char *host, |
||||||
|
grpc_security_check_cb cb, |
||||||
|
void *user_data); |
||||||
|
}; |
||||||
|
|
||||||
|
/* Checks that the host that will be set for a call is acceptable.
|
||||||
|
Implementations can choose do the check either synchronously or |
||||||
|
asynchronously. In the first case, a successful call will return |
||||||
|
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
||||||
|
GRPC_SECURITY_PENDING unless an error is detected early on. */ |
||||||
|
grpc_security_status grpc_channel_security_connector_check_call_host( |
||||||
|
grpc_channel_security_connector *sc, const char *host, |
||||||
|
grpc_security_check_cb cb, void *user_data); |
||||||
|
|
||||||
|
/* --- Creation security connectors. --- */ |
||||||
|
|
||||||
|
/* For TESTING ONLY!
|
||||||
|
Creates a fake connector that emulates real channel security. */ |
||||||
|
grpc_channel_security_connector *grpc_fake_channel_security_connector_create( |
||||||
|
grpc_credentials *request_metadata_creds, int call_host_check_is_async); |
||||||
|
|
||||||
|
/* For TESTING ONLY!
|
||||||
|
Creates a fake connector that emulates real server security. */ |
||||||
|
grpc_security_connector *grpc_fake_server_security_connector_create(void); |
||||||
|
|
||||||
|
/* Config for ssl clients. */ |
||||||
|
typedef struct { |
||||||
|
unsigned char *pem_private_key; |
||||||
|
size_t pem_private_key_size; |
||||||
|
unsigned char *pem_cert_chain; |
||||||
|
size_t pem_cert_chain_size; |
||||||
|
unsigned char *pem_root_certs; |
||||||
|
size_t pem_root_certs_size; |
||||||
|
} grpc_ssl_config; |
||||||
|
|
||||||
|
/* Creates an SSL channel_security_connector.
|
||||||
|
- request_metadata_creds is the credentials object which metadata |
||||||
|
will be sent with each request. This parameter can be NULL. |
||||||
|
- config is the SSL config to be used for the SSL channel establishment. |
||||||
|
- is_client should be 0 for a server or a non-0 value for a client. |
||||||
|
- secure_peer_name is the secure peer name that should be checked in |
||||||
|
grpc_channel_security_connector_check_peer. This parameter may be NULL in |
||||||
|
which case the peer name will not be checked. Note that if this parameter |
||||||
|
is not NULL, then, pem_root_certs should not be NULL either. |
||||||
|
- sc is a pointer on the connector to be created. |
||||||
|
This function returns GRPC_SECURITY_OK in case of success or a |
||||||
|
specific error code otherwise. |
||||||
|
*/ |
||||||
|
grpc_security_status grpc_ssl_channel_security_connector_create( |
||||||
|
grpc_credentials *request_metadata_creds, |
||||||
|
const grpc_ssl_config *config, const char *target_name, |
||||||
|
const char *overridden_target_name, grpc_channel_security_connector **sc); |
||||||
|
|
||||||
|
/* Gets the default ssl roots. */ |
||||||
|
size_t grpc_get_default_ssl_roots(const unsigned char **pem_root_certs); |
||||||
|
|
||||||
|
/* Config for ssl servers. */ |
||||||
|
typedef struct { |
||||||
|
unsigned char **pem_private_keys; |
||||||
|
size_t *pem_private_keys_sizes; |
||||||
|
unsigned char **pem_cert_chains; |
||||||
|
size_t *pem_cert_chains_sizes; |
||||||
|
size_t num_key_cert_pairs; |
||||||
|
unsigned char *pem_root_certs; |
||||||
|
size_t pem_root_certs_size; |
||||||
|
} grpc_ssl_server_config; |
||||||
|
|
||||||
|
/* Creates an SSL server_security_connector.
|
||||||
|
- config is the SSL config to be used for the SSL channel establishment. |
||||||
|
- sc is a pointer on the connector to be created. |
||||||
|
This function returns GRPC_SECURITY_OK in case of success or a |
||||||
|
specific error code otherwise. |
||||||
|
*/ |
||||||
|
grpc_security_status grpc_ssl_server_security_connector_create( |
||||||
|
const grpc_ssl_server_config *config, grpc_security_connector **sc); |
||||||
|
|
||||||
|
#endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONNECTOR_H */ |
@ -1,215 +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. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H |
|
||||||
#define GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H |
|
||||||
|
|
||||||
#include <grpc/grpc_security.h> |
|
||||||
#include "src/core/iomgr/endpoint.h" |
|
||||||
#include "src/core/security/credentials.h" |
|
||||||
#include "src/core/tsi/transport_security_interface.h" |
|
||||||
|
|
||||||
/* --- status enum. --- */ |
|
||||||
|
|
||||||
typedef enum { |
|
||||||
GRPC_SECURITY_OK = 0, |
|
||||||
GRPC_SECURITY_PENDING, |
|
||||||
GRPC_SECURITY_ERROR |
|
||||||
} grpc_security_status; |
|
||||||
|
|
||||||
/* --- URL schemes. --- */ |
|
||||||
|
|
||||||
#define GRPC_SSL_URL_SCHEME "https" |
|
||||||
#define GRPC_FAKE_SECURITY_URL_SCHEME "http+fake_security" |
|
||||||
|
|
||||||
/* --- security_context object. ---
|
|
||||||
|
|
||||||
A security context object represents away to configure the underlying |
|
||||||
transport security mechanism and check the resulting trusted peer. */ |
|
||||||
|
|
||||||
typedef struct grpc_security_context grpc_security_context; |
|
||||||
|
|
||||||
#define GRPC_SECURITY_CONTEXT_ARG "grpc.security_context" |
|
||||||
|
|
||||||
typedef void (*grpc_security_check_cb)(void *user_data, |
|
||||||
grpc_security_status status); |
|
||||||
|
|
||||||
typedef struct { |
|
||||||
void (*destroy)(grpc_security_context *ctx); |
|
||||||
grpc_security_status (*create_handshaker)(grpc_security_context *ctx, |
|
||||||
tsi_handshaker **handshaker); |
|
||||||
grpc_security_status (*check_peer)(grpc_security_context *ctx, tsi_peer peer, |
|
||||||
grpc_security_check_cb cb, |
|
||||||
void *user_data); |
|
||||||
} grpc_security_context_vtable; |
|
||||||
|
|
||||||
struct grpc_security_context { |
|
||||||
const grpc_security_context_vtable *vtable; |
|
||||||
gpr_refcount refcount; |
|
||||||
int is_client_side; |
|
||||||
const char *url_scheme; |
|
||||||
}; |
|
||||||
|
|
||||||
/* Increments the refcount. */ |
|
||||||
grpc_security_context *grpc_security_context_ref(grpc_security_context *ctx); |
|
||||||
|
|
||||||
/* Decrements the refcount and destroys the object if it reaches 0. */ |
|
||||||
void grpc_security_context_unref(grpc_security_context *ctx); |
|
||||||
|
|
||||||
/* Handshake creation. */ |
|
||||||
grpc_security_status grpc_security_context_create_handshaker( |
|
||||||
grpc_security_context *ctx, tsi_handshaker **handshaker); |
|
||||||
|
|
||||||
/* Check the peer.
|
|
||||||
Implementations can choose to check the peer either synchronously or |
|
||||||
asynchronously. In the first case, a successful call will return |
|
||||||
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
|
||||||
GRPC_SECURITY_PENDING unless an error is detected early on. |
|
||||||
Ownership of the peer is transfered. |
|
||||||
*/ |
|
||||||
grpc_security_status grpc_security_context_check_peer( |
|
||||||
grpc_security_context *ctx, tsi_peer peer, |
|
||||||
grpc_security_check_cb cb, void *user_data); |
|
||||||
|
|
||||||
/* Util to encapsulate the context in a channel arg. */ |
|
||||||
grpc_arg grpc_security_context_to_arg(grpc_security_context *ctx); |
|
||||||
|
|
||||||
/* Util to get the context from a channel arg. */ |
|
||||||
grpc_security_context *grpc_security_context_from_arg(const grpc_arg *arg); |
|
||||||
|
|
||||||
/* Util to find the context from channel args. */ |
|
||||||
grpc_security_context *grpc_find_security_context_in_args( |
|
||||||
const grpc_channel_args *args); |
|
||||||
|
|
||||||
/* --- channel_security_context object. ---
|
|
||||||
|
|
||||||
A channel security context object represents away to configure the |
|
||||||
underlying transport security mechanism on the client side. */ |
|
||||||
|
|
||||||
typedef struct grpc_channel_security_context grpc_channel_security_context; |
|
||||||
|
|
||||||
struct grpc_channel_security_context { |
|
||||||
grpc_security_context base; /* requires is_client_side to be non 0. */ |
|
||||||
grpc_credentials *request_metadata_creds; |
|
||||||
grpc_security_status (*check_call_host)( |
|
||||||
grpc_channel_security_context *ctx, const char *host, |
|
||||||
grpc_security_check_cb cb, void *user_data); |
|
||||||
}; |
|
||||||
|
|
||||||
/* Checks that the host that will be set for a call is acceptable.
|
|
||||||
Implementations can choose do the check either synchronously or |
|
||||||
asynchronously. In the first case, a successful call will return |
|
||||||
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
|
||||||
GRPC_SECURITY_PENDING unless an error is detected early on. */ |
|
||||||
grpc_security_status grpc_channel_security_context_check_call_host( |
|
||||||
grpc_channel_security_context *ctx, const char *host, |
|
||||||
grpc_security_check_cb cb, void *user_data); |
|
||||||
|
|
||||||
/* --- Creation security contexts. --- */ |
|
||||||
|
|
||||||
/* For TESTING ONLY!
|
|
||||||
Creates a fake context that emulates real channel security. */ |
|
||||||
grpc_channel_security_context *grpc_fake_channel_security_context_create( |
|
||||||
grpc_credentials *request_metadata_creds, int call_host_check_is_async); |
|
||||||
|
|
||||||
/* For TESTING ONLY!
|
|
||||||
Creates a fake context that emulates real server security. */ |
|
||||||
grpc_security_context *grpc_fake_server_security_context_create(void); |
|
||||||
|
|
||||||
/* Creates an SSL channel_security_context.
|
|
||||||
- request_metadata_creds is the credentials object which metadata |
|
||||||
will be sent with each request. This parameter can be NULL. |
|
||||||
- config is the SSL config to be used for the SSL channel establishment. |
|
||||||
- is_client should be 0 for a server or a non-0 value for a client. |
|
||||||
- secure_peer_name is the secure peer name that should be checked in |
|
||||||
grpc_channel_security_context_check_peer. This parameter may be NULL in |
|
||||||
which case the peer name will not be checked. Note that if this parameter |
|
||||||
is not NULL, then, pem_root_certs should not be NULL either. |
|
||||||
- ctx is a pointer on the context to be created. |
|
||||||
This function returns GRPC_SECURITY_OK in case of success or a |
|
||||||
specific error code otherwise. |
|
||||||
*/ |
|
||||||
grpc_security_status grpc_ssl_channel_security_context_create( |
|
||||||
grpc_credentials *request_metadata_creds, const grpc_ssl_config *config, |
|
||||||
const char *target_name, const char *overridden_target_name, |
|
||||||
grpc_channel_security_context **ctx); |
|
||||||
|
|
||||||
/* Creates an SSL server_security_context.
|
|
||||||
- config is the SSL config to be used for the SSL channel establishment. |
|
||||||
- ctx is a pointer on the context to be created. |
|
||||||
This function returns GRPC_SECURITY_OK in case of success or a |
|
||||||
specific error code otherwise. |
|
||||||
*/ |
|
||||||
grpc_security_status grpc_ssl_server_security_context_create( |
|
||||||
const grpc_ssl_server_config *config, grpc_security_context **ctx); |
|
||||||
|
|
||||||
/* --- Creation of high level objects. --- */ |
|
||||||
|
|
||||||
/* Secure client channel creation. */ |
|
||||||
|
|
||||||
size_t grpc_get_default_ssl_roots(const unsigned char **pem_root_certs); |
|
||||||
|
|
||||||
grpc_channel *grpc_ssl_channel_create(grpc_credentials *ssl_creds, |
|
||||||
grpc_credentials *request_metadata_creds, |
|
||||||
const char *target, |
|
||||||
const grpc_channel_args *args); |
|
||||||
|
|
||||||
grpc_channel *grpc_fake_transport_security_channel_create( |
|
||||||
grpc_credentials *fake_creds, grpc_credentials *request_metadata_creds, |
|
||||||
const char *target, const grpc_channel_args *args); |
|
||||||
|
|
||||||
grpc_channel *grpc_secure_channel_create_internal( |
|
||||||
const char *target, const grpc_channel_args *args, |
|
||||||
grpc_channel_security_context *ctx); |
|
||||||
|
|
||||||
typedef grpc_channel *(*grpc_secure_channel_factory_func)( |
|
||||||
grpc_credentials *transport_security_creds, |
|
||||||
grpc_credentials *request_metadata_creds, const char *target, |
|
||||||
const grpc_channel_args *args); |
|
||||||
|
|
||||||
typedef struct { |
|
||||||
const char *creds_type; |
|
||||||
grpc_secure_channel_factory_func factory; |
|
||||||
} grpc_secure_channel_factory; |
|
||||||
|
|
||||||
grpc_channel *grpc_secure_channel_create_with_factories( |
|
||||||
const grpc_secure_channel_factory *factories, size_t num_factories, |
|
||||||
grpc_credentials *creds, const char *target, const grpc_channel_args *args); |
|
||||||
|
|
||||||
/* Secure server creation. */ |
|
||||||
|
|
||||||
grpc_server *grpc_secure_server_create_internal(grpc_completion_queue *cq, |
|
||||||
const grpc_channel_args *args, |
|
||||||
grpc_security_context *ctx); |
|
||||||
|
|
||||||
#endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */ |
|
@ -1,2 +1,3 @@ |
|||||||
bin |
bin |
||||||
obj |
obj |
||||||
|
*.nupkg |
||||||
|
@ -1,44 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// 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. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
package proto2; |
|
||||||
|
|
||||||
// An empty message that you can re-use to avoid defining duplicated empty |
|
||||||
// messages in your project. A typical example is to use it as argument or the |
|
||||||
// return value of a service API. For instance: |
|
||||||
// |
|
||||||
// service Foo { |
|
||||||
// rpc Bar (proto2.Empty) returns (proto2.Empty) { }; |
|
||||||
// }; |
|
||||||
// |
|
||||||
message Empty {} |
|
@ -1,79 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// 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. |
|
||||||
|
|
||||||
// Labels provide a way to associate user-defined metadata with various |
|
||||||
// objects. Labels may be used to organize objects into non-hierarchical |
|
||||||
// groups; think metadata tags attached to mp3s. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
package tech.label; |
|
||||||
|
|
||||||
// A key-value pair applied to a given object. |
|
||||||
message Label { |
|
||||||
// The key of a label is a syntactically valid URL (as per RFC 1738) with |
|
||||||
// the "scheme" and initial slashes omitted and with the additional |
|
||||||
// restrictions noted below. Each key should be globally unique. The |
|
||||||
// "host" portion is called the "namespace" and is not necessarily |
|
||||||
// resolvable to a network endpoint. Instead, the namespace indicates what |
|
||||||
// system or entity defines the semantics of the label. Namespaces do not |
|
||||||
// restrict the set of objects to which a label may be associated. |
|
||||||
// |
|
||||||
// Keys are defined by the following grammar: |
|
||||||
// |
|
||||||
// key = hostname "/" kpath |
|
||||||
// kpath = ksegment *[ "/" ksegment ] |
|
||||||
// ksegment = alphadigit | *[ alphadigit | "-" | "_" | "." ] |
|
||||||
// |
|
||||||
// where "hostname" and "alphadigit" are defined as in RFC 1738. |
|
||||||
// |
|
||||||
// Example key: |
|
||||||
// spanner.google.com/universe |
|
||||||
required string key = 1; |
|
||||||
|
|
||||||
// The value of the label. |
|
||||||
oneof value { |
|
||||||
// A string value. |
|
||||||
string str_value = 2; |
|
||||||
// An integer value. |
|
||||||
int64 num_value = 3; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A collection of labels, such as the set of all labels attached to an |
|
||||||
// object. Each label in the set must have a different key. |
|
||||||
// |
|
||||||
// Users should prefer to embed "repeated Label" directly when possible. |
|
||||||
// This message should only be used in cases where that isn't possible (e.g. |
|
||||||
// with oneof). |
|
||||||
message Labels { |
|
||||||
repeated Label label = 1; |
|
||||||
} |
|
@ -1,734 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// 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. |
|
||||||
|
|
||||||
|
|
||||||
// Specification of the Pubsub API. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
import "empty.proto"; |
|
||||||
import "label.proto"; |
|
||||||
|
|
||||||
package tech.pubsub; |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Overview of the Pubsub API |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// This file describes an API for a Pubsub system. This system provides a |
|
||||||
// reliable many-to-many communication mechanism between independently written |
|
||||||
// publishers and subscribers where the publisher publishes messages to "topics" |
|
||||||
// and each subscriber creates a "subscription" and consumes messages from it. |
|
||||||
// |
|
||||||
// (a) The pubsub system maintains bindings between topics and subscriptions. |
|
||||||
// (b) A publisher publishes messages into a topic. |
|
||||||
// (c) The pubsub system delivers messages from topics into relevant |
|
||||||
// subscriptions. |
|
||||||
// (d) A subscriber receives pending messages from its subscription and |
|
||||||
// acknowledges or nacks each one to the pubsub system. |
|
||||||
// (e) The pubsub system removes acknowledged messages from that subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Data Model |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The data model consists of the following: |
|
||||||
// |
|
||||||
// * Topic: A topic is a resource to which messages are published by publishers. |
|
||||||
// Topics are named, and the name of the topic is unique within the pubsub |
|
||||||
// system. |
|
||||||
// |
|
||||||
// * Subscription: A subscription records the subscriber's interest in a topic. |
|
||||||
// It can optionally include a query to select a subset of interesting |
|
||||||
// messages. The pubsub system maintains a logical cursor tracking the |
|
||||||
// matching messages which still need to be delivered and acked so that |
|
||||||
// they can retried as needed. The set of messages that have not been |
|
||||||
// acknowledged is called the subscription backlog. |
|
||||||
// |
|
||||||
// * Message: A message is a unit of data that flows in the system. It contains |
|
||||||
// opaque data from the publisher along with its labels. |
|
||||||
// |
|
||||||
// * Message Labels (optional): A set of opaque key, value pairs assigned |
|
||||||
// by the publisher which the subscriber can use for filtering out messages |
|
||||||
// in the topic. For example, a label with key "foo.com/device_type" and |
|
||||||
// value "mobile" may be added for messages that are only relevant for a |
|
||||||
// mobile subscriber; a subscriber on a phone may decide to create a |
|
||||||
// subscription only for messages that have this label. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Publisher Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// A publisher publishes messages to the topic using the Publish request: |
|
||||||
// |
|
||||||
// PubsubMessage message; |
|
||||||
// message.set_data("...."); |
|
||||||
// Label label; |
|
||||||
// label.set_key("foo.com/key1"); |
|
||||||
// label.set_str_value("value1"); |
|
||||||
// message.add_label(label); |
|
||||||
// PublishRequest request; |
|
||||||
// request.set_topic("topicName"); |
|
||||||
// request.set_message(message); |
|
||||||
// PublisherService.Publish(request); |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Subscriber Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The subscriber part of the API is richer than the publisher part and has a |
|
||||||
// number of concepts w.r.t. subscription creation and monitoring: |
|
||||||
// |
|
||||||
// (1) A subscriber creates a subscription using the CreateSubscription call. |
|
||||||
// It may specify an optional "query" to indicate that it wants to receive |
|
||||||
// only messages with a certain set of labels using the label query syntax. |
|
||||||
// It may also specify an optional truncation policy to indicate when old |
|
||||||
// messages from the subcription can be removed. |
|
||||||
// |
|
||||||
// (2) A subscriber receives messages in one of two ways: via push or pull. |
|
||||||
// |
|
||||||
// (a) To receive messages via push, the PushConfig field must be specified in |
|
||||||
// the Subscription parameter when creating a subscription. The PushConfig |
|
||||||
// specifies an endpoint at which the subscriber must expose the |
|
||||||
// PushEndpointService. Messages are received via the HandlePubsubEvent |
|
||||||
// method. The push subscriber responds to the HandlePubsubEvent method |
|
||||||
// with a result code that indicates one of three things: Ack (the message |
|
||||||
// has been successfully processed and the Pubsub system may delete it), |
|
||||||
// Nack (the message has been rejected, the Pubsub system should resend it |
|
||||||
// at a later time), or Push-Back (this is a Nack with the additional |
|
||||||
// semantics that the subscriber is overloaded and the pubsub system should |
|
||||||
// back off on the rate at which it is invoking HandlePubsubEvent). The |
|
||||||
// endpoint may be a load balancer for better scalability. |
|
||||||
// |
|
||||||
// (b) To receive messages via pull a subscriber calls the Pull method on the |
|
||||||
// SubscriberService to get messages from the subscription. For each |
|
||||||
// individual message, the subscriber may use the ack_id received in the |
|
||||||
// PullResponse to Ack the message, Nack the message, or modify the ack |
|
||||||
// deadline with ModifyAckDeadline. See the |
|
||||||
// Subscription.ack_deadline_seconds field documentation for details on the |
|
||||||
// ack deadline behavior. |
|
||||||
// |
|
||||||
// Note: Messages may be consumed in parallel by multiple subscribers making |
|
||||||
// Pull calls to the same subscription; this will result in the set of |
|
||||||
// messages from the subscription being shared and each subscriber |
|
||||||
// receiving a subset of the messages. |
|
||||||
// |
|
||||||
// (4) The subscriber can explicitly truncate the current subscription. |
|
||||||
// |
|
||||||
// (5) "Truncated" events are delivered when a subscription is |
|
||||||
// truncated, whether due to the subscription's truncation policy |
|
||||||
// or an explicit request from the subscriber. |
|
||||||
// |
|
||||||
// Subscription creation: |
|
||||||
// |
|
||||||
// Subscription subscription; |
|
||||||
// subscription.set_topic("topicName"); |
|
||||||
// subscription.set_name("subscriptionName"); |
|
||||||
// subscription.push_config().set_push_endpoint("machinename:8888"); |
|
||||||
// SubscriberService.CreateSubscription(subscription); |
|
||||||
// |
|
||||||
// Consuming messages via push: |
|
||||||
// |
|
||||||
// TODO(eschapira): Add HTTP push example. |
|
||||||
// |
|
||||||
// The port 'machinename:8888' must be bound to a stubby server that implements |
|
||||||
// the PushEndpointService with the following method: |
|
||||||
// |
|
||||||
// int HandlePubsubEvent(PubsubEvent event) { |
|
||||||
// if (event.subscription().equals("subscriptionName")) { |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// } |
|
||||||
// return OK; // This return code implies an acknowledgment |
|
||||||
// } |
|
||||||
// |
|
||||||
// Consuming messages via pull: |
|
||||||
// |
|
||||||
// The subscription must be created without setting the push_config field. |
|
||||||
// |
|
||||||
// PullRequest pull_request; |
|
||||||
// pull_request.set_subscription("subscriptionName"); |
|
||||||
// pull_request.set_return_immediately(false); |
|
||||||
// while (true) { |
|
||||||
// PullResponse pull_response; |
|
||||||
// if (SubscriberService.Pull(pull_request, pull_response) == OK) { |
|
||||||
// PubsubEvent event = pull_response.pubsub_event(); |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// AcknowledgeRequest ack_request; |
|
||||||
// ackRequest.set_subscription("subscriptionName"); |
|
||||||
// ackRequest.set_ack_id(pull_response.ack_id()); |
|
||||||
// SubscriberService.Acknowledge(ack_request); |
|
||||||
// } |
|
||||||
// } |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Reliability Semantics |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// When a subscriber successfully creates a subscription using |
|
||||||
// Subscriber.CreateSubscription, it establishes a "subscription point" with |
|
||||||
// respect to that subscription - the subscriber is guaranteed to receive any |
|
||||||
// message published after this subscription point that matches the |
|
||||||
// subscription's query. Note that messages published before the Subscription |
|
||||||
// point may or may not be delivered. |
|
||||||
// |
|
||||||
// If the system truncates the subscription according to the specified |
|
||||||
// truncation policy, the system delivers a subscription status event with the |
|
||||||
// "truncated" field set to true. We refer to such events as "truncation |
|
||||||
// events". A truncation event: |
|
||||||
// |
|
||||||
// * Informs the subscriber that part of the subscription messages have been |
|
||||||
// discarded. The subscriber may want to recover from the message loss, e.g., |
|
||||||
// by resyncing its state with its backend. |
|
||||||
// * Establishes a new subscription point, i.e., the subscriber is guaranteed to |
|
||||||
// receive all changes published after the trunction event is received (or |
|
||||||
// until another truncation event is received). |
|
||||||
// |
|
||||||
// Note that messages are not delivered in any particular order by the pubsub |
|
||||||
// system. Furthermore, the system guarantees at-least-once delivery |
|
||||||
// of each message or truncation events until acked. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Deletion |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Both topics and subscriptions may be deleted. Deletion of a topic implies |
|
||||||
// deletion of all attached subscriptions. |
|
||||||
// |
|
||||||
// When a subscription is deleted directly by calling DeleteSubscription, all |
|
||||||
// messages are immediately dropped. If it is a pull subscriber, future pull |
|
||||||
// requests will return NOT_FOUND. |
|
||||||
// |
|
||||||
// When a topic is deleted all corresponding subscriptions are immediately |
|
||||||
// deleted, and subscribers experience the same behavior as directly deleting |
|
||||||
// the subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Publisher service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate topics, and to send |
|
||||||
// messages to a topic. |
|
||||||
service PublisherService { |
|
||||||
|
|
||||||
// Creates the given topic with the given name. |
|
||||||
rpc CreateTopic(Topic) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds a message to the topic. Returns NOT_FOUND if the topic does not |
|
||||||
// exist. |
|
||||||
// (-- For different error code values returned via Stubby, see |
|
||||||
// util/task/codes.proto. --) |
|
||||||
rpc Publish(PublishRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds one or more messages to the topic. Returns NOT_FOUND if the topic does |
|
||||||
// not exist. |
|
||||||
rpc PublishBatch(PublishBatchRequest) returns (PublishBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration of a topic. Since the topic only has the name |
|
||||||
// attribute, this method is only useful to check the existence of a topic. |
|
||||||
// If other attributes are added in the future, they will be returned here. |
|
||||||
rpc GetTopic(GetTopicRequest) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching topics. |
|
||||||
rpc ListTopics(ListTopicsRequest) returns (ListTopicsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes the topic with the given name. All subscriptions to this topic |
|
||||||
// are also deleted. Returns NOT_FOUND if the topic does not exist. |
|
||||||
// After a topic is deleted, a new topic may be created with the same name. |
|
||||||
rpc DeleteTopic(DeleteTopicRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A topic resource. |
|
||||||
message Topic { |
|
||||||
// Name of the topic. |
|
||||||
optional string name = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// A message data and its labels. |
|
||||||
message PubsubMessage { |
|
||||||
// The message payload. |
|
||||||
optional bytes data = 1; |
|
||||||
|
|
||||||
// Optional list of labels for this message. Keys in this collection must |
|
||||||
// be unique. |
|
||||||
//(-- TODO(eschapira): Define how key namespace may be scoped to the topic.--) |
|
||||||
repeated tech.label.Label label = 2; |
|
||||||
|
|
||||||
// ID of this message assigned by the server at publication time. Guaranteed |
|
||||||
// to be unique within the topic. This value may be read by a subscriber |
|
||||||
// that receives a PubsubMessage via a Pull call or a push delivery. It must |
|
||||||
// not be populated by a publisher in a Publish call. |
|
||||||
optional string message_id = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetTopic method. |
|
||||||
message GetTopicRequest { |
|
||||||
// The name of the topic to get. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Publish method. |
|
||||||
message PublishRequest { |
|
||||||
// The message in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The message to publish. |
|
||||||
optional PubsubMessage message = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PublishBatch method. |
|
||||||
message PublishBatchRequest { |
|
||||||
// The messages in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The messages to publish. |
|
||||||
repeated PubsubMessage messages = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PublishBatch method. |
|
||||||
message PublishBatchResponse { |
|
||||||
// The server-assigned ID of each published message, in the same order as |
|
||||||
// the messages in the request. IDs are guaranteed to be unique within |
|
||||||
// the topic. |
|
||||||
repeated string message_ids = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListTopics method. |
|
||||||
message ListTopicsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of topics to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 2; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListTopicsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 3; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListTopics method. |
|
||||||
message ListTopicsResponse { |
|
||||||
// The resulting topics. |
|
||||||
repeated Topic topic = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more topics that match the request, |
|
||||||
// and this value should be passed to the next <code>ListTopicsRequest</code> |
|
||||||
// to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Delete method. |
|
||||||
message DeleteTopicRequest { |
|
||||||
// Name of the topic to delete. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Subscriber service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate subscriptions and to |
|
||||||
// consume messages from a subscription via the pull method. |
|
||||||
service SubscriberService { |
|
||||||
|
|
||||||
// Creates a subscription on a given topic for a given subscriber. |
|
||||||
// If the subscription already exists, returns ALREADY_EXISTS. |
|
||||||
// If the corresponding topic doesn't exist, returns NOT_FOUND. |
|
||||||
// |
|
||||||
// If the name is not provided in the request, the server will assign a random |
|
||||||
// name for this subscription on the same project as the topic. |
|
||||||
rpc CreateSubscription(Subscription) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration details of a subscription. |
|
||||||
rpc GetSubscription(GetSubscriptionRequest) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching subscriptions. |
|
||||||
rpc ListSubscriptions(ListSubscriptionsRequest) |
|
||||||
returns (ListSubscriptionsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes an existing subscription. All pending messages in the subscription |
|
||||||
// are immediately dropped. Calls to Pull after deletion will return |
|
||||||
// NOT_FOUND. |
|
||||||
rpc DeleteSubscription(DeleteSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Removes all the pending messages in the subscription and releases the |
|
||||||
// storage associated with them. Results in a truncation event to be sent to |
|
||||||
// the subscriber. Messages added after this call returns are stored in the |
|
||||||
// subscription as before. |
|
||||||
rpc TruncateSubscription(TruncateSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Push subscriber calls. |
|
||||||
// |
|
||||||
|
|
||||||
// Modifies the <code>PushConfig</code> for a specified subscription. |
|
||||||
// This method can be used to suspend the flow of messages to an endpoint |
|
||||||
// by clearing the <code>PushConfig</code> field in the request. Messages |
|
||||||
// will be accumulated for delivery even if no push configuration is |
|
||||||
// defined or while the configuration is modified. |
|
||||||
rpc ModifyPushConfig(ModifyPushConfigRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Pull Subscriber calls |
|
||||||
// |
|
||||||
|
|
||||||
// Pulls a single message from the server. |
|
||||||
// If return_immediately is true, and no messages are available in the |
|
||||||
// subscription, this method returns FAILED_PRECONDITION. The system is free |
|
||||||
// to return an UNAVAILABLE error if no messages are available in a |
|
||||||
// reasonable amount of time (to reduce system load). |
|
||||||
rpc Pull(PullRequest) returns (PullResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Pulls messages from the server. Returns an empty list if there are no |
|
||||||
// messages available in the backlog. The system is free to return UNAVAILABLE |
|
||||||
// if there are too many pull requests outstanding for the given subscription. |
|
||||||
rpc PullBatch(PullBatchRequest) returns (PullBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Modifies the Ack deadline for a message received from a pull request. |
|
||||||
rpc ModifyAckDeadline(ModifyAckDeadlineRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Acknowledges a particular received message: the Pub/Sub system can remove |
|
||||||
// the given message from the subscription. Acknowledging a message whose |
|
||||||
// Ack deadline has expired may succeed, but the message could have been |
|
||||||
// already redelivered. Acknowledging a message more than once will not |
|
||||||
// result in an error. This is only used for messages received via pull. |
|
||||||
rpc Acknowledge(AcknowledgeRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Refuses processing a particular received message. The system will |
|
||||||
// redeliver this message to some consumer of the subscription at some |
|
||||||
// future time. This is only used for messages received via pull. |
|
||||||
rpc Nack(NackRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A subscription resource. |
|
||||||
message Subscription { |
|
||||||
// Name of the subscription. |
|
||||||
optional string name = 1; |
|
||||||
|
|
||||||
// The name of the topic from which this subscription is receiving messages. |
|
||||||
optional string topic = 2; |
|
||||||
|
|
||||||
// If <code>query</code> is non-empty, only messages on the subscriber's |
|
||||||
// topic whose labels match the query will be returned. Otherwise all |
|
||||||
// messages on the topic will be returned. |
|
||||||
// |
|
||||||
optional string query = 3; |
|
||||||
|
|
||||||
// The subscriber may specify requirements for truncating unacknowledged |
|
||||||
// subscription entries. The system will honor the |
|
||||||
// <code>CreateSubscription</code> request only if it can meet these |
|
||||||
// requirements. If this field is not specified, messages are never truncated |
|
||||||
// by the system. |
|
||||||
optional TruncationPolicy truncation_policy = 4; |
|
||||||
|
|
||||||
// Specifies which messages can be truncated by the system. |
|
||||||
message TruncationPolicy { |
|
||||||
oneof policy { |
|
||||||
// If <code>max_bytes</code> is specified, the system is allowed to drop |
|
||||||
// old messages to keep the combined size of stored messages under |
|
||||||
// <code>max_bytes</code>. This is a hint; the system may keep more than |
|
||||||
// this many bytes, but will make a best effort to keep the size from |
|
||||||
// growing much beyond this parameter. |
|
||||||
int64 max_bytes = 1; |
|
||||||
|
|
||||||
// If <code>max_age_seconds</code> is specified, the system is allowed to |
|
||||||
// drop messages that have been stored for at least this many seconds. |
|
||||||
// This is a hint; the system may keep these messages, but will make a |
|
||||||
// best effort to remove them when their maximum age is reached. |
|
||||||
int64 max_age_seconds = 2; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// If push delivery is used with this subscription, this field is |
|
||||||
// used to configure it. |
|
||||||
optional PushConfig push_config = 5; |
|
||||||
|
|
||||||
// For either push or pull delivery, the value is the maximum time after a |
|
||||||
// subscriber receives a message before the subscriber should acknowledge or |
|
||||||
// Nack the message. If the Ack deadline for a message passes without an |
|
||||||
// Ack or a Nack, the Pub/Sub system will eventually redeliver the message. |
|
||||||
// If a subscriber acknowledges after the deadline, the Pub/Sub system may |
|
||||||
// accept the Ack, but it is possible that the message has been already |
|
||||||
// delivered again. Multiple Acks to the message are allowed and will |
|
||||||
// succeed. |
|
||||||
// |
|
||||||
// For push delivery, this value is used to set the request timeout for |
|
||||||
// the call to the push endpoint. |
|
||||||
// |
|
||||||
// For pull delivery, this value is used as the initial value for the Ack |
|
||||||
// deadline. It may be overridden for a specific pull request (message) with |
|
||||||
// <code>ModifyAckDeadline</code>. |
|
||||||
// While a message is outstanding (i.e. it has been delivered to a pull |
|
||||||
// subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub |
|
||||||
// system will not deliver that message to another pull subscriber |
|
||||||
// (on a best-effort basis). |
|
||||||
optional int32 ack_deadline_seconds = 6; |
|
||||||
|
|
||||||
// If this parameter is set to n, the system is allowed to (but not required |
|
||||||
// to) delete the subscription when at least n seconds have elapsed since the |
|
||||||
// client presence was detected. (Presence is detected through any |
|
||||||
// interaction using the subscription ID, including Pull(), Get(), or |
|
||||||
// acknowledging a message.) |
|
||||||
// |
|
||||||
// If this parameter is not set, the subscription will stay live until |
|
||||||
// explicitly deleted. |
|
||||||
// |
|
||||||
// Clients can detect such garbage collection when a Get call or a Pull call |
|
||||||
// (for pull subscribers only) returns NOT_FOUND. |
|
||||||
optional int64 garbage_collect_seconds = 7; |
|
||||||
} |
|
||||||
|
|
||||||
// Configuration for a push delivery endpoint. |
|
||||||
message PushConfig { |
|
||||||
// A URL locating the endpoint to which messages should be pushed. |
|
||||||
// For example, a Webhook endpoint might use "https://example.com/push". |
|
||||||
// (-- An Android application might use "gcm:<REGID>", where <REGID> is a |
|
||||||
// GCM registration id allocated for pushing messages to the application. --) |
|
||||||
optional string push_endpoint = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// An event indicating a received message or truncation event. |
|
||||||
message PubsubEvent { |
|
||||||
// The subscription that received the event. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
oneof type { |
|
||||||
// A received message. |
|
||||||
PubsubMessage message = 2; |
|
||||||
|
|
||||||
// Indicates that this subscription has been truncated. |
|
||||||
bool truncated = 3; |
|
||||||
|
|
||||||
// Indicates that this subscription has been deleted. (Note that pull |
|
||||||
// subscribers will always receive NOT_FOUND in response in their pull |
|
||||||
// request on the subscription, rather than seeing this boolean.) |
|
||||||
bool deleted = 4; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetSubscription method. |
|
||||||
message GetSubscriptionRequest { |
|
||||||
// The name of the subscription to get. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// (-- Which labels are required or supported is implementation-specific. |
|
||||||
// TODO(eschapira): This method must support to query by topic. We must |
|
||||||
// define the key URI for the "topic" label. --) |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of subscriptions to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 3; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListSubscriptionsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 4; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsResponse { |
|
||||||
// The subscriptions that match the request. |
|
||||||
repeated Subscription subscription = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more subscriptions that match the |
|
||||||
// request and this value should be passed to the next |
|
||||||
// <code>ListSubscriptionsRequest</code> to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the TruncateSubscription method. |
|
||||||
message TruncateSubscriptionRequest { |
|
||||||
// The subscription that is being truncated. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the DeleteSubscription method. |
|
||||||
message DeleteSubscriptionRequest { |
|
||||||
// The subscription to delete. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyPushConfig method. |
|
||||||
message ModifyPushConfigRequest { |
|
||||||
// The name of the subscription. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// An empty <code>push_config</code> indicates that the Pub/Sub system should |
|
||||||
// pause pushing messages from the given subscription. |
|
||||||
optional PushConfig push_config = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The protos used by a pull subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Request for the Pull method. |
|
||||||
message PullRequest { |
|
||||||
// The subscription from which a message should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning FAILED_PRECONDITION. The client may cancel the request if |
|
||||||
// it does not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Either a <code>PubsubMessage</code> or a truncation event. One of these two |
|
||||||
// must be populated. |
|
||||||
message PullResponse { |
|
||||||
// This ID must be used to acknowledge the received event or message. |
|
||||||
optional string ack_id = 1; |
|
||||||
|
|
||||||
// A pubsub message or truncation event. |
|
||||||
optional PubsubEvent pubsub_event = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PullBatch method. |
|
||||||
message PullBatchRequest { |
|
||||||
// The subscription from which messages should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning no messages. The client may cancel the request if it does |
|
||||||
// not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
|
|
||||||
// The maximum number of PubsubEvents returned for this request. The Pub/Sub |
|
||||||
// system may return fewer than the number of events specified. |
|
||||||
optional int32 max_events = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PullBatch method. |
|
||||||
message PullBatchResponse { |
|
||||||
|
|
||||||
// Received Pub/Sub messages or status events. The Pub/Sub system will return |
|
||||||
// zero messages if there are no more messages available in the backlog. The |
|
||||||
// Pub/Sub system may return fewer than the max_events requested even if |
|
||||||
// there are more messages available in the backlog. |
|
||||||
repeated PullResponse pull_responses = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyAckDeadline method. |
|
||||||
message ModifyAckDeadlineRequest { |
|
||||||
// The name of the subscription from which messages are being pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID. |
|
||||||
optional string ack_id = 2; |
|
||||||
|
|
||||||
// The new Ack deadline. Must be >= 0. |
|
||||||
optional int32 ack_deadline_seconds = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Acknowledge method. |
|
||||||
message AcknowledgeRequest { |
|
||||||
// The subscription whose message is being acknowledged. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being acknowledged. This was |
|
||||||
// returned by the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Nack method. |
|
||||||
message NackRequest { |
|
||||||
// The subscription whose message is being Nacked. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being refused. This was returned by |
|
||||||
// the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The service and protos used by a push subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that a subscriber uses to handle messages sent via push |
|
||||||
// delivery. |
|
||||||
// This service is not currently exported for HTTP clients. |
|
||||||
// TODO(eschapira): Explain HTTP subscribers. |
|
||||||
service PushEndpointService { |
|
||||||
// Sends a <code>PubsubMessage</code> or a subscription status event to a |
|
||||||
// push endpoint. |
|
||||||
// The push endpoint responds with an empty message and a code from |
|
||||||
// util/task/codes.proto. The following codes have a particular meaning to the |
|
||||||
// Pub/Sub system: |
|
||||||
// OK - This is interpreted by Pub/Sub as Ack. |
|
||||||
// ABORTED - This is intepreted by Pub/Sub as a Nack, without implying |
|
||||||
// pushback for congestion control. The Pub/Sub system will |
|
||||||
// retry this message at a later time. |
|
||||||
// UNAVAILABLE - This is intepreted by Pub/Sub as a Nack, with the additional |
|
||||||
// semantics of push-back. The Pub/Sub system will use an AIMD |
|
||||||
// congestion control algorithm to backoff the rate of sending |
|
||||||
// messages from this subscription. |
|
||||||
// Any other code, or a failure to respond, will be interpreted in the same |
|
||||||
// way as ABORTED; i.e. the system will retry the message at a later time to |
|
||||||
// ensure reliable delivery. |
|
||||||
rpc HandlePubsubEvent(PubsubEvent) returns (proto2.Empty); |
|
||||||
} |
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue