Bläddra i källkod

Add TLS checkbox to Echo example

Tim Burks 9 år sedan
förälder
incheckning
901b19b3e6

+ 12 - 0
Examples/Echo/Swift/Echo/Base.lproj/MainMenu.xib

@@ -154,12 +154,24 @@
                             <action selector="buttonValueChangedWithSender:" target="8aG-cq-jvr" id="hJq-8b-Uoe"/>
                         </connections>
                     </button>
+                    <button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1Ls-ri-Jup">
+                        <rect key="frame" x="170" y="21" width="46" height="18"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                        <buttonCell key="cell" type="check" title="TLS" bezelStyle="regularSquare" imagePosition="left" inset="2" id="2hc-58-S2L">
+                            <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                            <font key="font" metaFont="system"/>
+                        </buttonCell>
+                        <connections>
+                            <action selector="buttonValueChangedWithSender:" target="8aG-cq-jvr" id="Y0Q-PO-XLx"/>
+                        </connections>
+                    </button>
                 </subviews>
             </view>
             <point key="canvasLocation" x="139" y="-275.5"/>
         </window>
         <viewController id="8aG-cq-jvr" customClass="EchoViewController" customModule="Echo" customModuleProvider="target">
             <connections>
+                <outlet property="TLSButton" destination="1Ls-ri-Jup" id="jan-Vv-OVl"/>
                 <outlet property="addressField" destination="jnU-RF-9F0" id="8vy-f1-cgl"/>
                 <outlet property="messageField" destination="DcE-8I-pH3" id="G2X-oh-frG"/>
                 <outlet property="outputField" destination="EyU-Iq-sai" id="9O7-AA-RS0"/>

+ 13 - 7
Examples/Echo/Swift/Echo/EchoViewController.swift

@@ -39,6 +39,7 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
   @IBOutlet weak var outputField: NSTextField!
   @IBOutlet weak var addressField: NSTextField!
   @IBOutlet weak var streamingButton: NSButton!
+  @IBOutlet weak var TLSButton: NSButton!
 
   private var streaming = false
   var client: Client!
@@ -80,6 +81,16 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
     }
   }
 
+  func createClient(address: String, host: String) {
+    if (TLSButton.intValue == 0) {
+      client = Client(address:address)
+    } else {
+      let certificateURL = Bundle.main.url(forResource: "ssl", withExtension: "crt")!
+      let certificates = try! String(contentsOf: certificateURL)
+      client = Client(address:address, certificates:certificates, host:host)
+    }
+  }
+
   func callServer(address:String) {
     let requestHost = "example.com"
     let requestMetadata = Metadata(["x-goog-api-key":"YOUR_API_KEY",
@@ -90,14 +101,10 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
       if let requestMessage = self.fileDescriptorSet.createMessage("EchoRequest") {
         requestMessage.addField("text", value:self.messageField.stringValue)
         let requestMessageData = requestMessage.data()
-
-        let certificateURL = Bundle.main.url(forResource: "ssl", withExtension: "crt")!
-        let certificates = try! String(contentsOf: certificateURL)
-        client = Client(address:address, certificates:certificates)
+        createClient(address:address, host:requestHost)
         call = client.createCall(host: requestHost,
                                  method: "/echo.Echo/Get",
                                  timeout: 30.0)
-
         call.performNonStreamingCall(messageData: requestMessageData,
                                      metadata: requestMetadata)
         { (response) in
@@ -122,11 +129,10 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
     else {
       // STREAMING
       if (!streaming) {
-        client = Client(address:address)
+        createClient(address:address, host:requestHost)
         call = client.createCall(host: requestHost,
                                  method: "/echo.Echo/Update",
                                  timeout: 30.0)
-
         call.start(metadata:requestMetadata)
         self.receiveMessage()
         streaming = true

+ 3 - 1
Packages/CgRPC/Sources/cgrpc.h

@@ -128,7 +128,9 @@ const char *grpc_version_string();
 
 // client support
 cgrpc_client *cgrpc_client_create(const char *address);
-cgrpc_client *cgrpc_client_create_secure(const char *address, const char *pem_root_certs);
+cgrpc_client *cgrpc_client_create_secure(const char *address,
+                                         const char *pem_root_certs,
+                                         const char *host);
 
 void cgrpc_client_destroy(cgrpc_client *client);
 cgrpc_call *cgrpc_client_create_call(cgrpc_client *client,

+ 4 - 2
Packages/CgRPC/Sources/client.c

@@ -49,7 +49,9 @@ cgrpc_client *cgrpc_client_create(const char *address) {
   return c;
 }
 
-cgrpc_client *cgrpc_client_create_secure(const char *address, const char *pem_root_certs) {
+cgrpc_client *cgrpc_client_create_secure(const char *address,
+                                         const char *pem_root_certs,
+                                         const char *host) {
   cgrpc_client *c = (cgrpc_client *) malloc(sizeof (cgrpc_client));
   // create the client
 
@@ -66,7 +68,7 @@ cgrpc_client *cgrpc_client_create_secure(const char *address, const char *pem_ro
   arg = &channelArgs->args[1];
   arg->type = GRPC_ARG_STRING;
   arg->key = gpr_strdup("grpc.ssl_target_name_override");
-  arg->value.string = gpr_strdup("example.com");
+  arg->value.string = gpr_strdup(host);
 
   grpc_channel_credentials *creds = grpc_ssl_credentials_create(pem_root_certs, NULL, NULL);
   c->client = grpc_secure_channel_create(creds, address, channelArgs, NULL);

+ 3 - 3
Packages/gRPC/Sources/Client.swift

@@ -56,15 +56,15 @@ public class Client {
   /// Initializes a gRPC client
   ///
   /// - Parameter address: the address of the server to be called
-  public init(address: String, certificates: String?) {
+  public init(address: String, certificates: String?, host: String?) {
     if certificates == nil {
       let bundle = Bundle(for: Client.self)
       let url = bundle.url(forResource: "roots", withExtension: "pem")!
       let data = try! Data(contentsOf: url)
       let s = String(data: data, encoding: .ascii)
-      c = cgrpc_client_create_secure(address, s)
+      c = cgrpc_client_create_secure(address, s, host)
     } else {
-      c = cgrpc_client_create_secure(address, certificates)
+      c = cgrpc_client_create_secure(address, certificates, host)
     }
     completionQueue = CompletionQueue(cq:cgrpc_client_completion_queue(c))
     completionQueue.name = "Client" // only for debugging