Client.php 4.55 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?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 $
	*/

	require_once('PEAR.php');
	require_once('Net/EPP/Protocol.php');

	$GLOBALS['Net_EPP_Client_Version'] = '0.0.4';

	/**
	* 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
		* a PEAR_Error object explaining the error will be returned instead.
		* @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
		* @return PEAR_Error|string a PEAR_Error on failure, or a string containing the server <greeting>
		*/
		function connect($host, $port=700, $timeout=1, $ssl=true, $context=NULL) {
			$target = sprintf('%s://%s:%d', ($ssl === true ? 'tls' : 'tcp'), $host, $port);
			if (is_resource($context)) {
				$result = stream_socket_client($target, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context);

			} else {
				$result = stream_socket_client($target, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT);
			}
			if (!$result) {
				return new PEAR_Error("Error connecting to $target: $errstr (code $errno)");

67
68
69
70
			}

			// Set our socket
			$this->socket = $result;
71

72
73
74
75
76
77
78
			// Set stream timeout
			if (!stream_set_timeout($this->socket,$timeout)) {
				return new PEAR_Error("Failed to set timeout on socket: $errstr (code $errno)");
			}
			// Set blocking
			if (!stream_set_blocking($this->socket,0)) {
				return new PEAR_Error("Failed to set blocking on socket: $errstr (code $errno)");
79
80
			}

81
			return $this->getFrame();
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
		}

		/**
		* 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,
		* this method will return a PEAR_Error object, otherwise it will return a string
		* containing the XML from the server
		* @return PEAR_Error|string a PEAR_Error on failure, or a string containing the frame
		*/
		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
		* @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
		* @return PEAR_Error|string the frame returned by the server, or an error object
		*/
		function request($xml) {
112
113
114
			if (PEAR::isError($res = $this->sendFrame($xml))) {
				return $res;
			}
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
			return $this->getFrame();
		}

		/**
		* 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);
		}

	}

?>