浏览代码

Add mechanism for reading request metadata from the server "session" object.

Tim Burks 9 年之前
父节点
当前提交
ad46789797

+ 17 - 14
Examples/Echo/Swift/Generated/echo.server.pb.swift

@@ -58,22 +58,27 @@ public protocol Echo_EchoProvider {
 
 /// Common properties available in each service session.
 public class Echo_EchoSession {
-  var statusCode : Int = 0
-  var statusMessage : String = "OK"
-  var initialMetadata : Metadata = Metadata()
-  var trailingMetadata : Metadata = Metadata()
-  var receivedMetadata : Metadata = Metadata()
+  fileprivate var handler : gRPC.Handler
+  public var requestMetadata : Metadata { return handler.requestMetadata }
+
+  public var statusCode : Int = 0
+  public var statusMessage : String = "OK"
+  public var initialMetadata : Metadata = Metadata()
+  public var trailingMetadata : Metadata = Metadata()
+
+  fileprivate init(handler:gRPC.Handler) {
+    self.handler = handler
+  }
 }
 
 // Get (Unary)
 public class Echo_EchoGetSession : Echo_EchoSession {
-  private var handler : gRPC.Handler
   private var provider : Echo_EchoProvider
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Run the session. Internal.
@@ -93,13 +98,12 @@ public class Echo_EchoGetSession : Echo_EchoSession {
 
 // Expand (Server Streaming)
 public class Echo_EchoExpandSession : Echo_EchoSession {
-  private var handler : gRPC.Handler
   private var provider : Echo_EchoProvider
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Send a message. Nonblocking.
@@ -136,13 +140,12 @@ public class Echo_EchoExpandSession : Echo_EchoSession {
 
 // Collect (Client Streaming)
 public class Echo_EchoCollectSession : Echo_EchoSession {
-  private var handler : gRPC.Handler
   private var provider : Echo_EchoProvider
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Receive a message. Blocks until a message is received or the client closes the connection.
@@ -190,13 +193,12 @@ public class Echo_EchoCollectSession : Echo_EchoSession {
 
 // Update (Bidirectional Streaming)
 public class Echo_EchoUpdateSession : Echo_EchoSession {
-  private var handler : gRPC.Handler
   private var provider : Echo_EchoProvider
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Receive a message. Blocks until a message is received or the client closes the connection.
@@ -300,7 +302,8 @@ public class Echo_EchoServer {
     server.run {(handler) in
       print("Server received request to " + handler.host
         + " calling " + handler.method
-        + " from " + handler.caller)
+        + " from " + handler.caller
+        + " with " + String(describing:handler.requestMetadata) )
 
       do {
         switch handler.method {

+ 1 - 2
Plugin/swiftgrpc.templates/server-session-bidistreaming.swift

@@ -1,12 +1,11 @@
 // {{ method.name }} (Bidirectional Streaming)
 public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var handler : gRPC.Handler
   private var provider : {{ .|provider:protoFile,service }}
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Receive a message. Blocks until a message is received or the client closes the connection.

+ 1 - 2
Plugin/swiftgrpc.templates/server-session-clientstreaming.swift

@@ -1,12 +1,11 @@
 // {{ method.name }} (Client Streaming)
 public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var handler : gRPC.Handler
   private var provider : {{ .|provider:protoFile,service }}
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Receive a message. Blocks until a message is received or the client closes the connection.

+ 1 - 2
Plugin/swiftgrpc.templates/server-session-serverstreaming.swift

@@ -1,12 +1,11 @@
 // {{ method.name }} (Server Streaming)
 public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var handler : gRPC.Handler
   private var provider : {{ .|provider:protoFile,service }}
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Send a message. Nonblocking.

+ 1 - 2
Plugin/swiftgrpc.templates/server-session-unary.swift

@@ -1,12 +1,11 @@
 // {{ method.name }} (Unary)
 public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var handler : gRPC.Handler
   private var provider : {{ .|provider:protoFile,service }}
 
   /// Create a session.
   fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
-    self.handler = handler
     self.provider = provider
+    super.init(handler:handler)
   }
 
   /// Run the session. Internal.

+ 13 - 6
Plugin/swiftgrpc.templates/server.pb.swift

@@ -69,11 +69,17 @@ public protocol {{ .|provider:protoFile,service }} {
 
 /// Common properties available in each service session.
 public class {{ .|service:protoFile,service }}Session {
-  var statusCode : Int = 0
-  var statusMessage : String = "OK"
-  var initialMetadata : Metadata = Metadata()
-  var trailingMetadata : Metadata = Metadata()
-  var receivedMetadata : Metadata = Metadata()
+  fileprivate var handler : gRPC.Handler
+  public var requestMetadata : Metadata { return handler.requestMetadata }
+
+  public var statusCode : Int = 0
+  public var statusMessage : String = "OK"
+  public var initialMetadata : Metadata = Metadata()
+  public var trailingMetadata : Metadata = Metadata()
+
+  fileprivate init(handler:gRPC.Handler) {
+    self.handler = handler
+  }
 }
 
 //-{% for method in service.method %}
@@ -131,7 +137,8 @@ public class {{ .|server:protoFile,service }} {
     server.run {(handler) in
       print("Server received request to " + handler.host
         + " calling " + handler.method
-        + " from " + handler.caller)
+        + " from " + handler.caller
+        + " with " + String(describing:handler.requestMetadata) )
 
       do {
         switch handler.method {

+ 1 - 1
Sources/gRPC/Call.swift

@@ -328,7 +328,7 @@ public class Call {
       if operationGroup.success {
         if let initialMetadata = operationGroup.receivedInitialMetadata() {
           for j in 0..<initialMetadata.count() {
-            print("Received initial metadata -> " + initialMetadata.key(index:j) + " : " + initialMetadata.value(index:j))
+            print("Received initial metadata -> " + initialMetadata.key(j) + " : " + initialMetadata.value(j))
           }
         }
       }

+ 13 - 3
Sources/gRPC/Metadata.swift

@@ -46,7 +46,7 @@ private struct MetadataPair {
 }
 
 /// Metadata sent with gRPC messages
-public class Metadata {
+public class Metadata : CustomStringConvertible {
 
   /// Pointer to underlying C representation
   var underlyingArray: UnsafeMutableRawPointer
@@ -87,12 +87,12 @@ public class Metadata {
     return cgrpc_metadata_array_get_count(underlyingArray);
   }
 
-  public func key(index: Int) -> (String) {
+  public func key(_ index: Int) -> (String) {
     return String(cString:cgrpc_metadata_array_get_key_at_index(underlyingArray, index),
                   encoding:String.Encoding.utf8)!;
   }
 
-  public func value(index: Int) -> (String) {
+  public func value(_ index: Int) -> (String) {
     return String(cString:cgrpc_metadata_array_get_value_at_index(underlyingArray, index),
                   encoding:String.Encoding.utf8)!;
   }
@@ -100,4 +100,14 @@ public class Metadata {
   public func add(key:String, value:String) {
     cgrpc_metadata_array_append_metadata(underlyingArray, key, value)
   }
+
+  public var description : String {
+    var result = ""
+    for i in 0..<count() {
+      let key = self.key(i)
+      let value = self.value(i)
+      result += key + ":" + value + "\n"
+    }
+    return result
+  }
 }