You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by jf...@apache.org on 2016/09/20 17:32:25 UTC

thrift git commit: THRIFT-948: SSL socket support for PHP Client: php Patch: Mansi Nahar

Repository: thrift
Updated Branches:
  refs/heads/master 54f49f863 -> 311c98455


THRIFT-948: SSL socket support for PHP
Client: php
Patch: Mansi Nahar

Adds TSSLServerSocket and TSSLSocket to PHP


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/311c9845
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/311c9845
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/311c9845

Branch: refs/heads/master
Commit: 311c98455a9cb9070e9dad86a28f9c3ecbdf0a01
Parents: 54f49f8
Author: jfarrell <jf...@apache.org>
Authored: Tue Sep 20 13:30:16 2016 -0400
Committer: jfarrell <jf...@apache.org>
Committed: Tue Sep 20 13:30:16 2016 -0400

----------------------------------------------------------------------
 lib/php/lib/Thrift/Server/TSSLServerSocket.php |  94 ++++++++++++++++
 lib/php/lib/Thrift/Server/TServerSocket.php    |  28 ++++-
 lib/php/lib/Thrift/Transport/TSSLSocket.php    | 112 ++++++++++++++++++++
 lib/php/lib/Thrift/Transport/TSocket.php       |  14 +--
 4 files changed, 237 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/311c9845/lib/php/lib/Thrift/Server/TSSLServerSocket.php
----------------------------------------------------------------------
diff --git a/lib/php/lib/Thrift/Server/TSSLServerSocket.php b/lib/php/lib/Thrift/Server/TSSLServerSocket.php
new file mode 100644
index 0000000..dfc4704
--- /dev/null
+++ b/lib/php/lib/Thrift/Server/TSSLServerSocket.php
@@ -0,0 +1,94 @@
+<?php
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+namespace Thrift\Server;
+
+use Thrift\Transport\TSSLSocket;
+
+/**
+ * Socket implementation of a server agent.
+ *
+ * @package thrift.transport
+ */
+class TSSLServerSocket extends TServerSocket
+{
+  /**
+   * Remote port
+   *
+   * @var resource
+   */
+  protected $context_ = null;
+
+  /**
+   * ServerSocket constructor
+   *
+   * @param string $host        Host to listen on
+   * @param int $port           Port to listen on
+   * @param resource   $context      Stream context
+   * @return void
+   */
+  public function __construct($host = 'localhost', $port = 9090, $context = null)
+  {
+    $ssl_host = $this->getSSLHost($host);
+    parent::__construct($ssl_host, $port);
+    $this->context_ = $context;
+  }
+
+  public function getSSLHost($host)
+  {
+    $transport_protocol_loc = strpos($host, "://");
+    if ($transport_protocol_loc === false) {
+      $host = 'ssl://'.$host;
+    }
+    return $host;
+  }
+
+  /**
+   * Opens a new socket server handle
+   *
+   * @return void
+   */
+  public function listen()
+  {
+    $this->listener_ = @stream_socket_server(
+      $this->host_ . ':' . $this->port_,
+      $errno,
+      $errstr,
+      STREAM_SERVER_BIND|STREAM_SERVER_LISTEN,
+      $this->context_);
+  }
+
+  /**
+   * Implementation of accept. If not client is accepted in the given time
+   *
+   * @return TSocket
+   */
+  protected function acceptImpl()
+  {
+    $handle = @stream_socket_accept($this->listener_, $this->acceptTimeout_ / 1000.0);
+    if(!$handle) return null;
+
+    $socket = new TSSLSocket();
+    $socket->setHandle($handle);
+
+    return $socket;
+  }
+}

http://git-wip-us.apache.org/repos/asf/thrift/blob/311c9845/lib/php/lib/Thrift/Server/TServerSocket.php
----------------------------------------------------------------------
diff --git a/lib/php/lib/Thrift/Server/TServerSocket.php b/lib/php/lib/Thrift/Server/TServerSocket.php
index 4eff29c..da8e226 100644
--- a/lib/php/lib/Thrift/Server/TServerSocket.php
+++ b/lib/php/lib/Thrift/Server/TServerSocket.php
@@ -1,4 +1,24 @@
 <?php
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ * @package thrift.transport
+ */
 
 namespace Thrift\Server;
 
@@ -16,28 +36,28 @@ class TServerSocket extends TServerTransport
    *
    * @var resource
    */
-  private $listener_;
+  protected $listener_;
 
   /**
    * Port for the listener to listen on
    *
    * @var int
    */
-  private $port_;
+  protected $port_;
 
   /**
    * Timeout when listening for a new client
    *
    * @var int
    */
-  private $acceptTimeout_ = 30000;
+  protected $acceptTimeout_ = 30000;
 
   /**
    * Host to listen on
    *
    * @var string
    */
-  private $host_;
+  protected $host_;
 
   /**
    * ServerSocket constructor

http://git-wip-us.apache.org/repos/asf/thrift/blob/311c9845/lib/php/lib/Thrift/Transport/TSSLSocket.php
----------------------------------------------------------------------
diff --git a/lib/php/lib/Thrift/Transport/TSSLSocket.php b/lib/php/lib/Thrift/Transport/TSSLSocket.php
new file mode 100644
index 0000000..533b7bb
--- /dev/null
+++ b/lib/php/lib/Thrift/Transport/TSSLSocket.php
@@ -0,0 +1,112 @@
+<?php
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ * @package thrift.transport
+ */
+
+namespace Thrift\Transport;
+
+use Thrift\Exception\TException;
+use Thrift\Exception\TTransportException;
+use Thrift\Factory\TStringFuncFactory;
+
+/**
+ * Sockets implementation of the TTransport interface.
+ *
+ * @package thrift.transport
+ */
+class TSSLSocket extends TSocket
+{
+  /**
+   * Remote port
+   *
+   * @var resource
+   */
+  protected $context_ = null;
+
+  /**
+   * Socket constructor
+   *
+   * @param string     $host         Remote hostname
+   * @param int        $port         Remote port
+   * @param resource   $context      Stream context
+   * @param bool       $persist      Whether to use a persistent socket
+   * @param string     $debugHandler Function to call for error logging
+   */
+  public function __construct($host='localhost',
+                              $port=9090,
+                              $context=null,
+                              $debugHandler=null) {
+    $this->host_ = $this->getSSLHost($host);
+    $this->port_ = $port;
+    $this->context_ = $context;
+    $this->debugHandler_ = $debugHandler ? $debugHandler : 'error_log';
+  }
+
+  /**
+   * Creates a host name with SSL transport protocol
+   * if no transport protocol already specified in
+   * the host name.
+   *
+   * @param string $host    Host to listen on
+   * @return string $host   Host name with transport protocol
+   */
+  private function getSSLHost($host)
+  {
+    $transport_protocol_loc = strpos($host, "://");
+    if ($transport_protocol_loc === false) {
+      $host = 'ssl://'.$host;
+    }
+    return $host;
+  }
+
+  /**
+   * Connects the socket.
+   */
+  public function open()
+  {
+    if ($this->isOpen()) {
+      throw new TTransportException('Socket already connected', TTransportException::ALREADY_OPEN);
+    }
+
+    if (empty($this->host_)) {
+      throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN);
+    }
+
+    if ($this->port_ <= 0) {
+      throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN);
+    }
+
+    $this->handle_ = @stream_socket_client($this->host_.':'.$this->port_,
+                                          $errno,
+                                          $errstr,
+                                          $this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                                          STREAM_CLIENT_CONNECT,
+                                          $this->context_);
+
+    // Connect failed?
+    if ($this->handle_ === FALSE) {
+      $error = 'TSocket: Could not connect to '.$this->host_.':'.$this->port_.' ('.$errstr.' ['.$errno.'])';
+      if ($this->debug_) {
+        call_user_func($this->debugHandler_, $error);
+      }
+      throw new TException($error);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/thrift/blob/311c9845/lib/php/lib/Thrift/Transport/TSocket.php
----------------------------------------------------------------------
diff --git a/lib/php/lib/Thrift/Transport/TSocket.php b/lib/php/lib/Thrift/Transport/TSocket.php
index 96935d4..10d5115 100644
--- a/lib/php/lib/Thrift/Transport/TSocket.php
+++ b/lib/php/lib/Thrift/Transport/TSocket.php
@@ -38,7 +38,7 @@ class TSocket extends TTransport
    *
    * @var resource
    */
-  private $handle_ = null;
+  protected $handle_ = null;
 
   /**
    * Remote hostname
@@ -61,7 +61,7 @@ class TSocket extends TTransport
    *
    * @var int
    */
-  private $sendTimeoutSec_ = 0;
+  protected $sendTimeoutSec_ = 0;
 
   /**
    * Send timeout in microseconds.
@@ -70,7 +70,7 @@ class TSocket extends TTransport
    *
    * @var int
    */
-  private $sendTimeoutUsec_ = 100000;
+  protected $sendTimeoutUsec_ = 100000;
 
   /**
    * Recv timeout in seconds
@@ -79,7 +79,7 @@ class TSocket extends TTransport
    *
    * @var int
    */
-  private $recvTimeoutSec_ = 0;
+  protected $recvTimeoutSec_ = 0;
 
   /**
    * Recv timeout in microseconds
@@ -88,7 +88,7 @@ class TSocket extends TTransport
    *
    * @var int
    */
-  private $recvTimeoutUsec_ = 750000;
+  protected $recvTimeoutUsec_ = 750000;
 
   /**
    * Persistent socket or plain?
@@ -270,7 +270,7 @@ class TSocket extends TTransport
     $readable = @stream_select($read, $null, $null, $this->recvTimeoutSec_, $this->recvTimeoutUsec_);
 
     if ($readable > 0) {
-      $data = @stream_socket_recvfrom($this->handle_, $len);
+      $data = fread($this->handle_, $len);
       if ($data === false) {
           throw new TTransportException('TSocket: Could not read '.$len.' bytes from '.
                                $this->host_.':'.$this->port_);
@@ -304,7 +304,7 @@ class TSocket extends TTransport
       $writable = @stream_select($null, $write, $null, $this->sendTimeoutSec_, $this->sendTimeoutUsec_);
       if ($writable > 0) {
         // write buffer to stream
-        $written = @stream_socket_sendto($this->handle_, $buf);
+        $written = fwrite($this->handle_, $buf);
         if ($written === -1 || $written === false) {
           throw new TTransportException('TSocket: Could not write '.TStringFuncFactory::create()->strlen($buf).' bytes '.
                                    $this->host_.':'.$this->port_);