From 9a9a0ae56f5ae65144e6da5014859b1e30044f8b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Sep 2009 21:50:19 -0400 Subject: add cURL client with HEAD method --- lib/curlclient.php | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 lib/curlclient.php (limited to 'lib/curlclient.php') diff --git a/lib/curlclient.php b/lib/curlclient.php new file mode 100644 index 000000000..e027102e3 --- /dev/null +++ b/lib/curlclient.php @@ -0,0 +1,134 @@ +n. + * + * @category HTTP + * @package Laconica + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +define(CURLCLIENT_VERSION, "0.1"); + +/** + * Wrapper for Curl + * + * Makes Curl HTTP client calls within our HTTPClient framework + * + * @category HTTP + * @package Laconica + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class CurlClient extends HTTPClient +{ + function __construct() + { + } + + function head($url, $headers=null) + { + $ch = curl_init($url); + + $this->setup($ch); + + curl_setopt_array($ch, + array(CURLOPT_NOBODY => true)); + + $result = curl_exec($ch); + + return $this->parseResults($result); + } + + function setup($ch) + { + curl_setopt_array($ch, + array(CURLOPT_USERAGENT, $this->userAgent(), + CURLOPT_HEADER => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => $headers)); + } + + function userAgent() + { + $version = curl_version(); + return parent::userAgent() . " CurlClient/".CURLCLIENT_VERSION . " cURL/" . $version['version']; + } + + function parseResults($results) + { + $resp = new HTTPResponse(); + + $lines = explode("\r\n", $results); + + if (preg_match("#^HTTP/1.[01] (\d\d\d) .+$#", $lines[0], $match)) { + $resp->code = $match[1]; + } else { + throw Exception("Bad format: initial line is not HTTP status line"); + } + + $lastk = null; + + for ($i = 1; $i < count($lines); $i++) { + $l =& $lines[$i]; + if (mb_strlen($l) == 0) { + $resp->body = implode("\r\n", array_slice($lines, $i + 1)); + break; + } + if (preg_match("#^(\S+):\s+(.*)$#", $l, $match)) { + $k = $match[1]; + $v = $match[2]; + + if (array_key_exists($k, $resp->headers)) { + if (is_array($resp->headers[$k])) { + $resp->headers[$k][] = $v; + } else { + $resp->headers[$k] = array($resp->headers[$k], $v); + } + } else { + $resp->headers[$k] = $v; + } + $lastk = $k; + } else if (preg_match("#^\s+(.*)$#", $l, $match)) { + // continuation line + if (is_null($lastk)) { + throw Exception("Bad format: initial whitespace in headers"); + } + $h =& $resp->headers[$lastk]; + if (is_array($h)) { + $n = count($h); + $h[$n-1] .= $match[1]; + } else { + $h .= $match[1]; + } + } + } + + return $resp; + } +} -- cgit v1.2.3-54-g00ecf From 6b7f09eba675679d5ea84ed33e85fa9d5c62a30d Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Sep 2009 21:55:36 -0400 Subject: add get to curl client --- lib/curlclient.php | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'lib/curlclient.php') diff --git a/lib/curlclient.php b/lib/curlclient.php index e027102e3..f45c3c2f4 100644 --- a/lib/curlclient.php +++ b/lib/curlclient.php @@ -60,8 +60,31 @@ class CurlClient extends HTTPClient curl_setopt_array($ch, array(CURLOPT_NOBODY => true)); + if (!is_null($headers)) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + + $result = curl_exec($ch); + + curl_close($ch); + + return $this->parseResults($result); + } + + function get($url, $headers=null) + { + $ch = curl_init($url); + + $this->setup($ch); + + if (!is_null($headers)) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + $result = curl_exec($ch); + curl_close($ch); + return $this->parseResults($result); } @@ -70,8 +93,7 @@ class CurlClient extends HTTPClient curl_setopt_array($ch, array(CURLOPT_USERAGENT, $this->userAgent(), CURLOPT_HEADER => true, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_HTTPHEADER => $headers)); + CURLOPT_RETURNTRANSFER => true)); } function userAgent() -- cgit v1.2.3-54-g00ecf From f8a8c14b550a3ac3a4b3a17c53559056f70409b2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Sep 2009 22:05:57 -0400 Subject: fix user-agent for curlclient --- lib/curlclient.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/curlclient.php') diff --git a/lib/curlclient.php b/lib/curlclient.php index f45c3c2f4..99c3b6aa4 100644 --- a/lib/curlclient.php +++ b/lib/curlclient.php @@ -88,10 +88,14 @@ class CurlClient extends HTTPClient return $this->parseResults($result); } + function post($url, $headers=null) + { + } + function setup($ch) { curl_setopt_array($ch, - array(CURLOPT_USERAGENT, $this->userAgent(), + array(CURLOPT_USERAGENT => $this->userAgent(), CURLOPT_HEADER => true, CURLOPT_RETURNTRANSFER => true)); } -- cgit v1.2.3-54-g00ecf From 2f97531a49c042a0a900edb31f067a3c9f32967f Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Sep 2009 22:14:15 -0400 Subject: add post to curlclient --- lib/curlclient.php | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'lib/curlclient.php') diff --git a/lib/curlclient.php b/lib/curlclient.php index 99c3b6aa4..c43bfb57f 100644 --- a/lib/curlclient.php +++ b/lib/curlclient.php @@ -88,8 +88,27 @@ class CurlClient extends HTTPClient return $this->parseResults($result); } - function post($url, $headers=null) + function post($url, $headers=null, $body=null) { + $ch = curl_init($url); + + $this->setup($ch); + + curl_setopt($ch, CURLOPT_POST, true); + + if (!is_null($body)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + } + + if (!is_null($headers)) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + + $result = curl_exec($ch); + + curl_close($ch); + + return $this->parseResults($result); } function setup($ch) -- cgit v1.2.3-54-g00ecf From 15a2b69777479f1544a681ed1bff76aa066cf95c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Sep 2009 22:31:52 -0400 Subject: statusize new HTTP classes --- lib/curlclient.php | 10 +++++----- lib/httpclient.php | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) (limited to 'lib/curlclient.php') diff --git a/lib/curlclient.php b/lib/curlclient.php index c43bfb57f..36fc7d157 100644 --- a/lib/curlclient.php +++ b/lib/curlclient.php @@ -1,6 +1,6 @@ n. * * @category HTTP - * @package Laconica + * @package StatusNet * @author Evan Prodromou * @copyright 2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ if (!defined('STATUSNET')) { @@ -39,10 +39,10 @@ define(CURLCLIENT_VERSION, "0.1"); * Makes Curl HTTP client calls within our HTTPClient framework * * @category HTTP - * @package Laconica + * @package StatusNet * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ class CurlClient extends HTTPClient diff --git a/lib/httpclient.php b/lib/httpclient.php index 005971153..c8c8ae5b2 100644 --- a/lib/httpclient.php +++ b/lib/httpclient.php @@ -1,6 +1,6 @@ . * * @category Action - * @package Laconica + * @package StatusNet * @author Evan Prodromou - * @copyright 2009 Control Yourself, Inc. + * @copyright 2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ if (!defined('STATUSNET')) { @@ -39,10 +39,10 @@ if (!defined('STATUSNET')) { * library (curl or PHP-HTTP or whatever) that's used. * * @category HTTP - * @package Laconica + * @package StatusNet * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ class HTTPResponse @@ -60,10 +60,10 @@ class HTTPResponse * library (curl or PHP-HTTP or whatever) that's used. * * @category HTTP - * @package Laconica + * @package StatusNet * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ class HTTPClient -- cgit v1.2.3-54-g00ecf