Client.php 4.69 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
<?php

	/*	EPP Client class for PHP, Copyright 2005 CentralNic Ltd
		This program is free software; you can redistribute it and/or modify
		it under the terms of the GNU General Public License as published by
		the Free Software Foundation; either version 2 of the License, or
		(at your option) any later version.

		This program is distributed in the hope that it will be useful,
		but WITHOUT ANY WARRANTY; without even the implied warranty of
		MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
		GNU General Public License for more details.

		You should have received a copy of the GNU General Public License
		along with this program; if not, write to the Free Software
		Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
	*/

	/**
	* A simple client class for the Extensible Provisioning Protocol (EPP)
	* @package Net_EPP
	* @version 0.0.4
	* @author Gavin Brown <gavin.brown@nospam.centralnic.com>
	* @revision $Id: Client.php,v 1.13 2010/10/21 11:55:07 gavin Exp $
	*/

27
	require_once('Protocol.php');
28

29
	$GLOBALS['Net_EPP_Client_Version'] = '0.0.5';
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

	/**
	* A simple client class for the Extensible Provisioning Protocol (EPP)
	* @package Net_EPP
	*/
	class Net_EPP_Client {

		/**
		* @var resource the socket resource, once connected
		*/
		var $socket;

		/**
		* Establishes a connect to the server
		* This method establishes the connection to the server. If the connection was
		* established, then this method will call getFrame() and return the EPP <greeting>
		* frame which is sent by the server upon connection. If connection fails, then
47 48
		* an exception with a message explaining the error will be thrown and handled 
		* in the calling code.
49 50 51 52 53
		* @param string $host the hostname
		* @param integer $port the TCP port
		* @param integer $timeout the timeout in seconds
		* @param boolean $ssl whether to connect using SSL
		* @param resource $context a stream resource to use when setting up the socket connection
54 55
		* @throws Exception on connection errors
		* @return a string containing the server <greeting>
56 57
		*/
		function connect($host, $port=700, $timeout=1, $ssl=true, $context=NULL) {
58
			debug_log("start connecting");
59
			$target = sprintf('%s://%s:%d', ($ssl === true ? 'tls' : 'tcp'), $host, $port);
60 61 62 63
			
			if (is_resource($context)) {
				$result = stream_socket_client($target, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context);

64
			} else {
65
				$result = stream_socket_client($target, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT);
66
			}
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
			if ($result === False) {
				throw new Exception("Error connecting to $target: $errstr (code $errno)");

			}

			// Set our socket
			$this->socket = $result;
			debug_log("connected");

			// Set stream timeout
			if (!stream_set_timeout($this->socket,$timeout)) {
				throw new Exception("Failed to set timeout on socket: $errstr (code $errno)");
			}
			// Set blocking
			if (!stream_set_blocking($this->socket,0)) {
				throw new Exception("Failed to set blocking on socket: $errstr (code $errno)");
			}
			debug_log("trying to get frame from server");
			return $this->getFrame();
86 87 88 89 90 91
		}

		/**
		* Get an EPP frame from the server.
		* This retrieves a frame from the server. Since the connection is blocking, this
		* method will wait until one becomes available. If the connection has been broken,
92 93 94
		* this method will return a string containing the XML from the server
		* @throws Exception on frame errors
		* @return a string containing the frame
95 96 97 98 99 100 101 102 103
		*/
		function getFrame() {
			return Net_EPP_Protocol::getFrame($this->socket);
		}

		/**
		* Send an XML frame to the server.
		* This method sends an EPP frame to the server.
		* @param string the XML data to send
104
		* @throws Exception when it doesn't complete the write to the socket
105 106 107 108 109 110 111 112 113
		* @return boolean the result of the fwrite() operation
		*/
		function sendFrame($xml) {
			return Net_EPP_Protocol::sendFrame($this->socket, $xml);
		}

		/**
		* a wrapper around sendFrame() and getFrame()
		* @param string $xml the frame to send to the server
114 115
		* @throws Exception when it doesn't complete the write to the socket
		* @return string the frame returned by the server, or an error object
116 117
		*/
		function request($xml) {
118
			$res = $this->sendFrame($xml);
119
			return $this->getFrame();
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
		}

		/**
		* Close the connection.
		* This method closes the connection to the server. Note that the
		* EPP specification indicates that clients should send a <logout>
		* command before ending the session.
		* @return boolean the result of the fclose() operation
		*/
		function disconnect() {
			return @fclose($this->socket);
		}

		/**
		* ping the connection to check that it's up
		* @return boolean
		*/
		function ping() {
			return (!is_resource($this->socket) || feof($this->socket) ? false : true);
		}

	}

?>