+++ /dev/null
-HTTP
-Michael Wallner, Sara Golemon, Daniel Stenberg (libcurl)
-
+++ /dev/null
-Known Issues
-============
-$Id$
-
-HttpResponse class is only available for PHP >= 5.1
-
-Not all places where files are handled check for open_basedir and/or safe_mode.
-
-
-Internals:
- - the request bodies created in http_request_pool_attach() are not
- destroyed in http_request_pool_detach(); may be a memory problem
- in long running scripts
+++ /dev/null
-phpincludedir=$(prefix)/include/php
-
-install-http-headers:
- @echo "Installing HTTP headers: $(INSTALL_ROOT)$(phpincludedir)/ext/http/"
- @$(mkinstalldirs) $(INSTALL_ROOT)$(phpincludedir)/ext/http
- @for f in $(HTTP_HEADER_FILES); do \
- if test -f "$(top_srcdir)/$$f"; then \
- $(INSTALL_DATA) $(top_srcdir)/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/http; \
- elif test -f "$(top_builddir)/$$f"; then \
- $(INSTALL_DATA) $(top_builddir)/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/http; \
- elif test -f "$(top_srcdir)/ext/http/$$f"; then \
- $(INSTALL_DATA) $(top_srcdir)/ext/http/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/http; \
- elif test -f "$(top_builddir)/ext/http/$$f"; then \
- $(INSTALL_DATA) $(top_builddir)/ext/http/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/http; \
- else \
- echo "WTF? $f $$f"; \
- fi \
- done;
-
-# mini hack
-install: $(all_targets) $(install_targets) install-http-headers
-
+++ /dev/null
-dnl config.m4 for pecl/http
-dnl $Id$
-
-PHP_ARG_ENABLE([http], [whether to enable extended HTTP support],
-[ --enable-http Enable extended HTTP support])
-PHP_ARG_WITH([http-curl-requests], [whether to enable cURL HTTP requests],
-[ --with-http-curl-requests[=CURLDIR]
- With cURL HTTP request support])
-PHP_ARG_WITH([http-mhash-etags], [whether to enable mhash ETag generator],
-[ --with-http-mhash-etags[=MHASHDIR]
- With mhash ETag generator support])
-PHP_ARG_WITH([http-magic-mime], [whether to enable response content type guessing],
-[ --with-http-magic-mime[=MAGICDIR]
- With magic mime response content type guessing])
-
-if test "$PHP_HTTP" != "no"; then
-
-dnl -------
-dnl NETDB.H
-dnl -------
- AC_MSG_CHECKING(for netdb.h)
- if test -r /usr/include/netdb.h -o -r /usr/local/include/netdb.h; then
- AC_DEFINE(HAVE_NETDB_H, 1, [Have netdb.h])
- AC_MSG_RESULT(found in default path)
- else
- AC_MSG_RESULT(not found in default path)
- fi
-
-dnl ----
-dnl CURL
-dnl ----
- if test "$PHP_HTTP_CURL_REQUESTS" != "no"; then
-
- AC_MSG_CHECKING([for curl/curl.h])
- CURL_DIR=
- for i in "$PHP_HTTP_CURL_REQUESTS" /usr/local /usr /opt; do
- if test -r "$i/include/curl/curl.h"; then
- CURL_DIR=$i
- break
- fi
- done
- if test -z "$CURL_DIR"; then
- AC_MSG_RESULT([not found])
- AC_MSG_ERROR([could not find curl/curl.h])
- else
- AC_MSG_RESULT([found in $CURL_DIR])
- fi
-
- AC_MSG_CHECKING([for curl-config])
- CURL_CONFIG=
- for i in "$CURL_DIR/bin/curl-config" "$CURL_DIR/curl-config" `which curl-config`; do
- if test -x "$i"; then
- CURL_CONFIG=$i
- break
- fi
- done
- if test -z "$CURL_CONFIG"; then
- AC_MSG_RESULT([not found])
- AC_MSG_ERROR([could not find curl-config])
- else
- AC_MSG_RESULT([found: $CURL_CONFIG])
- fi
-
- CURL_SSL=`$CURL_CONFIG --features | $EGREP SSL`
- if test "$CURL_SSL" == "SSL"; then
- AC_DEFINE([HTTP_HAVE_SSL], [1], [ ])
- fi
- AC_CHECK_HEADERS([openssl/crypto.h])
-
- CURL_LIBS=`$CURL_CONFIG --libs`
-
- PHP_ADD_INCLUDE($CURL_DIR/include)
- PHP_ADD_LIBRARY_WITH_PATH(curl, $CURL_DIR/$PHP_LIBDIR, HTTP_SHARED_LIBADD)
- PHP_EVAL_LIBLINE($CURL_LIBS, HTTP_SHARED_LIBADD)
- AC_DEFINE([HTTP_HAVE_CURL], [1], [Have cURL support])
-
- PHP_CHECK_LIBRARY(curl, curl_multi_strerror,
- [AC_DEFINE([HAVE_CURL_MULTI_STRERROR], [1], [ ])], [ ],
- [$CURL_LIBS -L$CURL_DIR/$PHP_LIBDIR]
- )
- PHP_CHECK_LIBRARY(curl, curl_easy_strerror,
- [AC_DEFINE([HAVE_CURL_EASY_STRERROR], [1], [ ])], [ ],
- [$CURL_LIBS -L$CURL_DIR/$PHP_LIBDIR]
- )
- PHP_CHECK_LIBRARY(curl, curl_easy_reset,
- [AC_DEFINE([HAVE_CURL_EASY_RESET], [1], [ ])], [ ],
- [$CURL_LIBS -L$CURL_DIR/$PHP_LIBDIR]
- )
- fi
-
-dnl ----
-dnl MHASH
-dnl ----
- if test "$PHP_HTTP_MHASH_ETAGS" != "no"; then
-
- AC_MSG_CHECKING([for mhash.h])
- MHASH_DIR=
- for i in "$PHP_HTTP_MHASH_ETAGS" /usr/local /usr /opt; do
- if test -f "$i/include/mhash.h"; then
- MHASH_DIR=$i
- break
- fi
- done
- if test -z "$MHASH_DIR"; then
- AC_MSG_RESULT([not found])
- AC_MSG_ERROR([could not find mhash.h])
- else
- AC_MSG_RESULT([found in $MHASH_DIR])
- fi
-
- PHP_ADD_INCLUDE($MHASH_DIR/include)
- PHP_ADD_LIBRARY_WITH_PATH(mhash, $MHASH_DIR/$PHP_LIBDIR, HTTP_SHARED_LIBADD)
- AC_DEFINE([HTTP_HAVE_MHASH], [1], [Have mhash support])
- fi
-
-dnl ----
-dnl MAGIC
-dnl ----
- if test "$PHP_HTTP_MAGIC_MIME" != "no"; then
-
- AC_MSG_CHECKING([for magic.h])
- MAGIC_DIR=
- for i in "$PHP_HTTP_MAGIC_MIME" /usr/local /usr /opt; do
- if test -f "$i/include/magic.h"; then
- MAGIC_DIR=$i
- break
- fi
- done
- if test -z "$MAGIC_DIR"; then
- AC_MSG_RESULT([not found])
- AC_MSG_ERROR([could not find magic.h])
- else
- AC_MSG_RESULT([found in $MAGIC_DIR])
- fi
-
- PHP_ADD_INCLUDE($MAGIC_DIR/include)
- PHP_ADD_LIBRARY_WITH_PATH(magic, $MAGIC_DIR/$PHP_LIBDIR, HTTP_SHARED_LIBADD)
- AC_DEFINE([HTTP_HAVE_MAGIC], [1], [Have magic mime support])
- fi
-
-dnl ----
-dnl DONE
-dnl ----
- PHP_HTTP_SOURCES="missing.c http.c http_functions.c phpstr/phpstr.c \
- http_util_object.c http_message_object.c http_request_object.c http_request_pool_api.c \
- http_response_object.c http_exception_object.c http_requestpool_object.c \
- http_api.c http_cache_api.c http_request_api.c http_date_api.c \
- http_headers_api.c http_message_api.c http_send_api.c http_url_api.c \
- http_info_api.c http_request_method_api.c"
- PHP_NEW_EXTENSION([http], $PHP_HTTP_SOURCES, [$ext_shared])
- PHP_ADD_BUILD_DIR($ext_builddir/phpstr, 1)
- PHP_SUBST([HTTP_SHARED_LIBADD])
-
- HTTP_HEADER_FILES="php_http_std_defs.h php_http.h php_http_api.h php_http_cache_api.h \
- php_http_date_api.h php_http_headers_api.h php_http_info_api.h php_http_message_api.h \
- php_http_request_api.h php_http_request_method_api.h php_http_send_api.h php_http_url_api.h"
- PHP_SUBST([HTTP_HEADER_FILES])
-
- ifdef([PHP_INSTALL_HEADERS],
- [
- PHP_INSTALL_HEADERS(ext/http, $HTTP_HEADER_FILES)
- PHP_INSTALL_HEADERS(ext/http/phpstr, [phpstr/phpstr.h])
- ], [
- PHP_ADD_MAKEFILE_FRAGMENT
- ])
-
- AC_DEFINE([HAVE_HTTP], [1], [Have extended HTTP support])
-fi
+++ /dev/null
-// config.w32 for pecl/http
-// $Id$
-
-ARG_ENABLE("http", "whether to enable extended HTTP support", "no");
-
-if (PHP_HTTP != "no") {
-
- EXTENSION("http",
- "missing.c http.c http_functions.c http_exception_object.c "+
- "http_util_object.c http_message_object.c http_requestpool_object.c "+
- "http_request_object.c http_response_object.c "+
- "http_api.c http_cache_api.c http_request_pool_api.c "+
- "http_request_api.c http_date_api.c http_headers_api.c "+
- "http_message_api.c http_send_api.c http_url_api.c "+
- "http_info_api.c http_request_method_api.c",
- null,
- "/I\"" + configure_module_dirname + "/phpstr\"");
- ADD_SOURCES(configure_module_dirname + "/phpstr", "phpstr.c", "http");
- AC_DEFINE("HAVE_HTTP", 1, "Have extended HTTP support");
-
- MHASH_LIB = PHP_DEBUG != "no" ? "libmhash-staticd.lib":"libmhash-static.lib";
- if (CHECK_HEADER_ADD_INCLUDE('mhash.h', 'CFLAGS_HTTP') &&
- (CHECK_LIB(MHASH_LIB, 'http', PHP_HTTP) ||
- CHECK_LIB('libmhash.lib', 'http', PHP_HTTP))) {
- AC_DEFINE('HTTP_HAVE_MHASH', 1 , "Have mhash library");
- } else {
- WARNING("mhash etag generator not enabled; libraries and headers not found");
- }
-
- CURL_LIB = PHP_DEBUG != "no" ? "libcurld.lib":"libcurl.lib";
- if (CHECK_HEADER_ADD_INCLUDE("curl/curl.h", "CFLAGS_HTTP") &&
- CHECK_HEADER_ADD_INCLUDE("openssl/crypto.h", "CFLAGS_HTTP") &&
- CHECK_LIB(CURL_LIB, "http", PHP_HTTP) &&
- CHECK_LIB("ssleay32.lib", "http", PHP_HTTP) &&
- CHECK_LIB("libeay32.lib", "http", PHP_HTTP) &&
- CHECK_LIB("zlib.lib", "http", PHP_HTTP) &&
- CHECK_LIB("winmm.lib", "http", PHP_HTTP)) {
- AC_DEFINE("HTTP_HAVE_CURL", 1, "Have CURL library");
- AC_DEFINE("HTTP_HAVE_SSL", 1, "Have SSL");
- AC_DEFINE("HAVE_CURL_MULTI_STRERROR", 1, "");
- AC_DEFINE("HAVE_CURL_EASY_STRERROR", 1, "");
- AC_DEFINE("HAVE_CURL_EASY_RESET", 1, "");
- AC_DEFINE("CURL_STATICLIB", 1, "");
- } else {
- WARNING("curl convenience functions not enabled; libraries and headers not found");
- }
-
- MAGIC_LIB = PHP_DEBUG != "no" ? "libmagic-staticd.lib":"libmagic-static.lib";
- if (CHECK_HEADER_ADD_INCLUDE("magic.h", "CFLAGS_HTTP") &&
- CHECK_LIB(MAGIC_LIB, "http", PHP_HTTP)) {
- AC_DEFINE("HTTP_HAVE_MAGIC", 1, "Have magic library");
- AC_DEFINE("USE_MAGIC_STATIC", "", "");
- } else {
- WARNING("content type guessing not enabled; libraries and headers not found");
- }
-}
+++ /dev/null
-<?php
-// send 5000 bytes every 0.2 seconds, i.e. max ~25kByte/s
-HttpResponse::setThrottleDelay(0.2);
-HttpResponse::setBufferSize(5000);
-HttpResponse::setCache(true);
-HttpResponse::setContentType('application/x-zip');
-HttpResponse::setFile('../archive.zip');
-HttpResponse::send();
-?>
+++ /dev/null
-<?php
-HttpResponse::setCacheControl('public');
-HttpResponse::setCache(true);
-HttpResponse::capture();
-
-print "This will be cached until content changes!\n";
-print "Note that this approach will only save the clients download time.\n";
-?>
+++ /dev/null
-<?php
-$r = new HttpRequest('http://www.google.com');
-
-// store Googles cookies in a dedicated file
-$r->setOptions(
- array( 'cookiestore' => '../cookies/google.txt',
- )
-);
-
-$r->setQueryData(
- array( 'q' => '+"pecl_http" -msg -cvs -list',
- 'hl' => 'de'
- )
-);
-
-// HttpRequest::send() returns an HttpMessage object
-// of type HttpMessage::RESPONSE or throws an exception
-try {
- print $r->send()->getBody();
-} catch (HttpException $e) {
- print $e;
-}
-?>
+++ /dev/null
-<?php
-class XmlRpcClient
-{
- public $namespace;
- protected $request;
-
- public function __construct($url, $namespace = '')
- {
- $this->namespace = $namespace;
- $this->request = new HttpRequest($url, HTTP_METH_POST);
- $this->request->setContentType('text/xml');
- }
-
- public function setOptions($options = array())
- {
- return $this->request->setOptions($options);
- }
-
- public function addOptions($options)
- {
- return $this->request->addOptions($options);
- }
-
- public function __call($method, $params)
- {
- if ($this->namespace) {
- $method = $this->namespace .'.'. $method;
- }
- $this->request->setPostData(xmlrpc_encode_request($method, $params));
- $response = $this->request->send();
- if ($response->getResponseCode() != 200) {
- throw new Exception($response->getBody(), $response->getResponseCode());
- }
- return xmlrpc_decode($response->getBody(), 'utf-8');
- }
-
- public function getHistory()
- {
- return $this->request->getHistory();
- }
-}
-
-?>
+++ /dev/null
-<?php
-$r = new HttpRequest('http://dev.iworks.at/.print_request.php', HTTP_METH_POST);
-
-// if redirects is set to true, a single redirect is allowed;
-// one can set any reasonable count of allowed redirects
-$r->setOptions(
- array( 'cookies' => array('MyCookie' => 'has a value'),
- 'redirect' => true,
- )
-);
-
-// common form data
-$r->setPostFields(
- array( 'name' => 'Mike',
- 'mail' => 'mike@php.net',
- )
-);
-// add the file to post (form name, file name, file type)
-$r->addPostFile('image', 'profile.jpg', 'image/jpeg');
-
-try {
- print $r->send()->getBody();
-} catch (HttpException $e) {
- print $e;
-}
-?>
+++ /dev/null
-<?php
-try {
- $p = new HttpRequestPool;
- // if you want to set _any_ options of the HttpRequest object,
- // you need to do so *prior attaching* to the request pool!
- $p->attach(new HttpRequest('http://pear.php.net', HTTP_METH_HEAD));
- $p->attach(new HttpRequest('http://pecl.php.net', HTTP_METH_HEAD));
-} catch (HttpException $e) {
- print $e;
- exit;
-}
-
-try {
- $p->send();
- // HttpRequestPool implements an iterator over attached HttpRequest objects
- foreach ($p as $r) {
- echo "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n";
- }
-} catch (HttpException $e) {
- print $e;
-}
-?>
+++ /dev/null
-<?php
-class Pool extends HttpRequestPool
-{
- public function __construct()
- {
- parent::__construct(
- new HttpRequest('http://pear.php.net', HTTP_METH_HEAD),
- new HttpRequest('http://pecl.php.net', HTTP_METH_HEAD)
- );
-
- // HttpRequestPool methods socketPerform() and socketSelect() are
- // protected; one could use this approach to do something else
- // while the requests are being executed
- print "Executing requests";
- for ($i = 0; $this->socketPerform(); $i++) {
- $i % 10 or print ".";
- if (!$this->socketSelect()) {
- throw new HttpException("Socket error!");
- }
- }
- print "\nDone!\n";
- }
-}
-
-try {
- foreach (new Pool as $r) {
- echo "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n";
- }
-} catch (HttpException $ex) {
- print $e;
-}
-?>
+++ /dev/null
-<?php
-class FeedAggregator
-{
- public $directory;
- protected $feeds = array();
-
- public function __construct($directory = 'feeds')
- {
- $this->setDirectory($directory);
- }
-
- public function setDirectory($directory)
- {
- $this->directory = $directory;
- foreach (glob($this->directory .'/*.xml') as $feed) {
- $this->feeds[basename($feed, '.xml')] = filemtime($feed);
- }
- }
-
- public function url2name($url)
- {
- return preg_replace('/[^\w\.-]+/', '_', $url);
- }
-
- public function hasFeed($url)
- {
- return isset($this->feeds[$this->url2name($url)]);
- }
-
- public function addFeed($url)
- {
- $r = $this->setupRequest($url);
- $r->send();
- $this->handleResponse($r);
- }
-
- public function addFeeds($urls)
- {
- $pool = new HttpRequestPool;
- foreach ($urls as $url) {
- $pool->attach($r = $this->setupRequest($url));
- }
- $pool->send();
-
- foreach ($pool as $request) {
- $this->handleResponse($request);
- }
- }
-
- public function getFeed($url)
- {
- $this->addFeed($url);
- return $this->loadFeed($this->url2name($url));
- }
-
- public function getFeeds($urls)
- {
- $feeds = array();
- $this->addFeeds($urls);
- foreach ($urls as $url) {
- $feeds[] = $this->loadFeed($this->url2name($url));
- }
- return $feeds;
- }
-
- protected function saveFeed($file, $contents)
- {
- if (file_put_contents($this->directory .'/'. $file .'.xml', $contents)) {
- $this->feeds[$file] = time();
- } else {
- throw new Exception("Could not save feed contents to $file.xml");
- }
- }
-
- protected function loadFeed($file)
- {
- if (isset($this->feeds[$file])) {
- if ($data = file_get_contents($this->directory .'/'. $file .'.xml')) {
- return $data;
- } else {
- throw new Exception("Could not load feed contents from $file.xml");
- }
- } else {
- throw new Exception("Unknown feed/file $file.xml");
- }
- }
-
- protected function setupRequest($url)
- {
- $r = new HttpRequest($url);
- $r->setOptions(array('redirect' => true));
-
- $file = $this->url2name($url);
-
- if (isset($this->feeds[$file])) {
- $r->setOptions(array('lastmodified' => $this->feeds[$file]));
- }
-
- return $r;
- }
-
- protected function handleResponse(HttpRequest $r)
- {
- if ($r->getResponseCode() != 304) {
- if ($r->getResponseCode() != 200) {
- throw new Exception("Unexpected response code ". $r->getResponseCode());
- }
- if (!strlen($body = $r->getResponseBody())) {
- throw new Exception("Received empty feed from ". $r->getUrl());
- }
- $this->saveFeed($this->url2name($r->getUrl()), $body);
- }
- }
-}
-?>
+++ /dev/null
-<?php
-/**
- * extract examples from tutorial.txt
- */
-
-if (preg_match_all('/\n- ([^\n]+).*?(\<\?.+?\?\>)/s', file_get_contents($_SERVER['argv'][1]), $matches)) {
- for ($i = 0; $i < count($matches[0]); $i++) {
- file_put_contents(preg_replace('/\W/', '_', $matches[1][$i]).".php", $matches[2][$i]."\n");
- }
-}
-
-?>
+++ /dev/null
-
-A Beginners Tutorial
---------------------
-$Revision$
-
-
-- GET Queries
-
- The HttpRequest class can be used to execute any HTTP request method.
- The following example shows a simple GET request where a few query
- parameters are supplied. Additionally potential cookies will be
- read from and written to a file.
-
-<?php
-$r = new HttpRequest('http://www.google.com');
-
-// store Googles cookies in a dedicated file
-$r->setOptions(
- array( 'cookiestore' => '../cookies/google.txt',
- )
-);
-
-$r->setQueryData(
- array( 'q' => '+"pecl_http" -msg -cvs -list',
- 'hl' => 'de'
- )
-);
-
-// HttpRequest::send() returns an HttpMessage object
-// of type HttpMessage::RESPONSE or throws an exception
-try {
- print $r->send()->getBody();
-} catch (HttpException $e) {
- print $e;
-}
-?>
-
-- Multipart Posts
-
- The following example shows an multipart POST request, with two form
- fields and an image that's supposed to be uploaded to the server.
- It's a bad habit as well as common practice to issue a redirect after
- an received POST request, so we'll allow a redirect by enabling the
- redirect option.
-
-<?php
-$r = new HttpRequest('http://dev.iworks.at/.print_request.php', HTTP_METH_POST);
-
-// if redirects is set to true, a single redirect is allowed;
-// one can set any reasonable count of allowed redirects
-$r->setOptions(
- array( 'cookies' => array('MyCookie' => 'has a value'),
- 'redirect' => true,
- )
-);
-
-// common form data
-$r->setPostFields(
- array( 'name' => 'Mike',
- 'mail' => 'mike@php.net',
- )
-);
-// add the file to post (form name, file name, file type)
-$r->addPostFile('image', 'profile.jpg', 'image/jpeg');
-
-try {
- print $r->send()->getBody();
-} catch (HttpException $e) {
- print $e;
-}
-?>
-
-- Parallel Requests
-
- It's possible to execute several HttpRequests in parallel with the
- HttpRequestPool class. HttpRequests to send, do not need to perform
- the same request method, but can only be attached to one HttpRequestPool
- at the same time.
-
-<?php
-try {
- $p = new HttpRequestPool;
- // if you want to set _any_ options of the HttpRequest object,
- // you need to do so *prior attaching* to the request pool!
- $p->attach(new HttpRequest('http://pear.php.net', HTTP_METH_HEAD));
- $p->attach(new HttpRequest('http://pecl.php.net', HTTP_METH_HEAD));
-} catch (HttpException $e) {
- print $e;
- exit;
-}
-
-try {
- $p->send();
- // HttpRequestPool implements an iterator over attached HttpRequest objects
- foreach ($p as $r) {
- echo "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n";
- }
-} catch (HttpException $e) {
- print $e;
-}
-?>
-
-- Parallel Requests?
-
- You can use a more advanced approach by using the protected interface of
- the HttpRequestPool class. This allows you to perform some other tasks
- while the requests are executed.
-
-<?php
-class Pool extends HttpRequestPool
-{
- public function __construct()
- {
- parent::__construct(
- new HttpRequest('http://pear.php.net', HTTP_METH_HEAD),
- new HttpRequest('http://pecl.php.net', HTTP_METH_HEAD)
- );
-
- // HttpRequestPool methods socketPerform() and socketSelect() are
- // protected; one could use this approach to do something else
- // while the requests are being executed
- print "Executing requests";
- for ($i = 0; $this->socketPerform(); $i++) {
- $i % 10 or print ".";
- if (!$this->socketSelect()) {
- throw new HttpException("Socket error!");
- }
- }
- print "\nDone!\n";
- }
-}
-
-try {
- foreach (new Pool as $r) {
- echo "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n";
- }
-} catch (HttpException $ex) {
- print $e;
-}
-?>
-
-- Cached Responses
-
- One of the main key features of HttpResponse is HTTP caching. HttpResponse
- will calculate an ETag based on the http.etag_mode INI setting as well as
- it will determine the last modification time of the sent entity. It uses
- those two indicators to decide if the cache entry on the client side is
- still valid and will emit an "304 Not Modified" response if applicable.
-
-<?php
-HttpResponse::setCacheControl('public');
-HttpResponse::setCache(true);
-HttpResponse::capture();
-
-print "This will be cached until content changes!\n";
-print "Note that this approach will only save the clients download time.\n";
-?>
-
-- Bandwidth Throttling
-
- HttpResponse supports a basic throttling mechanism, which is enabled by
- setting a throttle delay and a buffer size. PHP will sleep the specified
- amount of seconds after each sent chunk of specified bytes.
-
-<?php
-// send 5000 bytes every 0.2 seconds, i.e. max ~25kByte/s
-HttpResponse::setThrottleDelay(0.2);
-HttpResponse::setBufferSize(5000);
-HttpResponse::setCache(true);
-HttpResponse::setContentType('application/x-zip');
-HttpResponse::setFile('../archive.zip');
-HttpResponse::send();
-?>
-
-Exemplar Use Cases
-------------------
-
-- KISS XMLRPC Client
-
-<?php
-class XmlRpcClient
-{
- public $namespace;
- protected $request;
-
- public function __construct($url, $namespace = '')
- {
- $this->namespace = $namespace;
- $this->request = new HttpRequest($url, HTTP_METH_POST);
- $this->request->setContentType('text/xml');
- }
-
- public function setOptions($options = array())
- {
- return $this->request->setOptions($options);
- }
-
- public function addOptions($options)
- {
- return $this->request->addOptions($options);
- }
-
- public function __call($method, $params)
- {
- if ($this->namespace) {
- $method = $this->namespace .'.'. $method;
- }
- $this->request->setPostData(xmlrpc_encode_request($method, $params));
- $response = $this->request->send();
- if ($response->getResponseCode() != 200) {
- throw new Exception($response->getBody(), $response->getResponseCode());
- }
- return xmlrpc_decode($response->getBody(), 'utf-8');
- }
-
- public function getHistory()
- {
- return $this->request->getHistory();
- }
-}
-
-?>
-
-- Simple Feed Aggregator
-
-<?php
-class FeedAggregator
-{
- public $directory;
- protected $feeds = array();
-
- public function __construct($directory = 'feeds')
- {
- $this->setDirectory($directory);
- }
-
- public function setDirectory($directory)
- {
- $this->directory = $directory;
- foreach (glob($this->directory .'/*.xml') as $feed) {
- $this->feeds[basename($feed, '.xml')] = filemtime($feed);
- }
- }
-
- public function url2name($url)
- {
- return preg_replace('/[^\w\.-]+/', '_', $url);
- }
-
- public function hasFeed($url)
- {
- return isset($this->feeds[$this->url2name($url)]);
- }
-
- public function addFeed($url)
- {
- $r = $this->setupRequest($url);
- $r->send();
- $this->handleResponse($r);
- }
-
- public function addFeeds($urls)
- {
- $pool = new HttpRequestPool;
- foreach ($urls as $url) {
- $pool->attach($r = $this->setupRequest($url));
- }
- $pool->send();
-
- foreach ($pool as $request) {
- $this->handleResponse($request);
- }
- }
-
- public function getFeed($url)
- {
- $this->addFeed($url);
- return $this->loadFeed($this->url2name($url));
- }
-
- public function getFeeds($urls)
- {
- $feeds = array();
- $this->addFeeds($urls);
- foreach ($urls as $url) {
- $feeds[] = $this->loadFeed($this->url2name($url));
- }
- return $feeds;
- }
-
- protected function saveFeed($file, $contents)
- {
- if (file_put_contents($this->directory .'/'. $file .'.xml', $contents)) {
- $this->feeds[$file] = time();
- } else {
- throw new Exception("Could not save feed contents to $file.xml");
- }
- }
-
- protected function loadFeed($file)
- {
- if (isset($this->feeds[$file])) {
- if ($data = file_get_contents($this->directory .'/'. $file .'.xml')) {
- return $data;
- } else {
- throw new Exception("Could not load feed contents from $file.xml");
- }
- } else {
- throw new Exception("Unknown feed/file $file.xml");
- }
- }
-
- protected function setupRequest($url)
- {
- $r = new HttpRequest($url);
- $r->setOptions(array('redirect' => true));
-
- $file = $this->url2name($url);
-
- if (isset($this->feeds[$file])) {
- $r->setOptions(array('lastmodified' => $this->feeds[$file]));
- }
-
- return $r;
- }
-
- protected function handleResponse(HttpRequest $r)
- {
- if ($r->getResponseCode() != 304) {
- if ($r->getResponseCode() != 200) {
- throw new Exception("Unexpected response code ". $r->getResponseCode());
- }
- if (!strlen($body = $r->getResponseBody())) {
- throw new Exception("Received empty feed from ". $r->getUrl());
- }
- $this->saveFeed($this->url2name($r->getUrl()), $body);
- }
- }
-}
-?>
-
-
+++ /dev/null
-<html>
-<head>
- <title>Function Summary of ext/http</title>
- <style>
- body {
- font-size: 80%;
- font-family: sans-serif;
- }
- h2, h3 {
- color: #339;
- clear: both;
- font-size: 1.2em;
- background: #ffc;
- padding: .2em;
- }
- h2.o {
- color: #66b;
- clear: both;
- font-size: 1.3em;
- background: #f0f0f0;
- padding: .2em;
- }
- p {
- margin-left: 1em;
- }
- pre {
- font-size: 1.2em;
- }
- br {
- display: none;
- }
- blockquote {
- margin-bottom: 3em;
- border: 1px solid #ccc;
- background: #f0f0f0;
- padding: 0em 1em;
- width: auto;
- float: left;
- }
- p, pre {
- clear: both;
- }
- p br, pre code br {
- display: block;
- }
- </style>
-</head>
-<body><h1>http_functions.c</h1>
-<h2 id="http_date">string http_date([int timestamp])</h2>
-<p>This function returns a valid HTTP date regarding RFC 822/1123<br />
-looking like: "Wed, 22 Dec 2004 11:34:47 GMT"</p>
-<h2 id="http_absolute_uri">string http_absolute_uri(string url[, string proto[, string host[, int port]]])</h2>
-<p>This function returns an absolute URI constructed from url.<br />
-If the url is already abolute but a different proto was supplied,<br />
-only the proto part of the URI will be updated. If url has no<br />
-path specified, the path of the current REQUEST_URI will be taken.<br />
-The host will be taken either from the Host HTTP header of the client<br />
-the SERVER_NAME or just localhost if prior are not available.<br />
-<br />
-Some examples:</p><pre> url = "page.php" => http://www.example.com/current/path/page.php<br />
- url = "/page.php" => http://www.example.com/page.php<br />
- url = "/page.php", proto = "https" => https://www.example.com/page.php<br />
-</pre></p>
-<h2 id="http_negotiate_language">string http_negotiate_language(array supported[, string default = 'en-US'])</h2>
-<p>This function negotiates the clients preferred language based on its<br />
-Accept-Language HTTP header. It returns the negotiated language or<br />
-the default language if none match.<br />
-<br />
-The qualifier is recognized and languages without qualifier are rated highest.<br />
-<br />
-The supported parameter is expected to be an array having<br />
-the supported languages as array values.<br />
-<br />
-Example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br />$langs </span><span style="color: #007700">= array(<br /> </span><span style="color: #DD0000">'en-US'</span><span style="color: #007700">,</span><span style="color: #FF8000">// default<br /> </span><span style="color: #DD0000">'fr'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'fr-FR'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'de'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'de-DE'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'de-AT'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'de-CH'</span><span style="color: #007700">,<br />);<br />include </span><span style="color: #DD0000">'./langs/'</span><span style="color: #007700">. </span><span style="color: #0000BB">http_negotiate_language</span><span style="color: #007700">(</span><span style="color: #0000BB">$langs</span><span style="color: #007700">) .</span><span style="color: #DD0000">'.php'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h2 id="http_negotiate_charset">string http_negotiate_charset(array supported[, string default = 'iso-8859-1'])</h2>
-<p>This function negotiates the clients preferred charset based on its<br />
-Accept-Charset HTTP header. It returns the negotiated charset or<br />
-the default charset if none match.<br />
-<br />
-The qualifier is recognized and charset without qualifier are rated highest.<br />
-<br />
-The supported parameter is expected to be an array having<br />
-the supported charsets as array values.<br />
-<br />
-Example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br />$charsets </span><span style="color: #007700">= array(<br /> </span><span style="color: #DD0000">'iso-8859-1'</span><span style="color: #007700">, </span><span style="color: #FF8000">// default<br /> </span><span style="color: #DD0000">'iso-8859-2'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'iso-8859-15'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'utf-8'<br /></span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$pref </span><span style="color: #007700">= </span><span style="color: #0000BB">http_negotiate_charset</span><span style="color: #007700">(</span><span style="color: #0000BB">$charsets</span><span style="color: #007700">);<br />if (!</span><span style="color: #0000BB">strcmp</span><span style="color: #007700">(</span><span style="color: #0000BB">$pref</span><span style="color: #007700">, </span><span style="color: #DD0000">'iso-8859-1'</span><span style="color: #007700">)) {<br /> </span><span style="color: #0000BB">iconv_set_encoding</span><span style="color: #007700">(</span><span style="color: #DD0000">'internal_encoding'</span><span style="color: #007700">, </span><span style="color: #DD0000">'iso-8859-1'</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">iconv_set_encoding</span><span style="color: #007700">(</span><span style="color: #DD0000">'output_encoding'</span><span style="color: #007700">, </span><span style="color: #0000BB">$pref</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">ob_start</span><span style="color: #007700">(</span><span style="color: #DD0000">'ob_iconv_handler'</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h2 id="http_send_status">bool http_send_status(int status)</h2>
-<p>Send HTTP status code.</p>
-<h2 id="http_send_last_modified">bool http_send_last_modified([int timestamp])</h2>
-<p>This converts the given timestamp to a valid HTTP date and<br />
-sends it as "Last-Modified" HTTP header. If timestamp is<br />
-omitted, current time is sent.</p>
-<h2 id="http_send_content_type">bool http_send_content_type([string content_type = 'application/x-octetstream'])</h2>
-<p>Sets the content type.</p>
-<h2 id="http_send_content_disposition">bool http_send_content_disposition(string filename[, bool inline = false])</h2>
-<p>Set the Content Disposition. The Content-Disposition header is very useful<br />
-if the data actually sent came from a file or something similar, that should<br />
-be "saved" by the client/user (i.e. by browsers "Save as..." popup window).</p>
-<h2 id="http_match_modified">bool http_match_modified([int timestamp[, for_range = false]])</h2>
-<p>Matches the given timestamp against the clients "If-Modified-Since" resp.<br />
-"If-Unmodified-Since" HTTP headers.</p>
-<h2 id="http_match_etag">bool http_match_etag(string etag[, for_range = false])</h2>
-<p>This matches the given ETag against the clients<br />
-"If-Match" resp. "If-None-Match" HTTP headers.</p>
-<h2 id="http_cache_last_modified">bool http_cache_last_modified([int timestamp_or_expires]])</h2>
-<p>If timestamp_or_expires is greater than 0, it is handled as timestamp<br />
-and will be sent as date of last modification. If it is 0 or omitted,<br />
-the current time will be sent as Last-Modified date. If it's negative,<br />
-it is handled as expiration time in seconds, which means that if the<br />
-requested last modification date is not between the calculated timespan,<br />
-the Last-Modified header is updated and the actual body will be sent.</p>
-<h2 id="http_cache_etag">bool http_cache_etag([string etag])</h2>
-<p>This function attempts to cache the HTTP body based on an ETag,<br />
-either supplied or generated through calculation of the MD5<br />
-checksum of the output (uses output buffering).<br />
-<br />
-If clients "If-None-Match" header matches the supplied/calculated<br />
-ETag, the body is considered cached on the clients side and<br />
-a "304 Not Modified" status code is issued.</p>
-<h2 id="ob_etaghandler">string ob_etaghandler(string data, int mode)</h2>
-<p>For use with ob_start().</p>
-<h2 id="http_throttle">void http_throttle(double sec[, long bytes = 2097152])</h2>
-<p>Use with http_send() API.<br />
-<br />
-Example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// ~ 20 kbyte/s<br /># http_throttle(1, 20000);<br /># http_throttle(0.5, 10000);<br /># http_throttle(0.1, 2000);<br /></span><span style="color: #0000BB">http_send_file</span><span style="color: #007700">(</span><span style="color: #DD0000">'document.pdf'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h2 id="http_redirect">void http_redirect([string url[, array params[, bool session,[ bool permanent]]]])</h2>
-<p>Redirect to a given url.<br />
-The supplied url will be expanded with http_absolute_uri(), the params array will<br />
-be treated with http_build_query() and the session identification will be appended<br />
-if session is true.<br />
-<br />
-Depending on permanent the redirection will be issued with a permanent<br />
-("301 Moved Permanently") or a temporary ("302 Found") redirection<br />
-status code.<br />
-<br />
-To be RFC compliant, "Redirecting to <a>URI</a>." will be displayed,<br />
-if the client doesn't redirect immediatly.</p>
-<h2 id="http_send_data">bool http_send_data(string data)</h2>
-<p>Sends raw data with support for (multiple) range requests.</p>
-<h2 id="http_send_file">bool http_send_file(string file)</h2>
-<p>Sends a file with support for (multiple) range requests.</p>
-<h2 id="http_send_stream">bool http_send_stream(resource stream)</h2>
-<p>Sends an already opened stream with support for (multiple) range requests.</p>
-<h2 id="http_chunked_decode">string http_chunked_decode(string encoded)</h2>
-<p>This function decodes a string that was HTTP-chunked encoded.<br />
-Returns false on failure.</p>
-<h2 id="http_parse_message">object http_parse_message(string message)</h2>
-<p>Parses (a) http_message(s) into a simple recursive object structure:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br />print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">http_parse_message</span><span style="color: #007700">(</span><span style="color: #0000BB">http_get</span><span style="color: #007700">(</span><span style="color: #0000BB">URL</span><span style="color: #007700">, array(</span><span style="color: #DD0000">'redirect' </span><span style="color: #007700">=> </span><span style="color: #0000BB">3</span><span style="color: #007700">)));<br /><br /></span><span style="color: #0000BB">stdClass object<br /></span><span style="color: #007700">(<br /> [</span><span style="color: #0000BB">type</span><span style="color: #007700">] => </span><span style="color: #0000BB">2<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">httpVersion</span><span style="color: #007700">] => </span><span style="color: #0000BB">1.1<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">responseCode</span><span style="color: #007700">] => </span><span style="color: #0000BB">200<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">headers</span><span style="color: #007700">] => Array <br /> (<br /> [</span><span style="color: #0000BB">Content</span><span style="color: #007700">-</span><span style="color: #0000BB">Length</span><span style="color: #007700">] => </span><span style="color: #0000BB">3<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">Server</span><span style="color: #007700">] => </span><span style="color: #0000BB">Apache<br /> </span><span style="color: #007700">)<br /> [</span><span style="color: #0000BB">body</span><span style="color: #007700">] => </span><span style="color: #0000BB">Hi</span><span style="color: #007700">!<br /> [</span><span style="color: #0000BB">parentMessage</span><span style="color: #007700">] => </span><span style="color: #0000BB">stdClass object<br /> </span><span style="color: #007700">(<br /> [</span><span style="color: #0000BB">type</span><span style="color: #007700">] => </span><span style="color: #0000BB">2<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">httpVersion</span><span style="color: #007700">] => </span><span style="color: #0000BB">1.1<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">responseCode</span><span style="color: #007700">] => </span><span style="color: #0000BB">302<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">headers</span><span style="color: #007700">] => Array <br /> (<br /> [</span><span style="color: #0000BB">Content</span><span style="color: #007700">-</span><span style="color: #0000BB">Length</span><span style="color: #007700">] => </span><span style="color: #0000BB">0<br /> </span><span style="color: #007700">[</span><span style="color: #0000BB">Location</span><span style="color: #007700">] => ...<br /> )<br /> [</span><span style="color: #0000BB">body</span><span style="color: #007700">] => <br /> [</span><span style="color: #0000BB">parentMessage</span><span style="color: #007700">] => ...<br /> )<br />)<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h2 id="http_parse_headers">array http_parse_headers(string header)</h2>
-<p></p>
-<h2 id="http_get_request_headers">array http_get_request_headers(void)</h2>
-<p>Get a list of incoming HTTP headers.</p>
-<h2 id="http_get_request_body">string http_get_request_body(void)</h2>
-<p>Get the raw request body (e.g. POST or PUT data).</p>
-<h2 id="http_match_request_header">bool http_match_request_header(string header, string value[, bool match_case = false])</h2>
-<p>Match an incoming HTTP header.</p>
-<h2 id="http_get">string http_get(string url[, array options[, array &info]])</h2>
-<p>Performs an HTTP GET request on the supplied url.<br />
-<br />
-The second parameter is expected to be an associative<br />
-array where the following keys will be recognized:</p><pre> - redirect: int, whether and how many redirects to follow<br />
- - unrestrictedauth: bool, whether to continue sending credentials on<br />
- redirects to a different host<br />
- - proxyhost: string, proxy host in "host[:port]" format<br />
- - proxyport: int, use another proxy port as specified in proxyhost<br />
- - proxyauth: string, proxy credentials in "user:pass" format<br />
- - proxyauthtype: int, HTTP_AUTH_BASIC and/or HTTP_AUTH_NTLM<br />
- - httpauth: string, http credentials in "user:pass" format<br />
- - httpauthtype: int, HTTP_AUTH_BASIC, DIGEST and/or NTLM<br />
- - compress: bool, whether to allow gzip/deflate content encoding<br />
- (defaults to true)<br />
- - port: int, use another port as specified in the url<br />
- - referer: string, the referer to sends<br />
- - useragent: string, the user agent to send<br />
- (defaults to PECL::HTTP/version (PHP/version)))<br />
- - headers: array, list of custom headers as associative array<br />
- like array("header" => "value")<br />
- - cookies: array, list of cookies as associative array<br />
- like array("cookie" => "value")<br />
- - cookiestore: string, path to a file where cookies are/will be stored<br />
- - resume: int, byte offset to start the download from;<br />
- if the server supports ranges<br />
- - maxfilesize: int, maximum file size that should be downloaded;<br />
- has no effect, if the size of the requested entity is not known<br />
- - lastmodified: int, timestamp for If-(Un)Modified-Since header<br />
- - timeout: int, seconds the request may take<br />
- - connecttimeout: int, seconds the connect may take<br />
- - onprogress: mixed, progress callback</pre><p>The optional third parameter will be filled with some additional information<br />
-in form af an associative array, if supplied, like the following example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">array (<br /> </span><span style="color: #DD0000">'effective_url' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'http://localhost'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'response_code' </span><span style="color: #007700">=> </span><span style="color: #0000BB">403</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'total_time' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0.017</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'namelookup_time' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0.013</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'connect_time' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0.014</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'pretransfer_time' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0.014</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'size_upload' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'size_download' </span><span style="color: #007700">=> </span><span style="color: #0000BB">202</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'speed_download' </span><span style="color: #007700">=> </span><span style="color: #0000BB">11882</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'speed_upload' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'header_size' </span><span style="color: #007700">=> </span><span style="color: #0000BB">145</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'request_size' </span><span style="color: #007700">=> </span><span style="color: #0000BB">62</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'ssl_verifyresult' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'filetime' </span><span style="color: #007700">=> -</span><span style="color: #0000BB">1</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'content_length_download' </span><span style="color: #007700">=> </span><span style="color: #0000BB">202</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'content_length_upload' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'starttransfer_time' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0.017</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'content_type' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'text/html; charset=iso-8859-1'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'redirect_time' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'redirect_count' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'http_connectcode' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'httpauth_avail' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'proxyauth_avail' </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br />)<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h2 id="http_head">string http_head(string url[, array options[, array &info]])</h2>
-<p>Performs an HTTP HEAD request on the suppied url.<br />
-Returns the HTTP response as string.<br />
-See http_get() for a full list of available options.</p>
-<h2 id="http_post_data">string http_post_data(string url, string data[, array options[, array &info]])</h2>
-<p>Performs an HTTP POST request, posting data.<br />
-Returns the HTTP response as string.<br />
-See http_get() for a full list of available options.</p>
-<h2 id="http_post_fields">string http_post_fields(string url, array data[, array files[, array options[, array &info]]])</h2>
-<p>Performs an HTTP POST request, posting www-form-urlencoded array data.<br />
-Returns the HTTP response as string.<br />
-See http_get() for a full list of available options.</p>
-<h2 id="http_put_file">string http_put_file(string url, string file[, array options[, array &info]])</h2>
-<p>Performs an HTTP PUT request, uploading file.<br />
-Returns the HTTP response as string.<br />
-See http_get() for a full list of available options.</p>
-<h2 id="http_put_stream">string http_put_stream(string url, resource stream[, array options[, array &info]])</h2>
-<p>Performs an HTTP PUT request, uploading stream.<br />
-Returns the HTTP response as string.<br />
-See http_get() for a full list of available options.</p>
-<h2 id="http_request_method_register">long http_request_method_register(string method)</h2>
-<p>Register a custom request method.</p>
-<h2 id="http_request_method_unregister">bool http_request_method_unregister(mixed method)</h2>
-<p>Unregister a previously registered custom request method.</p>
-<h2 id="http_request_method_exists">long http_request_method_exists(mixed method)</h2>
-<p>Check if a request method is registered (or available by default).</p>
-<h2 id="http_request_method_name">string http_request_method_name(long method)</h2>
-<p>Get the literal string representation of a standard or registered request method.</p>
-<h2 id="http_build_query">string http_build_query(mixed formdata [, string prefix[, string arg_separator]])</h2>
-<p>Generates a form-encoded query string from an associative array or object.</p>
-<hr noshade>
-<h1>http_message_object.c</h1>
-<h2 id="HttpMessage" class="o">HttpMessage</h2>
-<h3 id="HttpMessage___construct">void HttpMessage::__construct([string message])</h3>
-<p>Instantiate a new HttpMessage object.</p>
-<h3 id="HttpMessage_fromString">static HttpMessage HttpMessage::fromString(string raw_message)</h3>
-<p>Create an HttpMessage object from a string.</p>
-<h3 id="HttpMessage_getBody">string HttpMessage::getBody()</h3>
-<p>Get the body of the parsed Message.</p>
-<h3 id="HttpMessage_getHeaders">array HttpMessage::getHeaders()</h3>
-<p>Get Message Headers.</p>
-<h3 id="HttpMessage_setHeaders">void HttpMessage::setHeaders(array headers)</h3>
-<p>Sets new headers.</p>
-<h3 id="HttpMessage_addHeaders">void HttpMessage::addHeaders(array headers[, bool append = false])</h3>
-<p>Add headers. If append is true, headers with the same name will be separated, else overwritten.</p>
-<h3 id="HttpMessage_getType">long HttpMessage::getType()</h3>
-<p>Get Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE)</p>
-<h3 id="HttpMessage_setType">void HttpMessage::setType(long type)</h3>
-<p>Set Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE)</p>
-<h3 id="HttpMessage_getResponseCode">long HttpMessage::getResponseCode()</h3>
-<p>Get the Response Code of the Message.</p>
-<h3 id="HttpMessage_setResponseCode">bool HttpMessage::setResponseCode(long code)</h3>
-<p>Set the response code of an HTTP Response Message.<br />
-Returns false if the Message is not of type HTTP_MSG_RESPONSE,<br />
-or if the response code is out of range (100-510).</p>
-<h3 id="HttpMessage_getRequestMethod">string HttpMessage::getRequestMethod()</h3>
-<p>Get the Request Method of the Message.<br />
-Returns false if the Message is not of type HTTP_MSG_REQUEST.</p>
-<h3 id="HttpMessage_setRequestMethod">bool HttpMessage::setRequestMethod(string method)</h3>
-<p>Set the Request Method of the HTTP Message.<br />
-Returns false if the Message is not of type HTTP_MSG_REQUEST.</p>
-<h3 id="HttpMessage_getRequestUri">string HttpMessage::getRequestUri()</h3>
-<p>Get the Request URI of the Message.</p>
-<h3 id="HttpMessage_setRequestUri">bool HttpMessage::setRequestUri(string URI)</h3>
-<p>Set the Request URI of the HTTP Message.<br />
-Returns false if the Message is not of type HTTP_MSG_REQUEST,<br />
-or if paramtere URI was empty.</p>
-<h3 id="HttpMessage_getHttpVersion">string HttpMessage::getHttpVersion()</h3>
-<p>Get the HTTP Protocol Version of the Message.</p>
-<h3 id="HttpMessage_setHttpVersion">bool HttpMessage::setHttpVersion(string version)</h3>
-<p>Set the HTTP Protocol version of the Message.<br />
-Returns false if version is invalid (1.0 and 1.1).</p>
-<h3 id="HttpMessage_getParentMessage">HttpMessage HttpMessage::getParentMessage()</h3>
-<p>Get parent Message.</p>
-<h3 id="HttpMessage_send">bool HttpMessage::send()</h3>
-<p>Send the Message according to its type as Response or Request.</p>
-<h3 id="HttpMessage_toString">string HttpMessage::toString([bool include_parent = true])</h3>
-<p>Get the string representation of the Message.</p>
-<hr noshade>
-<h1>http_request_object.c</h1>
-<h2 id="HttpRequest" class="o">HttpRequest</h2>
-<h3 id="HttpRequest___construct">void HttpRequest::__construct([string url[, long request_method = HTTP_GET]])</h3>
-<p>Instantiate a new HttpRequest object which can be used to issue HEAD, GET<br />
-and POST (including posting files) HTTP requests.</p>
-<h3 id="HttpRequest___destruct">void HttpRequest::__destruct()</h3>
-<p>Destroys the HttpRequest object.</p>
-<h3 id="HttpRequest_setOptions">bool HttpRequest::setOptions([array options])</h3>
-<p>Set the request options to use. See http_get() for a full list of available options.</p>
-<h3 id="HttpRequest_getOptions">array HttpRequest::getOptions()</h3>
-<p>Get currently set options.</p>
-<h3 id="HttpRequest_setSslOptions">bool HttpRequest::setSslOptions([array options])</h3>
-<p>Set SSL options.</p>
-<h3 id="HttpRequest_addSslOptions">bool HttpRequest::addSslOptions(array options)</h3>
-<p>Set additional SSL options.</p>
-<h3 id="HttpRequest_getSslOptions">array HttpRequest::getSslOtpions()</h3>
-<p>Get previously set SSL options.</p>
-<h3 id="HttpRequest_addHeaders">bool HttpRequest::addHeaders(array headers)</h3>
-<p>Add request header name/value pairs.</p>
-<h3 id="HttpRequest_setHeaders">bool HttpRequest::setHeaders([array headers])</h3>
-<p>Set request header name/value pairs.</p>
-<h3 id="HttpRequest_getHeaders">array HttpRequest::getHeaders()</h3>
-<p>Get previously set request headers.</p>
-<h3 id="HttpRequest_setCookies">bool HttpRequest::setCookies([array cookies])</h3>
-<p>Set cookies.</p>
-<h3 id="HttpRequest_addCookies">bool HttpRequest::addCookies(array cookies)</h3>
-<p>Add cookies.</p>
-<h3 id="HttpRequest_getCookies">array HttpRequest::getCookies()</h3>
-<p>Get previously set cookies.</p>
-<h3 id="HttpRequest_setUrl">bool HttpRequest::setUrl(string url)</h3>
-<p>Set the request URL.</p>
-<h3 id="HttpRequest_getUrl">string HttpRequest::getUrl()</h3>
-<p>Get the previously set request URL.</p>
-<h3 id="HttpRequest_setMethod">bool HttpRequest::setMethod(long request_method)</h3>
-<p>Set the request methods; one of the <tt>HTTP_HEAD</tt>, <tt>HTTP_GET</tt> or<br />
-<tt>HTTP_POST</tt> constants.</p>
-<h3 id="HttpRequest_getMethod">long HttpRequest::getMethod()</h3>
-<p>Get the previously set request method.</p>
-<h3 id="HttpRequest_setContentType">bool HttpRequest::setContentType(string content_type)</h3>
-<p>Set the content type the post request should have.<br />
-Use this only if you know what you're doing.</p>
-<h3 id="HttpRequest_getContentType">string HttpRequest::getContentType()</h3>
-<p>Get the previously content type.</p>
-<h3 id="HttpRequest_setQueryData">bool HttpRequest::setQueryData([mixed query_data])</h3>
-<p>Set the URL query parameters to use.<br />
-Overwrites previously set query parameters.<br />
-Affects any request types.</p>
-<h3 id="HttpRequest_getQueryData">string HttpRequest::getQueryData()</h3>
-<p>Get the current query data in form of an urlencoded query string.</p>
-<h3 id="HttpRequest_addQueryData">bool HttpRequest::addQueryData(array query_params)</h3>
-<p>Add parameters to the query parameter list.<br />
-Affects any request type.</p>
-<h3 id="HttpRequest_addPostFields">bool HttpRequest::addPostFields(array post_data)</h3>
-<p>Adds POST data entries.<br />
-Affects only POST requests.</p>
-<h3 id="HttpRequest_setPostFields">bool HttpRequest::setPostFields([array post_data])</h3>
-<p>Set the POST data entries.<br />
-Overwrites previously set POST data.<br />
-Affects only POST requests.</p>
-<h3 id="HttpRequest_getPostFields">array HttpRequest::getPostFields()</h3>
-<p>Get previously set POST data.</p>
-<h3 id="HttpRequest_addPostFile">bool HttpRequest::addPostFile(string name, string file[, string content_type = "application/x-octetstream"])</h3>
-<p>Add a file to the POST request.<br />
-Affects only POST requests.</p>
-<h3 id="HttpRequest_setPostFiles">bool HttpRequest::setPostFiles([array post_files])</h3>
-<p>Set files to post.<br />
-Overwrites previously set post files.<br />
-Affects only POST requests.</p>
-<h3 id="HttpRequest_getPostFiles">array HttpRequest::getPostFiles()</h3>
-<p>Get all previously added POST files.</p>
-<h3 id="HttpRequest_setPutFile">bool HttpRequest::setPutFile([string file])</h3>
-<p>Set file to put.<br />
-Affects only PUT requests.</p>
-<h3 id="HttpRequest_getPutFile">string HttpRequest::getPutFile()</h3>
-<p>Get previously set put file.</p>
-<h3 id="HttpRequest_getResponseData">array HttpRequest::getResponseData()</h3>
-<p>Get all response data after the request has been sent.</p>
-<h3 id="HttpRequest_getResponseHeader">mixed HttpRequest::getResponseHeader([string name])</h3>
-<p>Get response header(s) after the request has been sent.</p>
-<h3 id="HttpRequest_getResponseCookie">array HttpRequest::getResponseCookie([string name])</h3>
-<p>Get response cookie(s) after the request has been sent.</p>
-<h3 id="HttpRequest_getResponseBody">string HttpRequest::getResponseBody()</h3>
-<p>Get the response body after the request has been sent.</p>
-<h3 id="HttpRequest_getResponseCode">int HttpRequest::getResponseCode()</h3>
-<p>Get the response code after the request has been sent.</p>
-<h3 id="HttpRequest_getResponseInfo">array HttpRequest::getResponseInfo([string name])</h3>
-<p>Get response info after the request has been sent.<br />
-See http_get() for a full list of returned info.</p>
-<h3 id="HttpRequest_getResponseMessage">HttpMessage HttpRequest::getResponseMessage()</h3>
-<p>Get the full response as HttpMessage object.</p>
-<h3 id="HttpRequest_getRequestMessage">HttpMessage HttpRequest::getRequestMessage()</h3>
-<p>Get sent HTTP message.</p>
-<h3 id="HttpRequest_send">HttpMessage HttpRequest::send()</h3>
-<p>Send the HTTP request.<br />
-<br />
-GET example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br />$r </span><span style="color: #007700">= new </span><span style="color: #0000BB">HttpRequest</span><span style="color: #007700">(</span><span style="color: #DD0000">'http://example.com/feed.rss'</span><span style="color: #007700">, </span><span style="color: #0000BB">HTTP_GET</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">setOptions</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'lastmodified' </span><span style="color: #007700">=> </span><span style="color: #0000BB">filemtime</span><span style="color: #007700">(</span><span style="color: #DD0000">'local.rss'</span><span style="color: #007700">)));<br /></span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">addQueryData</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'category' </span><span style="color: #007700">=> </span><span style="color: #0000BB">3</span><span style="color: #007700">));<br />try {<br /> </span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">send</span><span style="color: #007700">();<br /> if (</span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">getResponseCode</span><span style="color: #007700">() == </span><span style="color: #0000BB">200</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">file_put_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'local.rss'</span><span style="color: #007700">, </span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">getResponseBody</span><span style="color: #007700">());<br /> }<br />} catch (</span><span style="color: #0000BB">HttpException $ex</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">$ex</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote></pre><p>POST example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br />$r </span><span style="color: #007700">= new </span><span style="color: #0000BB">HttpRequest</span><span style="color: #007700">(</span><span style="color: #DD0000">'http://example.com/form.php'</span><span style="color: #007700">, </span><span style="color: #0000BB">HTTP_POST</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">setOptions</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'cookies' </span><span style="color: #007700">=> array(</span><span style="color: #DD0000">'lang' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'de'</span><span style="color: #007700">)));<br /></span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">addPostFields</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'user' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'mike'</span><span style="color: #007700">, </span><span style="color: #DD0000">'pass' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'s3c|r3t'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">addPostFile</span><span style="color: #007700">(</span><span style="color: #DD0000">'image'</span><span style="color: #007700">, </span><span style="color: #DD0000">'profile.jpg'</span><span style="color: #007700">, </span><span style="color: #DD0000">'image/jpeg'</span><span style="color: #007700">);<br />try {<br /> echo </span><span style="color: #0000BB">$r</span><span style="color: #007700">-></span><span style="color: #0000BB">send</span><span style="color: #007700">()-></span><span style="color: #0000BB">getBody</span><span style="color: #007700">();<br />} catch (</span><span style="color: #0000BB">HttpException $ex</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">$ex</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<hr noshade>
-<h1>http_requestpool_object.c</h1>
-<h2 id="HttpRequestPool" class="o">HttpRequestPool</h2>
-<h3 id="HttpRequestPool___construct">void HttpRequestPool::__construct([HttpRequest request[, ...]])</h3>
-<p>Instantiate a new HttpRequestPool object. An HttpRequestPool is<br />
-able to send several HttpRequests in parallel.<br />
-<br />
-Example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">try {<br /> </span><span style="color: #0000BB">$pool </span><span style="color: #007700">= new </span><span style="color: #0000BB">HttpRequestPool</span><span style="color: #007700">(<br /> new </span><span style="color: #0000BB">HttpRequest</span><span style="color: #007700">(</span><span style="color: #DD0000">'http://www.google.com/'</span><span style="color: #007700">, </span><span style="color: #0000BB">HTTP_HEAD</span><span style="color: #007700">),<br /> new </span><span style="color: #0000BB">HttpRequest</span><span style="color: #007700">(</span><span style="color: #DD0000">'http://www.php.net/'</span><span style="color: #007700">, </span><span style="color: #0000BB">HTTP_HEAD</span><span style="color: #007700">)<br /> );<br /> </span><span style="color: #0000BB">$pool</span><span style="color: #007700">-></span><span style="color: #0000BB">send</span><span style="color: #007700">();<br /> foreach(</span><span style="color: #0000BB">$pool </span><span style="color: #007700">as </span><span style="color: #0000BB">$request</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%s is %s (%d)\n"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$request</span><span style="color: #007700">-></span><span style="color: #0000BB">getUrl</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">$request</span><span style="color: #007700">-></span><span style="color: #0000BB">getResponseCode</span><span style="color: #007700">() ? </span><span style="color: #DD0000">'alive' </span><span style="color: #007700">: </span><span style="color: #DD0000">'not alive'</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$request</span><span style="color: #007700">-></span><span style="color: #0000BB">getResponseCode</span><span style="color: #007700">()<br /> );<br /> }<br />} catch (</span><span style="color: #0000BB">HttpException $e</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">$e</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h3 id="HttpRequestPool___destruct">void HttpRequestPool::__destruct()</h3>
-<p>Clean up HttpRequestPool object.</p>
-<h3 id="HttpRequestPool_reset">void HttpRequestPool::reset()</h3>
-<p>Detach all attached HttpRequest objects.</p>
-<h3 id="HttpRequestPool_attach">bool HttpRequestPool::attach(HttpRequest request)</h3>
-<p>Attach an HttpRequest object to this HttpRequestPool.<br />
-NOTE: set all options prior attaching!</p>
-<h3 id="HttpRequestPool_detach">bool HttpRequestPool::detach(HttpRequest request)</h3>
-<p>Detach an HttpRequest object from this HttpRequestPool.</p>
-<h3 id="HttpRequestPool_send">bool HttpRequestPool::send()</h3>
-<p>Send all attached HttpRequest objects in parallel.</p>
-<h3 id="HttpRequestPool_socketPerform">protected bool HttpRequestPool::socketSend()</h3>
-<p>Usage:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br /> </span><span style="color: #007700">while (</span><span style="color: #0000BB">$pool</span><span style="color: #007700">-></span><span style="color: #0000BB">socketPerform</span><span style="color: #007700">()) {<br /> </span><span style="color: #0000BB">do_something_else</span><span style="color: #007700">();<br /> if (!</span><span style="color: #0000BB">$pool</span><span style="color: #007700">-></span><span style="color: #0000BB">socketSelect</span><span style="color: #007700">()) {<br /> die(</span><span style="color: #DD0000">'Socket error'</span><span style="color: #007700">);<br /> }<br /> }<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h3 id="HttpRequestPool_socketSelect">protected bool HttpRequestPool::socketSelect()</h3>
-<p>See HttpRequestPool::socketPerform().</p>
-<h3 id="HttpRequestPool_valid">bool HttpRequestPool::valid()</h3>
-<p>Implements Iterator::valid().</p>
-<h3 id="HttpRequestPool_current">HttpRequest HttpRequestPool::current()</h3>
-<p>Implements Iterator::current().</p>
-<h3 id="HttpRequestPool_key">long HttpRequestPool::key()</h3>
-<p>Implements Iterator::key().</p>
-<h3 id="HttpRequestPool_next">void HttpRequestPool::next()</h3>
-<p>Implements Iterator::next().</p>
-<h3 id="HttpRequestPool_rewind">void HttpRequestPool::rewind()</h3>
-<p>Implements Iterator::rewind().</p>
-<hr noshade>
-<h1>http_response_object.c</h1>
-<h3 id="HttpResponse_setHeader">static bool HttpResponse::setHeader(string name, mixed value[, bool replace = true)</h3>
-<p></p>
-<h3 id="HttpResponse_getHeader">static mixed HttpResponse::getHeader([string name])</h3>
-<p></p>
-<h3 id="HttpResponse_setCache">static bool HttpResponse::setCache(bool cache)</h3>
-<p>Whether it sould be attempted to cache the entitity.<br />
-This will result in necessary caching headers and checks of clients<br />
-"If-Modified-Since" and "If-None-Match" headers. If one of those headers<br />
-matches a "304 Not Modified" status code will be issued.<br />
-<br />
-NOTE: If you're using sessions, be shure that you set session.cache_limiter<br />
-to something more appropriate than "no-cache"!</p>
-<h3 id="HttpResponse_getCache">static bool HttpResponse::getCache()</h3>
-<p>Get current caching setting.</p>
-<h3 id="HttpResponse_setGzip">static bool HttpResponse::setGzip(bool gzip)</h3>
-<p>Enable on-thy-fly gzipping of the sent entity.</p>
-<h3 id="HttpResponse_getGzip">static bool HttpResponse::getGzip()</h3>
-<p>Get current gzipping setting.</p>
-<h3 id="HttpResponse_setCacheControl">static bool HttpResponse::setCacheControl(string control[, long max_age = 0])</h3>
-<p>Set a custom cache-control header, usually being "private" or "public";<br />
-The max_age parameter controls how long the cache entry is valid on the client side.</p>
-<h3 id="HttpResponse_getCacheControl">static string HttpResponse::getCacheControl()</h3>
-<p>Get current Cache-Control header setting.</p>
-<h3 id="HttpResponse_setContentType">static bool HttpResponse::setContentType(string content_type)</h3>
-<p>Set the content-type of the sent entity.</p>
-<h3 id="HttpResponse_getContentType">static string HttpResponse::getContentType()</h3>
-<p>Get current Content-Type header setting.</p>
-<h3 id="HttpResponse_setContentDisposition">static bool HttpResponse::setContentDisposition(string filename[, bool inline = false])</h3>
-<p>Set the Content-Disposition of the sent entity. This setting aims to suggest<br />
-the receiveing user agent how to handle the sent entity; usually the client<br />
-will show the user a "Save As..." popup.</p>
-<h3 id="HttpResponse_getContentDisposition">static string HttpResponse::getContentDisposition()</h3>
-<p>Get current Content-Disposition setting.</p>
-<h3 id="HttpResponse_setETag">static bool HttpResponse::setETag(string etag)</h3>
-<p>Set a custom ETag. Use this only if you know what you're doing.</p>
-<h3 id="HttpResponse_getETag">static string HttpResponse::getETag()</h3>
-<p>Get calculated or previously set custom ETag.</p>
-<h3 id="HttpResponse_setLastModified">static bool HttpResponse::setLastModified(long timestamp)</h3>
-<p>Set a custom Last-Modified date.</p>
-<h3 id="HttpResponse_getLastModified">static HttpResponse::getLastModified()</h3>
-<p>Get calculated or previously set custom Last-Modified date.</p>
-<h3 id="HttpResponse_setThrottleDelay">static bool HttpResponse::setThrottleDelay(double seconds)</h3>
-<p></p>
-<h3 id="HttpResponse_getThrottleDelay">static double HttpResponse::getThrottleDelay()</h3>
-<p></p>
-<h3 id="HttpResponse_setBufferSize">static bool HttpResponse::setBufferSize(long bytes)</h3>
-<p></p>
-<h3 id="HttpResponse_getBufferSize">static long HttpResponse::getBufferSize()</h3>
-<p></p>
-<h3 id="HttpResponse_setData">static bool HttpResponse::setData(string data)</h3>
-<p>Set the data to be sent.</p>
-<h3 id="HttpResponse_getData">static string HttpResponse::getData()</h3>
-<p>Get the previously set data to be sent.</p>
-<h3 id="HttpResponse_setStream">static bool HttpResponse::setStream(resource stream)</h3>
-<p>Set the resource to be sent.</p>
-<h3 id="HttpResponse_getStream">static resource HttpResponse::getStream()</h3>
-<p>Get the previously set resource to be sent.</p>
-<h3 id="HttpResponse_setFile">static bool HttpResponse::setFile(string file)</h3>
-<p>Set the file to be sent.</p>
-<h3 id="HttpResponse_getFile">static string HttpResponse::getFile()</h3>
-<p>Get the previously set file to be sent.</p>
-<h3 id="HttpResponse_send">static bool HttpResponse::send([bool clean_ob = true])</h3>
-<p>Finally send the entity.<br />
-<br />
-Example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br />HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">setCache</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">setContentType</span><span style="color: #007700">(</span><span style="color: #DD0000">'application/pdf'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">setContentDisposition</span><span style="color: #007700">(</span><span style="color: #DD0000">"$user.pdf"</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">setFile</span><span style="color: #007700">(</span><span style="color: #DD0000">'sheet.pdf'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">send</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<h3 id="HttpResponse_capture">static void HttpResponse::capture()</h3>
-<p>Capture script output.<br />
-<br />
-Example:</p><pre><blockquote><code><span style="color: #000000"><br />
-<span style="color: #0000BB"><?php<br />HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">setCache</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">capture</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">// script follows<br />// note that you need to call<br /></span><span style="color: #0000BB">HttpResponse</span><span style="color: #007700">::</span><span style="color: #0000BB">send</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">// at the end of the script unless <br />// you use PHP-5.1 or greater<br /></span><span style="color: #0000BB">?></span><br />
-</span><br />
-</code></blockquote><br />
-<br />
-</pre></p>
-<hr noshade>
- <p><b>Generated at: Fri, 26 Aug 2005 11:08:03 +0000</b></p>
-</body>
-</html>
-
+++ /dev/null
-; example INI file for pecl/http
-; $Id$
-
-[http]
-; enable if you want to transform all errors to exceptions (PHP >= 5 only)
-http.only_exceptions = 0
-
-; the hashing algorithm with wich ETags are generated
-; you can use mhash constants if ext/mhash is enabled, or their
-; literal representation if ext/http was linked against libmhash
-;http.etag_mode = MHASH_TIGER ; same as 7
-http.etag_mode = HTTP_ETAG_MD5
-
-; allowed request methods
-; by default PHP ignores unkown request methods
-; PHP will exit with a response status of 405 and an Allow header
-; if it encounters a request method not contained in the specified list
-;http.allowed_methods = "HEAD, GET, POST"
-
-; log file for positive cache hits
-;http.cache_log =
-
-; log file for redirects
-;http.redirect_log =
-
-; log file for requests with an unallowed request method
-;http.allowed_methods_log =
-
-; composite log file (i.e. log all messages to this file)
-;http.composite_log =
+++ /dev/null
-<?php
-
-function hl($m)
-{
- return sprintf("<blockquote>%s</blockquote>\n", highlight_string($m[1], true));
-}
-function mf($f, &$m)
-{
- return preg_match_all(
- '/\/\* *\{\{\{ *proto (.*?)(\n|$)(.*?)PHP_(?:FUNCTION|METHOD)\((.*?)\)/s',
- file_get_contents($f), $m);
-}
-function ff($t)
-{
- $t = preg_replace('/^ \* /m', '', trim($t, "*/ \n"));
- $t = preg_replace_callback('/(\<\?php.*?\?\>)/s', 'hl', $t);
- $t = nl2br(preg_replace('/\n *\* */', "\n", $t));
- $t = preg_replace('/(\<br \/\>\n)+\<pre\>(\<br \/\>\n)+/', '</p><pre>', $t);
- $t = preg_replace('/(\<br \/\>\n)+\<\/pre\>(\<br \/\>\n)+/', '</pre><p>', $t);
- return sprintf('<p>%s</p>', ltrim($t, ' *'));
-}
-function e($s)
-{
- $a = func_get_args();
- array_unshift($a, STDERR);
- call_user_func_array('fprintf', $a);
-}
-
-$preface = <<<_PREFACE
-<html>
-<head>
- <title>Function Summary of ext/%s</title>
- <style>
- body {
- font-size: 80%%;
- font-family: sans-serif;
- }
- h2, h3 {
- color: #339;
- clear: both;
- font-size: 1.2em;
- background: #ffc;
- padding: .2em;
- }
- h2.o {
- color: #66b;
- clear: both;
- font-size: 1.3em;
- background: #f0f0f0;
- padding: .2em;
- }
- p {
- margin-left: 1em;
- }
- pre {
- font-size: 1.2em;
- }
- br {
- display: none;
- }
- blockquote {
- margin-bottom: 3em;
- border: 1px solid #ccc;
- background: #f0f0f0;
- padding: 0em 1em;
- width: auto;
- float: left;
- }
- p, pre {
- clear: both;
- }
- p br, pre code br {
- display: block;
- }
- </style>
-</head>
-<body>
-_PREFACE;
-
-$footer = <<<_FOOTER
- <p><b>Generated at: %s</b></p>
-</body>
-</html>
-
-_FOOTER;
-
-if ($_SERVER['argc'] < 2) {
- die("Usage: {$_SERVER['argv'][0]} <file>[ <file> ...]\n");
-}
-
-printf($preface, basename(getcwd()));
-
-foreach (array_slice($_SERVER['argv'], 1) as $fp) {
- foreach (glob($fp) as $f) {
-
- if (mf($f, $m)) {
- e("\nAnalyzing %s\n", basename($f));
- printf("<h1>%s</h1>\n", basename($f));
- foreach ($m[1] as $i => $p) {
- e("Documenting $p\n");
- if ($o = preg_match('/^(.*), (.*)$/', $m[4][$i], $n)) {
- if ($n[2] == '__construct') {
- printf("<h2 id=\"%s\" class=\"o\">%s</h2>\n", $n[1], $n[1]);
- }
- }
- printf("<h%d id=\"%s\">%s</h%d>\n%s\n",
- $o?3:2, $o?$n[1].'_'.$n[2]:$m[4][$i], $p, $o?3:2, ff($m[3][$i]));
- }
- print "<hr noshade>\n";
- }
- }
-}
-
-printf($footer, date('r'));
-e("\nDone\n");
-?>
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "SAPI.h"
-#include "php_ini.h"
-#include "ext/standard/info.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_send_api.h"
-#include "php_http_cache_api.h"
-#include "php_http_request_method_api.h"
-#ifdef HTTP_HAVE_CURL
-# include "php_http_request_api.h"
-#endif
-
-#ifdef ZEND_ENGINE_2
-# include "php_http_util_object.h"
-# include "php_http_message_object.h"
-# ifndef WONKY
-# include "php_http_response_object.h"
-# endif
-# ifdef HTTP_HAVE_CURL
-# include "php_http_request_object.h"
-# include "php_http_requestpool_object.h"
-# endif
-# include "php_http_exception_object.h"
-#endif
-
-#include "missing.h"
-#include "phpstr/phpstr.h"
-
-#ifdef HTTP_HAVE_CURL
-# ifdef PHP_WIN32
-# include <winsock2.h>
-# endif
-# include <curl/curl.h>
-#endif
-#ifdef HTTP_HAVE_MHASH
-# include <mhash.h>
-#endif
-
-#include <ctype.h>
-
-ZEND_DECLARE_MODULE_GLOBALS(http);
-HTTP_DECLARE_ARG_PASS_INFO();
-
-#ifdef COMPILE_DL_HTTP
-ZEND_GET_MODULE(http)
-#endif
-
-/* {{{ http_functions[] */
-zend_function_entry http_functions[] = {
- PHP_FE(http_test, NULL)
- PHP_FE(http_date, NULL)
- PHP_FE(http_absolute_uri, NULL)
- PHP_FE(http_negotiate_language, NULL)
- PHP_FE(http_negotiate_charset, NULL)
- PHP_FE(http_redirect, NULL)
- PHP_FE(http_throttle, NULL)
- PHP_FE(http_send_status, NULL)
- PHP_FE(http_send_last_modified, NULL)
- PHP_FE(http_send_content_type, NULL)
- PHP_FE(http_send_content_disposition, NULL)
- PHP_FE(http_match_modified, NULL)
- PHP_FE(http_match_etag, NULL)
- PHP_FE(http_cache_last_modified, NULL)
- PHP_FE(http_cache_etag, NULL)
- PHP_FE(http_send_data, NULL)
- PHP_FE(http_send_file, NULL)
- PHP_FE(http_send_stream, NULL)
- PHP_FE(http_chunked_decode, NULL)
- PHP_FE(http_parse_message, NULL)
- PHP_FE(http_parse_headers, NULL)
- PHP_FE(http_get_request_headers, NULL)
- PHP_FE(http_get_request_body, NULL)
- PHP_FE(http_match_request_header, NULL)
-#ifdef HTTP_HAVE_CURL
- PHP_FE(http_get, http_arg_pass_ref_3)
- PHP_FE(http_head, http_arg_pass_ref_3)
- PHP_FE(http_post_data, http_arg_pass_ref_4)
- PHP_FE(http_post_fields, http_arg_pass_ref_5)
- PHP_FE(http_put_file, http_arg_pass_ref_4)
- PHP_FE(http_put_stream, http_arg_pass_ref_4)
-#endif
- PHP_FE(http_request_method_register, NULL)
- PHP_FE(http_request_method_unregister, NULL)
- PHP_FE(http_request_method_exists, NULL)
- PHP_FE(http_request_method_name, NULL)
-#ifndef ZEND_ENGINE_2
- PHP_FE(http_build_query, NULL)
-#endif
- PHP_FE(ob_etaghandler, NULL)
-
- EMPTY_FUNCTION_ENTRY
-};
-/* }}} */
-
-/* {{{ http_module_entry */
-zend_module_entry http_module_entry = {
-#if ZEND_MODULE_API_NO >= 20010901
- STANDARD_MODULE_HEADER,
-#endif
- "http",
- http_functions,
- PHP_MINIT(http),
- PHP_MSHUTDOWN(http),
- PHP_RINIT(http),
- PHP_RSHUTDOWN(http),
- PHP_MINFO(http),
-#if ZEND_MODULE_API_NO >= 20010901
- HTTP_PEXT_VERSION,
-#endif
- STANDARD_MODULE_PROPERTIES
-};
-/* }}} */
-
-int http_module_number;
-
-/* {{{ http_globals */
-static void http_globals_init_once(zend_http_globals *G)
-{
- memset(G, 0, sizeof(zend_http_globals));
-}
-
-static inline void http_globals_init(zend_http_globals *G)
-{
- G->send.buffer_size = HTTP_SENDBUF_SIZE;
- zend_hash_init(&G->request.methods.custom, 0, NULL, ZVAL_PTR_DTOR, 0);
-#ifdef HTTP_HAVE_CURL
- zend_llist_init(&G->request.copies.strings, sizeof(char *), http_request_data_free_string, 0);
- zend_llist_init(&G->request.copies.slists, sizeof(struct curl_slist *), http_request_data_free_slist, 0);
- zend_llist_init(&G->request.copies.contexts, sizeof(http_request_callback_ctx *), http_request_data_free_context, 0);
- zend_llist_init(&G->request.copies.convs, sizeof(http_request_conv *), http_request_data_free_conv, 0);
-#endif
-}
-
-static inline void http_globals_free(zend_http_globals *G)
-{
- STR_SET(G->send.content_type, NULL);
- STR_SET(G->send.unquoted_etag, NULL);
- zend_hash_destroy(&G->request.methods.custom);
-#ifdef HTTP_HAVE_CURL
- zend_llist_clean(&G->request.copies.strings);
- zend_llist_clean(&G->request.copies.slists);
- zend_llist_clean(&G->request.copies.contexts);
- zend_llist_clean(&G->request.copies.convs);
-#endif
-}
-/* }}} */
-
-/* {{{ static inline void http_check_allowed_methods(char *, int) */
-#define http_check_allowed_methods(m, l) _http_check_allowed_methods((m), (l) TSRMLS_CC)
-static inline void _http_check_allowed_methods(char *methods, int length TSRMLS_DC)
-{
- if (length && SG(request_info).request_method) {
- if (SUCCESS != http_check_method_ex(SG(request_info).request_method, methods)) {
- char *header = emalloc(length + sizeof("Allow: "));
- sprintf(header, "Allow: %s", methods);
- http_exit(405, header);
- }
- }
-}
-/* }}} */
-
-/* {{{ PHP_INI */
-PHP_INI_MH(http_update_allowed_methods)
-{
- http_check_allowed_methods(new_value, new_value_length);
- return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
-}
-
-PHP_INI_DISP(http_etag_mode_displayer)
-{
- long value;
-
- if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
- value = (ini_entry->orig_value) ? atoi(ini_entry->orig_value) : HTTP_ETAG_MD5;
- } else if (ini_entry->value) {
- value = (ini_entry->value[0]) ? atoi(ini_entry->value) : HTTP_ETAG_MD5;
- } else {
- value = HTTP_ETAG_MD5;
- }
-
- switch (value)
- {
- case HTTP_ETAG_CRC32:
- ZEND_WRITE("HTTP_ETAG_CRC32", lenof("HTTP_ETAG_CRC32"));
- break;
-
- case HTTP_ETAG_SHA1:
- ZEND_WRITE("HTTP_ETAG_SHA1", lenof("HTTP_ETAG_SHA1"));
- break;
-
- case HTTP_ETAG_MD5:
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- ZEND_WRITE("HTTP_ETAG_MD5", lenof("HTTP_ETAG_MD5"));
- break;
-
-#ifdef HTTP_HAVE_MHASH
- default:
- {
- const char *hash_name = mhash_get_hash_name_static(value);
-
- if (!hash_name) {
- ZEND_WRITE("HTTP_ETAG_MD5", lenof("HTTP_ETAG_MD5"));
- } else {
- ZEND_WRITE("HTTP_ETAG_MHASH_", lenof("HTTP_ETAG_MHASH_"));
- ZEND_WRITE(hash_name, strlen(hash_name));
- }
- }
- break;
-#endif
- }
-}
-
-#ifndef ZEND_ENGINE_2
-# define OnUpdateLong OnUpdateInt
-#endif
-
-PHP_INI_BEGIN()
- HTTP_PHP_INI_ENTRY("http.allowed_methods", "", PHP_INI_ALL, http_update_allowed_methods, request.methods.allowed)
- HTTP_PHP_INI_ENTRY("http.cache_log", "", PHP_INI_ALL, OnUpdateString, log.cache)
- HTTP_PHP_INI_ENTRY("http.redirect_log", "", PHP_INI_ALL, OnUpdateString, log.redirect)
- HTTP_PHP_INI_ENTRY("http.allowed_methods_log", "", PHP_INI_ALL, OnUpdateString, log.allowed_methods)
- HTTP_PHP_INI_ENTRY("http.composite_log", "", PHP_INI_ALL, OnUpdateString, log.composite)
-#ifdef ZEND_ENGINE_2
- HTTP_PHP_INI_ENTRY("http.only_exceptions", "0", PHP_INI_ALL, OnUpdateBool, only_exceptions)
-#endif
- HTTP_PHP_INI_ENTRY_EX("http.etag_mode", "-2", PHP_INI_ALL, OnUpdateLong, http_etag_mode_displayer, etag.mode)
-PHP_INI_END()
-/* }}} */
-
-/* {{{ PHP_MINIT_FUNCTION */
-PHP_MINIT_FUNCTION(http)
-{
- http_module_number = module_number;
-
- ZEND_INIT_MODULE_GLOBALS(http, http_globals_init_once, NULL)
-
- REGISTER_INI_ENTRIES();
-
- if (SUCCESS != http_cache_global_init()) {
- return FAILURE;
- }
- if (SUCCESS != http_request_method_global_init()) {
- return FAILURE;
- }
-#ifdef HTTP_HAVE_CURL
- if (SUCCESS != http_request_global_init()) {
- return FAILURE;
- }
-#endif /* HTTP_HAVE_CURL */
-
-#ifdef ZEND_ENGINE_2
- http_util_object_init();
- http_message_object_init();
-# ifndef WONKY
- http_response_object_init();
-# endif
-# ifdef HTTP_HAVE_CURL
- http_request_object_init();
- http_requestpool_object_init();
-# endif /* HTTP_HAVE_CURL */
- http_exception_object_init();
-#endif /* ZEND_ENGINE_2 */
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ PHP_MSHUTDOWN_FUNCTION */
-PHP_MSHUTDOWN_FUNCTION(http)
-{
- UNREGISTER_INI_ENTRIES();
-#ifdef HTTP_HAVE_CURL
- http_request_global_cleanup();
-#endif
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ PHP_RINIT_FUNCTION */
-PHP_RINIT_FUNCTION(http)
-{
- char *m;
-
- if (m = INI_STR("http.allowed_methods")) {
- http_check_allowed_methods(m, strlen(m));
- }
-
- http_globals_init(HTTP_GLOBALS);
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ PHP_RSHUTDOWN_FUNCTION */
-PHP_RSHUTDOWN_FUNCTION(http)
-{
-#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
- int i, c = zend_hash_num_elements(&HTTP_G(request).methods.custom);
-
- for (i = 0; i < c; ++i) {
- http_request_method_unregister(HTTP_MAX_REQUEST_METHOD + i);
- }
-#endif
- http_globals_free(HTTP_GLOBALS);
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ PHP_MINFO_FUNCTION */
-PHP_MINFO_FUNCTION(http)
-{
- php_info_print_table_start();
- {
- php_info_print_table_row(2, "Extended HTTP support", "enabled");
- php_info_print_table_row(2, "Extension Version", HTTP_PEXT_VERSION);
-#ifdef HTTP_HAVE_CURL
- php_info_print_table_row(2, "cURL HTTP Requests", curl_version());
-#else
- php_info_print_table_row(2, "cURL HTTP Requests", "disabled");
-#endif
-#ifdef HTTP_HAVE_MHASH
- {
- char mhash_info[32];
-
- snprintf(mhash_info, 32, "libmhash/%d", MHASH_API_VERSION);
- php_info_print_table_row(2, "mhash ETag Generator", mhash_info);
- }
-#else
- php_info_print_table_row(2, "mhash ETag Generator", "disabled");
-#endif
-#if defined(HTTP_HAVE_MAGIC) && !defined(WONKY)
- php_info_print_table_row(2, "magic MIME Guessing", "libmagic/unknown");
-#else
- php_info_print_table_row(2, "magic MIME Guessing", "disabled");
-#endif
- php_info_print_table_row(2, "Registered Classes",
-#ifndef ZEND_ENGINE_2
- "none"
-#else
- "HttpUtil, "
- "HttpMessage, "
-# ifdef HTTP_HAVE_CURL
- "HttpRequest, "
- "HttpRequestPool, "
-# endif
-# ifndef WONKY
- "HttpResponse"
-# endif
-#endif
- );
- }
- php_info_print_table_end();
-
- php_info_print_table_start();
- php_info_print_table_colspan_header(2, "Supported ETag Hash Algorithms");
- {
-
- php_info_print_table_row(2, "PHP", "CRC32, MD5, SHA1");
-#ifdef HTTP_HAVE_MHASH
- {
- phpstr *algos = phpstr_new();
- int i, c = mhash_count();
-
- for (i = 0; i <= c; ++i) {
- const char *hash = mhash_get_hash_name_static(i);
-
- if (hash) {
- phpstr_appendf(algos, "%s, ", hash);
- }
- }
- phpstr_fix(algos);
- php_info_print_table_row(2, "MHASH", PHPSTR_VAL(algos));
- phpstr_free(&algos);
- }
-#else
- php_info_print_table_row(2, "MHASH", "not available");
-#endif
- }
- php_info_print_table_end();
-
- php_info_print_table_start();
- php_info_print_table_colspan_header(2, "Request Methods");
- {
- unsigned i;
- zval **custom_method;
- phpstr *known_request_methods = phpstr_new();
- phpstr *custom_request_methods = phpstr_new();
-
- for (i = HTTP_NO_REQUEST_METHOD+1; i < HTTP_MAX_REQUEST_METHOD; ++i) {
- phpstr_appendl(known_request_methods, http_request_method_name(i));
- phpstr_appends(known_request_methods, ", ");
- }
- FOREACH_HASH_VAL(&HTTP_G(request).methods.custom, custom_method) {
- phpstr_append(custom_request_methods, Z_STRVAL_PP(custom_method), Z_STRLEN_PP(custom_method));
- phpstr_appends(custom_request_methods, ", ");
- }
-
- phpstr_append(known_request_methods, PHPSTR_VAL(custom_request_methods), PHPSTR_LEN(custom_request_methods));
- phpstr_fix(known_request_methods);
- phpstr_fix(custom_request_methods);
-
- php_info_print_table_row(2, "Known", PHPSTR_VAL(known_request_methods));
- php_info_print_table_row(2, "Custom",
- PHPSTR_LEN(custom_request_methods) ? PHPSTR_VAL(custom_request_methods) : "none registered");
- php_info_print_table_row(2, "Allowed", strlen(HTTP_G(request).methods.allowed) ? HTTP_G(request).methods.allowed : "(ANY)");
-
- phpstr_free(&known_request_methods);
- phpstr_free(&custom_request_methods);
- }
- php_info_print_table_end();
-
- DISPLAY_INI_ENTRIES();
-}
-/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-# Microsoft Developer Studio Project File - Name="http" - Package Owner=<4>\r
-# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
-# ** DO NOT EDIT **\r
-\r
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102\r
-\r
-CFG=http - Win32 Release_TS\r
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
-!MESSAGE use the Export Makefile command and run\r
-!MESSAGE \r
-!MESSAGE NMAKE /f "http.mak".\r
-!MESSAGE \r
-!MESSAGE You can specify a configuration when running NMAKE\r
-!MESSAGE by defining the macro CFG on the command line. For example:\r
-!MESSAGE \r
-!MESSAGE NMAKE /f "http.mak" CFG="http - Win32 Release_TS"\r
-!MESSAGE \r
-!MESSAGE Possible choices for configuration are:\r
-!MESSAGE \r
-!MESSAGE "http - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")\r
-!MESSAGE "http - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")\r
-!MESSAGE \r
-\r
-# Begin Project\r
-# PROP AllowPerConfigDependencies 0\r
-# PROP Scc_ProjName ""\r
-# PROP Scc_LocalPath ""\r
-CPP=cl.exe\r
-MTL=midl.exe\r
-RSC=rc.exe\r
-\r
-!IF "$(CFG)" == "http - Win32 Release_TS"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "Release_TS"\r
-# PROP BASE Intermediate_Dir "Release_TS"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "Release_TS"\r
-# PROP Intermediate_Dir "Release_TS"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_HTTP" /D ZTS=1 /YX /FD /c\r
-# ADD CPP /nologo /Gd /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HTTP_EXPORTS" /D "COMPILE_DL_HTTP" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_HTTP=1 /D HTTP_HAVE_CURL=1 /D "_WINSOCKAPI_=" /FR /YX /FD /c\r
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
-# ADD BASE RSC /l 0x406 /d "NDEBUG"\r
-# ADD RSC /l 0x406 /d "NDEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386\r
-# ADD LINK32 libcurl.lib ssleay32.lib libeay32.lib zlib.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib wsock32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_http.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" /libpath:"..\..\..\php_build\curl\lib" /libpath:"..\..\..\php4\Release_TS" /libpath:"..\..\..\php4\Release_TS_Inline"\r
-\r
-!ELSEIF "$(CFG)" == "http - Win32 Debug_TS"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "Debug_TS"\r
-# PROP BASE Intermediate_Dir "Debug_TS"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "Debug_TS"\r
-# PROP Intermediate_Dir "Debug_TS"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_HTTP" /D ZTS=1 /YX /FD /c\r
-# ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HTTP_EXPORTS" /D "COMPILE_DL_HTTP" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_HTTP=1 /D HTTP_HAVE_CURL=1 /D "_WINSOCKAPI_=" /YX /FD /c\r
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
-# ADD BASE RSC /l 0x406 /d "NDEBUG"\r
-# ADD RSC /l 0x406 /d "NDEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386\r
-# ADD LINK32 libcurl.lib ssleay32.lib libeay32.lib zlib.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib wsock32.lib /nologo /dll /machine:I386 /out:"..\..\Debug_TS/http.dll" /libpath:"..\..\Debug_TS" /libpath:"..\..\..\php_build\curl\lib" /libpath:"..\..\..\php4\Release_TS" /libpath:"..\..\..\php4\Release_TS_Inline"\r
-\r
-!ENDIF \r
-\r
-# Begin Target\r
-\r
-# Name "http - Win32 Release_TS"\r
-# Name "http - Win32 Debug_TS"\r
-# Begin Group "Source Files"\r
-\r
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
-# Begin Source File\r
-\r
-SOURCE=.\http.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_request_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_request_method_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_functions.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_cache_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_date_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_headers_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_message_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_send_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_url_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\http_info_api.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\phpstr\phpstr.c\r
-# End Source File\r
-# End Group\r
-# Begin Group "Header Files"\r
-\r
-# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_request_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_request_method_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_cache_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_date_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_message_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_send_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_headers_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_url_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_info_api.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\php_http_std_defs.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\phpstr\phpstr.h\r
-# End Source File\r
-# End Group\r
-# Begin Group "Resource Files"\r
-\r
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
-# End Group\r
-# End Target\r
-# End Project\r
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "SAPI.h"
-#include "ext/standard/url.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_headers_api.h"
-#include "php_http_send_api.h"
-
-#ifdef ZEND_ENGINE_2
-# include "zend_exceptions.h"
-# include "php_http_exception_object.h"
-#endif
-
-#include <ctype.h>
-
-#ifdef HTTP_HAVE_MAGIC
-# if defined(PHP_WIN32) && !defined(USE_MAGIC_DLL) && !defined(USE_MAGIC_STATIC)
-# define USE_MAGIC_STATIC
-# endif
-# include <magic.h>
-#endif
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-/* char *pretty_key(char *, size_t, zend_bool, zend_bool) */
-char *_http_pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool xhyphen)
-{
- if (key && key_len) {
- size_t i;
- int wasalpha;
- if (wasalpha = isalpha((int) key[0])) {
- key[0] = (char) (uctitle ? toupper((int) key[0]) : tolower((int) key[0]));
- }
- for (i = 1; i < key_len; i++) {
- if (isalpha((int) key[i])) {
- key[i] = (char) (((!wasalpha) && uctitle) ? toupper((int) key[i]) : tolower((int) key[i]));
- wasalpha = 1;
- } else {
- if (xhyphen && (key[i] == '_')) {
- key[i] = '-';
- }
- wasalpha = 0;
- }
- }
- }
- return key;
-}
-/* }}} */
-
-/* {{{ */
-void _http_key_list_default_decoder(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC)
-{
- *decoded = estrndup(encoded, encoded_len);
- *decoded_len = (size_t) php_url_decode(*decoded, encoded_len);
-}
-/* }}} */
-
-/* {{{ */
-STATUS _http_parse_key_list(const char *list, HashTable *items, char separator, http_key_list_decode_t decode, zend_bool first_entry_is_name_value_pair TSRMLS_DC)
-{
- const char *key = list, *val = NULL;
- int vallen = 0, keylen = 0, done = 0;
- zval array;
-
- INIT_ZARR(array, items);
-
- if (!(val = strchr(list, '='))) {
- return FAILURE;
- }
-
-#define HTTP_KEYLIST_VAL(array, k, str, len) \
- { \
- char *decoded; \
- size_t decoded_len; \
- if (decode) { \
- decode(str, len, &decoded, &decoded_len TSRMLS_CC); \
- } else { \
- decoded_len = len; \
- decoded = estrndup(str, decoded_len); \
- } \
- add_assoc_stringl(array, k, decoded, decoded_len, 0); \
- }
-#define HTTP_KEYLIST_FIXKEY() \
- { \
- while (isspace(*key)) ++key; \
- keylen = val - key; \
- while (isspace(key[keylen - 1])) --keylen; \
- }
-#define HTTP_KEYLIST_FIXVAL() \
- { \
- ++val; \
- while (isspace(*val)) ++val; \
- vallen = key - val; \
- while (isspace(val[vallen - 1])) --vallen; \
- }
-
- HTTP_KEYLIST_FIXKEY();
-
- if (first_entry_is_name_value_pair) {
- HTTP_KEYLIST_VAL(&array, "name", key, keylen);
-
- /* just one name=value */
- if (!(key = strchr(val, separator))) {
- key = val + strlen(val);
- HTTP_KEYLIST_FIXVAL();
- HTTP_KEYLIST_VAL(&array, "value", val, vallen);
- return SUCCESS;
- }
- /* additional info appended */
- else {
- HTTP_KEYLIST_FIXVAL();
- HTTP_KEYLIST_VAL(&array, "value", val, vallen);
- }
- }
-
- do {
- char *keydup = NULL;
-
- if (!(val = strchr(key, '='))) {
- break;
- }
-
- /* start at 0 if first_entry_is_name_value_pair==0 */
- if (zend_hash_num_elements(items)) {
- ++key;
- }
-
- HTTP_KEYLIST_FIXKEY();
- keydup = estrndup(key, keylen);
- if (!(key = strchr(val, separator))) {
- done = 1;
- key = val + strlen(val);
- }
- HTTP_KEYLIST_FIXVAL();
- HTTP_KEYLIST_VAL(&array, keydup, val, vallen);
- efree(keydup);
- } while (!done);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ void http_error(long, long, char*) */
-void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...)
-{
- va_list args;
-
- va_start(args, format);
-#ifdef ZEND_ENGINE_2
- if ((type == E_THROW) || (PG(error_handling) == EH_THROW)) {
- char *message;
-
- vspprintf(&message, 0, format, args);
- zend_throw_exception(http_exception_get_for_code(code), message, code TSRMLS_CC);
- } else
-#endif
- php_verror(NULL, "", type, format, args TSRMLS_CC);
- va_end(args);
-}
-/* }}} */
-
-/* {{{ void http_log(char *, char *, char *) */
-void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC)
-{
- time_t now;
- struct tm nowtm;
- char datetime[128];
-
- time(&now);
- strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", php_localtime_r(&now, &nowtm));
-
-#define HTTP_LOG_WRITE(file, type, msg) \
- if (file && strlen(file)) { \
- php_stream *log = php_stream_open_wrapper(file, "ab", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); \
- \
- if (log) { \
- php_stream_printf(log TSRMLS_CC, "%s\t[%s]\t%s\t<%s>%s", datetime, type, msg, SG(request_info).request_uri, PHP_EOL); \
- php_stream_close(log); \
- } \
- \
- }
-
- HTTP_LOG_WRITE(file, ident, message);
- HTTP_LOG_WRITE(HTTP_G(log).composite, ident, message);
-}
-/* }}} */
-
-/* {{{ STATUS http_exit(int, char*, char*) */
-STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header TSRMLS_DC)
-{
- if (status || send_header) {
- if (SUCCESS != http_send_status_header(status, send_header ? header : NULL)) {
- http_error_ex(HE_WARNING, HTTP_E_HEADER, "Failed to exit with status/header: %d - %s", status, header ? header : "");
- STR_FREE(header);
- STR_FREE(body);
- return FAILURE;
- }
- }
-
- if (body) {
- PHPWRITE(body, strlen(body));
- }
-
- switch (status)
- {
- case 301: http_log(HTTP_G(log).redirect, "301-REDIRECT", header); break;
- case 302: http_log(HTTP_G(log).redirect, "302-REDIRECT", header); break;
- case 304: http_log(HTTP_G(log).cache, "304-CACHE", header); break;
- case 405: http_log(HTTP_G(log).allowed_methods, "405-ALLOWED", header); break;
- default: http_log(NULL, header, body); break;
- }
-
- STR_FREE(header);
- STR_FREE(body);
-
- zend_bailout();
- /* fake */
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ STATUS http_check_method(char *) */
-STATUS _http_check_method_ex(const char *method, const char *methods)
-{
- const char *found;
-
- if ( (found = strstr(methods, method)) &&
- (found == method || !isalpha(found[-1])) &&
- (!isalpha(found[strlen(method) + 1]))) {
- return SUCCESS;
- }
- return FAILURE;
-}
-/* }}} */
-
-/* {{{ zval *http_get_server_var_ex(char *, size_t) */
-PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_size, zend_bool check TSRMLS_DC)
-{
- zval **hsv;
- zval **var;
-
- if (SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &hsv)) {
- return NULL;
- }
- if (SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_size, (void **) &var)) {
- return NULL;
- }
- if (check && !(Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) {
- return NULL;
- }
- return *var;
-}
-/* }}} */
-
-/* {{{ STATUS http_get_request_body(char **, size_t *) */
-PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_bool dup TSRMLS_DC)
-{
- *length = 0;
- *body = NULL;
-
- if (SG(request_info).raw_post_data) {
- *length = SG(request_info).raw_post_data_length;
- *body = (char *) (dup ? estrndup(SG(request_info).raw_post_data, *length) : SG(request_info).raw_post_data);
- return SUCCESS;
- }
- return FAILURE;
-}
-/* }}} */
-
-/* {{{ char *http_chunked_decode(char *, size_t, char **, size_t *) */
-PHP_HTTP_API const char *_http_chunked_decode(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC)
-{
- const char *e_ptr;
- char *d_ptr;
- long rest;
-
- *decoded_len = 0;
- *decoded = ecalloc(1, encoded_len);
- d_ptr = *decoded;
- e_ptr = encoded;
-
- while ((rest = encoded + encoded_len - e_ptr) > 0) {
- long chunk_len = 0;
- int EOL_len = 0, eol_mismatch = 0;
- char *n_ptr;
-
- chunk_len = strtol(e_ptr, &n_ptr, 16);
-
- /* check if:
- * - we could not read in chunk size
- * - we got a negative chunk size
- * - chunk size is greater then remaining size
- * - chunk size is not followed by (CR)LF|NUL
- */
- if ( (n_ptr == e_ptr) || (chunk_len < 0) || (chunk_len > rest) ||
- (*n_ptr && (eol_mismatch = (n_ptr != http_locate_eol(e_ptr, &EOL_len))))) {
- /* don't fail on apperently not encoded data */
- if (e_ptr == encoded) {
- memcpy(*decoded, encoded, encoded_len);
- *decoded_len = encoded_len;
- return encoded + encoded_len;
- } else {
- efree(*decoded);
- if (eol_mismatch) {
- if (EOL_len == 2) {
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Invalid character (expected 0x0D 0x0A; got: 0x%X 0x%X)", *n_ptr, *(n_ptr + 1));
- } else {
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Invalid character (expected 0x0A; got: 0x%X)", *n_ptr);
- }
- } else {
- char *error = estrndup(n_ptr, strcspn(n_ptr, "\r\n "));
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Invalid chunk size: '%s' at pos %d", error, n_ptr - encoded);
- efree(error);
- }
- return NULL;
- }
- } else {
- e_ptr = n_ptr;
- }
-
- /* reached the end */
- if (!chunk_len) {
- break;
- }
-
- memcpy(d_ptr, e_ptr += EOL_len, chunk_len);
- d_ptr += chunk_len;
- e_ptr += chunk_len + EOL_len;
- *decoded_len += chunk_len;
- }
-
- return e_ptr;
-}
-/* }}} */
-
-/* {{{ char *http_guess_content_type(char *magic_file, long magic_mode, void *data, size_t size, http_send_mode mode) */
-PHP_HTTP_API char *_http_guess_content_type(const char *magicfile, long magicmode, void *data_ptr, size_t data_len, http_send_mode data_mode TSRMLS_DC)
-{
- char *ct = NULL;
-
-#ifdef HTTP_HAVE_MAGIC
- /* magic_load() fails if MAGIC_MIME is set because it
- cowardly adds .mime to the file name */
- struct magic_set *magic = magic_open(magicmode &~ MAGIC_MIME);
-
- if (!magic) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid magic mode: %ld", magicmode);
- } else if (-1 == magic_load(magic, magicfile)) {
- http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Failed to load magic database '%s' (%s)", magicfile, magic_error(magic));
- } else {
- const char *ctype = NULL;
-
- magic_setflags(magic, magicmode);
-
- switch (data_mode)
- {
- case SEND_RSRC:
- {
- char *buffer;
- size_t b_len;
-
- b_len = php_stream_copy_to_mem(data_ptr, &buffer, 65536, 0);
- ctype = magic_buffer(magic, buffer, b_len);
- efree(buffer);
- }
- break;
-
- case SEND_DATA:
- ctype = magic_buffer(magic, data_ptr, data_len);
- break;
-
- default:
- ctype = magic_file(magic, data_ptr);
- break;
- }
-
- if (ctype) {
- ct = estrdup(ctype);
- } else {
- http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Failed to guess Content-Type: %s", magic_error(magic));
- }
- }
- if (magic) {
- magic_close(magic);
- }
-#else
- http_error(HE_WARNING, HTTP_E_RUNTIME, "Cannot guess Content-Type; libmagic not available");
-#endif
-
- return ct;
-}
-/* }}} */
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "SAPI.h"
-#include "php_streams.h"
-#include "php_output.h"
-#include "ext/standard/md5.h"
-#include "ext/standard/sha1.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_cache_api.h"
-#include "php_http_send_api.h"
-#include "php_http_date_api.h"
-
-#ifdef HTTP_HAVE_MHASH
-# include <mhash.h>
-#endif
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-STATUS _http_cache_global_init(INIT_FUNC_ARGS)
-{
- HTTP_LONG_CONSTANT("HTTP_ETAG_MD5", HTTP_ETAG_MD5);
- HTTP_LONG_CONSTANT("HTTP_ETAG_SHA1", HTTP_ETAG_SHA1);
- HTTP_LONG_CONSTANT("HTTP_ETAG_CRC32", HTTP_ETAG_CRC32);
-
-#ifdef HTTP_HAVE_MHASH
- {
- int l, i, c = mhash_count();
-
- for (i = 0; i <= c; ++i) {
- char const_name[256] = {0};
- const char *hash_name = mhash_get_hash_name_static(i);
-
- if (hash_name) {
- l = snprintf(const_name, 255, "HTTP_ETAG_MHASH_%s", hash_name);
- zend_register_long_constant(const_name, l + 1, i, CONST_CS|CONST_PERSISTENT, module_number TSRMLS_CC);
- }
- }
- }
-#endif
-
- return SUCCESS;
-}
-
-/* {{{ char *http_etag(void *, size_t, http_send_mode) */
-PHP_HTTP_API char *_http_etag(const void *data_ptr, size_t data_len, http_send_mode data_mode TSRMLS_DC)
-{
- php_stream_statbuf ssb;
- char ssb_buf[128] = {0};
- size_t ssb_len;
- void *ctx = http_etag_init();
-
- switch (data_mode)
- {
- case SEND_DATA:
- http_etag_update(ctx, data_ptr, data_len);
- break;
-
- case SEND_RSRC:
- {
- if (php_stream_stat((php_stream *) data_ptr, &ssb)) {
- efree(ctx);
- return NULL;
- }
- ssb_len = snprintf(ssb_buf, 127, "%ld=%ld=%ld", ssb.sb.st_mtime, ssb.sb.st_ino, ssb.sb.st_size);
- http_etag_update(ctx, ssb_buf, ssb_len);
- }
- break;
-
- default:
- {
- if (php_stream_stat_path((char *) data_ptr, &ssb)) {
- efree(ctx);
- return NULL;
- }
- ssb_len = snprintf(ssb_buf, 127, "%ld=%ld=%ld", ssb.sb.st_mtime, ssb.sb.st_ino, ssb.sb.st_size);
- http_etag_update(ctx, ssb_buf, ssb_len);
- }
- break;
- }
-
- return http_etag_finish(ctx);
-}
-/* }}} */
-
-/* {{{ time_t http_last_modified(void *, http_send_mode) */
-PHP_HTTP_API time_t _http_last_modified(const void *data_ptr, http_send_mode data_mode TSRMLS_DC)
-{
- php_stream_statbuf ssb;
-
- switch (data_mode)
- {
- case SEND_DATA: return time(NULL);
- case SEND_RSRC: return php_stream_stat((php_stream *) data_ptr, &ssb) ? 0 : ssb.sb.st_mtime;
- default: return php_stream_stat_path((char *) data_ptr, &ssb) ? 0 : ssb.sb.st_mtime;
- }
-}
-/* }}} */
-
-/* {{{ zend_bool http_match_last_modified(char *, time_t) */
-PHP_HTTP_API zend_bool _http_match_last_modified_ex(const char *entry, time_t t, zend_bool enforce_presence TSRMLS_DC)
-{
- zend_bool retval;
- zval *zmodified;
- char *modified, *chr_ptr;
-
- HTTP_GSC(zmodified, entry, !enforce_presence);
-
- modified = estrndup(Z_STRVAL_P(zmodified), Z_STRLEN_P(zmodified));
- if (chr_ptr = strrchr(modified, ';')) {
- chr_ptr = 0;
- }
- retval = (t <= http_parse_date(modified));
- efree(modified);
- return retval;
-}
-/* }}} */
-
-/* {{{ zend_bool http_match_etag(char *, char *) */
-PHP_HTTP_API zend_bool _http_match_etag_ex(const char *entry, const char *etag, zend_bool enforce_presence TSRMLS_DC)
-{
- zval *zetag;
- char *quoted_etag;
- zend_bool result;
-
- HTTP_GSC(zetag, entry, !enforce_presence);
-
- if (NULL != strchr(Z_STRVAL_P(zetag), '*')) {
- return 1;
- }
-
- quoted_etag = (char *) emalloc(strlen(etag) + 3);
- sprintf(quoted_etag, "\"%s\"", etag);
-
- if (!strchr(Z_STRVAL_P(zetag), ',')) {
- result = !strcmp(Z_STRVAL_P(zetag), quoted_etag);
- } else {
- result = (NULL != strstr(Z_STRVAL_P(zetag), quoted_etag));
- }
- efree(quoted_etag);
- return result;
-}
-/* }}} */
-
-/* {{{ STATUS http_cache_last_modified(time_t, time_t, char *, size_t) */
-PHP_HTTP_API STATUS _http_cache_last_modified(time_t last_modified,
- time_t send_modified, const char *cache_control, size_t cc_len TSRMLS_DC)
-{
- char *sent_header = NULL;
-
- if (cc_len && (SUCCESS != http_send_cache_control(cache_control, cc_len))) {
- return FAILURE;
- }
-
- if (SUCCESS != http_send_last_modified_ex(send_modified, &sent_header)) {
- return FAILURE;
- }
-
- if (http_match_last_modified("HTTP_IF_MODIFIED_SINCE", last_modified)) {
- http_exit_ex(304, sent_header, NULL, 0);
- } else {
- STR_FREE(sent_header);
- }
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ STATUS http_cache_etag(char *, size_t, char *, size_t) */
-PHP_HTTP_API STATUS _http_cache_etag(const char *etag, size_t etag_len,
- const char *cache_control, size_t cc_len TSRMLS_DC)
-{
- char *sent_header = NULL;
-
- if (cc_len && (SUCCESS != http_send_cache_control(cache_control, cc_len))) {
- return FAILURE;
- }
-
- if (etag_len) {
- if (SUCCESS != http_send_etag_ex(etag, etag_len, &sent_header)) {
- return FAILURE;
- }
- if (http_match_etag("HTTP_IF_NONE_MATCH", etag)) {
- http_exit_ex(304, sent_header, NULL, 0);
- } else {
- STR_FREE(sent_header);
- }
- return SUCCESS;
- }
-
- /* if no etag is given and we didn't already start ob_etaghandler -- start it */
- if (HTTP_G(etag).started) {
- return SUCCESS;
- }
-
- if (HTTP_G(etag).started = (SUCCESS == php_start_ob_buffer_named("ob_etaghandler", HTTP_SENDBUF_SIZE, 1 TSRMLS_CC))) {
- return SUCCESS;
- } else {
- return FAILURE;
- }
-}
-/* }}} */
-
-/* {{{ void http_ob_etaghandler(char *, uint, char **, uint *, int) */
-PHP_HTTP_API void _http_ob_etaghandler(char *output, uint output_len,
- char **handled_output, uint *handled_output_len, int mode TSRMLS_DC)
-{
- if (mode & PHP_OUTPUT_HANDLER_START) {
- if (HTTP_G(etag).started) {
- http_error(HE_WARNING, HTTP_E_RUNTIME, "ob_etaghandler can only be used once");
- return;
- }
- HTTP_G(etag).started = 1;
- HTTP_G(etag).ctx = http_etag_init();
- }
-
- http_etag_update(HTTP_G(etag).ctx, output, output_len);
-
- if (mode & PHP_OUTPUT_HANDLER_END) {
- char *etag = http_etag_finish(HTTP_G(etag).ctx);
-
- /* just do that if desired */
- if (HTTP_G(etag).started) {
- char *sent_header = NULL;
-
- http_send_cache_control(HTTP_DEFAULT_CACHECONTROL, lenof(HTTP_DEFAULT_CACHECONTROL));
- http_send_etag_ex(etag, strlen(etag), &sent_header);
-
- if (http_match_etag("HTTP_IF_NONE_MATCH", etag)) {
- efree(etag);
- http_exit_ex(304, sent_header, NULL, 0);
- } else {
- STR_FREE(sent_header);
- }
- }
- efree(etag);
- }
-
- *handled_output_len = output_len;
- *handled_output = estrndup(output, output_len);
-}
-/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-
-#include <ctype.h>
-
-static int check_day(char *day, size_t len);
-static int check_month(char *month);
-static int check_tzone(char *tzone);
-
-/* {{{ day/month names */
-static const char *days[] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-};
-static const char *wkdays[] = {
- "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
-};
-static const char *weekdays[] = {
- "Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday", "Sunday"
-};
-static const char *months[] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
-};
-enum assume_next {
- DATE_MDAY,
- DATE_YEAR,
- DATE_TIME
-};
-static const struct time_zone {
- const char *name;
- const int offset;
-} time_zones[] = {
- {"GMT", 0}, /* Greenwich Mean */
- {"UTC", 0}, /* Universal (Coordinated) */
- {"WET", 0}, /* Western European */
- {"BST", 0}, /* British Summer */
- {"WAT", 60}, /* West Africa */
- {"AST", 240}, /* Atlantic Standard */
- {"ADT", 240}, /* Atlantic Daylight */
- {"EST", 300}, /* Eastern Standard */
- {"EDT", 300}, /* Eastern Daylight */
- {"CST", 360}, /* Central Standard */
- {"CDT", 360}, /* Central Daylight */
- {"MST", 420}, /* Mountain Standard */
- {"MDT", 420}, /* Mountain Daylight */
- {"PST", 480}, /* Pacific Standard */
- {"PDT", 480}, /* Pacific Daylight */
- {"YST", 540}, /* Yukon Standard */
- {"YDT", 540}, /* Yukon Daylight */
- {"HST", 600}, /* Hawaii Standard */
- {"HDT", 600}, /* Hawaii Daylight */
- {"CAT", 600}, /* Central Alaska */
- {"AHST", 600}, /* Alaska-Hawaii Standard */
- {"NT", 660}, /* Nome */
- {"IDLW", 720}, /* International Date Line West */
- {"CET", -60}, /* Central European */
- {"MET", -60}, /* Middle European */
- {"MEWT", -60}, /* Middle European Winter */
- {"MEST", -120}, /* Middle European Summer */
- {"CEST", -120}, /* Central European Summer */
- {"MESZ", -60}, /* Middle European Summer */
- {"FWT", -60}, /* French Winter */
- {"FST", -60}, /* French Summer */
- {"EET", -120}, /* Eastern Europe, USSR Zone 1 */
- {"WAST", -420}, /* West Australian Standard */
- {"WADT", -420}, /* West Australian Daylight */
- {"CCT", -480}, /* China Coast, USSR Zone 7 */
- {"JST", -540}, /* Japan Standard, USSR Zone 8 */
- {"EAST", -600}, /* Eastern Australian Standard */
- {"EADT", -600}, /* Eastern Australian Daylight */
- {"GST", -600}, /* Guam Standard, USSR Zone 9 */
- {"NZT", -720}, /* New Zealand */
- {"NZST", -720}, /* New Zealand Standard */
- {"NZDT", -720}, /* New Zealand Daylight */
- {"IDLE", -720}, /* International Date Line East */
-};
-/* }}} */
-
-/* {{{ Day/Month/TZ checks for http_parse_date()
- Originally by libcurl, Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. */
-static int check_day(char *day, size_t len)
-{
- int i;
- const char * const *check = (len > 3) ? &weekdays[0] : &wkdays[0];
- for (i = 0; i < 7; i++) {
- if (!strcmp(day, check[0])) {
- return i;
- }
- check++;
- }
- return -1;
-}
-
-static int check_month(char *month)
-{
- int i;
- const char * const *check = &months[0];
- for (i = 0; i < 12; i++) {
- if (!strcmp(month, check[0])) {
- return i;
- }
- check++;
- }
- return -1;
-}
-
-/* return the time zone offset between GMT and the input one, in number
- of seconds or -1 if the timezone wasn't found/legal */
-
-static int check_tzone(char *tzone)
-{
- unsigned i;
- const struct time_zone *check = time_zones;
- for (i = 0; i < sizeof(time_zones) / sizeof(time_zones[0]); i++) {
- if (!strcmp(tzone, check->name)) {
- return check->offset * 60;
- }
- check++;
- }
- return -1;
-}
-/* }}} */
-
-/* {{{ char *http_date(time_t) */
-PHP_HTTP_API char *_http_date(time_t t TSRMLS_DC)
-{
- struct tm *gmtime, tmbuf;
-
- if (gmtime = php_gmtime_r(&t, &tmbuf)) {
- char *date = ecalloc(1, 31);
- snprintf(date, 30,
- "%s, %02d %s %04d %02d:%02d:%02d GMT",
- days[gmtime->tm_wday], gmtime->tm_mday,
- months[gmtime->tm_mon], gmtime->tm_year + 1900,
- gmtime->tm_hour, gmtime->tm_min, gmtime->tm_sec
- );
- return date;
- }
-
- return NULL;
-}
-/* }}} */
-
-/* {{{ time_t http_parse_date(char *)
- Originally by libcurl, Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. */
-PHP_HTTP_API time_t _http_parse_date(const char *date)
-{
- time_t t = 0;
- int tz_offset = -1, year = -1, month = -1, monthday = -1, weekday = -1,
- hours = -1, minutes = -1, seconds = -1;
- struct tm tm;
- enum assume_next dignext = DATE_MDAY;
- const char *indate = date;
-
- int part = 0; /* max 6 parts */
-
- while (*date && (part < 6)) {
- int found = 0;
-
- while (*date && !isalnum(*date)) {
- date++;
- }
-
- if (isalpha(*date)) {
- /* a name coming up */
- char buf[32] = "";
- size_t len;
- sscanf(date, "%31[A-Za-z]", buf);
- len = strlen(buf);
-
- if (weekday == -1) {
- weekday = check_day(buf, len);
- if (weekday != -1) {
- found = 1;
- }
- }
-
- if (!found && (month == -1)) {
- month = check_month(buf);
- if (month != -1) {
- found = 1;
- }
- }
-
- if (!found && (tz_offset == -1)) {
- /* this just must be a time zone string */
- tz_offset = check_tzone(buf);
- if (tz_offset != -1) {
- found = 1;
- }
- }
-
- if (!found) {
- return -1; /* bad string */
- }
- date += len;
- }
- else if (isdigit(*date)) {
- /* a digit */
- int val;
- char *end;
- if ((seconds == -1) &&
- (3 == sscanf(date, "%02d:%02d:%02d", &hours, &minutes, &seconds))) {
- /* time stamp! */
- date += 8;
- found = 1;
- }
- else {
- val = (int) strtol(date, &end, 10);
-
- if ((tz_offset == -1) && ((end - date) == 4) && (val < 1300) &&
- (indate < date) && ((date[-1] == '+' || date[-1] == '-'))) {
- /* four digits and a value less than 1300 and it is preceeded with
- a plus or minus. This is a time zone indication. */
- found = 1;
- tz_offset = (val / 100 * 60 + val % 100) * 60;
-
- /* the + and - prefix indicates the local time compared to GMT,
- this we need ther reversed math to get what we want */
- tz_offset = date[-1] == '+' ? -tz_offset : tz_offset;
- }
-
- if (((end - date) == 8) && (year == -1) && (month == -1) && (monthday == -1)) {
- /* 8 digits, no year, month or day yet. This is YYYYMMDD */
- found = 1;
- year = val / 10000;
- month = (val % 10000) / 100 - 1; /* month is 0 - 11 */
- monthday = val % 100;
- }
-
- if (!found && (dignext == DATE_MDAY) && (monthday == -1)) {
- if ((val > 0) && (val < 32)) {
- monthday = val;
- found = 1;
- }
- dignext = DATE_YEAR;
- }
-
- if (!found && (dignext == DATE_YEAR) && (year == -1)) {
- year = val;
- found = 1;
- if (year < 1900) {
- year += year > 70 ? 1900 : 2000;
- }
- if(monthday == -1) {
- dignext = DATE_MDAY;
- }
- }
-
- if (!found) {
- return -1;
- }
-
- date = end;
- }
- }
-
- part++;
- }
-
- if (-1 == seconds) {
- seconds = minutes = hours = 0; /* no time, make it zero */
- }
-
- if ((-1 == monthday) || (-1 == month) || (-1 == year)) {
- /* lacks vital info, fail */
- return -1;
- }
-
- if (sizeof(time_t) < 5) {
- /* 32 bit time_t can only hold dates to the beginning of 2038 */
- if (year > 2037) {
- return 0x7fffffff;
- }
- }
-
- tm.tm_sec = seconds;
- tm.tm_min = minutes;
- tm.tm_hour = hours;
- tm.tm_mday = monthday;
- tm.tm_mon = month;
- tm.tm_year = year - 1900;
- tm.tm_wday = 0;
- tm.tm_yday = 0;
- tm.tm_isdst = 0;
-
- t = mktime(&tm);
-
- /* time zone adjust */
- if (t != -1) {
- struct tm *gmt, keeptime2;
- long delta;
- time_t t2;
-
- if(!(gmt = php_gmtime_r(&t, &keeptime2))) {
- return -1; /* illegal date/time */
- }
-
- t2 = mktime(gmt);
-
- /* Add the time zone diff (between the given timezone and GMT) and the
- diff between the local time zone and GMT. */
- delta = (tz_offset != -1 ? tz_offset : 0) + (t - t2);
-
- if((delta > 0) && (t + delta < t)) {
- return -1; /* time_t overflow */
- }
-
- t += delta;
- }
-
- return t;
-}
-/* }}} */
-
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#ifdef ZEND_ENGINE_2
-
-#include "zend_exceptions.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_exception_object.h"
-
-#define HTTP_EX_DEF_CE http_exception_object_ce
-zend_class_entry *http_exception_object_ce;
-#define HTTP_EX_CE(name) http_ ##name## _exception_object_ce
-zend_class_entry *HTTP_EX_CE(runtime);
-zend_class_entry *HTTP_EX_CE(header);
-zend_class_entry *HTTP_EX_CE(malformed_headers);
-zend_class_entry *HTTP_EX_CE(request_method);
-zend_class_entry *HTTP_EX_CE(message_type);
-zend_class_entry *HTTP_EX_CE(invalid_param);
-zend_class_entry *HTTP_EX_CE(encoding);
-zend_class_entry *HTTP_EX_CE(request);
-zend_class_entry *HTTP_EX_CE(request_pool);
-zend_class_entry *HTTP_EX_CE(socket);
-zend_class_entry *HTTP_EX_CE(response);
-zend_class_entry *HTTP_EX_CE(url);
-
-void _http_exception_object_init(INIT_FUNC_ARGS)
-{
- HTTP_REGISTER_EXCEPTION(HttpException, http_exception_object_ce, zend_exception_get_default());
- HTTP_REGISTER_EXCEPTION(HttpRuntimeException, HTTP_EX_CE(runtime), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpInvalidParamException, HTTP_EX_CE(invalid_param), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpHeaderException, HTTP_EX_CE(header), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpMalformedHeadersException, HTTP_EX_CE(malformed_headers), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpRequestMethodException, HTTP_EX_CE(request_method), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpMessageTypeException, HTTP_EX_CE(message_type), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpEncodingException, HTTP_EX_CE(encoding), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpRequestException, HTTP_EX_CE(request), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpRequestPoolException, HTTP_EX_CE(request_pool), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpSocketException, HTTP_EX_CE(socket), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpResponseException, HTTP_EX_CE(response), HTTP_EX_DEF_CE);
- HTTP_REGISTER_EXCEPTION(HttpUrlException, HTTP_EX_CE(url), HTTP_EX_DEF_CE);
-
- HTTP_LONG_CONSTANT("HTTP_E_RUNTIME", HTTP_E_RUNTIME);
- HTTP_LONG_CONSTANT("HTTP_E_INVALID_PARAM", HTTP_E_INVALID_PARAM);
- HTTP_LONG_CONSTANT("HTTP_E_HEADER", HTTP_E_HEADER);
- HTTP_LONG_CONSTANT("HTTP_E_MALFORMED_HEADERS", HTTP_E_MALFORMED_HEADERS);
- HTTP_LONG_CONSTANT("HTTP_E_REQUEST_METHOD", HTTP_E_REQUEST_METHOD);
- HTTP_LONG_CONSTANT("HTTP_E_MESSAGE_TYPE", HTTP_E_MESSAGE_TYPE);
- HTTP_LONG_CONSTANT("HTTP_E_ENCODING", HTTP_E_ENCODING);
- HTTP_LONG_CONSTANT("HTTP_E_REQUEST", HTTP_E_REQUEST);
- HTTP_LONG_CONSTANT("HTTP_E_REQUEST_POOL", HTTP_E_REQUEST_POOL);
- HTTP_LONG_CONSTANT("HTTP_E_SOCKET", HTTP_E_SOCKET);
- HTTP_LONG_CONSTANT("HTTP_E_RESPONSE", HTTP_E_RESPONSE);
- HTTP_LONG_CONSTANT("HTTP_E_URL", HTTP_E_URL);
-}
-
-zend_class_entry *_http_exception_get_default()
-{
- return http_exception_object_ce;
-}
-
-zend_class_entry *_http_exception_get_for_code(long code)
-{
- zend_class_entry *ex = http_exception_object_ce;
-
- switch (code)
- {
- case HTTP_E_RUNTIME: ex = HTTP_EX_CE(runtime); break;
- case HTTP_E_INVALID_PARAM: ex = HTTP_EX_CE(invalid_param); break;
- case HTTP_E_HEADER: ex = HTTP_EX_CE(header); break;
- case HTTP_E_MALFORMED_HEADERS: ex = HTTP_EX_CE(malformed_headers); break;
- case HTTP_E_REQUEST_METHOD: ex = HTTP_EX_CE(request_method); break;
- case HTTP_E_MESSAGE_TYPE: ex = HTTP_EX_CE(message_type); break;
- case HTTP_E_ENCODING: ex = HTTP_EX_CE(encoding); break;
- case HTTP_E_REQUEST: ex = HTTP_EX_CE(request); break;
- case HTTP_E_REQUEST_POOL: ex = HTTP_EX_CE(request_pool); break;
- case HTTP_E_SOCKET: ex = HTTP_EX_CE(socket); break;
- case HTTP_E_RESPONSE: ex = HTTP_EX_CE(response); break;
- case HTTP_E_URL: ex = HTTP_EX_CE(url); break;
- }
-
- return ex;
-}
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "zend_operators.h"
-
-#include "SAPI.h"
-#include "php_ini.h"
-#include "ext/standard/info.h"
-#include "ext/standard/php_string.h"
-#if defined(HAVE_PHP_SESSION) && !defined(COMPILE_DL_SESSION)
-# include "ext/session/php_session.h"
-#endif
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_request_api.h"
-#include "php_http_cache_api.h"
-#include "php_http_request_method_api.h"
-#include "php_http_request_api.h"
-#include "php_http_date_api.h"
-#include "php_http_headers_api.h"
-#include "php_http_message_api.h"
-#include "php_http_send_api.h"
-#include "php_http_url_api.h"
-
-#include "phpstr/phpstr.h"
-
-ZEND_EXTERN_MODULE_GLOBALS(http)
-
-/* {{{ proto string http_date([int timestamp])
- *
- * This function returns a valid HTTP date regarding RFC 822/1123
- * looking like: "Wed, 22 Dec 2004 11:34:47 GMT"
- *
- */
-PHP_FUNCTION(http_date)
-{
- long t = -1;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &t) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (t == -1) {
- t = (long) time(NULL);
- }
-
- RETURN_STRING(http_date(t), 0);
-}
-/* }}} */
-
-/* {{{ proto string http_absolute_uri(string url[, string proto[, string host[, int port]]])
- *
- * This function returns an absolute URI constructed from url.
- * If the url is already abolute but a different proto was supplied,
- * only the proto part of the URI will be updated. If url has no
- * path specified, the path of the current REQUEST_URI will be taken.
- * The host will be taken either from the Host HTTP header of the client
- * the SERVER_NAME or just localhost if prior are not available.
- *
- * Some examples:
- * <pre>
- * url = "page.php" => http://www.example.com/current/path/page.php
- * url = "/page.php" => http://www.example.com/page.php
- * url = "/page.php", proto = "https" => https://www.example.com/page.php
- * </pre>
- *
- */
-PHP_FUNCTION(http_absolute_uri)
-{
- char *url = NULL, *proto = NULL, *host = NULL;
- int url_len = 0, proto_len = 0, host_len = 0;
- long port = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ssl", &url, &url_len, &proto, &proto_len, &host, &host_len, &port) != SUCCESS) {
- RETURN_FALSE;
- }
-
- RETURN_STRING(http_absolute_uri_ex(url, url_len, proto, proto_len, host, host_len, port), 0);
-}
-/* }}} */
-
-#define HTTP_DO_NEGOTIATE(type, supported, as_array) \
-{ \
- HashTable *result; \
- if (result = http_negotiate_ ##type(supported)) { \
- if (as_array) { \
- Z_TYPE_P(return_value) = IS_ARRAY; \
- Z_ARRVAL_P(return_value) = result; \
- } else { \
- char *key; \
- uint key_len; \
- ulong idx; \
- \
- if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \
- RETVAL_STRINGL(key, key_len-1, 0); \
- } else { \
- RETVAL_NULL(); \
- } \
- zend_hash_destroy(result); \
- } \
- } else { \
- if (as_array) { \
- zval **value; \
- \
- array_init(return_value); \
- \
- FOREACH_VAL(supported, value) { \
- convert_to_string_ex(value); \
- add_assoc_double(return_value, Z_STRVAL_PP(value), 1.0); \
- } \
- } else { \
- zval **value; \
- \
- zend_hash_internal_pointer_reset(Z_ARRVAL_P(supported)); \
- if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(supported), (void **) &value)) { \
- RETVAL_ZVAL(*value, 1, 0); \
- } else { \
- RETVAL_NULL(); \
- } \
- } \
- } \
-}
-
-
-/* {{{ proto string http_negotiate_language(array supported[, bool return_quality_array = false])
- *
- * This function negotiates the clients preferred language based on its
- * Accept-Language HTTP header. It returns the negotiated language or
- * the default language (i.e. first array entry) if none match.
- *
- * The qualifier is recognized and languages without qualifier are rated highest.
- *
- * The supported parameter is expected to be an array having
- * the supported languages as array values.
- *
- * Example:
- * <pre>
- * <?php
- * $langs = array(
- * 'en-US',// default
- * 'fr',
- * 'fr-FR',
- * 'de',
- * 'de-DE',
- * 'de-AT',
- * 'de-CH',
- * );
- * include './langs/'. http_negotiate_language($langs) .'.php';
- * ?>
- * </pre>
- *
- */
-PHP_FUNCTION(http_negotiate_language)
-{
- zval *supported;
- zend_bool as_array = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &supported, &as_array) != SUCCESS) {
- RETURN_FALSE;
- }
-
- HTTP_DO_NEGOTIATE(language, supported, as_array);
-}
-/* }}} */
-
-/* {{{ proto string http_negotiate_charset(array supported)
- *
- * This function negotiates the clients preferred charset based on its
- * Accept-Charset HTTP header. It returns the negotiated charset or
- * the default charset (i.e. first array entry) if none match.
- *
- * The qualifier is recognized and charset without qualifier are rated highest.
- *
- * The supported parameter is expected to be an array having
- * the supported charsets as array values.
- *
- * Example:
- * <pre>
- * <?php
- * $charsets = array(
- * 'iso-8859-1', // default
- * 'iso-8859-2',
- * 'iso-8859-15',
- * 'utf-8'
- * );
- * $pref = http_negotiate_charset($charsets);
- * if (!strcmp($pref, 'iso-8859-1')) {
- * iconv_set_encoding('internal_encoding', 'iso-8859-1');
- * iconv_set_encoding('output_encoding', $pref);
- * ob_start('ob_iconv_handler');
- * }
- * ?>
- * </pre>
- */
-PHP_FUNCTION(http_negotiate_charset)
-{
- zval *supported;
- zend_bool as_array = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &supported, &as_array) != SUCCESS) {
- RETURN_FALSE;
- }
-
- HTTP_DO_NEGOTIATE(charset, supported, as_array);
-}
-/* }}} */
-
-/* {{{ proto bool http_send_status(int status)
- *
- * Send HTTP status code.
- *
- */
-PHP_FUNCTION(http_send_status)
-{
- int status = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &status) != SUCCESS) {
- RETURN_FALSE;
- }
- if (status < 100 || status > 510) {
- http_error_ex(HE_WARNING, HTTP_E_HEADER, "Invalid HTTP status code (100-510): %d", status);
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(http_send_status(status));
-}
-/* }}} */
-
-/* {{{ proto bool http_send_last_modified([int timestamp])
- *
- * This converts the given timestamp to a valid HTTP date and
- * sends it as "Last-Modified" HTTP header. If timestamp is
- * omitted, current time is sent.
- *
- */
-PHP_FUNCTION(http_send_last_modified)
-{
- long t = -1;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &t) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (t == -1) {
- t = (long) time(NULL);
- }
-
- RETURN_SUCCESS(http_send_last_modified(t));
-}
-/* }}} */
-
-/* {{{ proto bool http_send_content_type([string content_type = 'application/x-octetstream'])
- *
- * Sets the content type.
- *
- */
-PHP_FUNCTION(http_send_content_type)
-{
- char *ct;
- int ct_len = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &ct, &ct_len) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (!ct_len) {
- RETURN_SUCCESS(http_send_content_type("application/x-octetstream", lenof("application/x-octetstream")));
- }
- RETURN_SUCCESS(http_send_content_type(ct, ct_len));
-}
-/* }}} */
-
-/* {{{ proto bool http_send_content_disposition(string filename[, bool inline = false])
- *
- * Set the Content Disposition. The Content-Disposition header is very useful
- * if the data actually sent came from a file or something similar, that should
- * be "saved" by the client/user (i.e. by browsers "Save as..." popup window).
- *
- */
-PHP_FUNCTION(http_send_content_disposition)
-{
- char *filename;
- int f_len;
- zend_bool send_inline = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &filename, &f_len, &send_inline) != SUCCESS) {
- RETURN_FALSE;
- }
- RETURN_SUCCESS(http_send_content_disposition(filename, f_len, send_inline));
-}
-/* }}} */
-
-/* {{{ proto bool http_match_modified([int timestamp[, for_range = false]])
- *
- * Matches the given timestamp against the clients "If-Modified-Since" resp.
- * "If-Unmodified-Since" HTTP headers.
- *
- */
-PHP_FUNCTION(http_match_modified)
-{
- long t = -1;
- zend_bool for_range = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lb", &t, &for_range) != SUCCESS) {
- RETURN_FALSE;
- }
-
- // current time if not supplied (senseless though)
- if (t == -1) {
- t = (long) time(NULL);
- }
-
- if (for_range) {
- RETURN_BOOL(http_match_last_modified("HTTP_IF_UNMODIFIED_SINCE", t));
- }
- RETURN_BOOL(http_match_last_modified("HTTP_IF_MODIFIED_SINCE", t));
-}
-/* }}} */
-
-/* {{{ proto bool http_match_etag(string etag[, for_range = false])
- *
- * This matches the given ETag against the clients
- * "If-Match" resp. "If-None-Match" HTTP headers.
- *
- */
-PHP_FUNCTION(http_match_etag)
-{
- int etag_len;
- char *etag;
- zend_bool for_range = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &etag, &etag_len, &for_range) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (for_range) {
- RETURN_BOOL(http_match_etag("HTTP_IF_MATCH", etag));
- }
- RETURN_BOOL(http_match_etag("HTTP_IF_NONE_MATCH", etag));
-}
-/* }}} */
-
-/* {{{ proto bool http_cache_last_modified([int timestamp_or_expires]])
- *
- * If timestamp_or_expires is greater than 0, it is handled as timestamp
- * and will be sent as date of last modification. If it is 0 or omitted,
- * the current time will be sent as Last-Modified date. If it's negative,
- * it is handled as expiration time in seconds, which means that if the
- * requested last modification date is not between the calculated timespan,
- * the Last-Modified header is updated and the actual body will be sent.
- *
- */
-PHP_FUNCTION(http_cache_last_modified)
-{
- long last_modified = 0, send_modified = 0, t;
- zval *zlm;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &last_modified) != SUCCESS) {
- RETURN_FALSE;
- }
-
- t = (long) time(NULL);
-
- /* 0 or omitted */
- if (!last_modified) {
- /* does the client have? (att: caching "forever") */
- if (zlm = http_get_server_var("HTTP_IF_MODIFIED_SINCE")) {
- last_modified = send_modified = http_parse_date(Z_STRVAL_P(zlm));
- /* send current time */
- } else {
- send_modified = t;
- }
- /* negative value is supposed to be expiration time */
- } else if (last_modified < 0) {
- last_modified += t;
- send_modified = t;
- /* send supplied time explicitly */
- } else {
- send_modified = last_modified;
- }
-
- RETURN_SUCCESS(http_cache_last_modified(last_modified, send_modified, HTTP_DEFAULT_CACHECONTROL, lenof(HTTP_DEFAULT_CACHECONTROL)));
-}
-/* }}} */
-
-/* {{{ proto bool http_cache_etag([string etag])
- *
- * This function attempts to cache the HTTP body based on an ETag,
- * either supplied or generated through calculation of the MD5
- * checksum of the output (uses output buffering).
- *
- * If clients "If-None-Match" header matches the supplied/calculated
- * ETag, the body is considered cached on the clients side and
- * a "304 Not Modified" status code is issued.
- *
- */
-PHP_FUNCTION(http_cache_etag)
-{
- char *etag = NULL;
- int etag_len = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &etag, &etag_len) != SUCCESS) {
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(http_cache_etag(etag, etag_len, HTTP_DEFAULT_CACHECONTROL, lenof(HTTP_DEFAULT_CACHECONTROL)));
-}
-/* }}} */
-
-/* {{{ proto string ob_etaghandler(string data, int mode)
- *
- * For use with ob_start().
- */
-PHP_FUNCTION(ob_etaghandler)
-{
- char *data;
- int data_len;
- long mode;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &data, &data_len, &mode)) {
- RETURN_FALSE;
- }
-
- Z_TYPE_P(return_value) = IS_STRING;
- http_ob_etaghandler(data, data_len, &Z_STRVAL_P(return_value), (uint *) &Z_STRLEN_P(return_value), mode);
-}
-/* }}} */
-
-/* {{{ proto void http_throttle(double sec[, long bytes = 2097152])
- *
- * Use with http_send() API.
- *
- * Example:
- * <pre>
- * <?php
- * // ~ 20 kbyte/s
- * # http_throttle(1, 20000);
- * # http_throttle(0.5, 10000);
- * # http_throttle(0.1, 2000);
- * http_send_file('document.pdf');
- * ?>
- * </pre>
- */
-PHP_FUNCTION(http_throttle)
-{
- long chunk_size;
- double interval;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dl", &interval, &chunk_size)) {
- return;
- }
-
- HTTP_G(send).throttle_delay = interval;
- HTTP_G(send).buffer_size = chunk_size;
-}
-/* }}} */
-
-/* {{{ proto void http_redirect([string url[, array params[, bool session,[ bool permanent]]]])
- *
- * Redirect to a given url.
- * The supplied url will be expanded with http_absolute_uri(), the params array will
- * be treated with http_build_query() and the session identification will be appended
- * if session is true.
- *
- * Depending on permanent the redirection will be issued with a permanent
- * ("301 Moved Permanently") or a temporary ("302 Found") redirection
- * status code.
- *
- * To be RFC compliant, "Redirecting to <a>URI</a>." will be displayed,
- * if the client doesn't redirect immediatly.
- */
-PHP_FUNCTION(http_redirect)
-{
- int url_len;
- size_t query_len = 0;
- zend_bool session = 0, permanent = 0, free_params = 0;
- zval *params = NULL;
- char *query = NULL, *url = NULL, *URI, *LOC, *RED = NULL;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sa!/bb", &url, &url_len, ¶ms, &session, &permanent) != SUCCESS) {
- RETURN_FALSE;
- }
-
- /* append session info */
- if (session) {
- if (!params) {
- free_params = 1;
- MAKE_STD_ZVAL(params);
- array_init(params);
- }
-#ifdef HAVE_PHP_SESSION
-# ifdef COMPILE_DL_SESSION
- if (SUCCESS == zend_get_module_started("session")) {
- zval nm_retval, id_retval, func;
-
- INIT_PZVAL(&func);
- INIT_PZVAL(&nm_retval);
- INIT_PZVAL(&id_retval);
- ZVAL_NULL(&nm_retval);
- ZVAL_NULL(&id_retval);
-
- ZVAL_STRINGL(&func, "session_id", lenof("session_id"), 0);
- call_user_function(EG(function_table), NULL, &func, &id_retval, 0, NULL TSRMLS_CC);
- ZVAL_STRINGL(&func, "session_name", lenof("session_name"), 0);
- call_user_function(EG(function_table), NULL, &func, &nm_retval, 0, NULL TSRMLS_CC);
-
- if ( Z_TYPE(nm_retval) == IS_STRING && Z_STRLEN(nm_retval) &&
- Z_TYPE(id_retval) == IS_STRING && Z_STRLEN(id_retval)) {
- if (add_assoc_stringl_ex(params, Z_STRVAL(nm_retval), Z_STRLEN(nm_retval)+1,
- Z_STRVAL(id_retval), Z_STRLEN(id_retval), 0) != SUCCESS) {
- http_error(HE_WARNING, HTTP_E_RUNTIME, "Could not append session information");
- }
- }
- }
-# else
- if (PS(session_status) == php_session_active) {
- if (add_assoc_string(params, PS(session_name), PS(id), 1) != SUCCESS) {
- http_error(HE_WARNING, HTTP_E_RUNTIME, "Could not append session information");
- }
- }
-# endif
-#endif
- }
-
- /* treat params array with http_build_query() */
- if (params) {
- if (SUCCESS != http_urlencode_hash_ex(Z_ARRVAL_P(params), 0, NULL, 0, &query, &query_len)) {
- if (free_params) {
- zval_dtor(params);
- FREE_ZVAL(params);
- }
- if (query) {
- efree(query);
- }
- RETURN_FALSE;
- }
- }
-
- URI = http_absolute_uri(url);
-
- if (query_len) {
- spprintf(&LOC, 0, "Location: %s?%s", URI, query);
- if (SG(request_info).request_method && strcmp(SG(request_info).request_method, "HEAD")) {
- spprintf(&RED, 0, "Redirecting to <a href=\"%s?%s\">%s?%s</a>.\n", URI, query, URI, query);
- }
- } else {
- spprintf(&LOC, 0, "Location: %s", URI);
- if (SG(request_info).request_method && strcmp(SG(request_info).request_method, "HEAD")) {
- spprintf(&RED, 0, "Redirecting to <a href=\"%s\">%s</a>.\n", URI, URI);
- }
- }
-
- efree(URI);
- if (query) {
- efree(query);
- }
- if (free_params) {
- zval_dtor(params);
- FREE_ZVAL(params);
- }
-
- RETURN_SUCCESS(http_exit_ex(permanent ? 301 : 302, LOC, RED, 1));
-}
-/* }}} */
-
-/* {{{ proto bool http_send_data(string data)
- *
- * Sends raw data with support for (multiple) range requests.
- *
- */
-PHP_FUNCTION(http_send_data)
-{
- zval *zdata;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zdata) != SUCCESS) {
- RETURN_FALSE;
- }
-
- convert_to_string_ex(&zdata);
- RETURN_SUCCESS(http_send_data(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata)));
-}
-/* }}} */
-
-/* {{{ proto bool http_send_file(string file)
- *
- * Sends a file with support for (multiple) range requests.
- *
- */
-PHP_FUNCTION(http_send_file)
-{
- char *file;
- int flen = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &flen) != SUCCESS) {
- RETURN_FALSE;
- }
- if (!flen) {
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(http_send_file(file));
-}
-/* }}} */
-
-/* {{{ proto bool http_send_stream(resource stream)
- *
- * Sends an already opened stream with support for (multiple) range requests.
- *
- */
-PHP_FUNCTION(http_send_stream)
-{
- zval *zstream;
- php_stream *file;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream) != SUCCESS) {
- RETURN_FALSE;
- }
-
- php_stream_from_zval(file, &zstream);
- RETURN_SUCCESS(http_send_stream(file));
-}
-/* }}} */
-
-/* {{{ proto string http_chunked_decode(string encoded)
- *
- * This function decodes a string that was HTTP-chunked encoded.
- * Returns false on failure.
- */
-PHP_FUNCTION(http_chunked_decode)
-{
- char *encoded = NULL, *decoded = NULL;
- size_t decoded_len = 0;
- int encoded_len = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &encoded, &encoded_len) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (NULL != http_chunked_decode(encoded, encoded_len, &decoded, &decoded_len)) {
- RETURN_STRINGL(decoded, (int) decoded_len, 0);
- } else {
- RETURN_FALSE;
- }
-}
-/* }}} */
-
-/* {{{ proto object http_parse_message(string message)
- *
- * Parses (a) http_message(s) into a simple recursive object structure:
- *
- * <pre>
- * <?php
- * print_r(http_parse_message(http_get(URL, array('redirect' => 3)));
- *
- * stdClass object
- * (
- * [type] => 2
- * [httpVersion] => 1.1
- * [responseCode] => 200
- * [headers] => Array
- * (
- * [Content-Length] => 3
- * [Server] => Apache
- * )
- * [body] => Hi!
- * [parentMessage] => stdClass object
- * (
- * [type] => 2
- * [httpVersion] => 1.1
- * [responseCode] => 302
- * [headers] => Array
- * (
- * [Content-Length] => 0
- * [Location] => ...
- * )
- * [body] =>
- * [parentMessage] => ...
- * )
- * )
- * ?>
- * </pre>
- */
-PHP_FUNCTION(http_parse_message)
-{
- char *message;
- int message_len;
- http_message *msg = NULL;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &message, &message_len)) {
- RETURN_NULL();
- }
-
-
- if (msg = http_message_parse(message, message_len)) {
- object_init(return_value);
- http_message_tostruct_recursive(msg, return_value);
- http_message_free(&msg);
- } else {
- RETURN_NULL();
- }
-}
-/* }}} */
-
-/* {{{ proto array http_parse_headers(string header)
- *
- */
-PHP_FUNCTION(http_parse_headers)
-{
- char *header;
- int header_len;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &header, &header_len)) {
- RETURN_FALSE;
- }
-
- array_init(return_value);
- if (SUCCESS != http_parse_headers(header, return_value)) {
- zval_dtor(return_value);
- RETURN_FALSE;
- }
-}
-/* }}}*/
-
-/* {{{ proto array http_get_request_headers(void)
- *
- * Get a list of incoming HTTP headers.
- */
-PHP_FUNCTION(http_get_request_headers)
-{
- NO_ARGS;
-
- array_init(return_value);
- http_get_request_headers(return_value);
-}
-/* }}} */
-
-/* {{{ proto string http_get_request_body(void)
- *
- * Get the raw request body (e.g. POST or PUT data).
- */
-PHP_FUNCTION(http_get_request_body)
-{
- char *body;
- size_t length;
-
- NO_ARGS;
-
- if (SUCCESS == http_get_request_body(&body, &length)) {
- RETURN_STRINGL(body, (int) length, 0);
- } else {
- RETURN_NULL();
- }
-}
-/* }}} */
-
-/* {{{ proto bool http_match_request_header(string header, string value[, bool match_case = false])
- *
- * Match an incoming HTTP header.
- */
-PHP_FUNCTION(http_match_request_header)
-{
- char *header, *value;
- int header_len, value_len;
- zend_bool match_case = 0;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &header, &header_len, &value, &value_len, &match_case)) {
- RETURN_FALSE;
- }
-
- RETURN_BOOL(http_match_request_header_ex(header, value, match_case));
-}
-/* }}} */
-
-/* {{{ HAVE_CURL */
-#ifdef HTTP_HAVE_CURL
-
-/* {{{ proto string http_get(string url[, array options[, array &info]])
- *
- * Performs an HTTP GET request on the supplied url.
- *
- * The second parameter is expected to be an associative
- * array where the following keys will be recognized:
- * <pre>
- * - redirect: int, whether and how many redirects to follow
- * - unrestrictedauth: bool, whether to continue sending credentials on
- * redirects to a different host
- * - proxyhost: string, proxy host in "host[:port]" format
- * - proxyport: int, use another proxy port as specified in proxyhost
- * - proxyauth: string, proxy credentials in "user:pass" format
- * - proxyauthtype: int, HTTP_AUTH_BASIC and/or HTTP_AUTH_NTLM
- * - httpauth: string, http credentials in "user:pass" format
- * - httpauthtype: int, HTTP_AUTH_BASIC, DIGEST and/or NTLM
- * - compress: bool, whether to allow gzip/deflate content encoding
- * (defaults to true)
- * - port: int, use another port as specified in the url
- * - referer: string, the referer to sends
- * - useragent: string, the user agent to send
- * (defaults to PECL::HTTP/version (PHP/version)))
- * - headers: array, list of custom headers as associative array
- * like array("header" => "value")
- * - cookies: array, list of cookies as associative array
- * like array("cookie" => "value")
- * - cookiestore: string, path to a file where cookies are/will be stored
- * - resume: int, byte offset to start the download from;
- * if the server supports ranges
- * - maxfilesize: int, maximum file size that should be downloaded;
- * has no effect, if the size of the requested entity is not known
- * - lastmodified: int, timestamp for If-(Un)Modified-Since header
- * - timeout: int, seconds the request may take
- * - connecttimeout: int, seconds the connect may take
- * - onprogress: mixed, progress callback
- * </pre>
- *
- * The optional third parameter will be filled with some additional information
- * in form af an associative array, if supplied, like the following example:
- * <pre>
- * <?php
- * array (
- * 'effective_url' => 'http://localhost',
- * 'response_code' => 403,
- * 'total_time' => 0.017,
- * 'namelookup_time' => 0.013,
- * 'connect_time' => 0.014,
- * 'pretransfer_time' => 0.014,
- * 'size_upload' => 0,
- * 'size_download' => 202,
- * 'speed_download' => 11882,
- * 'speed_upload' => 0,
- * 'header_size' => 145,
- * 'request_size' => 62,
- * 'ssl_verifyresult' => 0,
- * 'filetime' => -1,
- * 'content_length_download' => 202,
- * 'content_length_upload' => 0,
- * 'starttransfer_time' => 0.017,
- * 'content_type' => 'text/html; charset=iso-8859-1',
- * 'redirect_time' => 0,
- * 'redirect_count' => 0,
- * 'http_connectcode' => 0,
- * 'httpauth_avail' => 0,
- * 'proxyauth_avail' => 0,
- * )
- * ?>
- * </pre>
- */
-PHP_FUNCTION(http_get)
-{
- zval *options = NULL, *info = NULL;
- char *URL;
- int URL_len;
- phpstr response;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|a/!z", &URL, &URL_len, &options, &info) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (info) {
- zval_dtor(info);
- array_init(info);
- }
-
- phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
- if (SUCCESS == http_get(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
- RETURN_PHPSTR_VAL(&response);
- } else {
- RETURN_FALSE;
- }
-}
-/* }}} */
-
-/* {{{ proto string http_head(string url[, array options[, array &info]])
- *
- * Performs an HTTP HEAD request on the suppied url.
- * Returns the HTTP response as string.
- * See http_get() for a full list of available options.
- */
-PHP_FUNCTION(http_head)
-{
- zval *options = NULL, *info = NULL;
- char *URL;
- int URL_len;
- phpstr response;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|a/!z", &URL, &URL_len, &options, &info) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (info) {
- zval_dtor(info);
- array_init(info);
- }
-
- phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
- if (SUCCESS == http_head(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
- RETURN_PHPSTR_VAL(&response);
- } else {
- RETURN_FALSE;
- }
-}
-/* }}} */
-
-/* {{{ proto string http_post_data(string url, string data[, array options[, array &info]])
- *
- * Performs an HTTP POST request, posting data.
- * Returns the HTTP response as string.
- * See http_get() for a full list of available options.
- */
-PHP_FUNCTION(http_post_data)
-{
- zval *options = NULL, *info = NULL;
- char *URL, *postdata;
- int postdata_len, URL_len;
- phpstr response;
- http_request_body body;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|a/!z", &URL, &URL_len, &postdata, &postdata_len, &options, &info) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (info) {
- zval_dtor(info);
- array_init(info);
- }
-
- body.type = HTTP_REQUEST_BODY_CSTRING;
- body.data = postdata;
- body.size = postdata_len;
-
- phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
- if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
- RETVAL_PHPSTR_VAL(&response);
- } else {
- RETVAL_FALSE;
- }
-}
-/* }}} */
-
-/* {{{ proto string http_post_fields(string url, array data[, array files[, array options[, array &info]]])
- *
- * Performs an HTTP POST request, posting www-form-urlencoded array data.
- * Returns the HTTP response as string.
- * See http_get() for a full list of available options.
- */
-PHP_FUNCTION(http_post_fields)
-{
- zval *options = NULL, *info = NULL, *fields, *files = NULL;
- char *URL;
- int URL_len;
- phpstr response;
- http_request_body body;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|aa/!z", &URL, &URL_len, &fields, &files, &options, &info) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (SUCCESS != http_request_body_fill(&body, Z_ARRVAL_P(fields), files ? Z_ARRVAL_P(files) : NULL)) {
- RETURN_FALSE;
- }
-
- if (info) {
- zval_dtor(info);
- array_init(info);
- }
-
- phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
- if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
- RETVAL_PHPSTR_VAL(&response);
- } else {
- RETVAL_FALSE;
- }
- http_request_body_dtor(&body);
-}
-/* }}} */
-
-/* {{{ proto string http_put_file(string url, string file[, array options[, array &info]])
- *
- * Performs an HTTP PUT request, uploading file.
- * Returns the HTTP response as string.
- * See http_get() for a full list of available options.
- */
-PHP_FUNCTION(http_put_file)
-{
- char *URL, *file;
- int URL_len, f_len;
- zval *options = NULL, *info = NULL;
- phpstr response;
- php_stream *stream;
- php_stream_statbuf ssb;
- http_request_body body;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|a/!z", &URL, &URL_len, &file, &f_len, &options, &info)) {
- RETURN_FALSE;
- }
-
- if (!(stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL))) {
- RETURN_FALSE;
- }
- if (php_stream_stat(stream, &ssb)) {
- php_stream_close(stream);
- RETURN_FALSE;
- }
-
- if (info) {
- zval_dtor(info);
- array_init(info);
- }
-
- body.type = HTTP_REQUEST_BODY_UPLOADFILE;
- body.data = stream;
- body.size = ssb.sb.st_size;
-
- phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
- if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
- RETVAL_PHPSTR_VAL(&response);
- } else {
- RETVAL_FALSE;
- }
- http_request_body_dtor(&body);
-}
-/* }}} */
-
-/* {{{ proto string http_put_stream(string url, resource stream[, array options[, array &info]])
- *
- * Performs an HTTP PUT request, uploading stream.
- * Returns the HTTP response as string.
- * See http_get() for a full list of available options.
- */
-PHP_FUNCTION(http_put_stream)
-{
- zval *resource, *options = NULL, *info = NULL;
- char *URL;
- int URL_len;
- phpstr response;
- php_stream *stream;
- php_stream_statbuf ssb;
- http_request_body body;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sr|a/!z", &URL, &URL_len, &resource, &options, &info)) {
- RETURN_FALSE;
- }
-
- php_stream_from_zval(stream, &resource);
- if (php_stream_stat(stream, &ssb)) {
- RETURN_FALSE;
- }
-
- if (info) {
- zval_dtor(info);
- array_init(info);
- }
-
- body.type = HTTP_REQUEST_BODY_UPLOADFILE;
- body.data = stream;
- body.size = ssb.sb.st_size;
-
- phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
- if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
- RETURN_PHPSTR_VAL(&response);
- } else {
- RETURN_NULL();
- }
-}
-/* }}} */
-#endif /* HTTP_HAVE_CURL */
-/* }}} HAVE_CURL */
-
-/* {{{ proto long http_request_method_register(string method)
- *
- * Register a custom request method.
- */
-PHP_FUNCTION(http_request_method_register)
-{
- char *method;
- int *method_len;
- unsigned long existing;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &method, &method_len)) {
- RETURN_FALSE;
- }
- if (existing = http_request_method_exists(1, 0, method)) {
- RETURN_LONG((long) existing);
- }
-
- RETVAL_LONG((long) http_request_method_register(method));
-}
-/* }}} */
-
-/* {{{ proto bool http_request_method_unregister(mixed method)
- *
- * Unregister a previously registered custom request method.
- */
-PHP_FUNCTION(http_request_method_unregister)
-{
- zval *method;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &method)) {
- RETURN_FALSE;
- }
-
- switch (Z_TYPE_P(method))
- {
- case IS_OBJECT:
- convert_to_string(method);
- case IS_STRING:
- if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) {
- convert_to_long(method);
- } else {
- unsigned long mn;
- if (!(mn = http_request_method_exists(1, 0, Z_STRVAL_P(method)))) {
- RETURN_FALSE;
- }
- zval_dtor(method);
- ZVAL_LONG(method, (long)mn);
- }
- case IS_LONG:
- RETURN_SUCCESS(http_request_method_unregister(Z_LVAL_P(method)));
- default:
- RETURN_FALSE;
- }
-}
-/* }}} */
-
-/* {{{ proto long http_request_method_exists(mixed method)
- *
- * Check if a request method is registered (or available by default).
- */
-PHP_FUNCTION(http_request_method_exists)
-{
- IF_RETVAL_USED {
- zval *method;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &method)) {
- RETURN_FALSE;
- }
-
- switch (Z_TYPE_P(method))
- {
- case IS_OBJECT:
- convert_to_string(method);
- case IS_STRING:
- if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) {
- convert_to_long(method);
- } else {
- RETURN_LONG((long) http_request_method_exists(1, 0, Z_STRVAL_P(method)));
- }
- case IS_LONG:
- RETURN_LONG((long) http_request_method_exists(0, Z_LVAL_P(method), NULL));
- default:
- RETURN_FALSE;
- }
- }
-}
-/* }}} */
-
-/* {{{ proto string http_request_method_name(long method)
- *
- * Get the literal string representation of a standard or registered request method.
- */
-PHP_FUNCTION(http_request_method_name)
-{
- IF_RETVAL_USED {
- long method;
-
- if ((SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &method)) || (method < 0)) {
- RETURN_FALSE;
- }
-
- RETURN_STRING(estrdup(http_request_method_name((unsigned long) method)), 0);
- }
-}
-/* }}} */
-
-/* {{{ Sara Golemons http_build_query() */
-#ifndef ZEND_ENGINE_2
-
-/* {{{ proto string http_build_query(mixed formdata [, string prefix[, string arg_separator]])
- Generates a form-encoded query string from an associative array or object. */
-PHP_FUNCTION(http_build_query)
-{
- zval *formdata;
- char *prefix = NULL, *arg_sep = INI_STR("arg_separator.output");
- int prefix_len = 0, arg_sep_len = strlen(arg_sep);
- phpstr *formstr;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|ss", &formdata, &prefix, &prefix_len, &arg_sep, &arg_sep_len) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (Z_TYPE_P(formdata) != IS_ARRAY && Z_TYPE_P(formdata) != IS_OBJECT) {
- http_error(HE_WARNING, HTTP_E_INVALID_PARAM, "Parameter 1 expected to be Array or Object. Incorrect value given.");
- RETURN_FALSE;
- }
-
- if (!arg_sep_len) {
- arg_sep = HTTP_URL_ARGSEP;
- }
-
- formstr = phpstr_new();
- if (SUCCESS != http_urlencode_hash_implementation_ex(HASH_OF(formdata), formstr, arg_sep, prefix, prefix_len, NULL, 0, NULL, 0, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL))) {
- phpstr_free(&formstr);
- RETURN_FALSE;
- }
-
- if (!formstr->used) {
- phpstr_free(&formstr);
- RETURN_NULL();
- }
-
- RETURN_PHPSTR_PTR(formstr);
-}
-/* }}} */
-#endif /* !ZEND_ENGINE_2 */
-/* }}} */
-
-PHP_FUNCTION(http_test)
-{
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "ext/standard/php_string.h"
-#include "ext/standard/url.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_headers_api.h"
-#include "php_http_info_api.h"
-
-#include <ctype.h>
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#ifndef HTTP_DBG_NEG
-# define HTTP_DBG_NEG 0
-#endif
-
-/* {{{ static int http_sort_q(const void *, const void *) */
-static int http_sort_q(const void *a, const void *b TSRMLS_DC)
-{
- Bucket *f, *s;
- zval result, *first, *second;
-
- f = *((Bucket **) a);
- s = *((Bucket **) b);
-
- first = *((zval **) f->pData);
- second= *((zval **) s->pData);
-
- if (numeric_compare_function(&result, first, second TSRMLS_CC) != SUCCESS) {
- return 0;
- }
- return (Z_LVAL(result) > 0 ? -1 : (Z_LVAL(result) < 0 ? 1 : 0));
-}
-/* }}} */
-
-/* {{{ char *http_negotiate_language_func */
-char *_http_negotiate_language_func(const char *test, double *quality, HashTable *supported TSRMLS_DC)
-{
- zval **value;
- const char *dash_test;
-
- FOREACH_HASH_VAL(supported, value) {
-#if HTTP_DBG_NEG
- fprintf(stderr, "strcasecmp('%s', '%s')\n", Z_STRVAL_PP(value), test);
-#endif
- if (!strcasecmp(Z_STRVAL_PP(value), test)) {
- return Z_STRVAL_PP(value);
- }
- }
-
- /* no distinct match found, so try primaries */
- if (dash_test = strchr(test, '-')) {
- FOREACH_HASH_VAL(supported, value) {
- int len = dash_test - test;
-#if HTTP_DBG_NEG
- fprintf(stderr, "strncascmp('%s', '%s', %d)\n", Z_STRVAL_PP(value), test, len);
-#endif
- if ( (!strncasecmp(Z_STRVAL_PP(value), test, len)) &&
- ( (Z_STRVAL_PP(value)[len] == '\0') ||
- (Z_STRVAL_PP(value)[len] == '-'))) {
- *quality /= 2;
- return Z_STRVAL_PP(value);
- }
- }
- }
-
- return NULL;
-}
-/* }}} */
-
-/* {{{ char *http_negotiate_charset_func */
-char *_http_negotiate_charset_func(const char *test, double *quality, HashTable *supported TSRMLS_DC)
-{
- zval **value;
-
- FOREACH_HASH_VAL(supported, value) {
-#if HTTP_DBG_NEG
- fprintf(stderr, "strcasecmp('%s', '%s')\n", Z_STRVAL_PP(value), test);
-#endif
- if (!strcasecmp(Z_STRVAL_PP(value), test)) {
- return Z_STRVAL_PP(value);
- }
- }
-
- return NULL;
-}
-/* }}} */
-
-/* {{{ HashTable *http_negotiate_q(const char *, HashTable *, negotiate_func_t) */
-PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *supported, negotiate_func_t neg TSRMLS_DC)
-{
- zval *accept;
- HashTable *result = NULL;
-
-#if HTTP_DBG_NEG
- fprintf(stderr, "Reading header %s: ", header);
-#endif
- HTTP_GSC(accept, header, NULL);
-#if HTTP_DBG_NEG
- fprintf(stderr, "%s\n", Z_STRVAL_P(accept));
-#endif
-
- if (Z_STRLEN_P(accept)) {
- zval ex_arr, ex_del;
-
- INIT_PZVAL(&ex_del);
- INIT_PZVAL(&ex_arr);
- ZVAL_STRINGL(&ex_del, ",", 1, 0);
- array_init(&ex_arr);
-
- php_explode(&ex_del, accept, &ex_arr, -1);
-
- if (zend_hash_num_elements(Z_ARRVAL(ex_arr)) > 0) {
- int i = 0;
- zval **entry, array;
-
- INIT_PZVAL(&array);
- array_init(&array);
-
- FOREACH_HASH_VAL(Z_ARRVAL(ex_arr), entry) {
- double quality;
- char *selected, *identifier;
- const char *separator;
-
-#if HTTP_DBG_NEG
- fprintf(stderr, "Checking %s\n", Z_STRVAL_PP(entry));
-#endif
-
- if (separator = strchr(Z_STRVAL_PP(entry), ';')) {
- const char *ptr = separator;
-
- while (*++ptr && !isdigit(*ptr));
-
- quality = atof(ptr);
- identifier = estrndup(Z_STRVAL_PP(entry), separator - Z_STRVAL_PP(entry));
- } else {
- quality = 1000.0 - i++;
- identifier = estrndup(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry));
- }
-
- if (selected = neg(identifier, &quality, supported TSRMLS_CC)) {
- /* don't overwrite previously set with higher quality */
- if (!zend_hash_exists(Z_ARRVAL(array), selected, strlen(selected) + 1)) {
- add_assoc_double(&array, selected, quality);
- }
- }
-
- efree(identifier);
- }
-
- result = Z_ARRVAL(array);
- zend_hash_sort(result, zend_qsort, http_sort_q, 0 TSRMLS_CC);
- }
-
- zval_dtor(&ex_arr);
- }
-
- return result;
-}
-/* }}} */
-
-/* {{{ http_range_status http_get_request_ranges(HashTable *ranges, size_t) */
-PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, size_t length TSRMLS_DC)
-{
- zval *zrange;
- char *range, c;
- long begin = -1, end = -1, *ptr;
-
- HTTP_GSC(zrange, "HTTP_RANGE", RANGE_NO);
- range = Z_STRVAL_P(zrange);
-
- if (strncmp(range, "bytes=", sizeof("bytes=") - 1)) {
- return RANGE_NO;
- }
-
- ptr = &begin;
- range += sizeof("bytes=") - 1;
-
- do {
- switch (c = *(range++))
- {
- case '0':
- /* allow 000... - shall we? */
- if (*ptr != -10) {
- *ptr *= 10;
- }
- break;
-
- case '1': case '2': case '3':
- case '4': case '5': case '6':
- case '7': case '8': case '9':
- /*
- * If the value of the pointer is already set (non-negative)
- * then multiply its value by ten and add the current value,
- * else initialise the pointers value with the current value
- * --
- * This let us recognize empty fields when validating the
- * ranges, i.e. a "-10" for begin and "12345" for the end
- * was the following range request: "Range: bytes=0-12345";
- * While a "-1" for begin and "12345" for the end would
- * have been: "Range: bytes=-12345".
- */
- if (*ptr > 0) {
- *ptr *= 10;
- *ptr += c - '0';
- } else {
- *ptr = c - '0';
- }
- break;
-
- case '-':
- ptr = &end;
- break;
-
- case ' ':
- /* IE - ignore for now */
- break;
-
- case 0:
- case ',':
-
- if (length) {
- /* validate ranges */
- switch (begin)
- {
- /* "0-12345" */
- case -10:
- /* "0-" */
- if (end == -1) {
- return RANGE_NO;
- }
- /* "0-0" or overflow */
- if (end == -10 || length <= (size_t) end) {
- return RANGE_ERR;
- }
- begin = 0;
- break;
-
- /* "-12345" */
- case -1:
- /* "-", "-0" or overflow */
- if (end == -1 || end == -10 || length <= (size_t) end) {
- return RANGE_ERR;
- }
- begin = length - end;
- end = length - 1;
- break;
-
- /* "12345-(xxx)" */
- default:
- switch (end)
- {
- /* "12345-0" */
- case -10:
- return RANGE_ERR;
- break;
-
- /* "12345-" */
- case -1:
- if (length <= (size_t) begin) {
- return RANGE_ERR;
- }
- end = length - 1;
- break;
-
- /* "12345-67890" */
- default:
- if ( (length <= (size_t) begin) ||
- (length <= (size_t) end) ||
- (end < begin)) {
- return RANGE_ERR;
- }
- break;
- }
- break;
- }
- }
- {
- zval *zentry;
- MAKE_STD_ZVAL(zentry);
- array_init(zentry);
- add_index_long(zentry, 0, begin);
- add_index_long(zentry, 1, end);
- zend_hash_next_index_insert(ranges, &zentry, sizeof(zval *), NULL);
-
- begin = -1;
- end = -1;
- ptr = &begin;
- }
- break;
-
- default:
- return RANGE_NO;
- break;
- }
- } while (c != 0);
-
- return RANGE_OK;
-}
-/* }}} */
-
-/* {{{ STATUS http_parse_headers(char *, HashTable *, zend_bool) */
-PHP_HTTP_API STATUS _http_parse_headers_ex(const char *header, HashTable *headers, zend_bool prettify,
- http_info_callback callback_func, void **callback_data TSRMLS_DC)
-{
- const char *colon = NULL, *line = NULL, *begin = header;
- const char *body = http_locate_body(header);
- size_t header_len;
- zval array;
-
- INIT_ZARR(array, headers);
-
- if (body) {
- header_len = body - header;
- } else {
- header_len = strlen(header) + 1;
- }
- line = header;
-
- while (header_len >= (size_t) (line - begin)) {
- int value_len = 0;
- /* note: valgrind may choke on that -- should be safe though */
- switch (*line++)
- {
- case ':':
- if (!colon) {
- colon = line - 1;
- }
- break;
-
- case 0:
- --value_len; /* we don't have CR so value length is one char less */
- case '\n':
- if ((!(*line - 1)) || ((*line != ' ') && (*line != '\t'))) {
- http_info i;
-
- /* response/request line */
- if (SUCCESS == http_info_parse(header, &i)) {
- callback_func(callback_data, &headers, &i TSRMLS_CC);
- http_info_dtor(&i);
- Z_ARRVAL(array) = headers;
- } else
-
- /* "header: value" pair */
- if (colon) {
-
- /* skip empty key */
- if (header != colon) {
- zval **previous = NULL;
- char *value;
- int keylen = colon - header;
- char *key = estrndup(header, keylen);
-
- if (prettify) {
- key = pretty_key(key, keylen, 1, 1);
- }
-
- value_len += line - colon - 1;
-
- /* skip leading ws */
- while (isspace(*(++colon))) --value_len;
- /* skip trailing ws */
- while (isspace(colon[value_len - 1])) --value_len;
-
- if (value_len > 0) {
- value = estrndup(colon, value_len);
- } else {
- value = estrdup("");
- value_len = 0;
- }
-
- /* if we already have got such a header make an array of those */
- if (SUCCESS == zend_hash_find(headers, key, keylen + 1, (void **) &previous)) {
- /* convert to array */
- if (Z_TYPE_PP(previous) != IS_ARRAY) {
- convert_to_array(*previous);
- }
- add_next_index_stringl(*previous, value, value_len, 0);
- } else {
- add_assoc_stringl(&array, key, value, value_len, 0);
- }
- efree(key);
- }
- }
- colon = NULL;
- value_len = 0;
- header += line - header;
- }
- break;
- }
- }
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ void http_get_request_headers_ex(HashTable *, zend_bool) */
-PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool prettify TSRMLS_DC)
-{
- char *key = NULL;
- ulong idx = 0;
- zval array, **hsv;
-
- Z_ARRVAL(array) = headers;
-
- if (SUCCESS == zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &hsv)) {
- FOREACH_KEY(*hsv, key, idx) {
- if (key && !strncmp(key, "HTTP_", 5)) {
- zval **header;
-
- key += 5;
- if (prettify) {
- key = pretty_key(key, strlen(key), 1, 1);
- }
-
- zend_hash_get_current_data(Z_ARRVAL_PP(hsv), (void **) &header);
- add_assoc_stringl(&array, key, Z_STRVAL_PP(header), Z_STRLEN_PP(header), 1);
- key = NULL;
- }
- }
- }
-}
-/* }}} */
-
-/* {{{ zend_bool http_match_request_header(char *, char *) */
-PHP_HTTP_API zend_bool _http_match_request_header_ex(const char *header, const char *value, zend_bool match_case TSRMLS_DC)
-{
- char *name, *key = NULL;
- ulong idx;
- zend_bool result = 0;
- HashTable headers;
-
- name = pretty_key(estrdup(header), strlen(header), 1, 1);
- zend_hash_init(&headers, 0, NULL, ZVAL_PTR_DTOR, 0);
- http_get_request_headers_ex(&headers, 1);
-
- FOREACH_HASH_KEY(&headers, key, idx) {
- if (key && (!strcmp(key, name))) {
- zval **data;
-
- if (SUCCESS == zend_hash_get_current_data(&headers, (void **) &data)) {
- result = (match_case ? strcmp(Z_STRVAL_PP(data), value) : strcasecmp(Z_STRVAL_PP(data), value)) ? 0 : 1;
- }
- break;
- }
- }
-
- zend_hash_destroy(&headers);
- efree(name);
-
- return result;
-}
-/* }}} */
-
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "php_http.h"
-#include "php_http_api.h"
-#include "php_http_std_defs.h"
-#include "php_http_info_api.h"
-
-#include <ctype.h>
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-PHP_HTTP_API void _http_info_default_callback(void **nothing, HashTable **headers, http_info *info TSRMLS_DC)
-{
- zval array;
-
- INIT_ZARR(array, *headers);
-
- switch (info->type)
- {
- case IS_HTTP_REQUEST:
- add_assoc_string(&array, "Request Method", HTTP_INFO(info).request.method, 1);
- add_assoc_string(&array, "Request Uri", HTTP_INFO(info).request.URI, 1);
- break;
-
- case IS_HTTP_RESPONSE:
- add_assoc_long(&array, "Response Code", (long) HTTP_INFO(info).response.code);
- add_assoc_string(&array, "Response Status", HTTP_INFO(info).response.status, 1);
- break;
- }
-}
-
-PHP_HTTP_API void _http_info_dtor(http_info *info)
-{
- http_info_t *i = (http_info_t *) info;
-
- switch (info->type)
- {
- case IS_HTTP_REQUEST:
- STR_SET(i->request.method, NULL);
- STR_SET(i->request.URI, NULL);
- break;
-
- case IS_HTTP_RESPONSE:
- STR_SET(i->response.status, NULL);
- break;
-
- default:
- break;
- }
-}
-
-PHP_HTTP_API STATUS _http_info_parse_ex(const char *pre_header, http_info *info, zend_bool silent TSRMLS_DC)
-{
- const char *end, *http;
-
- /* sane parameter */
- if ((!pre_header) || (!*pre_header)) {
- if (!silent) {
- http_error(HE_WARNING, HTTP_E_MALFORMED_HEADERS, "Empty pre-header HTTP info");
- }
- return FAILURE;
- }
-
- /* where's the end of the line */
- if (!(end = http_locate_eol(pre_header, NULL))) {
- end = pre_header + strlen(pre_header);
- }
-
- /* there must be HTTP/1.x in the line
- * and nothing than SPACE or NUL after HTTP/1.x
- */
- if ( (!(http = strstr(pre_header, "HTTP/1."))) ||
- (!(http < end)) ||
- (!isdigit(http[lenof("HTTP/1.")])) ||
- (http[lenof("HTTP/1.1")] && (!isspace(http[lenof("HTTP/1.1")])))) {
- if (!silent) {
- http_error(HE_WARNING, HTTP_E_MALFORMED_HEADERS, "Invalid or missing HTTP/1.x protocol identification");
- }
- return FAILURE;
- }
-
-#if 0
- {
- char *line = estrndup(pre_header, end - pre_header);
- fprintf(stderr, "http_parse_info('%s')\n", line);
- efree(line);
- }
-#endif
-
- info->http.version = atof(http + lenof("HTTP/"));
-
- /* is response */
- if (pre_header == http) {
- char *status = NULL;
- const char *code = http + sizeof("HTTP/1.1");
-
- info->type = IS_HTTP_RESPONSE;
- HTTP_INFO(info).response.code = (code && (end > code)) ? strtol(code, &status, 10) : 0;
- HTTP_INFO(info).response.status = (status && (end > ++status)) ? estrndup(status, end - status) : ecalloc(1,1);
-
- return SUCCESS;
- }
-
- /* is request */
- else {
- const char *url = strchr(pre_header, ' ');
-
- info->type = IS_HTTP_REQUEST;
- if (url && http > url) {
- HTTP_INFO(info).request.method = estrndup(pre_header, url - pre_header);
- HTTP_INFO(info).request.URI = estrndup(url + 1, http - url - 2);
- } else {
- HTTP_INFO(info).request.method = ecalloc(1,1);
- HTTP_INFO(info).request.URI = ecalloc(1,1);
- }
-
- return SUCCESS;
- }
-}
-
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_message_api.h"
-#include "php_http_headers_api.h"
-#include "php_http_send_api.h"
-#include "php_http_request_api.h"
-#include "php_http_url_api.h"
-
-#include "phpstr/phpstr.h"
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#define http_message_info_callback _http_message_info_callback
-static void _http_message_info_callback(http_message **message, HashTable **headers, http_info *info TSRMLS_DC)
-{
- http_message *old = *message;
-
- /* advance message */
- if (old->type || zend_hash_num_elements(&old->hdrs) || PHPSTR_LEN(old)) {
- (*message) = http_message_new();
- (*message)->parent = old;
- (*headers) = &((*message)->hdrs);
- }
-
- (*message)->http.version = info->http.version;
-
- switch (info->type)
- {
- case IS_HTTP_REQUEST:
- (*message)->type = HTTP_MSG_REQUEST;
- HTTP_INFO(*message).request.URI = estrdup(HTTP_INFO(info).request.URI);
- HTTP_INFO(*message).request.method = estrdup(HTTP_INFO(info).request.method);
- break;
-
- case IS_HTTP_RESPONSE:
- (*message)->type = HTTP_MSG_RESPONSE;
- HTTP_INFO(*message).response.code = HTTP_INFO(info).response.code;
- HTTP_INFO(*message).response.status = estrdup(HTTP_INFO(info).response.status);
- break;
- }
-}
-
-#define http_message_init_type _http_message_init_type
-static inline void _http_message_init_type(http_message *message, http_message_type type)
-{
- message->http.version = .0;
-
- switch (message->type = type)
- {
- case HTTP_MSG_RESPONSE:
- message->http.info.response.code = 0;
- message->http.info.response.status = NULL;
- break;
-
- case HTTP_MSG_REQUEST:
- message->http.info.request.method = NULL;
- message->http.info.request.URI = NULL;
- break;
-
- case HTTP_MSG_NONE:
- default:
- break;
- }
-}
-
-PHP_HTTP_API http_message *_http_message_init_ex(http_message *message, http_message_type type)
-{
- if (!message) {
- message = ecalloc(1, sizeof(http_message));
- }
-
- http_message_init_type(message, type);
- message->parent = NULL;
- phpstr_init(&message->body);
- zend_hash_init(&message->hdrs, 0, NULL, ZVAL_PTR_DTOR, 0);
-
- return message;
-}
-
-
-PHP_HTTP_API void _http_message_set_type(http_message *message, http_message_type type)
-{
- /* just act if different */
- if (type != message->type) {
-
- /* free request info */
- switch (message->type)
- {
- case HTTP_MSG_REQUEST:
- STR_FREE(message->http.info.request.method);
- STR_FREE(message->http.info.request.URI);
- break;
-
- case HTTP_MSG_RESPONSE:
- STR_FREE(message->http.info.response.status);
- break;
-
- default:
- break;
- }
-
- /* init */
- http_message_init_type(message, type);
- }
-}
-
-PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char *message, size_t message_length TSRMLS_DC)
-{
- const char *body = NULL;
- zend_bool free_msg = msg ? 0 : 1;
-
- if ((!message) || (message_length < HTTP_MSG_MIN_SIZE)) {
- return NULL;
- }
-
- msg = http_message_init(msg);
-
- if (SUCCESS != http_parse_headers_cb(message, &msg->hdrs, 1, (http_info_callback) http_message_info_callback, (void **) &msg)) {
- if (free_msg) {
- http_message_free(&msg);
- }
- return NULL;
- }
-
- /* header parsing stops at (CR)LF (CR)LF */
- if (body = http_locate_body(message)) {
- zval *c;
- const char *continue_at = NULL;
-
- /* message has chunked transfer encoding */
- if (c = http_message_header(msg, "Transfer-Encoding")) {
- if (!strcasecmp("chunked", Z_STRVAL_P(c))) {
- char *decoded;
- size_t decoded_len;
-
- /* decode and replace Transfer-Encoding with Content-Length header */
- if (continue_at = http_chunked_decode(body, message + message_length - body, &decoded, &decoded_len)) {
- phpstr_from_string_ex(PHPSTR(msg), decoded, decoded_len);
- efree(decoded);
- {
- zval *len;
- char *tmp;
-
- spprintf(&tmp, 0, "%lu", (ulong) decoded_len);
- MAKE_STD_ZVAL(len);
- ZVAL_STRING(len, tmp, 0);
-
- zend_hash_del(&msg->hdrs, "Transfer-Encoding", sizeof("Transfer-Encoding"));
- zend_hash_add(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL);
- }
- }
- }
- } else
-
- /* message has content-length header */
- if (c = http_message_header(msg, "Content-Length")) {
- long len = atol(Z_STRVAL_P(c));
- phpstr_from_string_ex(PHPSTR(msg), body, len);
- continue_at = body + len;
- } else
-
- /* message has content-range header */
- if (c = http_message_header(msg, "Content-Range")) {
- ulong start = 0, end = 0;
-
- sscanf(Z_STRVAL_P(c), "bytes=%lu-%lu", &start, &end);
- if (end > start) {
- phpstr_from_string_ex(PHPSTR(msg), body, (size_t) (end - start));
- continue_at = body + (end - start);
- }
- } else
-
- /* no headers that indicate content length */
- if (HTTP_MSG_TYPE(RESPONSE, msg)) {
- phpstr_from_string_ex(PHPSTR(msg), body, message + message_length - body);
- } else {
- continue_at = body;
- }
-
- /* check for following messages */
- if (continue_at) {
- while (isspace(*continue_at)) ++continue_at;
- if (continue_at < (message + message_length)) {
- http_message *next = NULL, *most = NULL;
-
- /* set current message to parent of most parent following messages and return deepest */
- if (most = next = http_message_parse(continue_at, message + message_length - continue_at)) {
- while (most->parent) most = most->parent;
- most->parent = msg;
- msg = next;
- }
- }
- }
- }
-
- return msg;
-}
-
-PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_t *length)
-{
- phpstr str;
- char *key, *data;
- ulong idx;
- zval **header;
-
- phpstr_init_ex(&str, 4096, 0);
-
- switch (msg->type)
- {
- case HTTP_MSG_REQUEST:
- phpstr_appendf(&str, "%s %s HTTP/%1.1f" HTTP_CRLF,
- msg->http.info.request.method,
- msg->http.info.request.URI,
- msg->http.version);
- break;
-
- case HTTP_MSG_RESPONSE:
- phpstr_appendf(&str, "HTTP/%1.1f %d%s%s" HTTP_CRLF,
- msg->http.version,
- msg->http.info.response.code,
- *msg->http.info.response.status ? " ":"",
- msg->http.info.response.status);
- break;
-
- case HTTP_MSG_NONE:
- default:
- break;
- }
-
- FOREACH_HASH_KEYVAL(&msg->hdrs, key, idx, header) {
- if (key) {
- zval **single_header;
-
- switch (Z_TYPE_PP(header))
- {
- case IS_STRING:
- phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(header));
- break;
-
- case IS_ARRAY:
- FOREACH_VAL(*header, single_header) {
- phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(single_header));
- }
- break;
- }
-
- key = NULL;
- }
- }
-
- if (PHPSTR_LEN(msg)) {
- phpstr_appends(&str, HTTP_CRLF);
- phpstr_append(&str, PHPSTR_VAL(msg), PHPSTR_LEN(msg));
- phpstr_appends(&str, HTTP_CRLF);
- }
-
- data = phpstr_data(&str, string, length);
- if (!string) {
- efree(data);
- }
-
- phpstr_dtor(&str);
-}
-
-PHP_HTTP_API void _http_message_serialize(http_message *message, char **string, size_t *length)
-{
- char *buf;
- size_t len;
- phpstr str;
-
- phpstr_init(&str);
-
- do {
- http_message_tostring(message, &buf, &len);
- phpstr_prepend(&str, buf, len);
- efree(buf);
- } while (message = message->parent);
-
- buf = phpstr_data(&str, string, length);
- if (!string) {
- efree(buf);
- }
-
- phpstr_dtor(&str);
-}
-
-PHP_HTTP_API void _http_message_tostruct_recursive(http_message *msg, zval *obj TSRMLS_DC)
-{
- zval strct;
- zval *headers;
-
- INIT_ZARR(strct, HASH_OF(obj));
-
- add_assoc_long(&strct, "type", msg->type);
- add_assoc_double(&strct, "httpVersion", msg->http.version);
- switch (msg->type)
- {
- case HTTP_MSG_RESPONSE:
- add_assoc_long(&strct, "responseCode", msg->http.info.response.code);
- add_assoc_string(&strct, "responseStatus", msg->http.info.response.status, 1);
- break;
-
- case HTTP_MSG_REQUEST:
- add_assoc_string(&strct, "requestMethod", msg->http.info.request.method, 1);
- add_assoc_string(&strct, "requestUri", msg->http.info.request.URI, 1);
- break;
- }
-
- MAKE_STD_ZVAL(headers);
- array_init(headers);
- zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
- add_assoc_zval(&strct, "headers", headers);
-
- add_assoc_stringl(&strct, "body", PHPSTR_VAL(msg), PHPSTR_LEN(msg), 1);
-
- if (msg->parent) {
- zval *parent;
-
- MAKE_STD_ZVAL(parent);
- if (Z_TYPE_P(obj) == IS_ARRAY) {
- array_init(parent);
- } else {
- object_init(parent);
- }
- add_assoc_zval(&strct, "parentMessage", parent);
- http_message_tostruct_recursive(msg->parent, parent);
- zval_ptr_dtor(&parent);
- } else {
- add_assoc_null(&strct, "parentMessage");
- }
-}
-
-PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC)
-{
- STATUS rs = FAILURE;
-
- switch (message->type)
- {
- case HTTP_MSG_RESPONSE:
- {
- char *key;
- ulong idx;
- zval **val;
-
- FOREACH_HASH_KEYVAL(&message->hdrs, key, idx, val) {
- if (key) {
- if (Z_TYPE_PP(val) == IS_ARRAY) {
- zend_bool first = 1;
- zval **data;
-
- FOREACH_VAL(*val, data) {
- http_send_header_ex(key, strlen(key), Z_STRVAL_PP(data), Z_STRLEN_PP(data), first, NULL);
- first = 0;
- }
- } else {
- http_send_header_ex(key, strlen(key), Z_STRVAL_PP(val), Z_STRLEN_PP(val), 1, NULL);
- }
- key = NULL;
- }
- }
- rs = SUCCESS == http_send_status(message->http.info.response.code) &&
- SUCCESS == http_send_data(PHPSTR_VAL(message), PHPSTR_LEN(message)) ?
- SUCCESS : FAILURE;
- }
- break;
-
- case HTTP_MSG_REQUEST:
- {
-#ifdef HTTP_HAVE_CURL
- char *uri = NULL;
- zval **zhost, options, headers;
-
- INIT_PZVAL(&options);
- INIT_PZVAL(&headers);
- array_init(&options);
- array_init(&headers);
- zend_hash_copy(Z_ARRVAL(headers), &message->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
- add_assoc_zval(&options, "headers", &headers);
-
- /* check host header */
- if (SUCCESS == zend_hash_find(&message->hdrs, "Host", sizeof("Host"), (void **) &zhost)) {
- char *colon = NULL, *host = NULL;
- size_t host_len = 0;
- int port = 0;
-
- /* check for port */
- if (colon = strchr(Z_STRVAL_PP(zhost), ':')) {
- port = atoi(colon + 1);
- host = estrndup(Z_STRVAL_PP(zhost), host_len = (Z_STRVAL_PP(zhost) - colon - 1));
- } else {
- host = estrndup(Z_STRVAL_PP(zhost), host_len = Z_STRLEN_PP(zhost));
- }
- uri = http_absolute_uri_ex(
- message->http.info.request.URI, strlen(message->http.info.request.URI),
- NULL, 0, host, host_len, port);
- efree(host);
- } else {
- uri = http_absolute_uri(message->http.info.request.URI);
- }
-
- if (!strcasecmp("POST", message->http.info.request.method)) {
- http_request_body body = {HTTP_REQUEST_BODY_CSTRING, PHPSTR_VAL(message), PHPSTR_LEN(message)};
- rs = http_post(uri, &body, Z_ARRVAL(options), NULL, NULL);
- } else
- if (!strcasecmp("GET", message->http.info.request.method)) {
- rs = http_get(uri, Z_ARRVAL(options), NULL, NULL);
- } else
- if (!strcasecmp("HEAD", message->http.info.request.method)) {
- rs = http_head(uri, Z_ARRVAL(options), NULL, NULL);
- } else {
- http_error_ex(HE_WARNING, HTTP_E_REQUEST_METHOD,
- "Cannot send HttpMessage. Request method %s not supported",
- message->http.info.request.method);
- }
-
- efree(uri);
-#else
- http_error(HE_WARNING, HTTP_E_RUNTIME, "HTTP requests not supported - ext/http was not linked against libcurl.");
-#endif
- }
- break;
-
- case HTTP_MSG_NONE:
- default:
- http_error(HE_WARNING, HTTP_E_MESSAGE_TYPE, "HttpMessage is neither of type HTTP_MSG_REQUEST nor HTTP_MSG_RESPONSE");
- break;
- }
-
- return rs;
-}
-
-PHP_HTTP_API http_message *_http_message_dup(http_message *msg TSRMLS_DC)
-{
- /*
- * TODO: unroll
- */
- http_message *new;
- char *serialized_data;
- size_t serialized_length;
-
- http_message_serialize(msg, &serialized_data, &serialized_length);
- new = http_message_parse(serialized_data, serialized_length);
- efree(serialized_data);
- return new;
-}
-
-PHP_HTTP_API void _http_message_dtor(http_message *message)
-{
- if (message) {
- zend_hash_destroy(&message->hdrs);
- phpstr_dtor(PHPSTR(message));
-
- switch (message->type)
- {
- case HTTP_MSG_REQUEST:
- STR_SET(message->http.info.request.method, NULL);
- STR_SET(message->http.info.request.URI, NULL);
- break;
-
- case HTTP_MSG_RESPONSE:
- STR_SET(message->http.info.response.status, NULL);
- break;
-
- default:
- break;
- }
- }
-}
-
-PHP_HTTP_API void _http_message_free(http_message **message)
-{
- if (*message) {
- if ((*message)->parent) {
- http_message_free(&(*message)->parent);
- }
- http_message_dtor(*message);
- efree(*message);
- *message = NULL;
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#ifdef ZEND_ENGINE_2
-
-#include "php_http.h"
-#include "php_http_api.h"
-#include "php_http_std_defs.h"
-#include "php_http_message_object.h"
-#include "php_http_exception_object.h"
-
-#include "phpstr/phpstr.h"
-#include "missing.h"
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#define HTTP_BEGIN_ARGS(method, ret_ref, req_args) HTTP_BEGIN_ARGS_EX(HttpMessage, method, ret_ref, req_args)
-#define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpMessage, method, ret_ref)
-#define HTTP_MESSAGE_ME(method, visibility) PHP_ME(HttpMessage, method, HTTP_ARGS(HttpMessage, method), visibility)
-
-HTTP_BEGIN_ARGS(__construct, 0, 0)
- HTTP_ARG_VAL(message, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(fromString, 1, 1)
- HTTP_ARG_VAL(message, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getBody, 0);
-HTTP_BEGIN_ARGS(setBody, 0, 1)
- HTTP_ARG_VAL(body, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getHeaders, 0);
-HTTP_BEGIN_ARGS(setHeaders, 0, 1)
- HTTP_ARG_VAL(headers, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(addHeaders, 0, 1)
- HTTP_ARG_VAL(headers, 0)
- HTTP_ARG_VAL(append, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getType, 0);
-HTTP_BEGIN_ARGS(setType, 0, 1)
- HTTP_ARG_VAL(type, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getResponseCode, 0);
-HTTP_BEGIN_ARGS(setResponseCode, 0, 1)
- HTTP_ARG_VAL(response_code, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getRequestMethod, 0);
-HTTP_BEGIN_ARGS(setRequestMethod, 0, 1)
- HTTP_ARG_VAL(request_method, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getRequestUri, 0);
-HTTP_BEGIN_ARGS(setRequestUri, 0, 1)
- HTTP_ARG_VAL(uri, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getHttpVersion, 0);
-HTTP_BEGIN_ARGS(setHttpVersion, 0, 1)
- HTTP_ARG_VAL(http_version, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getParentMessage, 1);
-HTTP_EMPTY_ARGS(send, 0);
-HTTP_BEGIN_ARGS(toString, 0, 0)
- HTTP_ARG_VAL(include_parent, 0)
-HTTP_END_ARGS;
-
-#define http_message_object_declare_default_properties() _http_message_object_declare_default_properties(TSRMLS_C)
-static inline void _http_message_object_declare_default_properties(TSRMLS_D);
-#define http_message_object_read_prop _http_message_object_read_prop
-static zval *_http_message_object_read_prop(zval *object, zval *member, int type TSRMLS_DC);
-#define http_message_object_write_prop _http_message_object_write_prop
-static void _http_message_object_write_prop(zval *object, zval *member, zval *value TSRMLS_DC);
-#define http_message_object_get_props _http_message_object_get_props
-static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC);
-#define http_message_object_clone_obj _http_message_object_clone_obj
-static inline zend_object_value _http_message_object_clone_obj(zval *object TSRMLS_DC);
-
-zend_class_entry *http_message_object_ce;
-zend_function_entry http_message_object_fe[] = {
- HTTP_MESSAGE_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
- HTTP_MESSAGE_ME(getBody, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(setBody, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(getHeaders, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(setHeaders, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(addHeaders, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(getType, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(setType, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(getResponseCode, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(setResponseCode, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(getRequestMethod, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(setRequestMethod, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(getRequestUri, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(setRequestUri, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(getHttpVersion, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(setHttpVersion, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(getParentMessage, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(send, ZEND_ACC_PUBLIC)
- HTTP_MESSAGE_ME(toString, ZEND_ACC_PUBLIC)
-
- ZEND_MALIAS(HttpMessage, __toString, toString, HTTP_ARGS(HttpMessage, toString), ZEND_ACC_PUBLIC)
-
- HTTP_MESSAGE_ME(fromString, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-
- EMPTY_FUNCTION_ENTRY
-};
-static zend_object_handlers http_message_object_handlers;
-
-void _http_message_object_init(INIT_FUNC_ARGS)
-{
- HTTP_REGISTER_CLASS_EX(HttpMessage, http_message_object, NULL, 0);
-
- HTTP_LONG_CONSTANT("HTTP_MSG_NONE", HTTP_MSG_NONE);
- HTTP_LONG_CONSTANT("HTTP_MSG_REQUEST", HTTP_MSG_REQUEST);
- HTTP_LONG_CONSTANT("HTTP_MSG_RESPONSE", HTTP_MSG_RESPONSE);
-
- http_message_object_handlers.clone_obj = http_message_object_clone_obj;
- http_message_object_handlers.read_property = http_message_object_read_prop;
- http_message_object_handlers.write_property = http_message_object_write_prop;
- http_message_object_handlers.get_properties = http_message_object_get_props;
- http_message_object_handlers.get_property_ptr_ptr = NULL;
-}
-
-zend_object_value _http_message_object_new(zend_class_entry *ce TSRMLS_DC)
-{
- return http_message_object_new_ex(ce, NULL);
-}
-
-zend_object_value _http_message_object_new_ex(zend_class_entry *ce, http_message *msg TSRMLS_DC)
-{
- zend_object_value ov;
- http_message_object *o;
-
- o = ecalloc(1, sizeof(http_message_object));
- o->zo.ce = ce;
-
- if (msg) {
- o->message = msg;
- if (msg->parent) {
- o->parent = http_message_object_from_msg(msg->parent);
- }
- }
-
- ALLOC_HASHTABLE(OBJ_PROP(o));
- zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0);
-
- ov.handle = putObject(http_message_object, o);
- ov.handlers = &http_message_object_handlers;
-
- return ov;
-}
-
-zend_object_value _http_message_object_clone(zval *this_ptr TSRMLS_DC)
-{
- return http_message_object_clone_obj(this_ptr TSRMLS_CC);
-}
-
-static inline void _http_message_object_declare_default_properties(TSRMLS_D)
-{
- zend_class_entry *ce = http_message_object_ce;
-
-#ifndef WONKY
- DCL_CONST(long, "TYPE_NONE", HTTP_MSG_NONE);
- DCL_CONST(long, "TYPE_REQUEST", HTTP_MSG_REQUEST);
- DCL_CONST(long, "TYPE_RESPONSE", HTTP_MSG_RESPONSE);
-#endif
-
- DCL_PROP(PROTECTED, long, type, HTTP_MSG_NONE);
- DCL_PROP(PROTECTED, string, body, "");
- DCL_PROP(PROTECTED, string, requestMethod, "");
- DCL_PROP(PROTECTED, string, requestUri, "");
- DCL_PROP(PROTECTED, long, responseCode, 0);
- DCL_PROP_N(PROTECTED, httpVersion);
- DCL_PROP_N(PROTECTED, headers);
- DCL_PROP_N(PROTECTED, parentMessage);
-}
-
-void _http_message_object_free(zend_object *object TSRMLS_DC)
-{
- http_message_object *o = (http_message_object *) object;
-
- if (OBJ_PROP(o)) {
- zend_hash_destroy(OBJ_PROP(o));
- FREE_HASHTABLE(OBJ_PROP(o));
- }
- if (o->message) {
- http_message_dtor(o->message);
- efree(o->message);
- }
- efree(o);
-}
-
-static inline zend_object_value _http_message_object_clone_obj(zval *this_ptr TSRMLS_DC)
-{
- getObject(http_message_object, obj);
- return http_message_object_from_msg(http_message_dup(obj->message));
-}
-
-static zval *_http_message_object_read_prop(zval *object, zval *member, int type TSRMLS_DC)
-{
- getObjectEx(http_message_object, obj, object);
- http_message *msg = obj->message;
- zval *return_value;
-#ifdef WONKY
- zend_hash_value h = zend_get_hash_value(Z_STRVAL_P(member), Z_STRLEN_P(member)+1);
-#else
- zend_property_info *pinfo = zend_get_property_info(obj->zo.ce, member, 1 TSRMLS_CC);
-
- if (!pinfo || ACC_PROP_PUBLIC(pinfo->flags)) {
- return zend_get_std_object_handlers()->read_property(object, member, type TSRMLS_CC);
- }
-#endif
-
- return_value = &EG(uninitialized_zval);
- return_value->refcount = 0;
- return_value->is_ref = 0;
-
-#ifdef WONKY
- switch (h)
-#else
- switch (pinfo->h)
-#endif
- {
- case HTTP_MSG_PROPHASH_TYPE:
- RETVAL_LONG(msg->type);
- break;
-
- case HTTP_MSG_PROPHASH_HTTP_VERSION:
- RETVAL_DOUBLE(msg->http.version);
- break;
-
- case HTTP_MSG_PROPHASH_BODY:
- phpstr_fix(PHPSTR(msg));
- RETVAL_PHPSTR(PHPSTR(msg), 0, 1);
- break;
-
- case HTTP_MSG_PROPHASH_HEADERS:
- /* This is needed for situations like
- * $this->headers['foo'] = 'bar';
- */
- if (type == BP_VAR_W) {
- return_value->refcount = 1;
- return_value->is_ref = 1;
- Z_TYPE_P(return_value) = IS_ARRAY;
- Z_ARRVAL_P(return_value) = &msg->hdrs;
- } else {
- array_init(return_value);
- zend_hash_copy(Z_ARRVAL_P(return_value), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
- }
- break;
-
- case HTTP_MSG_PROPHASH_PARENT_MESSAGE:
- if (msg->parent) {
- RETVAL_OBJVAL(obj->parent);
- } else {
- RETVAL_NULL();
- }
- break;
-
- case HTTP_MSG_PROPHASH_REQUEST_METHOD:
- if (HTTP_MSG_TYPE(REQUEST, msg) && msg->http.info.request.method) {
- RETVAL_STRING(msg->http.info.request.method, 1);
- } else {
- RETVAL_NULL();
- }
- break;
-
- case HTTP_MSG_PROPHASH_REQUEST_URI:
- if (HTTP_MSG_TYPE(REQUEST, msg) && msg->http.info.request.URI) {
- RETVAL_STRING(msg->http.info.request.URI, 1);
- } else {
- RETVAL_NULL();
- }
- break;
-
- case HTTP_MSG_PROPHASH_RESPONSE_CODE:
- if (HTTP_MSG_TYPE(RESPONSE, msg)) {
- RETVAL_LONG(msg->http.info.response.code);
- } else {
- RETVAL_NULL();
- }
- break;
-
- case HTTP_MSG_PROPHASH_RESPONSE_STATUS:
- if (HTTP_MSG_TYPE(RESPONSE, msg) && msg->http.info.response.status) {
- RETVAL_STRING(msg->http.info.response.status, 1);
- } else {
- RETVAL_NULL();
- }
- break;
-
- default:
-#ifdef WONKY
- return zend_get_std_object_handlers()->read_property(object, member, type TSRMLS_CC);
-#else
- RETVAL_NULL();
-#endif
- break;
- }
-
- return return_value;
-}
-
-static void _http_message_object_write_prop(zval *object, zval *member, zval *value TSRMLS_DC)
-{
- getObjectEx(http_message_object, obj, object);
- http_message *msg = obj->message;
-#ifdef WONKY
- zend_hash_value h = zend_get_hash_value(Z_STRVAL_P(member), Z_STRLEN_P(member) + 1);
-#else
- zend_property_info *pinfo = zend_get_property_info(obj->zo.ce, member, 1 TSRMLS_CC);
-
- if (!pinfo || ACC_PROP_PUBLIC(pinfo->flags)) {
- zend_get_std_object_handlers()->write_property(object, member, value TSRMLS_CC);
- return;
- }
-#endif
-
-#ifdef WONKY
- switch (h)
-#else
- switch (pinfo->h)
-#endif
- {
- case HTTP_MSG_PROPHASH_TYPE:
- convert_to_long_ex(&value);
- http_message_set_type(msg, Z_LVAL_P(value));
- break;
-
- case HTTP_MSG_PROPHASH_HTTP_VERSION:
- convert_to_double_ex(&value);
- msg->http.version = Z_DVAL_P(value);
- break;
-
- case HTTP_MSG_PROPHASH_BODY:
- convert_to_string_ex(&value);
- phpstr_dtor(PHPSTR(msg));
- phpstr_from_string_ex(PHPSTR(msg), Z_STRVAL_P(value), Z_STRLEN_P(value));
- break;
-
- case HTTP_MSG_PROPHASH_HEADERS:
- convert_to_array_ex(&value);
- zend_hash_clean(&msg->hdrs);
- zend_hash_copy(&msg->hdrs, Z_ARRVAL_P(value), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
- break;
-
- case HTTP_MSG_PROPHASH_PARENT_MESSAGE:
- if (msg->parent) {
- zval tmp;
- tmp.value.obj = obj->parent;
- zend_objects_store_del_ref(&tmp TSRMLS_CC);
- }
- zend_objects_store_add_ref(value TSRMLS_CC);
- obj->parent = value->value.obj;
- break;
-
- case HTTP_MSG_PROPHASH_REQUEST_METHOD:
- if (HTTP_MSG_TYPE(REQUEST, msg)) {
- convert_to_string_ex(&value);
- STR_SET(msg->http.info.request.method, estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value)));
- }
- break;
-
- case HTTP_MSG_PROPHASH_REQUEST_URI:
- if (HTTP_MSG_TYPE(REQUEST, msg)) {
- convert_to_string_ex(&value);
- STR_SET(msg->http.info.request.URI, estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value)));
- }
- break;
-
- case HTTP_MSG_PROPHASH_RESPONSE_CODE:
- if (HTTP_MSG_TYPE(RESPONSE, msg)) {
- convert_to_long_ex(&value);
- msg->http.info.response.code = Z_LVAL_P(value);
- }
- break;
-
- case HTTP_MSG_PROPHASH_RESPONSE_STATUS:
- if (HTTP_MSG_TYPE(RESPONSE, msg)) {
- convert_to_string_ex(&value);
- STR_SET(msg->http.info.response.status, estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value)));
- }
- break;
-
- default:
-#ifdef WONKY
- zend_get_std_object_handlers()->write_property(object, member, value TSRMLS_CC);
-#endif
- break;
- }
-}
-
-static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC)
-{
- zval *headers;
- getObjectEx(http_message_object, obj, object);
- http_message *msg = obj->message;
- HashTable *props = OBJ_PROP(obj);
- zval array;
-
- INIT_ZARR(array, props);
-
-#define ASSOC_PROP(array, ptype, name, val) \
- { \
- char *m_prop_name; \
- int m_prop_len; \
- zend_mangle_property_name(&m_prop_name, &m_prop_len, "*", 1, name, lenof(name), 0); \
- add_assoc_ ##ptype## _ex(&array, m_prop_name, sizeof(name)+4, val); \
- efree(m_prop_name); \
- }
-#define ASSOC_STRING(array, name, val) ASSOC_STRINGL(array, name, val, strlen(val))
-#define ASSOC_STRINGL(array, name, val, len) \
- { \
- char *m_prop_name; \
- int m_prop_len; \
- zend_mangle_property_name(&m_prop_name, &m_prop_len, "*", 1, name, lenof(name), 0); \
- add_assoc_stringl_ex(&array, m_prop_name, sizeof(name)+4, val, len, 1); \
- efree(m_prop_name); \
- }
-
- ASSOC_PROP(array, long, "type", msg->type);
- ASSOC_PROP(array, double, "httpVersion", msg->http.version);
-
- switch (msg->type)
- {
- case HTTP_MSG_REQUEST:
- ASSOC_PROP(array, long, "responseCode", 0);
- ASSOC_STRINGL(array, "responseStatus", "", 0);
- ASSOC_STRING(array, "requestMethod", msg->http.info.request.method);
- ASSOC_STRING(array, "requestUri", msg->http.info.request.URI);
- break;
-
- case HTTP_MSG_RESPONSE:
- ASSOC_PROP(array, long, "responseCode", msg->http.info.response.code);
- ASSOC_STRING(array, "responseStatus", msg->http.info.response.status);
- ASSOC_STRINGL(array, "requestMethod", "", 0);
- ASSOC_STRINGL(array, "requestUri", "", 0);
- break;
-
- case HTTP_MSG_NONE:
- default:
- ASSOC_PROP(array, long, "responseCode", 0);
- ASSOC_STRINGL(array, "responseStatus", "", 0);
- ASSOC_STRINGL(array, "requestMethod", "", 0);
- ASSOC_STRINGL(array, "requestUri", "", 0);
- break;
- }
-
- MAKE_STD_ZVAL(headers);
- array_init(headers);
- zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
- ASSOC_PROP(array, zval, "headers", headers);
- ASSOC_STRINGL(array, "body", PHPSTR_VAL(msg), PHPSTR_LEN(msg));
-
- return OBJ_PROP(obj);
-}
-
-/* ### USERLAND ### */
-
-/* {{{ proto void HttpMessage::__construct([string message])
- *
- * Instantiate a new HttpMessage object.
- */
-PHP_METHOD(HttpMessage, __construct)
-{
- char *message = NULL;
- int length = 0;
- getObject(http_message_object, obj);
-
- SET_EH_THROW_HTTP();
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &message, &length) && message && length) {
- if (obj->message = http_message_parse(message, length)) {
- if (obj->message->parent) {
- obj->parent = http_message_object_from_msg(obj->message->parent);
- }
- }
- } else if (!obj->message) {
- obj->message = http_message_new();
- }
- SET_EH_NORMAL();
-}
-/* }}} */
-
-/* {{{ proto static HttpMessage HttpMessage::fromString(string raw_message)
- *
- * Create an HttpMessage object from a string.
- */
-PHP_METHOD(HttpMessage, fromString)
-{
- char *string = NULL;
- int length = 0;
- http_message *msg = NULL;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &string, &length)) {
- RETURN_NULL();
- }
-
- if (!(msg = http_message_parse(string, length))) {
- RETURN_NULL();
- }
-
- Z_TYPE_P(return_value) = IS_OBJECT;
- return_value->value.obj = http_message_object_from_msg(msg);
-}
-/* }}} */
-
-/* {{{ proto string HttpMessage::getBody()
- *
- * Get the body of the parsed Message.
- */
-PHP_METHOD(HttpMessage, getBody)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_message_object, obj);
- RETURN_PHPSTR(&obj->message->body, PHPSTR_FREE_NOT, 1);
- }
-}
-/* }}} */
-
-/* {{{ proto void HttpMessage::setBody(string body)
- *
- * Set the body of the HttpMessage.
- * NOTE: Don't forget to update any headers accordingly.
- */
-PHP_METHOD(HttpMessage, setBody)
-{
- char *body;
- int len;
- getObject(http_message_object, obj);
-
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &body, &len)) {
- phpstr_dtor(PHPSTR(obj->message));
- phpstr_from_string_ex(PHPSTR(obj->message), body, len);
- }
-}
-/* }}} */
-
-/* {{{ proto array HttpMessage::getHeaders()
- *
- * Get Message Headers.
- */
-PHP_METHOD(HttpMessage, getHeaders)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval headers;
- getObject(http_message_object, obj);
-
- INIT_ZARR(headers, &obj->message->hdrs);
- array_init(return_value);
- array_copy(&headers, return_value);
- }
-}
-/* }}} */
-
-/* {{{ proto void HttpMessage::setHeaders(array headers)
- *
- * Sets new headers.
- */
-PHP_METHOD(HttpMessage, setHeaders)
-{
- zval *new_headers, old_headers;
- getObject(http_message_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &new_headers)) {
- return;
- }
-
- zend_hash_clean(&obj->message->hdrs);
- INIT_ZARR(old_headers, &obj->message->hdrs);
- array_copy(new_headers, &old_headers);
-}
-/* }}} */
-
-/* {{{ proto void HttpMessage::addHeaders(array headers[, bool append = false])
- *
- * Add headers. If append is true, headers with the same name will be separated, else overwritten.
- */
-PHP_METHOD(HttpMessage, addHeaders)
-{
- zval old_headers, *new_headers;
- zend_bool append = 0;
- getObject(http_message_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &new_headers, &append)) {
- return;
- }
-
- INIT_ZARR(old_headers, &obj->message->hdrs);
- if (append) {
- array_append(new_headers, &old_headers);
- } else {
- array_merge(new_headers, &old_headers);
- }
-}
-/* }}} */
-
-/* {{{ proto long HttpMessage::getType()
- *
- * Get Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE)
- */
-PHP_METHOD(HttpMessage, getType)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_message_object, obj);
- RETURN_LONG(obj->message->type);
- }
-}
-/* }}} */
-
-/* {{{ proto void HttpMessage::setType(long type)
- *
- * Set Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE)
- */
-PHP_METHOD(HttpMessage, setType)
-{
- long type;
- getObject(http_message_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &type)) {
- return;
- }
- http_message_set_type(obj->message, type);
-}
-/* }}} */
-
-/* {{{ proto long HttpMessage::getResponseCode()
- *
- * Get the Response Code of the Message.
- */
-PHP_METHOD(HttpMessage, getResponseCode)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_message_object, obj);
-
- if (!HTTP_MSG_TYPE(RESPONSE, obj->message)) {
- http_error(HE_NOTICE, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_RESPONSE");
- RETURN_NULL();
- }
-
- RETURN_LONG(obj->message->http.info.response.code);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpMessage::setResponseCode(long code)
- *
- * Set the response code of an HTTP Response Message.
- * Returns false if the Message is not of type HTTP_MSG_RESPONSE,
- * or if the response code is out of range (100-510).
- */
-PHP_METHOD(HttpMessage, setResponseCode)
-{
- long code;
- getObject(http_message_object, obj);
-
- if (!HTTP_MSG_TYPE(RESPONSE, obj->message)) {
- http_error(HE_WARNING, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_RESPONSE");
- RETURN_FALSE;
- }
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &code)) {
- RETURN_FALSE;
- }
- if (code < 100 || code > 510) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid response code (100-510): %ld", code);
- RETURN_FALSE;
- }
-
- obj->message->http.info.response.code = code;
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpMessage::getRequestMethod()
- *
- * Get the Request Method of the Message.
- * Returns false if the Message is not of type HTTP_MSG_REQUEST.
- */
-PHP_METHOD(HttpMessage, getRequestMethod)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_message_object, obj);
-
- if (!HTTP_MSG_TYPE(REQUEST, obj->message)) {
- http_error(HE_NOTICE, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_REQUEST");
- RETURN_NULL();
- }
-
- RETURN_STRING(obj->message->http.info.request.method, 1);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpMessage::setRequestMethod(string method)
- *
- * Set the Request Method of the HTTP Message.
- * Returns false if the Message is not of type HTTP_MSG_REQUEST.
- */
-PHP_METHOD(HttpMessage, setRequestMethod)
-{
- char *method;
- int method_len;
- getObject(http_message_object, obj);
-
- if (!HTTP_MSG_TYPE(REQUEST, obj->message)) {
- http_error(HE_WARNING, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_REQUEST");
- RETURN_FALSE;
- }
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &method, &method_len)) {
- RETURN_FALSE;
- }
- if (method_len < 1) {
- http_error(HE_WARNING, HTTP_E_INVALID_PARAM, "Cannot set HttpMessage::requestMethod to an empty string");
- RETURN_FALSE;
- }
- if (SUCCESS != http_check_method(method)) {
- http_error_ex(HE_WARNING, HTTP_E_REQUEST_METHOD, "Unkown request method: %s", method);
- RETURN_FALSE;
- }
-
- STR_SET(obj->message->http.info.request.method, estrndup(method, method_len));
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpMessage::getRequestUri()
- *
- * Get the Request URI of the Message.
- */
-PHP_METHOD(HttpMessage, getRequestUri)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_message_object, obj);
-
- if (!HTTP_MSG_TYPE(REQUEST, obj->message)) {
- http_error(HE_WARNING, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_REQUEST");
- RETURN_NULL();
- }
-
- RETURN_STRING(obj->message->http.info.request.URI, 1);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpMessage::setRequestUri(string URI)
- *
- * Set the Request URI of the HTTP Message.
- * Returns false if the Message is not of type HTTP_MSG_REQUEST,
- * or if paramtere URI was empty.
- */
-PHP_METHOD(HttpMessage, setRequestUri)
-{
- char *URI;
- int URIlen;
- getObject(http_message_object, obj);
-
- if (!HTTP_MSG_TYPE(REQUEST, obj->message)) {
- http_error(HE_WARNING, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_REQUEST");
- RETURN_FALSE;
- }
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &URI, &URIlen)) {
- RETURN_FALSE;
- }
- if (URIlen < 1) {
- http_error(HE_WARNING, HTTP_E_INVALID_PARAM, "Cannot set HttpMessage::requestUri to an empty string");
- RETURN_FALSE;
- }
-
- STR_SET(obj->message->http.info.request.URI, estrndup(URI, URIlen));
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpMessage::getHttpVersion()
- *
- * Get the HTTP Protocol Version of the Message.
- */
-PHP_METHOD(HttpMessage, getHttpVersion)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- char ver[4] = {0};
- getObject(http_message_object, obj);
-
- sprintf(ver, "%1.1lf", obj->message->http.version);
- RETURN_STRINGL(ver, 3, 1);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpMessage::setHttpVersion(string version)
- *
- * Set the HTTP Protocol version of the Message.
- * Returns false if version is invalid (1.0 and 1.1).
- */
-PHP_METHOD(HttpMessage, setHttpVersion)
-{
- char v[4];
- zval *zv;
- getObject(http_message_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &zv)) {
- return;
- }
-
- convert_to_double(zv);
- sprintf(v, "%1.1lf", Z_DVAL_P(zv));
- if (strcmp(v, "1.0") && strcmp(v, "1.1")) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid HTTP protocol version (1.0 or 1.1): %s", v);
- RETURN_FALSE;
- }
-
- obj->message->http.version = Z_DVAL_P(zv);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto HttpMessage HttpMessage::getParentMessage()
- *
- * Get parent Message.
- */
-PHP_METHOD(HttpMessage, getParentMessage)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_message_object, obj);
-
- if (obj->message->parent) {
- RETVAL_OBJVAL(obj->parent);
- } else {
- RETVAL_NULL();
- }
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpMessage::send()
- *
- * Send the Message according to its type as Response or Request.
- */
-PHP_METHOD(HttpMessage, send)
-{
- getObject(http_message_object, obj);
-
- NO_ARGS;
-
- RETURN_SUCCESS(http_message_send(obj->message));
-}
-/* }}} */
-
-/* {{{ proto string HttpMessage::toString([bool include_parent = false])
- *
- * Get the string representation of the Message.
- */
-PHP_METHOD(HttpMessage, toString)
-{
- IF_RETVAL_USED {
- char *string;
- size_t length;
- zend_bool include_parent = 0;
- getObject(http_message_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &include_parent)) {
- RETURN_FALSE;
- }
-
- if (include_parent) {
- http_message_serialize(obj->message, &string, &length);
- } else {
- http_message_tostring(obj->message, &string, &length);
- }
- RETURN_STRINGL(string, length, 0);
- }
-}
-/* }}} */
-
-#endif /* ZEND_ENGINE_2 */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-/*
- * Contents have been split up into http_*_object.c
- */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#ifdef HTTP_HAVE_CURL
-
-#if defined(ZTS) && defined(HTTP_HAVE_SSL)
-# if !defined(HAVE_OPENSSL_CRYPTO_H)
-# error "libcurl was compiled with OpenSSL support, but we have no openssl/crypto.h"
-# else
-# define HTTP_NEED_SSL
-# include <openssl/crypto.h>
-# endif
-#endif
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_request_api.h"
-#include "php_http_request_method_api.h"
-#include "php_http_url_api.h"
-#ifdef ZEND_ENGINE_2
-# include "php_http_request_object.h"
-#endif
-
-#include "phpstr/phpstr.h"
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#endif
-
-#include <curl/curl.h>
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#ifdef HTTP_NEED_SSL
-static inline zend_bool http_ssl_init(void);
-static inline void http_ssl_cleanup(void);
-#endif
-
-STATUS _http_request_global_init(INIT_FUNC_ARGS)
-{
- if (CURLE_OK != curl_global_init(CURL_GLOBAL_ALL)) {
- return FAILURE;
- }
-
-#ifdef HTTP_NEED_SSL
- http_ssl_init();
-#endif
-
-#if LIBCURL_VERSION_NUM >= 0x070a05
- HTTP_LONG_CONSTANT("HTTP_AUTH_BASIC", CURLAUTH_BASIC);
- HTTP_LONG_CONSTANT("HTTP_AUTH_DIGEST", CURLAUTH_DIGEST);
- HTTP_LONG_CONSTANT("HTTP_AUTH_NTLM", CURLAUTH_NTLM);
- HTTP_LONG_CONSTANT("HTTP_AUTH_ANY", CURLAUTH_ANY);
-#endif /* LIBCURL_VERSION_NUM */
-
- return SUCCESS;
-}
-
-void _http_request_global_cleanup(TSRMLS_D)
-{
- curl_global_cleanup();
-#ifdef HTTP_NEED_SSL
- http_ssl_cleanup();
-#endif
-}
-
-#ifndef HAVE_CURL_EASY_STRERROR
-# define curl_easy_strerror(code) HTTP_G(request).error
-#endif
-
-#define HTTP_CURL_INFO(I) HTTP_CURL_INFO_EX(I, I)
-#define HTTP_CURL_INFO_EX(I, X) \
- switch (CURLINFO_ ##I & ~CURLINFO_MASK) \
- { \
- case CURLINFO_STRING: \
- { \
- char *c; \
- if (CURLE_OK == curl_easy_getinfo(ch, CURLINFO_ ##I, &c)) { \
- add_assoc_string(&array, pretty_key(http_request_data_copy(COPY_STRING, #X), sizeof(#X)-1, 0, 0), c ? c : "", 1); \
- } \
- } \
- break; \
-\
- case CURLINFO_DOUBLE: \
- { \
- double d; \
- if (CURLE_OK == curl_easy_getinfo(ch, CURLINFO_ ##I, &d)) { \
- add_assoc_double(&array, pretty_key(http_request_data_copy(COPY_STRING, #X), sizeof(#X)-1, 0, 0), d); \
- } \
- } \
- break; \
-\
- case CURLINFO_LONG: \
- { \
- long l; \
- if (CURLE_OK == curl_easy_getinfo(ch, CURLINFO_ ##I, &l)) { \
- add_assoc_long(&array, pretty_key(http_request_data_copy(COPY_STRING, #X), sizeof(#X)-1, 0, 0), l); \
- } \
- } \
- break; \
- }
-
-#define HTTP_CURL_OPT(OPTION, p) curl_easy_setopt(ch, CURLOPT_##OPTION, (p))
-#define HTTP_CURL_OPT_STRING(keyname) HTTP_CURL_OPT_STRING_EX(keyname, keyname)
-#define HTTP_CURL_OPT_SSL_STRING(keyname) HTTP_CURL_OPT_STRING_EX(keyname, SSL##keyname)
-#define HTTP_CURL_OPT_SSL_STRING_(keyname) HTTP_CURL_OPT_STRING_EX(keyname, SSL_##keyname)
-#define HTTP_CURL_OPT_STRING_EX(keyname, optname) \
- if (!strcasecmp(key, #keyname)) { \
- convert_to_string_ex(param); \
- HTTP_CURL_OPT(optname, http_request_data_copy(COPY_STRING, Z_STRVAL_PP(param))); \
- key = NULL; \
- continue; \
- }
-#define HTTP_CURL_OPT_LONG(keyname) HTTP_OPT_SSL_LONG_EX(keyname, keyname)
-#define HTTP_CURL_OPT_SSL_LONG(keyname) HTTP_CURL_OPT_LONG_EX(keyname, SSL##keyname)
-#define HTTP_CURL_OPT_SSL_LONG_(keyname) HTTP_CURL_OPT_LONG_EX(keyname, SSL_##keyname)
-#define HTTP_CURL_OPT_LONG_EX(keyname, optname) \
- if (!strcasecmp(key, #keyname)) { \
- convert_to_long_ex(param); \
- HTTP_CURL_OPT(optname, Z_LVAL_PP(param)); \
- key = NULL; \
- continue; \
- }
-
-#define http_curl_getopt(o, k, t) _http_curl_getopt_ex((o), (k), sizeof(k), (t) TSRMLS_CC)
-#define http_curl_getopt_ex(o, k, l, t) _http_curl_getopt_ex((o), (k), (l), (t) TSRMLS_CC)
-static inline zval *_http_curl_getopt_ex(HashTable *options, char *key, size_t keylen, int type TSRMLS_DC);
-#define http_curl_defaults(ch) _http_curl_defaults((ch))
-static inline void _http_curl_defaults(CURL *ch);
-static size_t http_curl_read_callback(void *, size_t, size_t, void *);
-static int http_curl_progress_callback(void *, double, double, double, double);
-static int http_curl_raw_callback(CURL *, curl_infotype, char *, size_t, void *);
-static int http_curl_dummy_callback(char *data, size_t n, size_t l, void *s) { return n*l; }
-
-/* {{{ http_request_callback_ctx http_request_callback_data(void *) */
-http_request_callback_ctx *_http_request_callback_data_ex(void *data, zend_bool cpy TSRMLS_DC)
-{
- http_request_callback_ctx *ctx = emalloc(sizeof(http_request_callback_ctx));
-
- TSRMLS_SET_CTX(ctx->tsrm_ctx);
- ctx->data = data;
-
- if (cpy) {
- return http_request_data_copy(COPY_CONTEXT, ctx);
- } else {
- return ctx;
- }
-}
-/* }}} */
-
-/* {{{ void *http_request_data_copy(int, void *) */
-void *_http_request_data_copy(int type, void *data TSRMLS_DC)
-{
- switch (type)
- {
- case COPY_STRING:
- {
- char *new_str = estrdup(data);
- zend_llist_add_element(&HTTP_G(request).copies.strings, &new_str);
- return new_str;
- }
-
- case COPY_SLIST:
- {
- zend_llist_add_element(&HTTP_G(request).copies.slists, &data);
- return data;
- }
-
- case COPY_CONTEXT:
- {
- zend_llist_add_element(&HTTP_G(request).copies.contexts, &data);
- return data;
- }
-
- case COPY_CONV:
- {
- zend_llist_add_element(&HTTP_G(request).copies.convs, &data);
- return data;
- }
-
- default:
- {
- return data;
- }
- }
-}
-/* }}} */
-
-/* {{{ void http_request_data_free_string(char **) */
-void _http_request_data_free_string(void *string)
-{
- efree(*((char **)string));
-}
-/* }}} */
-
-/* {{{ void http_request_data_free_slist(struct curl_slist **) */
-void _http_request_data_free_slist(void *list)
-{
- curl_slist_free_all(*((struct curl_slist **) list));
-}
-/* }}} */
-
-/* {{{ _http_request_data_free_context(http_request_callback_ctx **) */
-void _http_request_data_free_context(void *context)
-{
- efree(*((http_request_callback_ctx **) context));
-}
-/* }}} */
-
-/* {{{ _http_request_data_free_conv(http_request_conv **) */
-void _http_request_data_free_conv(void *conv)
-{
- efree(*((http_request_conv **) conv));
-}
-/* }}} */
-
-/* {{{ http_request_body *http_request_body_new() */
-PHP_HTTP_API http_request_body *_http_request_body_new(TSRMLS_D)
-{
- http_request_body *body = ecalloc(1, sizeof(http_request_body));
- return body;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_body_fill(http_request_body *body, HashTable *, HashTable *) */
-PHP_HTTP_API STATUS _http_request_body_fill(http_request_body *body, HashTable *fields, HashTable *files TSRMLS_DC)
-{
- if (files && (zend_hash_num_elements(files) > 0)) {
- char *key = NULL;
- ulong idx;
- zval **data;
- struct curl_httppost *http_post_data[2] = {NULL, NULL};
-
- /* normal data */
- FOREACH_HASH_KEYVAL(fields, key, idx, data) {
- CURLcode err;
- if (key) {
- convert_to_string_ex(data);
- err = curl_formadd(&http_post_data[0], &http_post_data[1],
- CURLFORM_COPYNAME, key,
- CURLFORM_COPYCONTENTS, Z_STRVAL_PP(data),
- CURLFORM_CONTENTSLENGTH, (long) Z_STRLEN_PP(data),
- CURLFORM_END
- );
- if (CURLE_OK != err) {
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Could not encode post fields: %s", curl_easy_strerror(err));
- curl_formfree(http_post_data[0]);
- return FAILURE;
- }
-
- /* reset */
- key = NULL;
- }
- }
-
- /* file data */
- FOREACH_HASH_VAL(files, data) {
- zval **file, **type, **name;
-
- if ( SUCCESS != zend_hash_find(Z_ARRVAL_PP(data), "name", sizeof("name"), (void **) &name) ||
- SUCCESS != zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &type) ||
- SUCCESS != zend_hash_find(Z_ARRVAL_PP(data), "file", sizeof("file"), (void **) &file)) {
- http_error(HE_NOTICE, HTTP_E_INVALID_PARAM, "Post file array entry misses either 'name', 'type' or 'file' entry");
- } else {
- CURLcode err = curl_formadd(&http_post_data[0], &http_post_data[1],
- CURLFORM_COPYNAME, Z_STRVAL_PP(name),
- CURLFORM_FILE, Z_STRVAL_PP(file),
- CURLFORM_CONTENTTYPE, Z_STRVAL_PP(type),
- CURLFORM_END
- );
- if (CURLE_OK != err) {
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Could not encode post files: %s", curl_easy_strerror(err));
- curl_formfree(http_post_data[0]);
- return FAILURE;
- }
- }
- }
-
- body->type = HTTP_REQUEST_BODY_CURLPOST;
- body->data = http_post_data[0];
- body->size = 0;
-
- } else {
- char *encoded;
- size_t encoded_len;
-
- if (SUCCESS != http_urlencode_hash_ex(fields, 1, NULL, 0, &encoded, &encoded_len)) {
- http_error(HE_WARNING, HTTP_E_ENCODING, "Could not encode post data");
- return FAILURE;
- }
-
- body->type = HTTP_REQUEST_BODY_CSTRING;
- body->data = encoded;
- body->size = encoded_len;
- }
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ void http_request_body_dtor(http_request_body *) */
-PHP_HTTP_API void _http_request_body_dtor(http_request_body *body TSRMLS_DC)
-{
- if (body) {
- switch (body->type)
- {
- case HTTP_REQUEST_BODY_CSTRING:
- if (body->data) {
- efree(body->data);
- }
- break;
-
- case HTTP_REQUEST_BODY_CURLPOST:
- curl_formfree(body->data);
- break;
-
- case HTTP_REQUEST_BODY_UPLOADFILE:
- php_stream_close(body->data);
- break;
- }
- }
-}
-/* }}} */
-
-/* {{{ void http_request_body_free(http_request_body *) */
-PHP_HTTP_API void _http_request_body_free(http_request_body *body TSRMLS_DC)
-{
- if (body) {
- http_request_body_dtor(body);
- efree(body);
- }
-}
-/* }}} */
-
-/* {{{ STATUS http_request_init(CURL *, http_request_method, char *, http_request_body *, HashTable *) */
-PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char *url, http_request_body *body, HashTable *options TSRMLS_DC)
-{
- zval *zoption;
- zend_bool range_req = 0;
-
- /* reset CURL handle */
-#ifdef HAVE_CURL_EASY_RESET
- curl_easy_reset(ch);
-#endif
- http_curl_defaults(ch);
-
- /* set options */
- if (url) {
- HTTP_CURL_OPT(URL, http_request_data_copy(COPY_STRING, url));
- }
-
- HTTP_CURL_OPT(HEADER, 0);
- HTTP_CURL_OPT(FILETIME, 1);
- HTTP_CURL_OPT(AUTOREFERER, 1);
- HTTP_CURL_OPT(READFUNCTION, http_curl_read_callback);
- /* we'll get all data through the debug function */
- HTTP_CURL_OPT(WRITEFUNCTION, http_curl_dummy_callback);
- HTTP_CURL_OPT(HEADERFUNCTION, NULL);
-
- HTTP_CURL_OPT(VERBOSE, 1);
- HTTP_CURL_OPT(DEBUGFUNCTION, http_curl_raw_callback);
-
-#if defined(ZTS) && (LIBCURL_VERSION_NUM >= 0x070a00)
- HTTP_CURL_OPT(NOSIGNAL, 1);
-#endif
-#if LIBCURL_VERSION_NUM < 0x070c00
- HTTP_CURL_OPT(ERRORBUFFER, HTTP_G(request).error);
-#endif
-
- /* progress callback */
- if (zoption = http_curl_getopt(options, "onprogress", 0)) {
- HTTP_CURL_OPT(NOPROGRESS, 0);
- HTTP_CURL_OPT(PROGRESSFUNCTION, http_curl_progress_callback);
- HTTP_CURL_OPT(PROGRESSDATA, http_request_callback_data(zoption));
- }
-
- /* proxy */
- if (zoption = http_curl_getopt(options, "proxyhost", IS_STRING)) {
- HTTP_CURL_OPT(PROXY, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- /* port */
- if (zoption = http_curl_getopt(options, "proxyport", IS_LONG)) {
- HTTP_CURL_OPT(PROXYPORT, Z_LVAL_P(zoption));
- }
- /* user:pass */
- if (zoption = http_curl_getopt(options, "proxyauth", IS_STRING)) {
- HTTP_CURL_OPT(PROXYUSERPWD, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- }
-#if LIBCURL_VERSION_NUM >= 0x070a07
- /* auth method */
- if (zoption = http_curl_getopt(options, "proxyauthtype", IS_LONG)) {
- HTTP_CURL_OPT(PROXYAUTH, Z_LVAL_P(zoption));
- }
-#endif
- }
-
- /* outgoing interface */
- if (zoption = http_curl_getopt(options, "interface", IS_STRING)) {
- HTTP_CURL_OPT(INTERFACE, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- }
-
- /* another port */
- if (zoption = http_curl_getopt(options, "port", IS_LONG)) {
- HTTP_CURL_OPT(PORT, Z_LVAL_P(zoption));
- }
-
- /* auth */
- if (zoption = http_curl_getopt(options, "httpauth", IS_STRING)) {
- HTTP_CURL_OPT(USERPWD, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- }
-#if LIBCURL_VERSION_NUM >= 0x070a06
- if (zoption = http_curl_getopt(options, "httpauthtype", IS_LONG)) {
- HTTP_CURL_OPT(HTTPAUTH, Z_LVAL_P(zoption));
- }
-#endif
-
- /* compress, empty string enables deflate and gzip */
- if ((zoption = http_curl_getopt(options, "compress", IS_BOOL)) && Z_LVAL_P(zoption)) {
- HTTP_CURL_OPT(ENCODING, "");
- }
-
- /* redirects, defaults to 0 */
- if (zoption = http_curl_getopt(options, "redirect", IS_LONG)) {
- HTTP_CURL_OPT(FOLLOWLOCATION, Z_LVAL_P(zoption) ? 1 : 0);
- HTTP_CURL_OPT(MAXREDIRS, Z_LVAL_P(zoption));
- if (zoption = http_curl_getopt(options, "unrestrictedauth", IS_BOOL)) {
- HTTP_CURL_OPT(UNRESTRICTED_AUTH, Z_LVAL_P(zoption));
- }
- }
-
- /* referer */
- if (zoption = http_curl_getopt(options, "referer", IS_STRING)) {
- HTTP_CURL_OPT(REFERER, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- }
-
- /* useragent, default "PECL::HTTP/version (PHP/version)" */
- if (zoption = http_curl_getopt(options, "useragent", IS_STRING)) {
- HTTP_CURL_OPT(USERAGENT, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- }
-
- /* additional headers, array('name' => 'value') */
- if (zoption = http_curl_getopt(options, "headers", IS_ARRAY)) {
- char *header_key;
- ulong header_idx;
- struct curl_slist *headers = NULL;
-
- FOREACH_KEY(zoption, header_key, header_idx) {
- if (header_key) {
- zval **header_val;
- if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(zoption), (void **) &header_val)) {
- char header[1024] = {0};
- snprintf(header, 1023, "%s: %s", header_key, Z_STRVAL_PP(header_val));
- headers = curl_slist_append(headers, http_request_data_copy(COPY_STRING, header));
- }
-
- /* reset */
- header_key = NULL;
- }
- }
-
- if (headers) {
- HTTP_CURL_OPT(HTTPHEADER, http_request_data_copy(COPY_SLIST, headers));
- }
- }
-
- /* cookies, array('name' => 'value') */
- if (zoption = http_curl_getopt(options, "cookies", IS_ARRAY)) {
- char *cookie_key = NULL;
- ulong cookie_idx = 0;
- phpstr *qstr = phpstr_new();
-
- FOREACH_KEY(zoption, cookie_key, cookie_idx) {
- if (cookie_key) {
- zval **cookie_val;
- if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(zoption), (void **) &cookie_val)) {
- phpstr_appendf(qstr, "%s=%s; ", cookie_key, Z_STRVAL_PP(cookie_val));
- }
-
- /* reset */
- cookie_key = NULL;
- }
- }
-
- if (qstr->used) {
- phpstr_fix(qstr);
- HTTP_CURL_OPT(COOKIE, http_request_data_copy(COPY_STRING, qstr->data));
- }
- phpstr_free(&qstr);
- }
-
- /* session cookies */
- if (zoption = http_curl_getopt(options, "cookiesession", IS_BOOL)) {
- if (Z_LVAL_P(zoption)) {
- /* accept cookies for this session */
- HTTP_CURL_OPT(COOKIEFILE, "");
- } else {
- /* reset session cookies */
- HTTP_CURL_OPT(COOKIESESSION, 1);
- }
- }
-
- /* cookiestore, read initial cookies from that file and store cookies back into that file */
- if ((zoption = http_curl_getopt(options, "cookiestore", IS_STRING)) && Z_STRLEN_P(zoption)) {
- HTTP_CURL_OPT(COOKIEFILE, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- HTTP_CURL_OPT(COOKIEJAR, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption)));
- }
-
- /* resume */
- if ((zoption = http_curl_getopt(options, "resume", IS_LONG)) && (Z_LVAL_P(zoption) != 0)) {
- range_req = 1;
- HTTP_CURL_OPT(RESUME_FROM, Z_LVAL_P(zoption));
- }
-
- /* maxfilesize */
- if (zoption = http_curl_getopt(options, "maxfilesize", IS_LONG)) {
- HTTP_CURL_OPT(MAXFILESIZE, Z_LVAL_P(zoption));
- }
-
- /* lastmodified */
- if (zoption = http_curl_getopt(options, "lastmodified", IS_LONG)) {
- HTTP_CURL_OPT(TIMECONDITION, range_req ? CURL_TIMECOND_IFUNMODSINCE : CURL_TIMECOND_IFMODSINCE);
- HTTP_CURL_OPT(TIMEVALUE, Z_LVAL_P(zoption));
- }
-
- /* timeout, defaults to 0 */
- if (zoption = http_curl_getopt(options, "timeout", IS_LONG)) {
- HTTP_CURL_OPT(TIMEOUT, Z_LVAL_P(zoption));
- }
-
- /* connecttimeout, defaults to 3 */
- if (zoption = http_curl_getopt(options, "connecttimeout", IS_LONG)) {
- HTTP_CURL_OPT(CONNECTTIMEOUT, Z_LVAL_P(zoption));
- }
-
- /* ssl */
- if (zoption = http_curl_getopt(options, "ssl", IS_ARRAY)) {
- ulong idx;
- char *key = NULL;
- zval **param;
-
- FOREACH_KEYVAL(zoption, key, idx, param) {
- if (key) {
- HTTP_CURL_OPT_SSL_STRING(CERT);
-#if LIBCURL_VERSION_NUM >= 0x070903
- HTTP_CURL_OPT_SSL_STRING(CERTTYPE);
-#endif
- HTTP_CURL_OPT_SSL_STRING(CERTPASSWD);
-
- HTTP_CURL_OPT_SSL_STRING(KEY);
- HTTP_CURL_OPT_SSL_STRING(KEYTYPE);
- HTTP_CURL_OPT_SSL_STRING(KEYPASSWD);
-
- HTTP_CURL_OPT_SSL_STRING(ENGINE);
- HTTP_CURL_OPT_SSL_LONG(VERSION);
-
- HTTP_CURL_OPT_SSL_LONG_(VERIFYPEER);
- HTTP_CURL_OPT_SSL_LONG_(VERIFYHOST);
- HTTP_CURL_OPT_SSL_STRING_(CIPHER_LIST);
-
-
- HTTP_CURL_OPT_STRING(CAINFO);
-#if LIBCURL_VERSION_NUM >= 0x070908
- HTTP_CURL_OPT_STRING(CAPATH);
-#endif
- HTTP_CURL_OPT_STRING(RANDOM_FILE);
- HTTP_CURL_OPT_STRING(EGDSOCKET);
-
- /* reset key */
- key = NULL;
- }
- }
- }
-
- /* request method */
- switch (meth)
- {
- case HTTP_GET:
- curl_easy_setopt(ch, CURLOPT_HTTPGET, 1);
- break;
-
- case HTTP_HEAD:
- curl_easy_setopt(ch, CURLOPT_NOBODY, 1);
- break;
-
- case HTTP_POST:
- curl_easy_setopt(ch, CURLOPT_POST, 1);
- break;
-
- case HTTP_PUT:
- curl_easy_setopt(ch, CURLOPT_UPLOAD, 1);
- break;
-
- default:
- if (http_request_method_exists(0, meth, NULL)) {
- curl_easy_setopt(ch, CURLOPT_CUSTOMREQUEST, http_request_method_name(meth));
- } else {
- http_error_ex(HE_WARNING, HTTP_E_REQUEST_METHOD, "Unsupported request method: %d", meth);
- return FAILURE;
- }
- break;
- }
-
- /* attach request body */
- if (body && (meth != HTTP_GET) && (meth != HTTP_HEAD)) {
- switch (body->type)
- {
- case HTTP_REQUEST_BODY_CSTRING:
- curl_easy_setopt(ch, CURLOPT_POSTFIELDS, body->data);
- curl_easy_setopt(ch, CURLOPT_POSTFIELDSIZE, body->size);
- break;
-
- case HTTP_REQUEST_BODY_CURLPOST:
- curl_easy_setopt(ch, CURLOPT_HTTPPOST, (struct curl_httppost *) body->data);
- break;
-
- case HTTP_REQUEST_BODY_UPLOADFILE:
- curl_easy_setopt(ch, CURLOPT_READDATA, http_request_callback_data(body));
- curl_easy_setopt(ch, CURLOPT_INFILESIZE, body->size);
- break;
-
- default:
- /* shouldn't ever happen */
- http_error_ex(HE_ERROR, 0, "Unknown request body type: %d", body->type);
- return FAILURE;
- break;
- }
- }
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ void http_request_conv(CURL *, phpstr *, phpstr *) */
-void _http_request_conv(CURL *ch, phpstr* response, phpstr *request TSRMLS_DC)
-{
- http_request_conv *conv = emalloc(sizeof(http_request_conv));
- conv->response = response;
- conv->request = request;
- conv->last_info = -1;
- HTTP_CURL_OPT(DEBUGDATA, http_request_callback_data(http_request_data_copy(COPY_CONV, conv)));
-}
-/* }}} */
-
-/* {{{ STATUS http_request_exec(CURL *, HashTable *) */
-PHP_HTTP_API STATUS _http_request_exec(CURL *ch, HashTable *info, phpstr *response, phpstr *request TSRMLS_DC)
-{
- CURLcode result;
-
- http_request_conv(ch, response, request);
-
- /* perform request */
- if (CURLE_OK != (result = curl_easy_perform(ch))) {
- http_error_ex(HE_WARNING, HTTP_E_REQUEST, "Could not perform request: %s", curl_easy_strerror(result));
- return FAILURE;
- } else {
- /* get curl info */
- if (info) {
- http_request_info(ch, info);
- }
- return SUCCESS;
- }
-}
-/* }}} */
-
-/* {{{ void http_request_info(CURL *, HashTable *) */
-PHP_HTTP_API void _http_request_info(CURL *ch, HashTable *info TSRMLS_DC)
-{
- zval array;
- INIT_ZARR(array, info);
-
- HTTP_CURL_INFO(EFFECTIVE_URL);
-#if LIBCURL_VERSION_NUM >= 0x070a07
- HTTP_CURL_INFO(RESPONSE_CODE);
-#else
- HTTP_CURL_INFO_EX(HTTP_CODE, RESPONSE_CODE);
-#endif
- HTTP_CURL_INFO(HTTP_CONNECTCODE);
-#if LIBCURL_VERSION_NUM >= 0x070500
- HTTP_CURL_INFO(FILETIME);
-#endif
- HTTP_CURL_INFO(TOTAL_TIME);
- HTTP_CURL_INFO(NAMELOOKUP_TIME);
- HTTP_CURL_INFO(CONNECT_TIME);
- HTTP_CURL_INFO(PRETRANSFER_TIME);
- HTTP_CURL_INFO(STARTTRANSFER_TIME);
-#if LIBCURL_VERSION_NUM >= 0x070907
- HTTP_CURL_INFO(REDIRECT_TIME);
- HTTP_CURL_INFO(REDIRECT_COUNT);
-#endif
- HTTP_CURL_INFO(SIZE_UPLOAD);
- HTTP_CURL_INFO(SIZE_DOWNLOAD);
- HTTP_CURL_INFO(SPEED_DOWNLOAD);
- HTTP_CURL_INFO(SPEED_UPLOAD);
- HTTP_CURL_INFO(HEADER_SIZE);
- HTTP_CURL_INFO(REQUEST_SIZE);
- HTTP_CURL_INFO(SSL_VERIFYRESULT);
-#if LIBCURL_VERSION_NUM >= 0x070c03
- /*HTTP_CURL_INFO(SSL_ENGINES); todo: CURLINFO_SLIST */
-#endif
- HTTP_CURL_INFO(CONTENT_LENGTH_DOWNLOAD);
- HTTP_CURL_INFO(CONTENT_LENGTH_UPLOAD);
- HTTP_CURL_INFO(CONTENT_TYPE);
-#if LIBCURL_VERSION_NUM >= 0x070a03
- /*HTTP_CURL_INFO(PRIVATE);*/
-#endif
-#if LIBCURL_VERSION_NUM >= 0x070a08
- HTTP_CURL_INFO(HTTPAUTH_AVAIL);
- HTTP_CURL_INFO(PROXYAUTH_AVAIL);
-#endif
-#if LIBCURL_VERSION_NUM >= 0x070c02
- /*HTTP_CURL_INFO(OS_ERRNO);*/
-#endif
-#if LIBCURL_VERSION_NUM >= 0x070c03
- HTTP_CURL_INFO(NUM_CONNECTS);
-#endif
-}
-/* }}} */
-
-/* {{{ STATUS http_request_ex(CURL *, http_request_method, char *, http_request_body, HashTable, HashTable, phpstr *) */
-PHP_HTTP_API STATUS _http_request_ex(CURL *ch, http_request_method meth, char *url, http_request_body *body, HashTable *options, HashTable *info, phpstr *response TSRMLS_DC)
-{
- STATUS status;
- zend_bool clean_curl;
-
- if ((clean_curl = (!ch))) {
- if (!(ch = curl_easy_init())) {
- http_error(HE_WARNING, HTTP_E_REQUEST, "Could not initialize curl.");
- return FAILURE;
- }
- }
-
- status = ((SUCCESS == http_request_init(ch, meth, url, body, options)) &&
- (SUCCESS == http_request_exec(ch, info, response, NULL))) ? SUCCESS : FAILURE;
-
- if (clean_curl) {
- curl_easy_cleanup(ch);
- }
- return status;
-}
-/* }}} */
-
-/* {{{ static size_t http_curl_read_callback(void *, size_t, size_t, void *) */
-static size_t http_curl_read_callback(void *data, size_t len, size_t n, void *s)
-{
- HTTP_REQUEST_CALLBACK_DATA(s, http_request_body *, body);
-
- if (body->type != HTTP_REQUEST_BODY_UPLOADFILE) {
- return 0;
- }
- return php_stream_read((php_stream *) body->data, data, len * n);
-}
-/* }}} */
-
-/* {{{ static int http_curl_progress_callback(void *, double, double, double, double) */
-static int http_curl_progress_callback(void *data, double dltotal, double dlnow, double ultotal, double ulnow)
-{
- zval *params_pass[4], params_local[4], retval;
- HTTP_REQUEST_CALLBACK_DATA(data, zval *, func);
-
- params_pass[0] = ¶ms_local[0];
- params_pass[1] = ¶ms_local[1];
- params_pass[2] = ¶ms_local[2];
- params_pass[3] = ¶ms_local[3];
-
- INIT_PZVAL(params_pass[0]);
- INIT_PZVAL(params_pass[1]);
- INIT_PZVAL(params_pass[2]);
- INIT_PZVAL(params_pass[3]);
- ZVAL_DOUBLE(params_pass[0], dltotal);
- ZVAL_DOUBLE(params_pass[1], dlnow);
- ZVAL_DOUBLE(params_pass[2], ultotal);
- ZVAL_DOUBLE(params_pass[3], ulnow);
-
- return call_user_function(EG(function_table), NULL, func, &retval, 4, params_pass TSRMLS_CC);
-}
-/* }}} */
-
-/* {{{ static int http_curl_raw_callback(CURL *, curl_infotype, char *, size_t, void *) */
-static int http_curl_raw_callback(CURL *ch, curl_infotype type, char *data, size_t length, void *ctx)
-{
- HTTP_REQUEST_CALLBACK_DATA(ctx, http_request_conv *, conv);
-
-#if 0
- fprintf(stderr, "DEBUG: %s\n", data);
-#endif
-
- switch (type)
- {
- case CURLINFO_DATA_IN:
- if (conv->response && conv->last_info == CURLINFO_HEADER_IN) {
- phpstr_appends(conv->response, HTTP_CRLF);
- }
- case CURLINFO_HEADER_IN:
- if (conv->response) {
- phpstr_append(conv->response, data, length);
- }
- break;
- case CURLINFO_DATA_OUT:
- if (conv->request && conv->last_info == CURLINFO_HEADER_OUT) {
- phpstr_appends(conv->request, HTTP_CRLF);
- }
- case CURLINFO_HEADER_OUT:
- if (conv->request) {
- phpstr_append(conv->request, data, length);
- }
- break;
- }
-
- if (type) {
- conv->last_info = type;
- }
- return 0;
-}
-/* }}} */
-
-/* {{{ static inline zval *http_curl_getopt(HashTable *, char *, size_t, int) */
-static inline zval *_http_curl_getopt_ex(HashTable *options, char *key, size_t keylen, int type TSRMLS_DC)
-{
- zval **zoption;
-
- if (!options || (SUCCESS != zend_hash_find(options, key, keylen, (void **) &zoption))) {
- return NULL;
- }
-
- if (Z_TYPE_PP(zoption) != type) {
- switch (type)
- {
- case IS_BOOL: convert_to_boolean_ex(zoption); break;
- case IS_LONG: convert_to_long_ex(zoption); break;
- case IS_DOUBLE: convert_to_double_ex(zoption); break;
- case IS_STRING: convert_to_string_ex(zoption); break;
- case IS_ARRAY: convert_to_array_ex(zoption); break;
- case IS_OBJECT: convert_to_object_ex(zoption); break;
- default:
- break;
- }
- }
-
- return *zoption;
-}
-/* }}} */
-
-#ifdef HTTP_NEED_SSL
-
-static MUTEX_T *http_ssl_mutex = NULL;
-
-static void http_ssl_lock(int mode, int n, const char * file, int line)
-{
- if (mode & CRYPTO_LOCK) {
- tsrm_mutex_lock(http_ssl_mutex[n]);
- } else {
- tsrm_mutex_unlock(http_ssl_mutex[n]);
- }
-}
-
-static unsigned long http_ssl_id(void)
-{
- return (unsigned long) tsrm_thread_id();
-}
-
-static inline zend_bool http_ssl_init(void)
-{
- curl_version_info_data *cvid = curl_version_info(CURLVERSION_NOW);
-
- if (cvid && (cvid->features & CURL_VERSION_SSL)) {
- int i, c = CRYPTO_num_locks();
-
- http_ssl_mutex = malloc(c * sizeof(MUTEX_T));
-
- for (i = 0; i < c; ++i) {
- http_ssl_mutex[i] = tsrm_mutex_alloc();
- }
-
- CRYPTO_set_id_callback(http_ssl_id);
- CRYPTO_set_locking_callback(http_ssl_lock);
-
- return 1;
- }
-
- return 0;
-}
-
-static inline void http_ssl_cleanup(void)
-{
- if (http_ssl_mutex) {
- int i, c = CRYPTO_num_locks();
-
- CRYPTO_set_id_callback(NULL);
- CRYPTO_set_locking_callback(NULL);
-
- for (i = 0; i < c; ++i) {
- tsrm_mutex_free(http_ssl_mutex[i]);
- }
-
- free(http_ssl_mutex);
- http_ssl_mutex = NULL;
- }
-}
-#endif /* HTTP_NEED_SSL */
-
-static inline void _http_curl_defaults(CURL *ch)
-{
- HTTP_CURL_OPT(URL, NULL);
- HTTP_CURL_OPT(NOPROGRESS, 1);
- HTTP_CURL_OPT(PROXY, NULL);
- HTTP_CURL_OPT(PROXYPORT, 0);
- HTTP_CURL_OPT(PROXYUSERPWD, NULL);
-#if LIBCURL_VERSION_NUM >= 0x070a07
- HTTP_CURL_OPT(PROXYAUTH, 0);
-#endif
- HTTP_CURL_OPT(INTERFACE, NULL);
- HTTP_CURL_OPT(PORT, 0);
- HTTP_CURL_OPT(USERPWD, NULL);
-#if LIBCURL_VERSION_NUM >= 0x070a06
- HTTP_CURL_OPT(HTTPAUTH, 0);
-#endif
- HTTP_CURL_OPT(ENCODING, 0);
- HTTP_CURL_OPT(FOLLOWLOCATION, 0);
- HTTP_CURL_OPT(UNRESTRICTED_AUTH, 0);
- HTTP_CURL_OPT(REFERER, NULL);
- HTTP_CURL_OPT(USERAGENT, "PECL::HTTP/" HTTP_PEXT_VERSION " (PHP/" PHP_VERSION ")");
- HTTP_CURL_OPT(HTTPHEADER, NULL);
- HTTP_CURL_OPT(COOKIE, NULL);
- HTTP_CURL_OPT(COOKIEFILE, NULL);
- HTTP_CURL_OPT(COOKIEJAR, NULL);
- HTTP_CURL_OPT(RESUME_FROM, 0);
- HTTP_CURL_OPT(MAXFILESIZE, 0);
- HTTP_CURL_OPT(TIMEVALUE, 0);
- HTTP_CURL_OPT(TIMEOUT, 0);
- HTTP_CURL_OPT(CONNECTTIMEOUT, 3);
- HTTP_CURL_OPT(SSLCERT, NULL);
-#if LIBCURL_VERSION_NUM >= 0x070903
- HTTP_CURL_OPT(SSLCERTTYPE, NULL);
-#endif
- HTTP_CURL_OPT(SSLCERTPASSWD, NULL);
- HTTP_CURL_OPT(SSLKEY, NULL);
- HTTP_CURL_OPT(SSLKEYTYPE, NULL);
- HTTP_CURL_OPT(SSLKEYPASSWD, NULL);
- HTTP_CURL_OPT(SSLENGINE, NULL);
- HTTP_CURL_OPT(SSLVERSION, 0);
- HTTP_CURL_OPT(SSL_VERIFYPEER, 0);
- HTTP_CURL_OPT(SSL_VERIFYHOST, 0);
- HTTP_CURL_OPT(SSL_CIPHER_LIST, NULL);
- HTTP_CURL_OPT(CAINFO, NULL);
-#if LIBCURL_VERSION_NUM >= 0x070908
- HTTP_CURL_OPT(CAPATH, NULL);
-#endif
- HTTP_CURL_OPT(RANDOM_FILE, NULL);
- HTTP_CURL_OPT(EGDSOCKET, NULL);
- HTTP_CURL_OPT(POSTFIELDS, NULL);
- HTTP_CURL_OPT(POSTFIELDSIZE, 0);
- HTTP_CURL_OPT(HTTPPOST, NULL);
- HTTP_CURL_OPT(READDATA, NULL);
- HTTP_CURL_OPT(INFILESIZE, 0);
-}
-
-#endif /* HTTP_HAVE_CURL */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_request_method_api.h"
-#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
-# include "php_http_request_object.h"
-#endif
-
-#include "phpstr/phpstr.h"
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-/* {{{ char *http_request_methods[] */
-static const char *const http_request_methods[] = {
- "UNKOWN",
- /* HTTP/1.1 */
- "GET",
- "HEAD",
- "POST",
- "PUT",
- "DELETE",
- "OPTIONS",
- "TRACE",
- "CONNECT",
- /* WebDAV - RFC 2518 */
- "PROPFIND",
- "PROPPATCH",
- "MKCOL",
- "COPY",
- "MOVE",
- "LOCK",
- "UNLOCK",
- /* WebDAV Versioning - RFC 3253 */
- "VERSION-CONTROL",
- "REPORT",
- "CHECKOUT",
- "CHECKIN",
- "UNCHECKOUT",
- "MKWORKSPACE",
- "UPDATE",
- "LABEL",
- "MERGE",
- "BASELINE-CONTROL",
- "MKACTIVITY",
- /* WebDAV Access Control - RFC 3744 */
- "ACL",
- NULL
-};
-/* }}} */
-
-STATUS _http_request_method_global_init(INIT_FUNC_ARGS)
-{
- /* HTTP/1.1 */
- HTTP_LONG_CONSTANT("HTTP_METH_GET", HTTP_GET);
- HTTP_LONG_CONSTANT("HTTP_METH_HEAD", HTTP_HEAD);
- HTTP_LONG_CONSTANT("HTTP_METH_POST", HTTP_POST);
- HTTP_LONG_CONSTANT("HTTP_METH_PUT", HTTP_PUT);
- HTTP_LONG_CONSTANT("HTTP_METH_DELETE", HTTP_DELETE);
- HTTP_LONG_CONSTANT("HTTP_METH_OPTIONS", HTTP_OPTIONS);
- HTTP_LONG_CONSTANT("HTTP_METH_TRACE", HTTP_TRACE);
- HTTP_LONG_CONSTANT("HTTP_METH_CONNECT", HTTP_CONNECT);
- /* WebDAV - RFC 2518 */
- HTTP_LONG_CONSTANT("HTTP_METH_PROPFIND", HTTP_PROPFIND);
- HTTP_LONG_CONSTANT("HTTP_METH_PROPPATCH", HTTP_PROPPATCH);
- HTTP_LONG_CONSTANT("HTTP_METH_MKCOL", HTTP_MKCOL);
- HTTP_LONG_CONSTANT("HTTP_METH_COPY", HTTP_COPY);
- HTTP_LONG_CONSTANT("HTTP_METH_MOVE", HTTP_MOVE);
- HTTP_LONG_CONSTANT("HTTP_METH_LOCK", HTTP_LOCK);
- HTTP_LONG_CONSTANT("HTTP_METH_UNLOCK", HTTP_UNLOCK);
- /* WebDAV Versioning - RFC 3253 */
- HTTP_LONG_CONSTANT("HTTP_METH_VERSION_CONTROL", HTTP_VERSION_CONTROL);
- HTTP_LONG_CONSTANT("HTTP_METH_REPORT", HTTP_REPORT);
- HTTP_LONG_CONSTANT("HTTP_METH_CHECKOUT", HTTP_CHECKOUT);
- HTTP_LONG_CONSTANT("HTTP_METH_CHECKIN", HTTP_CHECKIN);
- HTTP_LONG_CONSTANT("HTTP_METH_UNCHECKOUT", HTTP_UNCHECKOUT);
- HTTP_LONG_CONSTANT("HTTP_METH_MKWORKSPACE", HTTP_MKWORKSPACE);
- HTTP_LONG_CONSTANT("HTTP_METH_UPDATE", HTTP_UPDATE);
- HTTP_LONG_CONSTANT("HTTP_METH_LABEL", HTTP_LABEL);
- HTTP_LONG_CONSTANT("HTTP_METH_MERGE", HTTP_MERGE);
- HTTP_LONG_CONSTANT("HTTP_METH_BASELINE_CONTROL", HTTP_BASELINE_CONTROL);
- HTTP_LONG_CONSTANT("HTTP_METH_MKACTIVITY", HTTP_MKACTIVITY);
- /* WebDAV Access Control - RFC 3744 */
- HTTP_LONG_CONSTANT("HTTP_METH_ACL", HTTP_ACL);
-
- return SUCCESS;
-}
-
-/* {{{ char *http_request_method_name(http_request_method) */
-PHP_HTTP_API const char *_http_request_method_name(http_request_method m TSRMLS_DC)
-{
- zval **meth;
-
- if (HTTP_STD_REQUEST_METHOD(m)) {
- return http_request_methods[m];
- }
-
- if (SUCCESS == zend_hash_index_find(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(m), (void **) &meth)) {
- return Z_STRVAL_PP(meth);
- }
-
- return http_request_methods[0];
-}
-/* }}} */
-
-/* {{{ unsigned long http_request_method_exists(zend_bool, unsigned long, char *) */
-PHP_HTTP_API unsigned long _http_request_method_exists(zend_bool by_name, unsigned long id, const char *name TSRMLS_DC)
-{
- if (by_name) {
- unsigned i;
-
- for (i = HTTP_NO_REQUEST_METHOD + 1; i < HTTP_MAX_REQUEST_METHOD; ++i) {
- if (!strcmp(name, http_request_methods[i])) {
- return i;
- }
- }
- {
- zval **data;
- char *key;
- ulong idx;
-
- FOREACH_HASH_KEYVAL(&HTTP_G(request).methods.custom, key, idx, data) {
- if (!strcmp(name, Z_STRVAL_PP(data))) {
- return idx + HTTP_MAX_REQUEST_METHOD;
- }
- }
- }
- return 0;
- } else {
- return HTTP_STD_REQUEST_METHOD(id) || zend_hash_index_exists(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(id)) ? id : 0;
- }
-}
-/* }}} */
-
-/* {{{ unsigned long http_request_method_register(char *) */
-PHP_HTTP_API unsigned long _http_request_method_register(const char *method_name TSRMLS_DC)
-{
- zval array;
- char *http_method, *method;
- int i, method_len = strlen(method_name);
- unsigned long meth_num = HTTP_G(request).methods.custom.nNextFreeElement + HTTP_MAX_REQUEST_METHOD;
-
- method = emalloc(method_len + 1);
- for (i = 0; i < method_len; ++i) {
- method[i] = toupper(method_name[i]);
- }
- method[method_len] = '\0';
-
- INIT_ZARR(array, &HTTP_G(request).methods.custom);
- add_next_index_stringl(&array, method, method_len, 0);
-
- method_len = spprintf(&http_method, 0, "HTTP_METH_%s", method);
- zend_register_long_constant(http_method, method_len + 1, meth_num, CONST_CS, http_module_number TSRMLS_CC);
- efree(http_method);
-
-#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) && !defined(WONKY)
- method_len = spprintf(&http_method, 0, "METH_%s", method);
- zend_declare_class_constant_long(http_request_object_ce, http_method, method_len, meth_num TSRMLS_CC);
- efree(http_method);
-#endif
-
- return meth_num;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_method_unregister(usngigned long) */
-PHP_HTTP_API STATUS _http_request_method_unregister(unsigned long method TSRMLS_DC)
-{
- zval **zmethod;
- char *http_method;
- int method_len;
-
- if (SUCCESS != zend_hash_index_find(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method), (void **) &zmethod)) {
- http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Request method with id %lu does not exist", method);
- return FAILURE;
- }
-
-#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) && !defined(WONKY)
- method_len = spprintf(&http_method, 0, "METH_%s", Z_STRVAL_PP(zmethod));
- if ((SUCCESS != zend_hash_del(&http_request_object_ce->constants_table, http_method, method_len + 1))) {
- http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Could not unregister request method: HttpRequest::%s", http_method);
- efree(http_method);
- return FAILURE;
- }
- efree(http_method);
-#endif
-
- method_len = spprintf(&http_method, 0, "HTTP_METH_%s", Z_STRVAL_PP(zmethod));
- if ( (SUCCESS != zend_hash_index_del(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method)))
- || (SUCCESS != zend_hash_del(EG(zend_constants), http_method, method_len + 1))) {
- http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Could not unregister request method: %s", http_method);
- efree(http_method);
- return FAILURE;
- }
- efree(http_method);
-
- return SUCCESS;
-}
-/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
-
-#include "php_http_std_defs.h"
-#include "php_http_request_object.h"
-#include "php_http_request_api.h"
-#include "php_http_request_pool_api.h"
-#include "php_http.h"
-#include "php_http_api.h"
-#include "php_http_url_api.h"
-#include "php_http_message_api.h"
-#include "php_http_message_object.h"
-#include "php_http_exception_object.h"
-
-#include "missing.h"
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#endif
-#include <curl/curl.h>
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#define HTTP_BEGIN_ARGS(method, ret_ref, req_args) HTTP_BEGIN_ARGS_EX(HttpRequest, method, ret_ref, req_args)
-#define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpRequest, method, ret_ref)
-#define HTTP_REQUEST_ME(method, visibility) PHP_ME(HttpRequest, method, HTTP_ARGS(HttpRequest, method), visibility)
-#define HTTP_REQUEST_ALIAS(method, func) HTTP_STATIC_ME_ALIAS(method, func, HTTP_ARGS(HttpRequest, method))
-
-HTTP_EMPTY_ARGS(__destruct, 0);
-HTTP_BEGIN_ARGS(__construct, 0, 0)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(method, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getOptions, 0);
-HTTP_BEGIN_ARGS(setOptions, 0, 0)
- HTTP_ARG_VAL(options, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getSslOptions, 0);
-HTTP_BEGIN_ARGS(setSslOptions, 0, 0)
- HTTP_ARG_VAL(ssl_options, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getHeaders, 0);
-HTTP_BEGIN_ARGS(setHeaders, 0, 0)
- HTTP_ARG_VAL(headers, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(addHeaders, 0, 1)
- HTTP_ARG_VAL(headers, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getCookies, 0);
-HTTP_BEGIN_ARGS(setCookies, 0, 0)
- HTTP_ARG_VAL(cookies, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(addCookies, 0, 1)
- HTTP_ARG_VAL(cookies, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getUrl, 0);
-HTTP_BEGIN_ARGS(setUrl, 0, 1)
- HTTP_ARG_VAL(url, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getMethod, 0);
-HTTP_BEGIN_ARGS(setMethod, 0, 1)
- HTTP_ARG_VAL(request_method, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getContentType, 0);
-HTTP_BEGIN_ARGS(setContentType, 0, 1)
- HTTP_ARG_VAL(content_type, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getQueryData, 0);
-HTTP_BEGIN_ARGS(setQueryData, 0, 0)
- HTTP_ARG_VAL(query_data, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(addQueryData, 0, 1)
- HTTP_ARG_VAL(query_data, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getPostFields, 0);
-HTTP_BEGIN_ARGS(setPostFields, 0, 0)
- HTTP_ARG_VAL(post_fields, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(addPostFields, 0, 1)
- HTTP_ARG_VAL(post_fields, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getPostFiles, 0);
-HTTP_BEGIN_ARGS(setPostFiles, 0, 0)
- HTTP_ARG_VAL(post_files, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(addPostFile, 0, 2)
- HTTP_ARG_VAL(formname, 0)
- HTTP_ARG_VAL(filename, 0)
- HTTP_ARG_VAL(content_type, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getRawPostData, 0);
-HTTP_BEGIN_ARGS(setRawPostData, 0, 0)
- HTTP_ARG_VAL(raw_post_data, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(addRawPostData, 0, 1)
- HTTP_ARG_VAL(raw_post_data, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getPutFile, 0);
-HTTP_BEGIN_ARGS(setPutFile, 0, 0)
- HTTP_ARG_VAL(filename, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getResponseData, 0);
-HTTP_BEGIN_ARGS(getResponseHeader, 0, 0)
- HTTP_ARG_VAL(name, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(getResponseCookie, 0, 0)
- HTTP_ARG_VAL(name, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getResponseBody, 0);
-HTTP_EMPTY_ARGS(getResponseCode, 0);
-HTTP_BEGIN_ARGS(getResponseInfo, 0, 0)
- HTTP_ARG_VAL(name, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getResponseMessage, 1);
-HTTP_EMPTY_ARGS(getRequestMessage, 1);
-HTTP_EMPTY_ARGS(getHistory, 1);
-HTTP_EMPTY_ARGS(send, 1);
-
-HTTP_BEGIN_ARGS(get, 0, 1)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(options, 0)
- HTTP_ARG_VAL(info, 1)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(head, 0, 1)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(options, 0)
- HTTP_ARG_VAL(info, 1)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(postData, 0, 2)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(data, 0)
- HTTP_ARG_VAL(options, 0)
- HTTP_ARG_VAL(info, 1)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(postFields, 0, 2)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(data, 0)
- HTTP_ARG_VAL(options, 0)
- HTTP_ARG_VAL(info, 1)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(putFile, 0, 2)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(file, 0)
- HTTP_ARG_VAL(options, 0)
- HTTP_ARG_VAL(info, 1)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(putStream, 0, 2)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(stream, 0)
- HTTP_ARG_VAL(options, 0)
- HTTP_ARG_VAL(info, 1)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(methodRegister, 0, 1)
- HTTP_ARG_VAL(method_name, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(methodUnregister, 0, 1)
- HTTP_ARG_VAL(method, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(methodName, 0, 1)
- HTTP_ARG_VAL(method_id, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(methodExists, 0, 1)
- HTTP_ARG_VAL(method, 0)
-HTTP_END_ARGS;
-
-#define http_request_object_declare_default_properties() _http_request_object_declare_default_properties(TSRMLS_C)
-static inline void _http_request_object_declare_default_properties(TSRMLS_D);
-
-zend_class_entry *http_request_object_ce;
-zend_function_entry http_request_object_fe[] = {
- HTTP_REQUEST_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
- HTTP_REQUEST_ME(__destruct, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR)
-
- HTTP_REQUEST_ME(setOptions, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getOptions, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(setSslOptions, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getSslOptions, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(addHeaders, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getHeaders, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(setHeaders, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(addCookies, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getCookies, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(setCookies, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setMethod, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getMethod, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setUrl, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getUrl, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setContentType, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getContentType, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setQueryData, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getQueryData, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(addQueryData, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setPostFields, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getPostFields, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(addPostFields, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setRawPostData, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getRawPostData, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(addRawPostData, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setPostFiles, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(addPostFile, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getPostFiles, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(setPutFile, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getPutFile, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(send, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ME(getResponseData, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getResponseHeader, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getResponseCookie, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getResponseCode, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getResponseBody, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getResponseInfo, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getResponseMessage, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getRequestMessage, ZEND_ACC_PUBLIC)
- HTTP_REQUEST_ME(getHistory, ZEND_ACC_PUBLIC)
-
- HTTP_REQUEST_ALIAS(get, http_get)
- HTTP_REQUEST_ALIAS(head, http_head)
- HTTP_REQUEST_ALIAS(postData, http_post_data)
- HTTP_REQUEST_ALIAS(postFields, http_post_fields)
- HTTP_REQUEST_ALIAS(putFile, http_put_file)
- HTTP_REQUEST_ALIAS(putStream, http_put_stream)
-
- HTTP_REQUEST_ALIAS(methodRegister, http_request_method_register)
- HTTP_REQUEST_ALIAS(methodUnregister, http_request_method_unregister)
- HTTP_REQUEST_ALIAS(methodName, http_request_method_name)
- HTTP_REQUEST_ALIAS(methodExists, http_request_method_exists)
-
- EMPTY_FUNCTION_ENTRY
-};
-static zend_object_handlers http_request_object_handlers;
-
-void _http_request_object_init(INIT_FUNC_ARGS)
-{
- HTTP_REGISTER_CLASS_EX(HttpRequest, http_request_object, NULL, 0);
-}
-
-zend_object_value _http_request_object_new(zend_class_entry *ce TSRMLS_DC)
-{
- zend_object_value ov;
- http_request_object *o;
-
- o = ecalloc(1, sizeof(http_request_object));
- o->zo.ce = ce;
- o->ch = curl_easy_init();
-
- phpstr_init(&o->history);
- phpstr_init(&o->request);
- phpstr_init_ex(&o->response, HTTP_CURLBUF_SIZE, 0);
-
- ALLOC_HASHTABLE(OBJ_PROP(o));
- zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0);
- zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
-
- ov.handle = putObject(http_request_object, o);
- ov.handlers = &http_request_object_handlers;
-
- return ov;
-}
-
-static inline void _http_request_object_declare_default_properties(TSRMLS_D)
-{
- zend_class_entry *ce = http_request_object_ce;
-
- DCL_PROP_N(PROTECTED, options);
- DCL_PROP_N(PROTECTED, responseInfo);
- DCL_PROP_N(PROTECTED, responseData);
- DCL_PROP_N(PROTECTED, responseCode);
- DCL_PROP_N(PROTECTED, responseMessage);
- DCL_PROP_N(PROTECTED, postFields);
- DCL_PROP_N(PROTECTED, postFiles);
-
- DCL_PROP(PROTECTED, long, method, HTTP_GET);
-
- DCL_PROP(PROTECTED, string, url, "");
- DCL_PROP(PROTECTED, string, contentType, "");
- DCL_PROP(PROTECTED, string, rawPostData, "");
- DCL_PROP(PROTECTED, string, queryData, "");
- DCL_PROP(PROTECTED, string, putFile, "");
-
- DCL_PROP(PUBLIC, bool, recordHistory, 1);
-
-#ifndef WONKY
- /*
- * Request Method Constants
- */
- /* HTTP/1.1 */
- DCL_CONST(long, "METH_GET", HTTP_GET);
- DCL_CONST(long, "METH_HEAD", HTTP_HEAD);
- DCL_CONST(long, "METH_POST", HTTP_POST);
- DCL_CONST(long, "METH_PUT", HTTP_PUT);
- DCL_CONST(long, "METH_DELETE", HTTP_DELETE);
- DCL_CONST(long, "METH_OPTIONS", HTTP_OPTIONS);
- DCL_CONST(long, "METH_TRACE", HTTP_TRACE);
- DCL_CONST(long, "METH_CONNECT", HTTP_CONNECT);
- /* WebDAV - RFC 2518 */
- DCL_CONST(long, "METH_PROPFIND", HTTP_PROPFIND);
- DCL_CONST(long, "METH_PROPPATCH", HTTP_PROPPATCH);
- DCL_CONST(long, "METH_MKCOL", HTTP_MKCOL);
- DCL_CONST(long, "METH_COPY", HTTP_COPY);
- DCL_CONST(long, "METH_MOVE", HTTP_MOVE);
- DCL_CONST(long, "METH_LOCK", HTTP_LOCK);
- DCL_CONST(long, "METH_UNLOCK", HTTP_UNLOCK);
- /* WebDAV Versioning - RFC 3253 */
- DCL_CONST(long, "METH_VERSION_CONTROL", HTTP_VERSION_CONTROL);
- DCL_CONST(long, "METH_REPORT", HTTP_REPORT);
- DCL_CONST(long, "METH_CHECKOUT", HTTP_CHECKOUT);
- DCL_CONST(long, "METH_CHECKIN", HTTP_CHECKIN);
- DCL_CONST(long, "METH_UNCHECKOUT", HTTP_UNCHECKOUT);
- DCL_CONST(long, "METH_MKWORKSPACE", HTTP_MKWORKSPACE);
- DCL_CONST(long, "METH_UPDATE", HTTP_UPDATE);
- DCL_CONST(long, "METH_LABEL", HTTP_LABEL);
- DCL_CONST(long, "METH_MERGE", HTTP_MERGE);
- DCL_CONST(long, "METH_BASELINE_CONTROL", HTTP_BASELINE_CONTROL);
- DCL_CONST(long, "METH_MKACTIVITY", HTTP_MKACTIVITY);
- /* WebDAV Access Control - RFC 3744 */
- DCL_CONST(long, "METH_ACL", HTTP_ACL);
-
- /*
- * Auth Constants
- */
-# if LIBCURL_VERSION_NUM >= 0x070a05
- DCL_CONST(long, "AUTH_BASIC", CURLAUTH_BASIC);
- DCL_CONST(long, "AUTH_DIGEST", CURLAUTH_DIGEST);
- DCL_CONST(long, "AUTH_NTLM", CURLAUTH_NTLM);
- DCL_CONST(long, "AUTH_ANY", CURLAUTH_ANY);
-# endif /* LIBCURL_VERSION_NUM */
-#endif /* WONKY */
-}
-
-void _http_request_object_free(zend_object *object TSRMLS_DC)
-{
- http_request_object *o = (http_request_object *) object;
-
- if (OBJ_PROP(o)) {
- zend_hash_destroy(OBJ_PROP(o));
- FREE_HASHTABLE(OBJ_PROP(o));
- }
- if (o->ch) {
- /* avoid nasty segfaults with already cleaned up callbacks */
- curl_easy_setopt(o->ch, CURLOPT_NOPROGRESS, 1);
- curl_easy_setopt(o->ch, CURLOPT_PROGRESSFUNCTION, NULL);
- curl_easy_setopt(o->ch, CURLOPT_VERBOSE, 0);
- curl_easy_setopt(o->ch, CURLOPT_DEBUGFUNCTION, NULL);
- curl_easy_cleanup(o->ch);
- }
- phpstr_dtor(&o->response);
- phpstr_dtor(&o->request);
- phpstr_dtor(&o->history);
- efree(o);
-}
-
-STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ptr, http_request_body *body TSRMLS_DC)
-{
- zval *meth, *URL;
- char *request_uri;
- STATUS status = SUCCESS;
-
- if (!body) {
- return FAILURE;
- }
- if ((!obj->ch) && (!(obj->ch = curl_easy_init()))) {
- http_error(HE_WARNING, HTTP_E_REQUEST, "Could not initilaize curl");
- return FAILURE;
- }
-
- URL = convert_to_type_ex(IS_STRING, GET_PROP(obj, url));
- // HTTP_URI_MAXLEN+1 long char *
- if (!(request_uri = http_absolute_uri_ex(Z_STRVAL_P(URL), Z_STRLEN_P(URL), NULL, 0, NULL, 0, 0))) {
- return FAILURE;
- }
-
- meth = convert_to_type_ex(IS_LONG, GET_PROP(obj, method));
- switch (Z_LVAL_P(meth))
- {
- case HTTP_GET:
- case HTTP_HEAD:
- body->type = -1;
- body = NULL;
- break;
-
- case HTTP_PUT:
- {
- php_stream_statbuf ssb;
- php_stream *stream = php_stream_open_wrapper(Z_STRVAL_P(GET_PROP(obj, putFile)), "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL);
-
- if (stream && !php_stream_stat(stream, &ssb)) {
- body->type = HTTP_REQUEST_BODY_UPLOADFILE;
- body->data = stream;
- body->size = ssb.sb.st_size;
- } else {
- status = FAILURE;
- }
- }
- break;
-
- case HTTP_POST:
- default:
- {
- /* check for raw post data */
- zval *raw_data = convert_to_type_ex(IS_STRING, GET_PROP(obj, rawPostData));
-
- if (Z_STRLEN_P(raw_data)) {
- zval *ctype = convert_to_type_ex(IS_STRING, GET_PROP(obj, contentType));
-
- if (Z_STRLEN_P(ctype)) {
- zval **headers, *opts = GET_PROP(obj, options);
-
- convert_to_array(opts);
-
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "headers", sizeof("headers"), (void **) &headers)) {
- zval **ct_header;
-
- convert_to_array(*headers);
- /* only override if not already set */
- if (SUCCESS != zend_hash_find(Z_ARRVAL_PP(headers), "Content-Type", sizeof("Content-Type"), (void **) &ct_header)) {
- add_assoc_stringl(*headers, "Content-Type", Z_STRVAL_P(ctype), Z_STRLEN_P(ctype), 1);
- }
- } else {
- zval *headers;
-
- MAKE_STD_ZVAL(headers);
- array_init(headers);
- add_assoc_stringl(headers, "Content-Type", Z_STRVAL_P(ctype), Z_STRLEN_P(ctype), 1);
- add_assoc_zval(opts, "headers", headers);
- }
- }
-
- body->type = HTTP_REQUEST_BODY_CSTRING;
- body->data = estrndup(Z_STRVAL_P(raw_data), Z_STRLEN_P(raw_data));
- body->size = Z_STRLEN_P(raw_data);
- } else {
- status = http_request_body_fill(body, Z_ARRVAL_P(GET_PROP(obj, postFields)), Z_ARRVAL_P(GET_PROP(obj, postFiles)));
- }
- }
- break;
- }
-
- if (status == SUCCESS) {
- zval *qdata = convert_to_type_ex(IS_STRING, GET_PROP(obj, queryData));
-
- if (Z_STRLEN_P(qdata) && (strlen(request_uri) < HTTP_URI_MAXLEN)) {
- if (!strchr(request_uri, '?')) {
- strcat(request_uri, "?");
- } else {
- strcat(request_uri, "&");
- }
- strncat(request_uri, Z_STRVAL_P(qdata), HTTP_URI_MAXLEN - strlen(request_uri));
- }
-
- status = http_request_init(obj->ch, Z_LVAL_P(meth), request_uri, body, Z_ARRVAL_P(GET_PROP(obj, options)));
- }
- efree(request_uri);
-
- /* clean previous response */
- phpstr_dtor(&obj->response);
- /* clean previous request */
- phpstr_dtor(&obj->request);
-
- return status;
-}
-
-STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this_ptr TSRMLS_DC)
-{
- http_message *msg;
-
- phpstr_fix(&obj->request);
- phpstr_fix(&obj->response);
-
- msg = http_message_parse(PHPSTR_VAL(&obj->response), PHPSTR_LEN(&obj->response));
-
- if (!msg) {
- return FAILURE;
- } else {
- char *body;
- size_t body_len;
- zval *headers, *message,
- *resp = convert_to_type(IS_ARRAY, GET_PROP(obj, responseData)),
- *info = convert_to_type(IS_ARRAY, GET_PROP(obj, responseInfo));
-
- if (zval_is_true(GET_PROP(obj, recordHistory))) {
- /* we need to act like a zipper, as we'll receive
- * the requests and the responses in separate chains
- * for redirects
- */
- http_message *response = msg, *request = http_message_parse(PHPSTR_VAL(&obj->request), PHPSTR_LEN(&obj->request));
- http_message *free_msg = request;
-
- do {
- char *message;
- size_t msglen;
-
- http_message_tostring(response, &message, &msglen);
- phpstr_append(&obj->history, message, msglen);
- efree(message);
-
- http_message_tostring(request, &message, &msglen);
- phpstr_append(&obj->history, message, msglen);
- efree(message);
-
- } while ((response = response->parent) && (request = request->parent));
-
- http_message_free(&free_msg);
- phpstr_fix(&obj->history);
- }
-
- UPD_PROP(obj, long, responseCode, msg->http.info.response.code);
-
- MAKE_STD_ZVAL(headers)
- array_init(headers);
-
- zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
- phpstr_data(PHPSTR(msg), &body, &body_len);
-
- add_assoc_zval(resp, "headers", headers);
- add_assoc_stringl(resp, "body", body, body_len, 0);
-
- MAKE_STD_ZVAL(message);
- ZVAL_OBJVAL(message, http_message_object_from_msg(msg));
- SET_PROP(obj, responseMessage, message);
- zval_ptr_dtor(&message);
-
- http_request_info(obj->ch, Z_ARRVAL_P(info));
- SET_PROP(obj, responseInfo, info);
-
- return SUCCESS;
- }
-}
-
-#define http_request_object_set_options_subr(key, ow) \
- _http_request_object_set_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU, (key), sizeof(key), (ow))
-static inline void _http_request_object_set_options_subr(INTERNAL_FUNCTION_PARAMETERS, char *key, size_t len, int overwrite)
-{
- zval *opts, **options, *new_options = NULL;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a/!", &new_options)) {
- RETURN_FALSE;
- }
-
- opts = convert_to_type(IS_ARRAY, GET_PROP(obj, options));
-
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), key, len, (void **) &options)) {
- convert_to_array(*options);
- if (overwrite) {
- zend_hash_clean(Z_ARRVAL_PP(options));
- }
- if (new_options && zend_hash_num_elements(Z_ARRVAL_P(new_options))) {
- if (overwrite) {
- array_copy(new_options, *options);
- } else {
- array_merge(new_options, *options);
- }
- }
- } else if (new_options && zend_hash_num_elements(Z_ARRVAL_P(new_options))) {
- zval_add_ref(&new_options);
- add_assoc_zval(opts, key, new_options);
- }
-
- RETURN_TRUE;
-}
-
-#define http_request_object_get_options_subr(key) \
- _http_request_get_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU, (key), sizeof(key))
-static inline void _http_request_get_options_subr(INTERNAL_FUNCTION_PARAMETERS, char *key, size_t len)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *opts, **options;
- getObject(http_request_object, obj);
-
- opts = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, options));
-
- array_init(return_value);
-
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), key, len, (void **) &options)) {
- convert_to_array(*options);
- array_copy(*options, return_value);
- }
- }
-}
-
-
-/* ### USERLAND ### */
-
-/* {{{ proto void HttpRequest::__construct([string url[, long request_method = HTTP_GET]])
- *
- * Instantiate a new HttpRequest object which can be used to issue HEAD, GET
- * and POST (including posting files) HTTP requests.
- */
-PHP_METHOD(HttpRequest, __construct)
-{
- char *URL = NULL;
- int URL_len;
- long meth = -1;
- getObject(http_request_object, obj);
-
- SET_EH_THROW_HTTP();
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sl", &URL, &URL_len, &meth)) {
- INIT_PARR(obj, options);
- INIT_PARR(obj, responseInfo);
- INIT_PARR(obj, responseData);
- INIT_PARR(obj, postFields);
- INIT_PARR(obj, postFiles);
-
- if (URL) {
- UPD_STRL(obj, url, URL, URL_len);
- }
- if (meth > -1) {
- UPD_PROP(obj, long, method, meth);
- }
- }
- SET_EH_NORMAL();
-}
-/* }}} */
-
-/* {{{ proto void HttpRequest::__destruct()
- *
- * Destroys the HttpRequest object.
- */
-PHP_METHOD(HttpRequest, __destruct)
-{
- getObject(http_request_object, obj);
-
- NO_ARGS;
-
- FREE_PARR(obj, options);
- FREE_PARR(obj, responseInfo);
- FREE_PARR(obj, responseData);
- FREE_PARR(obj, postFields);
- FREE_PARR(obj, postFiles);
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setOptions([array options])
- *
- * Set the request options to use. See http_get() for a full list of available options.
- */
-PHP_METHOD(HttpRequest, setOptions)
-{
- char *key = NULL;
- ulong idx = 0;
- zval *opts = NULL, *old_opts, **opt;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a/!", &opts)) {
- RETURN_FALSE;
- }
-
- old_opts = convert_to_type(IS_ARRAY, GET_PROP(obj, options));
-
- if (!opts || !zend_hash_num_elements(Z_ARRVAL_P(opts))) {
- zend_hash_clean(Z_ARRVAL_P(old_opts));
- RETURN_TRUE;
- }
-
- /* some options need extra attention -- thus cannot use array_merge() directly */
- FOREACH_KEYVAL(opts, key, idx, opt) {
- if (key) {
- if (!strcmp(key, "headers")) {
- zval **headers;
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(old_opts), "headers", sizeof("headers"), (void **) &headers)) {
- convert_to_array(*opt);
- convert_to_array(*headers);
- array_merge(*opt, *headers);
- continue;
- }
- } else if (!strcmp(key, "cookies")) {
- zval **cookies;
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(old_opts), "cookies", sizeof("cookies"), (void **) &cookies)) {
- convert_to_array(*opt);
- convert_to_array(*cookies);
- array_merge(*opt, *cookies);
- continue;
- }
- } else if (!strcmp(key, "ssl")) {
- zval **ssl;
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(old_opts), "ssl", sizeof("ssl"), (void **) &ssl)) {
- convert_to_array(*opt);
- convert_to_array(*ssl);
- array_merge(*opt, *ssl);
- continue;
- }
- } else if ((!strcasecmp(key, "url")) || (!strcasecmp(key, "uri"))) {
- if (Z_TYPE_PP(opt) != IS_STRING) {
- convert_to_string_ex(opt);
- }
- UPD_STRL(obj, url, Z_STRVAL_PP(opt), Z_STRLEN_PP(opt));
- continue;
- } else if (!strcmp(key, "method")) {
- if (Z_TYPE_PP(opt) != IS_LONG) {
- convert_to_long_ex(opt);
- }
- UPD_PROP(obj, long, method, Z_LVAL_PP(opt));
- continue;
- }
-
- zval_add_ref(opt);
- add_assoc_zval(old_opts, key, *opt);
-
- /* reset */
- key = NULL;
- }
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getOptions()
- *
- * Get currently set options.
- */
-PHP_METHOD(HttpRequest, getOptions)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *opts;
- getObject(http_request_object, obj);
-
- opts = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, options));
- array_init(return_value);
- array_copy(opts, return_value);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setSslOptions([array options])
- *
- * Set SSL options.
- */
-PHP_METHOD(HttpRequest, setSslOptions)
-{
- http_request_object_set_options_subr("ssl", 1);
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::addSslOptions(array options)
- *
- * Set additional SSL options.
- */
-PHP_METHOD(HttpRequest, addSslOptions)
-{
- http_request_object_set_options_subr("ssl", 0);
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getSslOtpions()
- *
- * Get previously set SSL options.
- */
-PHP_METHOD(HttpRequest, getSslOptions)
-{
- http_request_object_get_options_subr("ssl");
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::addHeaders(array headers)
- *
- * Add request header name/value pairs.
- */
-PHP_METHOD(HttpRequest, addHeaders)
-{
- http_request_object_set_options_subr("headers", 0);
-}
-
-/* {{{ proto bool HttpRequest::setHeaders([array headers])
- *
- * Set request header name/value pairs.
- */
-PHP_METHOD(HttpRequest, setHeaders)
-{
- http_request_object_set_options_subr("headers", 1);
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getHeaders()
- *
- * Get previously set request headers.
- */
-PHP_METHOD(HttpRequest, getHeaders)
-{
- http_request_object_get_options_subr("headers");
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setCookies([array cookies])
- *
- * Set cookies.
- */
-PHP_METHOD(HttpRequest, setCookies)
-{
- http_request_object_set_options_subr("cookies", 1);
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::addCookies(array cookies)
- *
- * Add cookies.
- */
-PHP_METHOD(HttpRequest, addCookies)
-{
- http_request_object_set_options_subr("cookies", 0);
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getCookies()
- *
- * Get previously set cookies.
- */
-PHP_METHOD(HttpRequest, getCookies)
-{
- http_request_object_get_options_subr("cookies");
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setUrl(string url)
- *
- * Set the request URL.
- */
-PHP_METHOD(HttpRequest, setUrl)
-{
- char *URL = NULL;
- int URL_len;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &URL, &URL_len)) {
- RETURN_FALSE;
- }
-
- UPD_STRL(obj, url, URL, URL_len);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpRequest::getUrl()
- *
- * Get the previously set request URL.
- */
-PHP_METHOD(HttpRequest, getUrl)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *URL = GET_PROP(obj, url);
-
- RETURN_ZVAL(URL, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setMethod(long request_method)
- *
- * Set the request methods; one of the <tt>HTTP_HEAD</tt>, <tt>HTTP_GET</tt> or
- * <tt>HTTP_POST</tt> constants.
- */
-PHP_METHOD(HttpRequest, setMethod)
-{
- long meth;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &meth)) {
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, long, method, meth);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto long HttpRequest::getMethod()
- *
- * Get the previously set request method.
- */
-PHP_METHOD(HttpRequest, getMethod)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *meth = GET_PROP(obj, method);
-
- RETURN_ZVAL(meth, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setContentType(string content_type)
- *
- * Set the content type the post request should have.
- * Use this only if you know what you're doing.
- */
-PHP_METHOD(HttpRequest, setContentType)
-{
- char *ctype;
- int ct_len;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &ctype, &ct_len)) {
- RETURN_FALSE;
- }
-
- if (!strchr(ctype, '/')) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Content-Type '%s' doesn't seem to contain a primary and a secondary part", ctype);
- RETURN_FALSE;
- }
-
- UPD_STRL(obj, contentType, ctype, ct_len);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpRequest::getContentType()
- *
- * Get the previously content type.
- */
-PHP_METHOD(HttpRequest, getContentType)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *ctype = GET_PROP(obj, contentType);
-
- RETURN_ZVAL(ctype, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setQueryData([mixed query_data])
- *
- * Set the URL query parameters to use.
- * Overwrites previously set query parameters.
- * Affects any request types.
- */
-PHP_METHOD(HttpRequest, setQueryData)
-{
- zval *qdata = NULL;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!", &qdata)) {
- RETURN_FALSE;
- }
-
- if ((!qdata) || Z_TYPE_P(qdata) == IS_NULL) {
- UPD_STRL(obj, queryData, "", 0);
- } else if ((Z_TYPE_P(qdata) == IS_ARRAY) || (Z_TYPE_P(qdata) == IS_OBJECT)) {
- char *query_data = NULL;
-
- if (SUCCESS != http_urlencode_hash(HASH_OF(qdata), &query_data)) {
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, string, queryData, query_data);
- efree(query_data);
- } else {
- convert_to_string_ex(&qdata);
- UPD_STRL(obj, queryData, Z_STRVAL_P(qdata), Z_STRLEN_P(qdata));
- }
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpRequest::getQueryData()
- *
- * Get the current query data in form of an urlencoded query string.
- */
-PHP_METHOD(HttpRequest, getQueryData)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *qdata = convert_to_type_ex(IS_STRING, GET_PROP(obj, queryData));
-
- RETURN_ZVAL(qdata, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::addQueryData(array query_params)
- *
- * Add parameters to the query parameter list.
- * Affects any request type.
- */
-PHP_METHOD(HttpRequest, addQueryData)
-{
- zval *qdata, *old_qdata;
- char *query_data = NULL;
- size_t query_data_len = 0;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &qdata)) {
- RETURN_FALSE;
- }
-
- old_qdata = convert_to_type_ex(IS_STRING, GET_PROP(obj, queryData));
-
- if (SUCCESS != http_urlencode_hash_ex(HASH_OF(qdata), 1, Z_STRVAL_P(old_qdata), Z_STRLEN_P(old_qdata), &query_data, &query_data_len)) {
- RETURN_FALSE;
- }
-
- UPD_STRL(obj, queryData, query_data, query_data_len);
- efree(query_data);
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::addPostFields(array post_data)
- *
- * Adds POST data entries.
- * Affects only POST requests.
- */
-PHP_METHOD(HttpRequest, addPostFields)
-{
- zval *post, *post_data;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &post_data)) {
- RETURN_FALSE;
- }
-
- post = convert_to_type(IS_ARRAY, GET_PROP(obj, postFields));
- array_merge(post_data, post);
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setPostFields([array post_data])
- *
- * Set the POST data entries.
- * Overwrites previously set POST data.
- * Affects only POST requests.
- */
-PHP_METHOD(HttpRequest, setPostFields)
-{
- zval *post, *post_data = NULL;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!", &post_data)) {
- RETURN_FALSE;
- }
-
- post = convert_to_type(IS_ARRAY, GET_PROP(obj, postFields));
- zend_hash_clean(Z_ARRVAL_P(post));
-
- if (post_data && zend_hash_num_elements(Z_ARRVAL_P(post_data))) {
- array_copy(post_data, post);
- }
-
- RETURN_TRUE;
-}
-/* }}}*/
-
-/* {{{ proto array HttpRequest::getPostFields()
- *
- * Get previously set POST data.
- */
-PHP_METHOD(HttpRequest, getPostFields)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *post_data = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, postFields));
-
- array_init(return_value);
- array_copy(post_data, return_value);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setRawPostData([string raw_post_data])
- *
- * Set raw post data to send. Don't forget to specify a content type.
- * Affects only POST requests.
- */
-PHP_METHOD(HttpRequest, setRawPostData)
-{
- char *raw_data = NULL;
- int data_len = 0;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &raw_data, &data_len)) {
- RETURN_FALSE;
- }
-
- if (!raw_data) {
- raw_data = "";
- }
-
- UPD_STRL(obj, rawPostData, raw_data, data_len);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::addRawPostData(string raw_post_data)
- *
- * Add raw post data.
- * Affects only POST requests.
- */
-PHP_METHOD(HttpRequest, addRawPostData)
-{
- char *raw_data, *new_data;
- int data_len;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &raw_data, &data_len)) {
- RETURN_FALSE;
- }
-
- if (data_len) {
- zval *zdata = convert_to_type_ex(IS_STRING, GET_PROP(obj, rawPostData));
-
- new_data = emalloc(Z_STRLEN_P(zdata) + data_len + 1);
- new_data[Z_STRLEN_P(zdata) + data_len] = '\0';
-
- if (Z_STRLEN_P(zdata)) {
- memcpy(new_data, Z_STRVAL_P(zdata), Z_STRLEN_P(zdata));
- }
-
- memcpy(new_data + Z_STRLEN_P(zdata), raw_data, data_len);
- UPD_STRL(obj, rawPostData, new_data, Z_STRLEN_P(zdata) + data_len);
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpRequest::getRawPostData()
- *
- * Get previously set raw post data.
- */
-PHP_METHOD(HttpRequest, getRawPostData)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *raw_data = convert_to_type_ex(IS_STRING, GET_PROP(obj, rawPostData));
-
- RETURN_ZVAL(raw_data, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::addPostFile(string name, string file[, string content_type = "application/x-octetstream"])
- *
- * Add a file to the POST request.
- * Affects only POST requests.
- */
-PHP_METHOD(HttpRequest, addPostFile)
-{
- zval *files, *entry;
- char *name, *file, *type = NULL;
- int name_len, file_len, type_len = 0;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s", &name, &name_len, &file, &file_len, &type, &type_len)) {
- RETURN_FALSE;
- }
-
- if (type_len) {
- if (!strchr(type, '/')) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Content-Type '%s' doesn't seem to contain a primary and a secondary part", type);
- RETURN_FALSE;
- }
- } else {
- type = "application/x-octetstream";
- type_len = sizeof("application/x-octetstream") - 1;
- }
-
- MAKE_STD_ZVAL(entry);
- array_init(entry);
-
- add_assoc_stringl(entry, "name", name, name_len, 1);
- add_assoc_stringl(entry, "type", type, type_len, 1);
- add_assoc_stringl(entry, "file", file, file_len, 1);
-
- files = convert_to_type(IS_ARRAY, GET_PROP(obj, postFiles));
- add_next_index_zval(files, entry);
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setPostFiles([array post_files])
- *
- * Set files to post.
- * Overwrites previously set post files.
- * Affects only POST requests.
- */
-PHP_METHOD(HttpRequest, setPostFiles)
-{
- zval *files, *pFiles;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &files)) {
- RETURN_FALSE;
- }
-
- pFiles = convert_to_type(IS_ARRAY, GET_PROP(obj, postFiles));
- zend_hash_clean(Z_ARRVAL_P(pFiles));
-
- if (files && zend_hash_num_elements(Z_ARRVAL_P(files))) {
- array_copy(files, pFiles);
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getPostFiles()
- *
- * Get all previously added POST files.
- */
-PHP_METHOD(HttpRequest, getPostFiles)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *files = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, postFiles));
-
- array_init(return_value);
- array_copy(files, return_value);
- }
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequest::setPutFile([string file])
- *
- * Set file to put.
- * Affects only PUT requests.
- */
-PHP_METHOD(HttpRequest, setPutFile)
-{
- char *file = "";
- int file_len = 0;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &file, &file_len)) {
- RETURN_FALSE;
- }
-
- UPD_STRL(obj, putFile, file, file_len);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HttpRequest::getPutFile()
- *
- * Get previously set put file.
- */
-PHP_METHOD(HttpRequest, getPutFile)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *putfile = convert_to_type_ex(IS_STRING, GET_PROP(obj, putFile));
-
- RETURN_ZVAL(putfile, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getResponseData()
- *
- * Get all response data after the request has been sent.
- */
-PHP_METHOD(HttpRequest, getResponseData)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *data = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, responseData));
-
- array_init(return_value);
- array_copy(data, return_value);
- }
-}
-/* }}} */
-
-/* {{{ proto mixed HttpRequest::getResponseHeader([string name])
- *
- * Get response header(s) after the request has been sent.
- */
-PHP_METHOD(HttpRequest, getResponseHeader)
-{
- IF_RETVAL_USED {
- zval *data, **headers, **header;
- char *header_name = NULL;
- int header_len = 0;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &header_name, &header_len)) {
- RETURN_FALSE;
- }
-
- data = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, responseData));
- if (SUCCESS != zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) {
- RETURN_FALSE;
- }
- convert_to_array_ex(headers);
- if (!header_len || !header_name) {
- array_init(return_value);
- array_copy(*headers, return_value);
- } else if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(headers), pretty_key(header_name, header_len, 1, 1), header_len + 1, (void **) &header)) {
- RETURN_ZVAL(*header, 1, 0);
- } else {
- RETURN_FALSE;
- }
- }
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getResponseCookie([string name])
- *
- * Get response cookie(s) after the request has been sent.
- */
-PHP_METHOD(HttpRequest, getResponseCookie)
-{
- IF_RETVAL_USED {
- zval *data, **headers;
- char *cookie_name = NULL;
- int cookie_len = 0;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &cookie_name, &cookie_len)) {
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- data = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, responseData));
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) {
- ulong idx = 0;
- char *key = NULL;
- zval **header = NULL;
-
- convert_to_array_ex(headers);
- FOREACH_HASH_KEYVAL(Z_ARRVAL_PP(headers), key, idx, header) {
- if (key && !strcasecmp(key, "Set-Cookie")) {
- /* several cookies? */
- if (Z_TYPE_PP(header) == IS_ARRAY) {
- zval **cookie;
-
- FOREACH_HASH_VAL(Z_ARRVAL_PP(header), cookie) {
- zval *cookie_hash;
- MAKE_STD_ZVAL(cookie_hash);
- array_init(cookie_hash);
-
- if (SUCCESS == http_parse_cookie(Z_STRVAL_PP(cookie), Z_ARRVAL_P(cookie_hash))) {
- if (!cookie_len) {
- add_next_index_zval(return_value, cookie_hash);
- } else {
- zval **name;
-
- if ( (SUCCESS == zend_hash_find(Z_ARRVAL_P(cookie_hash), "name", sizeof("name"), (void **) &name)) &&
- (!strcmp(Z_STRVAL_PP(name), cookie_name))) {
- add_next_index_zval(return_value, cookie_hash);
- return; /* <<< FOUND >>> */
- } else {
- zval_dtor(cookie_hash);
- efree(cookie_hash);
- }
- }
- } else {
- zval_dtor(cookie_hash);
- efree(cookie_hash);
- }
- }
- } else {
- zval *cookie_hash;
-
- MAKE_STD_ZVAL(cookie_hash);
- array_init(cookie_hash);
- convert_to_string_ex(header);
-
- if (SUCCESS == http_parse_cookie(Z_STRVAL_PP(header), Z_ARRVAL_P(cookie_hash))) {
- if (!cookie_len) {
- add_next_index_zval(return_value, cookie_hash);
- } else {
- zval **name;
-
- if ( (SUCCESS == zend_hash_find(Z_ARRVAL_P(cookie_hash), "name", sizeof("name"), (void **) &name)) &&
- (!strcmp(Z_STRVAL_PP(name), cookie_name))) {
- add_next_index_zval(return_value, cookie_hash);
- } else {
- zval_dtor(cookie_hash);
- efree(cookie_hash);
- }
- }
- } else {
- zval_dtor(cookie_hash);
- efree(cookie_hash);
- }
- }
- break;
- }
- /* reset key */
- key = NULL;
- }
- }
- }
-}
-/* }}} */
-
-/* {{{ proto string HttpRequest::getResponseBody()
- *
- * Get the response body after the request has been sent.
- */
-PHP_METHOD(HttpRequest, getResponseBody)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval **body;
- getObject(http_request_object, obj);
- zval *data = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, responseData));
-
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "body", sizeof("body"), (void **) &body)) {
- convert_to_string_ex(body);
- RETURN_ZVAL(*body, 1, 0);
- } else {
- RETURN_FALSE;
- }
- }
-}
-/* }}} */
-
-/* {{{ proto int HttpRequest::getResponseCode()
- *
- * Get the response code after the request has been sent.
- */
-PHP_METHOD(HttpRequest, getResponseCode)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_request_object, obj);
- zval *code = convert_to_type_ex(IS_LONG, GET_PROP(obj, responseCode));
-
- RETURN_ZVAL(code, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto array HttpRequest::getResponseInfo([string name])
- *
- * Get response info after the request has been sent.
- * See http_get() for a full list of returned info.
- */
-PHP_METHOD(HttpRequest, getResponseInfo)
-{
- IF_RETVAL_USED {
- zval *info, **infop;
- char *info_name = NULL;
- int info_len = 0;
- getObject(http_request_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &info_name, &info_len)) {
- RETURN_FALSE;
- }
-
- info = convert_to_type_ex(IS_ARRAY, GET_PROP(obj, responseInfo));
-
- if (info_len && info_name) {
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(info), pretty_key(info_name, info_len, 0, 0), info_len + 1, (void **) &infop)) {
- RETURN_ZVAL(*infop, 1, 0);
- } else {
- http_error_ex(HE_NOTICE, HTTP_E_INVALID_PARAM, "Could not find response info named %s", info_name);
- RETURN_FALSE;
- }
- } else {
- array_init(return_value);
- array_copy(info, return_value);
- }
- }
-}
-/* }}}*/
-
-/* {{{ proto HttpMessage HttpRequest::getResponseMessage()
- *
- * Get the full response as HttpMessage object.
- */
-PHP_METHOD(HttpRequest, getResponseMessage)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *message;
- getObject(http_request_object, obj);
-
- SET_EH_THROW_HTTP();
- message = GET_PROP(obj, responseMessage);
- if (Z_TYPE_P(message) == IS_OBJECT) {
- RETVAL_OBJECT(message);
- } else {
- RETVAL_NULL();
- }
- SET_EH_NORMAL();
- }
-}
-/* }}} */
-
-/* {{{ proto HttpMessage HttpRequest::getRequestMessage()
- *
- * Get sent HTTP message.
- */
-PHP_METHOD(HttpRequest, getRequestMessage)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- http_message *msg;
- getObject(http_request_object, obj);
-
- SET_EH_THROW_HTTP();
- if (msg = http_message_parse(PHPSTR_VAL(&obj->request), PHPSTR_LEN(&obj->request))) {
- RETVAL_OBJVAL(http_message_object_from_msg(msg));
- }
- SET_EH_NORMAL();
- }
-}
-/* }}} */
-
-PHP_METHOD(HttpRequest, getHistory)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- http_message *msg;
- getObject(http_request_object, obj);
-
- SET_EH_THROW_HTTP();
- if (msg = http_message_parse(PHPSTR_VAL(&obj->history), PHPSTR_LEN(&obj->history))) {
- RETVAL_OBJVAL(http_message_object_from_msg(msg));
- }
- SET_EH_NORMAL();
- }
-}
-
-/* {{{ proto HttpMessage HttpRequest::send()
- *
- * Send the HTTP request.
- *
- * GET example:
- * <pre>
- * <?php
- * $r = new HttpRequest('http://example.com/feed.rss', HTTP_GET);
- * $r->setOptions(array('lastmodified' => filemtime('local.rss')));
- * $r->addQueryData(array('category' => 3));
- * try {
- * $r->send();
- * if ($r->getResponseCode() == 200) {
- * file_put_contents('local.rss', $r->getResponseBody());
- * }
- * } catch (HttpException $ex) {
- * echo $ex;
- * }
- * ?>
- * </pre>
- *
- * POST example:
- * <pre>
- * <?php
- * $r = new HttpRequest('http://example.com/form.php', HTTP_POST);
- * $r->setOptions(array('cookies' => array('lang' => 'de')));
- * $r->addPostFields(array('user' => 'mike', 'pass' => 's3c|r3t'));
- * $r->addPostFile('image', 'profile.jpg', 'image/jpeg');
- * try {
- * echo $r->send()->getBody();
- * } catch (HttpException $ex) {
- * echo $ex;
- * }
- * ?>
- * </pre>
- */
-PHP_METHOD(HttpRequest, send)
-{
- http_request_body body = {0, NULL, 0};
- getObject(http_request_object, obj);
-
- NO_ARGS;
-
- SET_EH_THROW_HTTP();
-
- if (obj->pool) {
- http_error(HE_WARNING, HTTP_E_RUNTIME, "Cannot perform HttpRequest::send() while attached to an HttpRequestPool");
- SET_EH_NORMAL();
- RETURN_FALSE;
- }
-
- RETVAL_NULL();
-
- if ( (SUCCESS == http_request_object_requesthandler(obj, getThis(), &body)) &&
- (SUCCESS == http_request_exec(obj->ch, NULL, &obj->response, &obj->request)) &&
- (SUCCESS == http_request_object_responsehandler(obj, getThis()))) {
- RETVAL_OBJECT(GET_PROP(obj, responseMessage));
- }
- http_request_body_dtor(&body);
-
- SET_EH_NORMAL();
-}
-/* }}} */
-
-#endif /* ZEND_ENGINE_2 && HTTP_HAVE_CURL */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_request_api.h"
-#include "php_http_request_pool_api.h"
-#include "php_http_request_object.h"
-#include "php_http_requestpool_object.h"
-
-#ifndef HTTP_DEBUG_REQPOOLS
-# define HTTP_DEBUG_REQPOOLS 0
-#endif
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#ifndef HAVE_CURL_MULTI_STRERROR
-# define curl_multi_strerror(dummy) "unknown error"
-#endif
-
-static void http_request_pool_freebody(http_request_callback_ctx **body);
-static int http_request_pool_compare_handles(void *h1, void *h2);
-
-/* {{{ http_request_pool *http_request_pool_init(http_request_pool *) */
-PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool TSRMLS_DC)
-{
- zend_bool free_pool;
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Initializing request pool %p\n", pool);
-#endif
- if ((free_pool = (!pool))) {
- pool = emalloc(sizeof(http_request_pool));
- pool->ch = NULL;
- }
-
- if (!pool->ch) {
- if (!(pool->ch = curl_multi_init())) {
- http_error(HE_WARNING, HTTP_E_REQUEST, "Could not initialize curl");
- if (free_pool) {
- efree(pool);
- }
- return NULL;
- }
- }
-
- pool->unfinished = 0;
- zend_llist_init(&pool->handles, sizeof(zval *), (llist_dtor_func_t) ZVAL_PTR_DTOR, 0);
- zend_llist_init(&pool->bodies, sizeof(http_request_callback_ctx *), (llist_dtor_func_t) http_request_pool_freebody, 0);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Initialized request pool %p\n", pool);
-#endif
- return pool;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_pool_attach(http_request_pool *, zval *) */
-PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *request TSRMLS_DC)
-{
- getObjectEx(http_request_object, req, request);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Attaching HttpRequest(#%d) %p to pool %p\n", Z_OBJ_HANDLE_P(request), req, pool);
-#endif
- if (req->pool) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "HttpRequest object(#%d) is already member of %s HttpRequestPool", Z_OBJ_HANDLE_P(request), req->pool == pool ? "this" : "another");
- } else {
- http_request_callback_ctx *body = http_request_callback_data_ex(http_request_body_new(), 0);
-
- if (SUCCESS != http_request_pool_requesthandler(request, body->data)) {
- http_error_ex(HE_WARNING, HTTP_E_REQUEST, "Could not initialize HttpRequest object for attaching to the HttpRequestPool");
- } else {
- CURLMcode code = curl_multi_add_handle(pool->ch, req->ch);
-
- if ((CURLM_OK != code) && (CURLM_CALL_MULTI_PERFORM != code)) {
- http_error_ex(HE_WARNING, HTTP_E_REQUEST_POOL, "Could not attach HttpRequest object to the HttpRequestPool: %s", curl_multi_strerror(code));
- } else {
- req->pool = pool;
-
- zend_llist_add_element(&pool->handles, &request);
- zend_llist_add_element(&pool->bodies, &body);
-
- zval_add_ref(&request);
- zend_objects_store_add_ref(request TSRMLS_CC);
-
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "> %d HttpRequests attached to pool %p\n", zend_llist_count(&pool->handles), pool);
-#endif
- return SUCCESS;
- }
- }
- efree(body->data);
- efree(body);
- }
- return FAILURE;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_pool_detach(http_request_pool *, zval *) */
-PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *request TSRMLS_DC)
-{
- getObjectEx(http_request_object, req, request);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Detaching HttpRequest(#%d) %p from pool %p\n", Z_OBJ_HANDLE_P(request), req, pool);
-#endif
- if (!req->pool) {
- /* not attached to any pool */
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "HttpRequest object(#%d) %p is not attached to any HttpRequestPool\n", Z_OBJ_HANDLE_P(request), req);
-#endif
- } else if (req->pool != pool) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "HttpRequest object(#%d) is not attached to this HttpRequestPool", Z_OBJ_HANDLE_P(request));
- } else {
- CURLMcode code;
-
- req->pool = NULL;
- zend_llist_del_element(&pool->handles, request, http_request_pool_compare_handles);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "> %d HttpRequests remaining in pool %p\n", zend_llist_count(&pool->handles), pool);
-#endif
- if (CURLM_OK != (code = curl_multi_remove_handle(pool->ch, req->ch))) {
- http_error_ex(HE_WARNING, HTTP_E_REQUEST_POOL, "Could not detach HttpRequest object from the HttpRequestPool: %s", curl_multi_strerror(code));
- } else {
- return SUCCESS;
- }
- }
- return FAILURE;
-}
-/* }}} */
-
-/* {{{ void http_request_pool_detach_all(http_request_pool *) */
-PHP_HTTP_API void _http_request_pool_detach_all(http_request_pool *pool TSRMLS_DC)
-{
- int count = zend_llist_count(&pool->handles);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Detaching %d requests from pool %p\n", count, pool);
-#endif
- /*
- * we cannot apply a function to the llist which actually detaches
- * the curl handle *and* removes the llist element --
- * so let's get our hands dirty
- */
- if (count) {
- int i = 0;
- zend_llist_position pos;
- zval **handle, **handles = emalloc(count * sizeof(zval *));
-
- for (handle = zend_llist_get_first_ex(&pool->handles, &pos); handle; handle = zend_llist_get_next_ex(&pool->handles, &pos)) {
- handles[i++] = *handle;
- }
- /* should never happen */
- if (i != count) {
- zend_error(E_ERROR, "number of fetched request handles do not match overall count");
- count = i;
- }
- for (i = 0; i < count; ++i) {
- http_request_pool_detach(pool, handles[i]);
- }
- efree(handles);
- }
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Destroying %d request bodies of pool %p\n", zend_llist_count(&pool->bodies), pool);
-#endif
- /* free created bodies too */
- zend_llist_clean(&pool->bodies);
-}
-
-/* {{{ STATUS http_request_pool_send(http_request_pool *) */
-PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC)
-{
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Attempt to send %d requests of pool %p\n", zend_llist_count(&pool->handles), pool);
-#endif
- while (http_request_pool_perform(pool)) {
- if (SUCCESS != http_request_pool_select(pool)) {
-#ifdef PHP_WIN32
- http_error(HE_WARNING, HTTP_E_SOCKET, WSAGetLastError());
-#else
- http_error(HE_WARNING, HTTP_E_SOCKET, strerror(errno));
-#endif
- return FAILURE;
- }
- }
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Finished sending %d HttpRequests of pool %p (still unfinished: %d)\n", zend_llist_count(&pool->handles), pool, pool->unfinished);
- {
- int remaining = 0;
- CURLMsg *msg;
- /*
- * FIXXME: populate --somehow
- */
- do {
- if (msg = curl_multi_info_read(pool->ch, &remaining))
- fprintf(stderr, "CURL: %s (%d)\n", curl_easy_strerror(msg->data.result), msg->data.result);
- } while (remaining);
- }
-#endif
- zend_llist_apply(&pool->handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC);
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ void http_request_pool_dtor(http_request_pool *) */
-PHP_HTTP_API void _http_request_pool_dtor(http_request_pool *pool TSRMLS_DC)
-{
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Destructing request pool %p\n", pool);
-#endif
- pool->unfinished = 0;
- zend_llist_clean(&pool->handles);
- zend_llist_clean(&pool->bodies);
- curl_multi_cleanup(pool->ch);
-}
-/* }}} */
-
-/* {{{ STATUS http_request_pool_select(http_request_pool *) */
-PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool)
-{
- int MAX;
- fd_set R, W, E;
- struct timeval timeout = {1, 0};
-
- FD_ZERO(&R);
- FD_ZERO(&W);
- FD_ZERO(&E);
-
- curl_multi_fdset(pool->ch, &R, &W, &E, &MAX);
- return (-1 != select(MAX + 1, &R, &W, &E, &timeout)) ? SUCCESS : FAILURE;
-}
-/* }}} */
-
-/* {{{ int http_request_pool_perform(http_request_pool *) */
-PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool)
-{
- while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(pool->ch, &pool->unfinished));
- return pool->unfinished;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_pool_requesthandler(zval *, http_request_body *) */
-STATUS _http_request_pool_requesthandler(zval *request, http_request_body *body TSRMLS_DC)
-{
- getObjectEx(http_request_object, req, request);
- if (SUCCESS == http_request_object_requesthandler(req, request, body)) {
- http_request_conv(req->ch, &req->response, &req->request);
- return SUCCESS;
- }
- return FAILURE;
-}
-/* }}} */
-
-/* {{{ void http_request_pool_responsehandler(zval **) */
-void _http_request_pool_responsehandler(zval **req TSRMLS_DC)
-{
- getObjectEx(http_request_object, obj, *req);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Fetching data from HttpRequest(#%d) %p of pool %p\n", Z_OBJ_HANDLE_PP(req), obj, obj->pool);
-#endif
- http_request_object_responsehandler(obj, *req);
-}
-/* }}} */
-
-/*#*/
-
-/* {{{ static void http_request_pool_freebody(http_request_ctx **) */
-static void http_request_pool_freebody(http_request_callback_ctx **body)
-{
- HTTP_REQUEST_CALLBACK_DATA(*body, http_request_body *, b);
- http_request_body_free(b);
- efree(*body);
-}
-/* }}} */
-
-/* {{{ static int http_request_pool_compare_handles(void *, void *) */
-static int http_request_pool_compare_handles(void *h1, void *h2)
-{
- int match = (Z_OBJ_HANDLE_PP((zval **) h1) == Z_OBJ_HANDLE_P((zval *) h2));
-#if HTTP_DEBUG_REQPOOLS
- /* if(match) fprintf(stderr, "OK\n"); */
-#endif
- return match;
-}
-/* }}} */
-
-#endif /* ZEND_ENGINE_2 && HTTP_HAVE_CURL */
-
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
-
-#include "php_http_std_defs.h"
-#include "php_http_requestpool_object.h"
-#include "php_http_request_pool_api.h"
-#include "php_http_request_object.h"
-#include "php_http_exception_object.h"
-
-#include "zend_interfaces.h"
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#endif
-#include <curl/curl.h>
-
-#define HTTP_BEGIN_ARGS(method, req_args) HTTP_BEGIN_ARGS_EX(HttpRequestPool, method, 0, req_args)
-#define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpRequestPool, method, ret_ref)
-#define HTTP_REQPOOL_ME(method, visibility) PHP_ME(HttpRequestPool, method, HTTP_ARGS(HttpRequestPool, method), visibility)
-
-HTTP_BEGIN_ARGS_AR(HttpRequestPool, __construct, 0, 0)
- HTTP_ARG_OBJ(HttpRequest, request0, 0)
- HTTP_ARG_OBJ(HttpRequest, request1, 0)
- HTTP_ARG_OBJ(HttpRequest, requestN, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(__destruct, 0);
-HTTP_EMPTY_ARGS(reset, 0);
-
-HTTP_BEGIN_ARGS(attach, 1)
- HTTP_ARG_OBJ(HttpRequest, request, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(detach, 1)
- HTTP_ARG_OBJ(HttpRequest, request, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(send, 0);
-HTTP_EMPTY_ARGS(socketPerform, 0);
-HTTP_EMPTY_ARGS(socketSelect, 0);
-
-HTTP_EMPTY_ARGS(valid, 0);
-HTTP_EMPTY_ARGS(current, 1);
-HTTP_EMPTY_ARGS(key, 0);
-HTTP_EMPTY_ARGS(next, 0);
-HTTP_EMPTY_ARGS(rewind, 0);
-
-#define http_requestpool_object_declare_default_properties() _http_requestpool_object_declare_default_properties(TSRMLS_C)
-static inline void _http_requestpool_object_declare_default_properties(TSRMLS_D);
-
-zend_class_entry *http_requestpool_object_ce;
-zend_function_entry http_requestpool_object_fe[] = {
- HTTP_REQPOOL_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
- HTTP_REQPOOL_ME(__destruct, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR)
- HTTP_REQPOOL_ME(attach, ZEND_ACC_PUBLIC)
- HTTP_REQPOOL_ME(detach, ZEND_ACC_PUBLIC)
- HTTP_REQPOOL_ME(send, ZEND_ACC_PUBLIC)
- HTTP_REQPOOL_ME(reset, ZEND_ACC_PUBLIC)
-
- HTTP_REQPOOL_ME(socketPerform, ZEND_ACC_PROTECTED)
- HTTP_REQPOOL_ME(socketSelect, ZEND_ACC_PROTECTED)
-
- /* implements Interator */
- HTTP_REQPOOL_ME(valid, ZEND_ACC_PUBLIC)
- HTTP_REQPOOL_ME(current, ZEND_ACC_PUBLIC)
- HTTP_REQPOOL_ME(key, ZEND_ACC_PUBLIC)
- HTTP_REQPOOL_ME(next, ZEND_ACC_PUBLIC)
- HTTP_REQPOOL_ME(rewind, ZEND_ACC_PUBLIC)
-
- EMPTY_FUNCTION_ENTRY
-};
-static zend_object_handlers http_requestpool_object_handlers;
-
-void _http_requestpool_object_init(INIT_FUNC_ARGS)
-{
- HTTP_REGISTER_CLASS_EX(HttpRequestPool, http_requestpool_object, NULL, 0);
- zend_class_implements(http_requestpool_object_ce TSRMLS_CC, 1, zend_ce_iterator);
-}
-
-zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC)
-{
- zend_object_value ov;
- http_requestpool_object *o;
-
- o = ecalloc(1, sizeof(http_requestpool_object));
- o->zo.ce = ce;
-
- http_request_pool_init(&o->pool);
-
- ALLOC_HASHTABLE(OBJ_PROP(o));
- zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0);
- zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
-
- ov.handle = putObject(http_requestpool_object, o);
- ov.handlers = &http_requestpool_object_handlers;
-
- return ov;
-}
-
-static inline void _http_requestpool_object_declare_default_properties(TSRMLS_D)
-{
- zend_class_entry *ce = http_requestpool_object_ce;
-
- DCL_PROP_N(PROTECTED, pool);
-}
-
-void _http_requestpool_object_free(zend_object *object TSRMLS_DC)
-{
- http_requestpool_object *o = (http_requestpool_object *) object;
-
- if (OBJ_PROP(o)) {
- zend_hash_destroy(OBJ_PROP(o));
- FREE_HASHTABLE(OBJ_PROP(o));
- }
- http_request_pool_dtor(&o->pool);
- efree(o);
-}
-
-/* ### USERLAND ### */
-
-/* {{{ proto void HttpRequestPool::__construct([HttpRequest request[, ...]])
- *
- * Instantiate a new HttpRequestPool object. An HttpRequestPool is
- * able to send several HttpRequests in parallel.
- *
- * Example:
- * <pre>
- * <?php
- * try {
- * $pool = new HttpRequestPool(
- * new HttpRequest('http://www.google.com/', HTTP_HEAD),
- * new HttpRequest('http://www.php.net/', HTTP_HEAD)
- * );
- * $pool->send();
- * foreach($pool as $request) {
- * printf("%s is %s (%d)\n",
- * $request->getUrl(),
- * $request->getResponseCode() ? 'alive' : 'not alive',
- * $request->getResponseCode()
- * );
- * }
- * } catch (HttpException $e) {
- * echo $e;
- * }
- * ?>
- * </pre>
- */
-PHP_METHOD(HttpRequestPool, __construct)
-{
- int argc = ZEND_NUM_ARGS();
- zval ***argv = safe_emalloc(argc, sizeof(zval *), 0);
- getObject(http_requestpool_object, obj);
-
- if (SUCCESS == zend_get_parameters_array_ex(argc, argv)) {
- int i;
-
- for (i = 0; i < argc; ++i) {
- if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), http_request_object_ce TSRMLS_CC)) {
- http_request_pool_attach(&obj->pool, *(argv[i]));
- }
- }
- }
- efree(argv);
-}
-/* }}} */
-
-/* {{{ proto void HttpRequestPool::__destruct()
- *
- * Clean up HttpRequestPool object.
- */
-PHP_METHOD(HttpRequestPool, __destruct)
-{
- getObject(http_requestpool_object, obj);
-
- NO_ARGS;
-
- http_request_pool_detach_all(&obj->pool);
-}
-/* }}} */
-
-/* {{{ proto void HttpRequestPool::reset()
- *
- * Detach all attached HttpRequest objects.
- */
-PHP_METHOD(HttpRequestPool, reset)
-{
- getObject(http_requestpool_object, obj);
-
- NO_ARGS;
-
- http_request_pool_detach_all(&obj->pool);
-}
-
-/* {{{ proto bool HttpRequestPool::attach(HttpRequest request)
- *
- * Attach an HttpRequest object to this HttpRequestPool.
- * NOTE: set all options prior attaching!
- */
-PHP_METHOD(HttpRequestPool, attach)
-{
- zval *request;
- STATUS status = FAILURE;
- getObject(http_requestpool_object, obj);
-
- SET_EH_THROW_HTTP();
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) {
- status = http_request_pool_attach(&obj->pool, request);
- }
- SET_EH_NORMAL();
- RETURN_SUCCESS(status);
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequestPool::detach(HttpRequest request)
- *
- * Detach an HttpRequest object from this HttpRequestPool.
- */
-PHP_METHOD(HttpRequestPool, detach)
-{
- zval *request;
- STATUS status = FAILURE;
- getObject(http_requestpool_object, obj);
-
- SET_EH_THROW_HTTP();
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) {
- status = http_request_pool_detach(&obj->pool, request);
- }
- SET_EH_NORMAL();
- RETURN_SUCCESS(status);
-}
-/* }}} */
-
-/* {{{ proto bool HttpRequestPool::send()
- *
- * Send all attached HttpRequest objects in parallel.
- */
-PHP_METHOD(HttpRequestPool, send)
-{
- STATUS status;
- getObject(http_requestpool_object, obj);
-
- NO_ARGS;
-
- SET_EH_THROW_HTTP();
- status = http_request_pool_send(&obj->pool);
- SET_EH_NORMAL();
-
- RETURN_SUCCESS(status);
-}
-/* }}} */
-
-/* {{{ proto protected bool HttpRequestPool::socketSend()
- *
- * Usage:
- * <pre>
- * <?php
- * while ($pool->socketPerform()) {
- * do_something_else();
- * if (!$pool->socketSelect()) {
- * die('Socket error');
- * }
- * }
- * ?>
- * </pre>
- */
-PHP_METHOD(HttpRequestPool, socketPerform)
-{
- getObject(http_requestpool_object, obj);
-
- NO_ARGS;
-
- if (0 < http_request_pool_perform(&obj->pool)) {
- RETURN_TRUE;
- } else {
- zend_llist_apply(&obj->pool.handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC);
- RETURN_FALSE;
- }
-}
-/* }}} */
-
-/* {{{ proto protected bool HttpRequestPool::socketSelect()
- *
- * See HttpRequestPool::socketPerform().
- */
-PHP_METHOD(HttpRequestPool, socketSelect)
-{
- getObject(http_requestpool_object, obj);
-
- NO_ARGS;
-
- RETURN_SUCCESS(http_request_pool_select(&obj->pool));
-}
-/* }}} */
-
-/* implements Iterator */
-
-/* {{{ proto bool HttpRequestPool::valid()
- *
- * Implements Iterator::valid().
- */
-PHP_METHOD(HttpRequestPool, valid)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_requestpool_object, obj);
- RETURN_BOOL(obj->iterator.pos < zend_llist_count(&obj->pool.handles));
- }
-}
-/* }}} */
-
-/* {{{ proto HttpRequest HttpRequestPool::current()
- *
- * Implements Iterator::current().
- */
-PHP_METHOD(HttpRequestPool, current)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- long pos = 0;
- zval **current = NULL;
- zend_llist_position lpos;
- getObject(http_requestpool_object, obj);
-
- if (obj->iterator.pos < zend_llist_count(&obj->pool.handles)) {
- for ( current = zend_llist_get_first_ex(&obj->pool.handles, &lpos);
- current && obj->iterator.pos != pos++;
- current = zend_llist_get_next_ex(&obj->pool.handles, &lpos));
- if (current) {
- RETURN_OBJECT(*current);
- }
- }
- RETURN_NULL();
- }
-}
-/* }}} */
-
-/* {{{ proto long HttpRequestPool::key()
- *
- * Implements Iterator::key().
- */
-PHP_METHOD(HttpRequestPool, key)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- getObject(http_requestpool_object, obj);
- RETURN_LONG(obj->iterator.pos);
- }
-}
-/* }}} */
-
-/* {{{ proto void HttpRequestPool::next()
- *
- * Implements Iterator::next().
- */
-PHP_METHOD(HttpRequestPool, next)
-{
- NO_ARGS {
- getObject(http_requestpool_object, obj);
- ++(obj->iterator.pos);
- }
-}
-/* }}} */
-
-/* {{{ proto void HttpRequestPool::rewind()
- *
- * Implements Iterator::rewind().
- */
-PHP_METHOD(HttpRequestPool, rewind)
-{
- NO_ARGS {
- getObject(http_requestpool_object, obj);
- obj->iterator.pos = 0;
- }
-}
-/* }}} */
-
-#endif /* ZEND_ENGINE_2 && HTTP_HAVE_CURL */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "missing.h"
-
-/* broken static properties in PHP 5.0 */
-#if defined(ZEND_ENGINE_2) && !defined(WONKY)
-
-#include "SAPI.h"
-#include "php_ini.h"
-
-#include "php_http.h"
-#include "php_http_api.h"
-#include "php_http_std_defs.h"
-#include "php_http_response_object.h"
-#include "php_http_exception_object.h"
-#include "php_http_send_api.h"
-#include "php_http_cache_api.h"
-#include "php_http_headers_api.h"
-
-#ifdef HTTP_HAVE_MHASH
-# include <mhash.h>
-#endif
-#ifdef HTTP_HAVE_MAGIC
-# include <magic.h>
-#endif
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#define GET_STATIC_PROP(n) *GET_STATIC_PROP_EX(http_response_object_ce, n)
-#define UPD_STATIC_PROP(t, n, v) UPD_STATIC_PROP_EX(http_response_object_ce, t, n, v)
-#define SET_STATIC_PROP(n, v) SET_STATIC_PROP_EX(http_response_object_ce, n, v)
-#define UPD_STATIC_STRL(n, v, l) UPD_STATIC_STRL_EX(http_response_object_ce, n, v, l)
-
-#define HTTP_BEGIN_ARGS(method, req_args) HTTP_BEGIN_ARGS_EX(HttpResponse, method, 0, req_args)
-#define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpResponse, method, ret_ref)
-#define HTTP_RESPONSE_ME(method, visibility) PHP_ME(HttpResponse, method, HTTP_ARGS(HttpResponse, method), visibility|ZEND_ACC_STATIC)
-#define HTTP_RESPONSE_ALIAS(method, func) HTTP_STATIC_ME_ALIAS(method, func, HTTP_ARGS(HttpResponse, method))
-
-HTTP_BEGIN_ARGS(setHeader, 2)
- HTTP_ARG_VAL(name, 0)
- HTTP_ARG_VAL(value, 0)
- HTTP_ARG_VAL(replace, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(getHeader, 0)
- HTTP_ARG_VAL(name, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getETag, 0);
-HTTP_BEGIN_ARGS(setETag, 1)
- HTTP_ARG_VAL(etag, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getLastModified, 0);
-HTTP_BEGIN_ARGS(setLastModified, 1)
- HTTP_ARG_VAL(timestamp, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getCache, 0);
-HTTP_BEGIN_ARGS(setCache, 1)
- HTTP_ARG_VAL(cache, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getGzip, 0);
-HTTP_BEGIN_ARGS(setGzip, 1)
- HTTP_ARG_VAL(gzip, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getCacheControl, 0);
-HTTP_BEGIN_ARGS(setCacheControl, 1)
- HTTP_ARG_VAL(cache_control, 0)
- HTTP_ARG_VAL(max_age, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getContentType, 0);
-HTTP_BEGIN_ARGS(setContentType, 1)
- HTTP_ARG_VAL(content_type, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(guessContentType, 1)
- HTTP_ARG_VAL(magic_file, 0)
- HTTP_ARG_VAL(magic_mode, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getContentDisposition, 0);
-HTTP_BEGIN_ARGS(setContentDisposition, 1)
- HTTP_ARG_VAL(filename, 0)
- HTTP_ARG_VAL(send_inline, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getThrottleDelay, 0);
-HTTP_BEGIN_ARGS(setThrottleDelay, 1)
- HTTP_ARG_VAL(seconds, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getBufferSize, 0);
-HTTP_BEGIN_ARGS(setBufferSize, 1)
- HTTP_ARG_VAL(bytes, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getData, 0);
-HTTP_BEGIN_ARGS(setData, 1)
- HTTP_ARG_VAL(data, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getStream, 0);
-HTTP_BEGIN_ARGS(setStream, 1)
- HTTP_ARG_VAL(stream, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getFile, 0);
-HTTP_BEGIN_ARGS(setFile, 1)
- HTTP_ARG_VAL(filepath, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(send, 0)
- HTTP_ARG_VAL(clean_ob, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(capture, 0);
-
-HTTP_BEGIN_ARGS(redirect, 0)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(params, 0)
- HTTP_ARG_VAL(session, 0)
- HTTP_ARG_VAL(permanent, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(status, 1)
- HTTP_ARG_VAL(code, 0)
-HTTP_END_ARGS;
-
-HTTP_EMPTY_ARGS(getRequestHeaders, 0);
-HTTP_EMPTY_ARGS(getRequestBody, 0);
-
-#define http_response_object_declare_default_properties() _http_response_object_declare_default_properties(TSRMLS_C)
-static inline void _http_response_object_declare_default_properties(TSRMLS_D);
-#define http_grab_response_headers _http_grab_response_headers
-static void _http_grab_response_headers(void *data, void *arg TSRMLS_DC);
-
-zend_class_entry *http_response_object_ce;
-zend_function_entry http_response_object_fe[] = {
-
- HTTP_RESPONSE_ME(setHeader, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getHeader, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setETag, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getETag, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setLastModified, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getLastModified, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setContentDisposition, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getContentDisposition, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setContentType, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getContentType, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(guessContentType, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setCache, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getCache, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setCacheControl, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getCacheControl, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setGzip, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getGzip, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setThrottleDelay, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getThrottleDelay, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setBufferSize, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getBufferSize, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setData, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getData, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setFile, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getFile, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(setStream, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(getStream, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ME(send, ZEND_ACC_PUBLIC)
- HTTP_RESPONSE_ME(capture, ZEND_ACC_PUBLIC)
-
- HTTP_RESPONSE_ALIAS(redirect, http_redirect)
- HTTP_RESPONSE_ALIAS(status, http_send_status)
- HTTP_RESPONSE_ALIAS(getRequestHeaders, http_get_request_headers)
- HTTP_RESPONSE_ALIAS(getRequestBody, http_get_request_body)
-
- EMPTY_FUNCTION_ENTRY
-};
-
-void _http_response_object_init(INIT_FUNC_ARGS)
-{
- HTTP_REGISTER_CLASS(HttpResponse, http_response_object, NULL, 0);
- http_response_object_declare_default_properties();
-}
-
-static inline void _http_response_object_declare_default_properties(TSRMLS_D)
-{
- zend_class_entry *ce = http_response_object_ce;
-
- DCL_STATIC_PROP(PRIVATE, bool, sent, 0);
- DCL_STATIC_PROP(PRIVATE, bool, catch, 0);
- DCL_STATIC_PROP(PRIVATE, long, mode, -1);
- DCL_STATIC_PROP(PRIVATE, long, stream, 0);
- DCL_STATIC_PROP_N(PRIVATE, file);
- DCL_STATIC_PROP_N(PRIVATE, data);
- DCL_STATIC_PROP(PROTECTED, bool, cache, 0);
- DCL_STATIC_PROP(PROTECTED, bool, gzip, 0);
- DCL_STATIC_PROP_N(PROTECTED, eTag);
- DCL_STATIC_PROP(PROTECTED, long, lastModified, 0);
- DCL_STATIC_PROP_N(PROTECTED, cacheControl);
- DCL_STATIC_PROP_N(PROTECTED, contentType);
- DCL_STATIC_PROP_N(PROTECTED, contentDisposition);
- DCL_STATIC_PROP(PROTECTED, long, bufferSize, HTTP_SENDBUF_SIZE);
- DCL_STATIC_PROP(PROTECTED, double, throttleDelay, 0.0);
-
-#ifndef WONKY
- DCL_CONST(long, "ETAG_MD5", HTTP_ETAG_MD5);
- DCL_CONST(long, "ETAG_SHA1", HTTP_ETAG_SHA1);
- DCL_CONST(long, "ETAG_CRC32", HTTP_ETAG_CRC32);
-
-# ifdef HTTP_HAVE_MHASH
- {
- int l, i, c = mhash_count();
-
- for (i = 0; i <= c; ++i) {
- char const_name[256] = {0};
- const char *hash_name = mhash_get_hash_name_static(i);
-
- if (hash_name) {
- l = snprintf(const_name, 255, "ETAG_MHASH_%s", hash_name);
- zend_declare_class_constant_long(ce, const_name, l, i TSRMLS_CC);
- }
- }
- }
-# endif /* HTTP_HAVE_MHASH */
-#endif /* WONKY */
-}
-
-static void _http_grab_response_headers(void *data, void *arg TSRMLS_DC)
-{
- phpstr_appendl(PHPSTR(arg), ((sapi_header_struct *)data)->header);
- phpstr_appends(PHPSTR(arg), HTTP_CRLF);
-}
-
-/* ### USERLAND ### */
-
-/* {{{ proto static bool HttpResponse::setHeader(string name, mixed value[, bool replace = true)
- */
-PHP_METHOD(HttpResponse, setHeader)
-{
- zend_bool replace = 1;
- char *name;
- int name_len = 0;
- zval *value = NULL;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz/!|b", &name, &name_len, &value, &replace)) {
- RETURN_FALSE;
- }
- if (SG(headers_sent)) {
- http_error(HE_WARNING, HTTP_E_HEADER, "Cannot add another header when headers have already been sent");
- RETURN_FALSE;
- }
- if (!name_len) {
- http_error(HE_WARNING, HTTP_E_HEADER, "Cannot send anonymous headers");
- RETURN_FALSE;
- }
-
- /* delete header if value == null */
- if (!value || Z_TYPE_P(value) == IS_NULL) {
- RETURN_SUCCESS(http_send_header_ex(name, name_len, "", 0, replace, NULL));
- }
- /* send multiple header if replace is false and value is an array */
- if (!replace && Z_TYPE_P(value) == IS_ARRAY) {
- zval **data;
-
- FOREACH_VAL(value, data) {
- convert_to_string_ex(data);
- if (SUCCESS != http_send_header_ex(name, name_len, Z_STRVAL_PP(data), Z_STRLEN_PP(data), 0, NULL)) {
- RETURN_FALSE;
- }
- }
- RETURN_TRUE;
- }
- /* send standard header */
- if (Z_TYPE_P(value) != IS_STRING) {
- convert_to_string_ex(&value);
- }
- RETURN_SUCCESS(http_send_header_ex(name, name_len, Z_STRVAL_P(value), Z_STRLEN_P(value), replace, NULL));
-}
-/* }}} */
-
-/* {{{ proto static mixed HttpResponse::getHeader([string name])
- */
-PHP_METHOD(HttpResponse, getHeader)
-{
- char *name = NULL;
- int name_len = 0;
- phpstr headers;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, &name_len)) {
- RETURN_FALSE;
- }
-
- phpstr_init(&headers);
- zend_llist_apply_with_argument(&SG(sapi_headers).headers, http_grab_response_headers, &headers TSRMLS_CC);
- phpstr_fix(&headers);
-
- if (name && name_len) {
- zval **header;
- HashTable headers_ht;
-
- zend_hash_init(&headers_ht, sizeof(zval *), NULL, ZVAL_PTR_DTOR, 0);
- if ( (SUCCESS == http_parse_headers_ex(PHPSTR_VAL(&headers), &headers_ht, 1)) &&
- (SUCCESS == zend_hash_find(&headers_ht, name, name_len + 1, (void **) &header))) {
- RETVAL_ZVAL(*header, 1, 0);
- } else {
- RETVAL_NULL();
- }
- zend_hash_destroy(&headers_ht);
- } else {
- array_init(return_value);
- http_parse_headers_ex(PHPSTR_VAL(&headers), Z_ARRVAL_P(return_value), 1);
- }
-
- phpstr_dtor(&headers);
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setCache(bool cache)
- *
- * Whether it sould be attempted to cache the entitity.
- * This will result in necessary caching headers and checks of clients
- * "If-Modified-Since" and "If-None-Match" headers. If one of those headers
- * matches a "304 Not Modified" status code will be issued.
- *
- * NOTE: If you're using sessions, be shure that you set session.cache_limiter
- * to something more appropriate than "no-cache"!
- */
-PHP_METHOD(HttpResponse, setCache)
-{
- zend_bool do_cache = 0;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &do_cache)) {
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(UPD_STATIC_PROP(bool, cache, do_cache));
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::getCache()
- *
- * Get current caching setting.
- */
-PHP_METHOD(HttpResponse, getCache)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *cache = convert_to_type_ex(IS_BOOL, GET_STATIC_PROP(cache));
-
- RETURN_ZVAL(cache, 1, 0);
- }
-}
-/* }}}*/
-
-/* {{{ proto static bool HttpResponse::setGzip(bool gzip)
- *
- * Enable on-thy-fly gzipping of the sent entity.
- */
-PHP_METHOD(HttpResponse, setGzip)
-{
- zend_bool do_gzip = 0;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &do_gzip)) {
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(UPD_STATIC_PROP(bool, gzip, do_gzip));
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::getGzip()
- *
- * Get current gzipping setting.
- */
-PHP_METHOD(HttpResponse, getGzip)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *gzip = convert_to_type_ex(IS_BOOL, GET_STATIC_PROP(gzip));
-
- RETURN_ZVAL(gzip, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setCacheControl(string control[, long max_age = 0])
- *
- * Set a custom cache-control header, usually being "private" or "public";
- * The max_age parameter controls how long the cache entry is valid on the client side.
- */
-PHP_METHOD(HttpResponse, setCacheControl)
-{
- char *ccontrol, *cctl;
- int cc_len;
- long max_age = 0;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &ccontrol, &cc_len, &max_age)) {
- RETURN_FALSE;
- }
-
- if (strcmp(ccontrol, "public") && strcmp(ccontrol, "private") && strcmp(ccontrol, "no-cache")) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Cache-Control '%s' doesn't match public, private or no-cache", ccontrol);
- RETURN_FALSE;
- } else {
- size_t cctl_len = spprintf(&cctl, 0, "%s, must-revalidate, max_age=%ld", ccontrol, max_age);
- RETVAL_SUCCESS(UPD_STATIC_STRL(cacheControl, cctl, cctl_len));
- efree(cctl);
- }
-}
-/* }}} */
-
-/* {{{ proto static string HttpResponse::getCacheControl()
- *
- * Get current Cache-Control header setting.
- */
-PHP_METHOD(HttpResponse, getCacheControl)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *ccontrol = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(cacheControl));
-
- RETURN_ZVAL(ccontrol, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setContentType(string content_type)
- *
- * Set the content-type of the sent entity.
- */
-PHP_METHOD(HttpResponse, setContentType)
-{
- char *ctype;
- int ctype_len;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &ctype, &ctype_len)) {
- RETURN_FALSE;
- }
-
- if (!strchr(ctype, '/')) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Content type '%s' doesn't seem to contain a primary and a secondary part", ctype);
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(UPD_STATIC_STRL(contentType, ctype, ctype_len));
-}
-/* }}} */
-
-/* {{{ proto static string HttpResponse::getContentType()
- *
- * Get current Content-Type header setting.
- */
-PHP_METHOD(HttpResponse, getContentType)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *ctype = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(contentType));
-
- RETURN_ZVAL(ctype, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static string HttpResponse::guessContentType(string magic_file[, long magic_mode = MAGIC_MIME])
- *
- * Attempts to guess the content type of supplied payload through libmagic.
- */
-PHP_METHOD(HttpResponse, guessContentType)
-{
- char *magic_file, *ct = NULL;
- int magic_file_len;
- long magic_mode = 0;
-
- RETVAL_NULL();
-
-#ifdef HTTP_HAVE_MAGIC
- magic_mode = MAGIC_MIME;
-
- SET_EH_THROW_HTTP();
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &magic_file, &magic_file_len, &magic_mode)) {
- switch (Z_LVAL_P(GET_STATIC_PROP(mode))) {
- case SEND_DATA:
- {
- zval *data = GET_STATIC_PROP(data);
- ct = http_guess_content_type(magic_file, magic_mode, Z_STRVAL_P(data), Z_STRLEN_P(data), SEND_DATA);
- }
- break;
-
- case SEND_RSRC:
- {
- php_stream *s;
- zval *z = GET_STATIC_PROP(stream);
- z->type = IS_RESOURCE;
- php_stream_from_zval(s, &z);
- ct = http_guess_content_type(magic_file, magic_mode, s, 0, SEND_RSRC);
- }
- break;
-
- default:
- ct = http_guess_content_type(magic_file, magic_mode, Z_STRVAL_P(GET_STATIC_PROP(file)), 0, -1);
- break;
- }
- if (ct) {
- UPD_STATIC_PROP(string, contentType, ct);
- RETVAL_STRING(ct, 0);
- }
- }
- SET_EH_NORMAL();
-#else
- http_error(HE_THROW, HTTP_E_RUNTIME, "Cannot guess Content-Type; libmagic not available");
-#endif
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setContentDisposition(string filename[, bool inline = false])
- *
- * Set the Content-Disposition of the sent entity. This setting aims to suggest
- * the receiveing user agent how to handle the sent entity; usually the client
- * will show the user a "Save As..." popup.
- */
-PHP_METHOD(HttpResponse, setContentDisposition)
-{
- char *file, *cd;
- int file_len;
- size_t cd_len;
- zend_bool send_inline = 0;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &file, &file_len, &send_inline)) {
- RETURN_FALSE;
- }
-
- cd_len = spprintf(&cd, 0, "%s; filename=\"%s\"", send_inline ? "inline" : "attachment", file);
- RETVAL_SUCCESS(UPD_STATIC_STRL(contentDisposition, cd, cd_len));
- efree(cd);
-}
-/* }}} */
-
-/* {{{ proto static string HttpResponse::getContentDisposition()
- *
- * Get current Content-Disposition setting.
- */
-PHP_METHOD(HttpResponse, getContentDisposition)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *cd = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(contentDisposition));
-
- RETURN_ZVAL(cd, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setETag(string etag)
- *
- * Set a custom ETag. Use this only if you know what you're doing.
- */
-PHP_METHOD(HttpResponse, setETag)
-{
- char *etag;
- int etag_len;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &etag, &etag_len)) {
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(UPD_STATIC_STRL(eTag, etag, etag_len));
-}
-/* }}} */
-
-/* {{{ proto static string HttpResponse::getETag()
- *
- * Get calculated or previously set custom ETag.
- */
-PHP_METHOD(HttpResponse, getETag)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *etag = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(eTag));
-
- RETURN_ZVAL(etag, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setLastModified(long timestamp)
- *
- * Set a custom Last-Modified date.
- */
-PHP_METHOD(HttpResponse, setLastModified)
-{
- long lm;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lm)) {
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(UPD_STATIC_PROP(long, lastModified, lm));
-}
-/* }}} */
-
-/* {{{ proto static HttpResponse::getLastModified()
- *
- * Get calculated or previously set custom Last-Modified date.
- */
-PHP_METHOD(HttpResponse, getLastModified)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *lm = convert_to_type_ex(IS_LONG, GET_STATIC_PROP(lastModified));
-
- RETURN_ZVAL(lm, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setThrottleDelay(double seconds)
- *
- */
-PHP_METHOD(HttpResponse, setThrottleDelay)
-{
- double seconds;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "d", &seconds)) {
- RETURN_FALSE;
- }
- RETURN_SUCCESS(UPD_STATIC_PROP(double, throttleDelay, seconds));
-}
-/* }}} */
-
-/* {{{ proto static double HttpResponse::getThrottleDelay()
- *
- */
-PHP_METHOD(HttpResponse, getThrottleDelay)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *delay = convert_to_type_ex(IS_DOUBLE, GET_STATIC_PROP(throttleDelay));
-
- RETURN_ZVAL(delay, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setBufferSize(long bytes)
- *
- */
-PHP_METHOD(HttpResponse, setBufferSize)
-{
- long bytes;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &bytes)) {
- RETURN_FALSE;
- }
- RETURN_SUCCESS(UPD_STATIC_PROP(long, bufferSize, bytes));
-}
-/* }}} */
-
-/* {{{ proto static long HttpResponse::getBufferSize()
- *
- */
-PHP_METHOD(HttpResponse, getBufferSize)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *size = convert_to_type_ex(IS_LONG, GET_STATIC_PROP(bufferSize));
-
- RETURN_ZVAL(size, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setData(string data)
- *
- * Set the data to be sent.
- */
-PHP_METHOD(HttpResponse, setData)
-{
- zval *the_data;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &the_data)) {
- RETURN_FALSE;
- }
- if (Z_TYPE_P(the_data) != IS_STRING) {
- convert_to_string_ex(&the_data);
- }
-
- if ( (SUCCESS != SET_STATIC_PROP(data, the_data)) ||
- (SUCCESS != UPD_STATIC_PROP(long, mode, SEND_DATA))) {
- RETURN_FALSE;
- }
-
- if (!(Z_LVAL_P(convert_to_type_ex(IS_LONG, GET_STATIC_PROP(lastModified))) > 0)) {
- UPD_STATIC_PROP(long, lastModified, http_last_modified(the_data, SEND_DATA));
- }
- if (!Z_STRLEN_P(convert_to_type_ex(IS_STRING, GET_STATIC_PROP(eTag)))) {
- char *etag = http_etag(Z_STRVAL_P(the_data), Z_STRLEN_P(the_data), SEND_DATA);
- if (etag) {
- UPD_STATIC_PROP(string, eTag, etag);
- efree(etag);
- }
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto static string HttpResponse::getData()
- *
- * Get the previously set data to be sent.
- */
-PHP_METHOD(HttpResponse, getData)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *the_data = GET_STATIC_PROP(data);
-
- RETURN_ZVAL(the_data, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setStream(resource stream)
- *
- * Set the resource to be sent.
- */
-PHP_METHOD(HttpResponse, setStream)
-{
- zval *the_stream;
- php_stream *the_real_stream;
- php_stream_statbuf ssb;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &the_stream)) {
- RETURN_FALSE;
- }
-
- php_stream_from_zval(the_real_stream, &the_stream);
- if (php_stream_stat(the_real_stream, &ssb)) {
- RETURN_FALSE;
- }
-
- if ( (SUCCESS != UPD_STATIC_PROP(long, stream, Z_LVAL_P(the_stream))) ||
- (SUCCESS != UPD_STATIC_PROP(long, mode, SEND_RSRC))) {
- RETURN_FALSE;
- }
- zend_list_addref(Z_LVAL_P(the_stream));
-
- if (!(Z_LVAL_P(convert_to_type_ex(IS_LONG, GET_STATIC_PROP(lastModified))) > 0)) {
- UPD_STATIC_PROP(long, lastModified, http_last_modified(the_real_stream, SEND_RSRC));
- }
- if (!Z_STRLEN_P(convert_to_type_ex(IS_STRING, GET_STATIC_PROP(eTag)))) {
- char *etag = http_etag(the_real_stream, 0, SEND_RSRC);
- if (etag) {
- UPD_STATIC_PROP(string, eTag, etag);
- efree(etag);
- }
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto static resource HttpResponse::getStream()
- *
- * Get the previously set resource to be sent.
- */
-PHP_METHOD(HttpResponse, getStream)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- RETURN_RESOURCE(Z_LVAL_P(convert_to_type_ex(IS_LONG, GET_STATIC_PROP(stream))));
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::setFile(string file)
- *
- * Set the file to be sent.
- */
-PHP_METHOD(HttpResponse, setFile)
-{
- char *the_file;
- int file_len;
- php_stream_statbuf ssb;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &the_file, &file_len)) {
- RETURN_FALSE;
- }
-
- if (php_stream_stat_path(the_file, &ssb)) {
- RETURN_FALSE;
- }
-
- if ( (SUCCESS != UPD_STATIC_STRL(file, the_file, file_len)) ||
- (SUCCESS != UPD_STATIC_PROP(long, mode, -1))) {
- RETURN_FALSE;
- }
-
- if (!(Z_LVAL_P(convert_to_type_ex(IS_LONG, GET_STATIC_PROP(lastModified))) > 0)) {
- UPD_STATIC_PROP(long, lastModified, http_last_modified(the_file, -1));
- }
- if (!Z_STRLEN_P(convert_to_type_ex(IS_STRING, GET_STATIC_PROP(eTag)))) {
- char *etag = http_etag(the_file, 0, -1);
- if (etag) {
- UPD_STATIC_PROP(string, eTag, etag);
- efree(etag);
- }
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto static string HttpResponse::getFile()
- *
- * Get the previously set file to be sent.
- */
-PHP_METHOD(HttpResponse, getFile)
-{
- NO_ARGS;
-
- IF_RETVAL_USED {
- zval *the_file = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(file));
-
- RETURN_ZVAL(the_file, 1, 0);
- }
-}
-/* }}} */
-
-/* {{{ proto static bool HttpResponse::send([bool clean_ob = true])
- *
- * Finally send the entity.
- *
- * Example:
- * <pre>
- * <?php
- * HttpResponse::setCache(true);
- * HttpResponse::setContentType('application/pdf');
- * HttpResponse::setContentDisposition("$user.pdf", false);
- * HttpResponse::setFile('sheet.pdf');
- * HttpResponse::send();
- * ?>
- * </pre>
- */
-PHP_METHOD(HttpResponse, send)
-{
- zval *sent;
- zend_bool clean_ob = 1;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &clean_ob)) {
- RETURN_FALSE;
- }
- if (SG(headers_sent)) {
- http_error(HE_WARNING, HTTP_E_RESPONSE, "Cannot send HttpResponse, headers have already been sent");
- RETURN_FALSE;
- }
-
- sent = GET_STATIC_PROP(sent);
- if (zval_is_true(sent)) {
- http_error(HE_WARNING, HTTP_E_RESPONSE, "Cannot send HttpResponse, response has already been sent");
- RETURN_FALSE;
- } else {
- Z_LVAL_P(sent) = 1;
- }
-
- /* capture mode */
- if (zval_is_true(GET_STATIC_PROP(catch))) {
- zval *the_data;
-
- MAKE_STD_ZVAL(the_data);
- php_ob_get_buffer(the_data TSRMLS_CC);
- SET_STATIC_PROP(data, the_data);
- ZVAL_LONG(GET_STATIC_PROP(mode), SEND_DATA);
-
- if (!Z_STRLEN_P(convert_to_type_ex(IS_STRING, GET_STATIC_PROP(eTag)))) {
- char *etag = http_etag(Z_STRVAL_P(the_data), Z_STRLEN_P(the_data), SEND_DATA);
- if (etag) {
- UPD_STATIC_PROP(string, eTag, etag);
- efree(etag);
- }
- }
- zval_ptr_dtor(&the_data);
-
- clean_ob = 1;
- }
-
- if (clean_ob) {
- /* interrupt on-the-fly etag generation */
- HTTP_G(etag).started = 0;
- /* discard previous output buffers */
- php_end_ob_buffers(0 TSRMLS_CC);
- }
-
- /* gzip */
- if (zval_is_true(GET_STATIC_PROP(gzip))) {
- php_start_ob_buffer_named("ob_gzhandler", 0, 0 TSRMLS_CC);
- } else {
- php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC);
- }
-
- /* caching */
- if (zval_is_true(GET_STATIC_PROP(cache))) {
- zval *cctl, *etag, *lmod;
-
- etag = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(eTag));
- lmod = convert_to_type_ex(IS_LONG, GET_STATIC_PROP(lastModified));
- cctl = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(cacheControl));
-
- http_cache_etag(Z_STRVAL_P(etag), Z_STRLEN_P(etag), Z_STRVAL_P(cctl), Z_STRLEN_P(cctl));
- http_cache_last_modified(Z_LVAL_P(lmod), Z_LVAL_P(lmod) ? Z_LVAL_P(lmod) : time(NULL), Z_STRVAL_P(cctl), Z_STRLEN_P(cctl));
- }
-
- /* content type */
- {
- zval *ctype = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(contentType));
- if (Z_STRLEN_P(ctype)) {
- http_send_content_type(Z_STRVAL_P(ctype), Z_STRLEN_P(ctype));
- } else {
- char *ctypes = INI_STR("default_mimetype");
- size_t ctlen = ctypes ? strlen(ctypes) : 0;
-
- if (ctlen) {
- http_send_content_type(ctypes, ctlen);
- } else {
- http_send_content_type("application/x-octetstream", lenof("application/x-octetstream"));
- }
- }
- }
-
- /* content disposition */
- {
- zval *cd = GET_STATIC_PROP(contentDisposition);
- if (Z_STRLEN_P(cd)) {
- http_send_header_ex("Content-Disposition", lenof("Content-Disposition"), Z_STRVAL_P(cd), Z_STRLEN_P(cd), 1, NULL);
- }
- }
-
- /* throttling */
- {
- HTTP_G(send).buffer_size = Z_LVAL_P(convert_to_type_ex(IS_LONG, GET_STATIC_PROP(bufferSize)));
- HTTP_G(send).throttle_delay = Z_DVAL_P(convert_to_type_ex(IS_DOUBLE, GET_STATIC_PROP(throttleDelay)));
- }
-
- /* send */
- {
- switch (Z_LVAL_P(GET_STATIC_PROP(mode)))
- {
- case SEND_DATA:
- {
- zval *zdata = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(data));
- RETURN_SUCCESS(http_send_data_ex(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), 1));
- }
-
- case SEND_RSRC:
- {
- php_stream *the_real_stream;
- zval *the_stream = convert_to_type_ex(IS_LONG, GET_STATIC_PROP(stream));
- the_stream->type = IS_RESOURCE;
- php_stream_from_zval(the_real_stream, &the_stream);
- RETURN_SUCCESS(http_send_stream_ex(the_real_stream, 0, 1));
- }
-
- default:
- {
- RETURN_SUCCESS(http_send_file_ex(Z_STRVAL_P(convert_to_type_ex(IS_STRING, GET_STATIC_PROP(file))), 1));
- }
- }
- }
-}
-/* }}} */
-
-/* {{{ proto static void HttpResponse::capture()
- *
- * Capture script output.
- *
- * Example:
- * <pre>
- * <?php
- * HttpResponse::setCache(true);
- * HttpResponse::capture();
- * // script follows
- * ?>
- * </pre>
- */
-PHP_METHOD(HttpResponse, capture)
-{
- NO_ARGS;
-
- UPD_STATIC_PROP(long, catch, 1);
-
- php_end_ob_buffers(0 TSRMLS_CC);
- php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC);
-
- /* register shutdown function */
- {
- zval func, retval, arg, *argp[1];
-
- INIT_PZVAL(&arg);
- INIT_PZVAL(&func);
- INIT_PZVAL(&retval);
- ZVAL_STRINGL(&func, "register_shutdown_function", lenof("register_shutdown_function"), 0);
-
- array_init(&arg);
- add_next_index_stringl(&arg, "HttpResponse", lenof("HttpResponse"), 1);
- add_next_index_stringl(&arg, "send", lenof("send"), 1);
- argp[0] = &arg;
- call_user_function(EG(function_table), NULL, &func, &retval, 1, argp TSRMLS_CC);
- zval_dtor(&arg);
- }
-}
-/* }}} */
-
-#endif /* ZEND_ENGINE_2 && !WONKY */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "SAPI.h"
-#include "php_streams.h"
-#include "ext/standard/php_lcg.h"
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_api.h"
-#include "php_http_date_api.h"
-#include "php_http_send_api.h"
-#include "php_http_headers_api.h"
-#include "php_http_date_api.h"
-#include "php_http_cache_api.h"
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#define http_flush() _http_flush(TSRMLS_C)
-/* {{{ static inline void http_flush() */
-static inline void _http_flush(TSRMLS_D)
-{
- php_end_ob_buffer(1, 1 TSRMLS_CC);
- sapi_flush(TSRMLS_C);
-}
-/* }}} */
-
-#define http_sleep() _http_sleep(TSRMLS_C)
-/* {{{ static inline void http_sleep() */
-static inline void _http_sleep(TSRMLS_D)
-{
-#define HTTP_MSEC(s) (s * 1000)
-#define HTTP_USEC(s) (HTTP_MSEC(s) * 1000)
-#define HTTP_NSEC(s) (HTTP_USEC(s) * 1000)
-#define HTTP_NANOSEC (1000 * 1000 * 1000)
-#define HTTP_DIFFSEC (0.001)
-
- if (HTTP_G(send).throttle_delay >= HTTP_DIFFSEC) {
-#if defined(PHP_WIN32)
- Sleep((DWORD) HTTP_MSEC(HTTP_G(send).throttle_delay));
-#elif defined(HAVE_USLEEP)
- usleep(HTTP_USEC(HTTP_G(send).throttle_delay));
-#elif defined(HAVE_NANOSLEEP)
- struct timespec req, rem;
-
- req.tv_sec = (time_t) HTTP_G(send).throttle_delay;
- req.tv_nsec = HTTP_NSEC(HTTP_G(send).throttle_delay) % HTTP_NANOSEC;
-
- while (nanosleep(&req, &rem) && (errno == EINTR) && (HTTP_NSEC(rem.tv_sec) + rem.tv_nsec) > HTTP_NSEC(HTTP_DIFFSEC))) {
- req.tv_sec = rem.tv_sec;
- req.tv_nsec = rem.tv_nsec;
- }
-#endif
- }
-}
-/* }}} */
-
-#define HTTP_CHUNK_AVAIL(len) ((len -= HTTP_G(send).buffer_size) >= 0)
-#define HTTP_CHUNK_WRITE(data, l, dofree, dosleep) \
- { \
- long size = (long) l; \
- \
- if ((1 > size) || (size - PHPWRITE(data, size))) { \
- if (dofree) { \
- efree(data); \
- } \
- return FAILURE; \
- } \
- \
- http_flush(); \
- if (dosleep) { \
- http_sleep(); \
- } \
- }
-
-#define http_send_chunk(d, b, e, m) _http_send_chunk((d), (b), (e), (m) TSRMLS_CC)
-/* {{{ static STATUS http_send_chunk(const void *, size_t, size_t, http_send_mode) */
-static STATUS _http_send_chunk(const void *data, size_t begin, size_t end, http_send_mode mode TSRMLS_DC)
-{
- long len = end - begin;
-
- switch (mode)
- {
- case SEND_RSRC:
- {
- char *buf;
- php_stream *s = (php_stream *) data;
-
- if (php_stream_seek(s, begin, SEEK_SET)) {
- return FAILURE;
- }
-
- buf = emalloc(HTTP_G(send).buffer_size);
-
- while (HTTP_CHUNK_AVAIL(len)) {
- HTTP_CHUNK_WRITE(buf, php_stream_read(s, buf, HTTP_G(send).buffer_size), 1, 1);
- }
-
- /* read & write left over */
- if (len) {
- HTTP_CHUNK_WRITE(buf, php_stream_read(s, buf, HTTP_G(send).buffer_size + len), 1, 0);
- }
-
- efree(buf);
- return SUCCESS;
- }
-
- case SEND_DATA:
- {
- char *s = (char *) data + begin;
-
- while (HTTP_CHUNK_AVAIL(len)) {
- HTTP_CHUNK_WRITE(s, HTTP_G(send).buffer_size, 0, 1);
- s += HTTP_G(send).buffer_size;
- }
-
- /* write left over */
- if (len) {
- HTTP_CHUNK_WRITE(s, HTTP_G(send).buffer_size + len, 0, 0);
- }
-
- return SUCCESS;
- }
-
- default:
- return FAILURE;
- break;
- }
-}
-/* }}} */
-
-/* {{{ STATUS http_send_header(char *, char *, zend_bool) */
-PHP_HTTP_API STATUS _http_send_header_ex(const char *name, size_t name_len, const char *value, size_t value_len, zend_bool replace, char **sent_header TSRMLS_DC)
-{
- STATUS ret;
- size_t header_len = sizeof(": ") + name_len + value_len + 1;
- char *header = emalloc(header_len + 1);
-
- header[header_len] = '\0';
- snprintf(header, header_len, "%s: %s", name, value);
- ret = http_send_header_string_ex(header, replace);
- efree(header);
- return ret;
-}
-/* }}} */
-
-/* {{{ STATUS http_send_status_header(int, char *) */
-PHP_HTTP_API STATUS _http_send_status_header_ex(int status, const char *header, zend_bool replace TSRMLS_DC)
-{
- STATUS ret;
- sapi_header_line h = {(char *) header, header ? strlen(header) : 0, status};
- if (SUCCESS != (ret = sapi_header_op(replace ? SAPI_HEADER_REPLACE : SAPI_HEADER_ADD, &h TSRMLS_CC))) {
- http_error_ex(HE_WARNING, HTTP_E_HEADER, "Could not send header: %s (%d)", header, status);
- }
- return ret;
-}
-/* }}} */
-
-/* {{{ STATUS http_send_last_modified(int) */
-PHP_HTTP_API STATUS _http_send_last_modified_ex(time_t t, char **sent_header TSRMLS_DC)
-{
- STATUS ret;
- char *date = http_date(t);
-
- if (!date) {
- return FAILURE;
- }
-
- ret = http_send_header_ex("Last-Modified", lenof("Last-Modifed"), date, strlen(date), 1, sent_header);
- efree(date);
-
- /* remember */
- HTTP_G(send).last_modified = t;
-
- return ret;
-}
-/* }}} */
-
-/* {{{ STATUS http_send_etag(char *, size_t) */
-PHP_HTTP_API STATUS _http_send_etag_ex(const char *etag, size_t etag_len, char **sent_header TSRMLS_DC)
-{
- STATUS status;
- char *etag_header;
-
- if (!etag_len){
- http_error_ex(HE_WARNING, HTTP_E_HEADER, "Attempt to send empty ETag (previous: %s)\n", HTTP_G(send).unquoted_etag);
- return FAILURE;
- }
-
- /* remember */
- STR_FREE(HTTP_G(send).unquoted_etag);
- HTTP_G(send).unquoted_etag = estrdup(etag);
-
- etag_header = ecalloc(1, sizeof("ETag: \"\"") + etag_len);
- sprintf(etag_header, "ETag: \"%s\"", etag);
- status = http_send_header_string(etag_header);
-
- if (sent_header) {
- *sent_header = etag_header;
- } else {
- efree(etag_header);
- }
-
- return status;
-}
-/* }}} */
-
-/* {{{ STATUS http_send_content_type(char *, size_t) */
-PHP_HTTP_API STATUS _http_send_content_type(const char *content_type, size_t ct_len TSRMLS_DC)
-{
- if (!strchr(content_type, '/')) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Content-Type '%s' doesn't seem to consist of a primary and a secondary part", content_type);
- return FAILURE;
- }
-
- /* remember for multiple ranges */
- STR_FREE(HTTP_G(send).content_type);
- HTTP_G(send).content_type = estrndup(content_type, ct_len);
-
- return http_send_header_ex("Content-Type", lenof("Content-Type"), content_type, ct_len, 1, NULL);
-}
-/* }}} */
-
-/* {{{ STATUS http_send_content_disposition(char *, size_t, zend_bool) */
-PHP_HTTP_API STATUS _http_send_content_disposition(const char *filename, size_t f_len, zend_bool send_inline TSRMLS_DC)
-{
- STATUS status;
- char *cd_header;
-
- if (send_inline) {
- cd_header = ecalloc(1, sizeof("Content-Disposition: inline; filename=\"\"") + f_len);
- sprintf(cd_header, "Content-Disposition: inline; filename=\"%s\"", filename);
- } else {
- cd_header = ecalloc(1, sizeof("Content-Disposition: attachment; filename=\"\"") + f_len);
- sprintf(cd_header, "Content-Disposition: attachment; filename=\"%s\"", filename);
- }
-
- status = http_send_header_string(cd_header);
- efree(cd_header);
- return status;
-}
-/* }}} */
-
-/* {{{ STATUS http_send_ranges(HashTable *, void *, size_t, http_send_mode) */
-PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_t size, http_send_mode mode TSRMLS_DC)
-{
- zval **zbegin, **zend, **zrange;
-
- /* single range */
- if (zend_hash_num_elements(ranges) == 1) {
- char range_header[256] = {0};
-
- if (SUCCESS != zend_hash_index_find(ranges, 0, (void **) &zrange) ||
- SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 0, (void **) &zbegin) ||
- SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 1, (void **) &zend)) {
- http_send_status(500);
- return FAILURE;
- }
-
- /* Send HTTP 206 Partial Content */
- http_send_status(206);
-
- /* send content range header */
- snprintf(range_header, 255, "Content-Range: bytes %ld-%ld/%lu", Z_LVAL_PP(zbegin), Z_LVAL_PP(zend), (ulong) size);
- http_send_header_string(range_header);
-
- /* send requested chunk */
- return http_send_chunk(data, Z_LVAL_PP(zbegin), Z_LVAL_PP(zend) + 1, mode);
- }
-
- /* multi range */
- else {
- size_t preface_len;
- char bound[23] = {0}, preface[1024] = {0},
- multi_header[68] = "Content-Type: multipart/byteranges; boundary=";
-
- /* Send HTTP 206 Partial Content */
- http_send_status(206);
-
- /* send multipart/byteranges header */
- snprintf(bound, 22, "--%lu%0.9f", (ulong) time(NULL), php_combined_lcg(TSRMLS_C));
- strncat(multi_header, bound + 2, 21);
- http_send_header_string(multi_header);
-
- /* send each requested chunk */
- FOREACH_HASH_VAL(ranges, zrange) {
- if (SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 0, (void **) &zbegin) ||
- SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 1, (void **) &zend)) {
- break;
- }
-
- preface_len = snprintf(preface, 1023,
- HTTP_CRLF "%s"
- HTTP_CRLF "Content-Type: %s"
- HTTP_CRLF "Content-Range: bytes %ld-%ld/%lu"
- HTTP_CRLF
- HTTP_CRLF,
-
- bound,
- HTTP_G(send).content_type ? HTTP_G(send).content_type : "application/x-octetstream",
- Z_LVAL_PP(zbegin),
- Z_LVAL_PP(zend),
- (ulong) size
- );
-
- PHPWRITE(preface, preface_len);
- http_send_chunk(data, Z_LVAL_PP(zbegin), Z_LVAL_PP(zend) + 1, mode);
- }
-
- /* write boundary once more */
- PHPWRITE(HTTP_CRLF, lenof(HTTP_CRLF));
- PHPWRITE(bound, strlen(bound));
- PHPWRITE("--", lenof("--"));
-
- return SUCCESS;
- }
-}
-/* }}} */
-
-/* {{{ STATUS http_send(void *, size_t, http_send_mode) */
-PHP_HTTP_API STATUS _http_send_ex(const void *data_ptr, size_t data_size, http_send_mode data_mode, zend_bool no_cache TSRMLS_DC)
-{
- HashTable ranges;
- http_range_status range_status;
- int cache_etag = 0;
-
- if (!data_ptr) {
- return FAILURE;
- }
- if (!data_size) {
- return SUCCESS;
- }
-
- /* stop on-the-fly etag generation */
- if (cache_etag = HTTP_G(etag).started) {
- /* interrupt ob_etaghandler */
- HTTP_G(etag).started = 0;
- }
-
- /* enable partial dl and resume */
- http_send_header_string("Accept-Ranges: bytes");
-
- zend_hash_init(&ranges, 0, NULL, ZVAL_PTR_DTOR, 0);
- range_status = http_get_request_ranges(&ranges, data_size);
-
- if (range_status == RANGE_ERR) {
- zend_hash_destroy(&ranges);
- http_send_status(416);
- return FAILURE;
- }
-
- /* Range Request - only send ranges if entity hasn't changed */
- if ( range_status == RANGE_OK &&
- http_match_etag_ex("HTTP_IF_MATCH", HTTP_G(send).unquoted_etag, 0) &&
- http_match_last_modified_ex("HTTP_IF_UNMODIFIED_SINCE", HTTP_G(send).last_modified, 0) &&
- http_match_last_modified_ex("HTTP_UNLESS_MODIFIED_SINCE", HTTP_G(send).last_modified, 0)) {
- STATUS result = http_send_ranges(&ranges, data_ptr, data_size, data_mode);
- zend_hash_destroy(&ranges);
- return result;
- }
-
- zend_hash_destroy(&ranges);
-
- /* send 304 Not Modified if etag matches - DON'T return on ETag generation failure */
- if (!no_cache && cache_etag) {
- char *etag = NULL;
-
- if (!(etag = http_etag(data_ptr, data_size, data_mode))) {
- http_error(HE_NOTICE, HTTP_E_RUNTIME, "Failed to generate ETag for data source");
- } else {
- char *sent_header = NULL;
-
- http_send_etag_ex(etag, 32, &sent_header);
- if (http_match_etag("HTTP_IF_NONE_MATCH", etag)) {
- return http_exit_ex(304, sent_header, NULL, 0);
- } else {
- STR_FREE(sent_header);
- }
- efree(etag);
- }
- }
-
- /* send 304 Not Modified if last modified matches */
- if (!no_cache && http_match_last_modified("HTTP_IF_MODIFIED_SINCE", HTTP_G(send).last_modified)) {
- char *sent_header = NULL;
- http_send_last_modified_ex(HTTP_G(send).last_modified, &sent_header);
- return http_exit_ex(304, sent_header, NULL, 0);
- }
-
- /* emit a content-length header */
- if (!php_ob_handler_used("ob_gzhandler" TSRMLS_CC)) {
- char *cl;
- spprintf(&cl, 0, "Content-Length: %lu", (unsigned long) data_size);
- http_send_header_string(cl);
- efree(cl);
- }
- /* send full entity */
- return http_send_chunk(data_ptr, 0, data_size, data_mode);
-}
-/* }}} */
-
-/* {{{ STATUS http_send_stream(php_stream *) */
-PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *file, zend_bool close_stream, zend_bool no_cache TSRMLS_DC)
-{
- STATUS status;
- php_stream_statbuf ssb;
-
- if ((!file) || php_stream_stat(file, &ssb)) {
- return FAILURE;
- }
-
- status = http_send_ex(file, ssb.sb.st_size, SEND_RSRC, no_cache);
-
- if (close_stream) {
- php_stream_close(file);
- }
-
- return status;
-}
-/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#include "SAPI.h"
-#include "zend_ini.h"
-#include "php_output.h"
-#include "ext/standard/url.h"
-
-#include "php_http.h"
-#include "php_http_api.h"
-#include "php_http_url_api.h"
-#include "php_http_std_defs.h"
-
-#include "phpstr/phpstr.h"
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#elif defined(HAVE_NETDB_H)
-# include <netdb.h>
-#endif
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-/* {{{ char *http_absolute_url(char *) */
-PHP_HTTP_API char *_http_absolute_url_ex(
- const char *url, size_t url_len,
- const char *proto, size_t proto_len,
- const char *host, size_t host_len,
- unsigned port TSRMLS_DC)
-{
-#if defined(PHP_WIN32) || defined(HAVE_NETDB_H)
- struct servent *se;
-#endif
- php_url *purl = NULL, furl;
- size_t full_len = 0;
- zval *zhost = NULL;
- char *scheme = NULL, *uri, *URL;
-
- if ((!url || !url_len) && (
- (!(url = SG(request_info).request_uri)) ||
- (!(url_len = strlen(SG(request_info).request_uri))))) {
- http_error(HE_WARNING, HTTP_E_RUNTIME, "Cannot build an absolute URI if supplied URL and REQUEST_URI is empty");
- return NULL;
- }
-
- URL = ecalloc(1, HTTP_URI_MAXLEN + 1);
- uri = estrndup(url, url_len);
- if (!(purl = php_url_parse(uri))) {
- http_error_ex(HE_WARNING, HTTP_E_URL, "Could not parse supplied URL: %s", url);
- return NULL;
- }
-
- furl.user = purl->user;
- furl.pass = purl->pass;
- furl.path = purl->path;
- furl.query = purl->query;
- furl.fragment = purl->fragment;
-
- if (proto && proto_len) {
- furl.scheme = scheme = estrdup(proto);
- } else if (purl->scheme) {
- furl.scheme = purl->scheme;
-#if defined(PHP_WIN32) || defined(HAVE_NETDB_H)
- } else if (port && (se = getservbyport(port, "tcp"))) {
- furl.scheme = (scheme = estrdup(se->s_name));
-#endif
- } else {
- furl.scheme = "http";
- }
-
- if (port) {
- furl.port = port;
- } else if (purl->port) {
- furl.port = purl->port;
- } else if (strncmp(furl.scheme, "http", 4)) {
-#if defined(PHP_WIN32) || defined(HAVE_NETDB_H)
- if (se = getservbyname(furl.scheme, "tcp")) {
- furl.port = se->s_port;
- }
-#endif
- } else {
- furl.port = (furl.scheme[4] == 's') ? 443 : 80;
- }
-
- if (host) {
- furl.host = (char *) host;
- } else if (purl->host) {
- furl.host = purl->host;
- } else if ( (zhost = http_get_server_var("HTTP_HOST")) ||
- (zhost = http_get_server_var("SERVER_NAME"))) {
- furl.host = Z_STRVAL_P(zhost);
- } else {
- furl.host = "localhost";
- }
-
-#define HTTP_URI_STRLCATS(URL, full_len, add_string) HTTP_URI_STRLCAT(URL, full_len, add_string, sizeof(add_string)-1)
-#define HTTP_URI_STRLCATL(URL, full_len, add_string) HTTP_URI_STRLCAT(URL, full_len, add_string, strlen(add_string))
-#define HTTP_URI_STRLCAT(URL, full_len, add_string, add_len) \
- if ((full_len += add_len) > HTTP_URI_MAXLEN) { \
- http_error_ex(HE_NOTICE, HTTP_E_URL, \
- "Absolute URI would have exceeded max URI length (%d bytes) - " \
- "tried to add %d bytes ('%s')", \
- HTTP_URI_MAXLEN, add_len, add_string); \
- if (scheme) { \
- efree(scheme); \
- } \
- php_url_free(purl); \
- efree(uri); \
- return URL; \
- } else { \
- strcat(URL, add_string); \
- }
-
- HTTP_URI_STRLCATL(URL, full_len, furl.scheme);
- HTTP_URI_STRLCATS(URL, full_len, "://");
-
- if (furl.user) {
- HTTP_URI_STRLCATL(URL, full_len, furl.user);
- if (furl.pass) {
- HTTP_URI_STRLCATS(URL, full_len, ":");
- HTTP_URI_STRLCATL(URL, full_len, furl.pass);
- }
- HTTP_URI_STRLCATS(URL, full_len, "@");
- }
-
- HTTP_URI_STRLCATL(URL, full_len, furl.host);
-
- if ( (!strcmp(furl.scheme, "http") && (furl.port != 80)) ||
- (!strcmp(furl.scheme, "https") && (furl.port != 443))) {
- char port_string[8] = {0};
- snprintf(port_string, 7, ":%u", furl.port);
- HTTP_URI_STRLCATL(URL, full_len, port_string);
- }
-
- if (furl.path) {
- if (furl.path[0] != '/') {
- HTTP_URI_STRLCATS(URL, full_len, "/");
- }
- HTTP_URI_STRLCATL(URL, full_len, furl.path);
- } else {
- HTTP_URI_STRLCATS(URL, full_len, "/");
- }
-
- if (furl.query) {
- HTTP_URI_STRLCATS(URL, full_len, "?");
- HTTP_URI_STRLCATL(URL, full_len, furl.query);
- }
-
- if (furl.fragment) {
- HTTP_URI_STRLCATS(URL, full_len, "#");
- HTTP_URI_STRLCATL(URL, full_len, furl.fragment);
- }
-
- if (scheme) {
- efree(scheme);
- }
- php_url_free(purl);
- efree(uri);
-
- return URL;
-}
-/* }}} */
-
-/* {{{ STATUS http_urlencode_hash_ex(HashTable *, zend_bool, char *, size_t, char **, size_t *) */
-PHP_HTTP_API STATUS _http_urlencode_hash_ex(HashTable *hash, zend_bool override_argsep,
- char *pre_encoded_data, size_t pre_encoded_len,
- char **encoded_data, size_t *encoded_len TSRMLS_DC)
-{
- char *arg_sep;
- phpstr *qstr = phpstr_new();
-
- if (override_argsep || !strlen(arg_sep = INI_STR("arg_separator.output"))) {
- arg_sep = HTTP_URL_ARGSEP;
- }
-
- if (pre_encoded_len && pre_encoded_data) {
- phpstr_append(qstr, pre_encoded_data, pre_encoded_len);
- }
-
- if (SUCCESS != http_urlencode_hash_implementation(hash, qstr, arg_sep)) {
- phpstr_free(&qstr);
- return FAILURE;
- }
-
- phpstr_data(qstr, encoded_data, encoded_len);
- phpstr_free(&qstr);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ http_urlencode_hash_implementation
- Original Author: Sara Golemon <pollita@php.net> */
-PHP_HTTP_API STATUS _http_urlencode_hash_implementation_ex(
- HashTable *ht, phpstr *formstr, char *arg_sep,
- const char *num_prefix, int num_prefix_len,
- const char *key_prefix, int key_prefix_len,
- const char *key_suffix, int key_suffix_len,
- zval *type TSRMLS_DC)
-{
- char *key = NULL, *ekey, *newprefix, *p;
- int arg_sep_len, ekey_len, key_type, newprefix_len;
- uint key_len;
- ulong idx;
- zval **zdata = NULL, *copyzval;
-
- if (!ht || !formstr) {
- http_error(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid parameters");
- return FAILURE;
- }
-
- if (ht->nApplyCount > 0) {
- /* Prevent recursion */
- return SUCCESS;
- }
-
- if (!arg_sep || !strlen(arg_sep)) {
- arg_sep = HTTP_URL_ARGSEP;
- }
- arg_sep_len = strlen(arg_sep);
-
- for (zend_hash_internal_pointer_reset(ht);
- (key_type = zend_hash_get_current_key_ex(ht, &key, &key_len, &idx, 0, NULL)) != HASH_KEY_NON_EXISTANT;
- zend_hash_move_forward(ht)
- ) {
- if (key_type == HASH_KEY_IS_STRING && key_len && key[key_len-1] == '\0') {
- /* We don't want that trailing NULL */
- key_len -= 1;
- }
-
-#ifdef ZEND_ENGINE_2
- /* handling for private & protected object properties */
- if (key && *key == '\0' && type != NULL) {
- char *tmp;
-
- zend_object *zobj = zend_objects_get_address(type TSRMLS_CC);
- if (zend_check_property_access(zobj, key TSRMLS_CC) != SUCCESS) {
- /* private or protected property access outside of the class */
- continue;
- }
- zend_unmangle_property_name(key, &tmp, &key);
- key_len = strlen(key);
- }
-#endif
-
- if (zend_hash_get_current_data_ex(ht, (void **)&zdata, NULL) == FAILURE || !zdata || !(*zdata)) {
- http_error(HE_WARNING, HTTP_E_ENCODING, "Error traversing form data array.");
- return FAILURE;
- }
- if (Z_TYPE_PP(zdata) == IS_ARRAY || Z_TYPE_PP(zdata) == IS_OBJECT) {
- if (key_type == HASH_KEY_IS_STRING) {
- ekey = php_url_encode(key, key_len, &ekey_len);
- newprefix_len = key_suffix_len + ekey_len + key_prefix_len + 1;
- newprefix = emalloc(newprefix_len + 1);
- p = newprefix;
-
- if (key_prefix) {
- memcpy(p, key_prefix, key_prefix_len);
- p += key_prefix_len;
- }
-
- memcpy(p, ekey, ekey_len);
- p += ekey_len;
- efree(ekey);
-
- if (key_suffix) {
- memcpy(p, key_suffix, key_suffix_len);
- p += key_suffix_len;
- }
-
- *(p++) = '[';
- *p = '\0';
- } else {
- /* Is an integer key */
- ekey_len = spprintf(&ekey, 12, "%ld", idx);
- newprefix_len = key_prefix_len + num_prefix_len + ekey_len + key_suffix_len + 1;
- newprefix = emalloc(newprefix_len + 1);
- p = newprefix;
-
- if (key_prefix) {
- memcpy(p, key_prefix, key_prefix_len);
- p += key_prefix_len;
- }
-
- memcpy(p, num_prefix, num_prefix_len);
- p += num_prefix_len;
-
- memcpy(p, ekey, ekey_len);
- p += ekey_len;
- efree(ekey);
-
- if (key_suffix) {
- memcpy(p, key_suffix, key_suffix_len);
- p += key_suffix_len;
- }
- *(p++) = '[';
- *p = '\0';
- }
- ht->nApplyCount++;
- http_urlencode_hash_implementation_ex(HASH_OF(*zdata), formstr, arg_sep,
- NULL, 0, newprefix, newprefix_len, "]", 1, (Z_TYPE_PP(zdata) == IS_OBJECT ? *zdata : NULL));
- ht->nApplyCount--;
- efree(newprefix);
- } else if (Z_TYPE_PP(zdata) == IS_NULL || Z_TYPE_PP(zdata) == IS_RESOURCE) {
- /* Skip these types */
- continue;
- } else {
- if (formstr->used) {
- phpstr_append(formstr, arg_sep, arg_sep_len);
- }
- /* Simple key=value */
- phpstr_append(formstr, key_prefix, key_prefix_len);
- if (key_type == HASH_KEY_IS_STRING) {
- ekey = php_url_encode(key, key_len, &ekey_len);
- phpstr_append(formstr, ekey, ekey_len);
- efree(ekey);
- } else {
- /* Numeric key */
- if (num_prefix) {
- phpstr_append(formstr, num_prefix, num_prefix_len);
- }
- ekey_len = spprintf(&ekey, 12, "%ld", idx);
- phpstr_append(formstr, ekey, ekey_len);
- efree(ekey);
- }
- phpstr_append(formstr, key_suffix, key_suffix_len);
- phpstr_appends(formstr, "=");
- switch (Z_TYPE_PP(zdata)) {
- case IS_STRING:
- ekey = php_url_encode(Z_STRVAL_PP(zdata), Z_STRLEN_PP(zdata), &ekey_len);
- break;
- case IS_LONG:
- case IS_BOOL:
- ekey_len = spprintf(&ekey, 12, "%ld", Z_LVAL_PP(zdata));
- break;
- case IS_DOUBLE:
- ekey_len = spprintf(&ekey, 48, "%.*G", (int) EG(precision), Z_DVAL_PP(zdata));
- break;
- default:
- /* fall back on convert to string */
- MAKE_STD_ZVAL(copyzval);
- *copyzval = **zdata;
- zval_copy_ctor(copyzval);
- convert_to_string_ex(©zval);
- ekey = php_url_encode(Z_STRVAL_P(copyzval), Z_STRLEN_P(copyzval), &ekey_len);
- zval_ptr_dtor(©zval);
- }
- phpstr_append(formstr, ekey, ekey_len);
- efree(ekey);
- }
- }
-
- return SUCCESS;
-}
-/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include "php.h"
-
-#ifdef ZEND_ENGINE_2
-
-#include "php_http.h"
-#include "php_http_std_defs.h"
-#include "php_http_util_object.h"
-
-#define HTTP_BEGIN_ARGS(method, req_args) HTTP_BEGIN_ARGS_EX(HttpUtil, method, 0, req_args)
-#define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpUtil, method, ret_ref)
-
-#define HTTP_UTIL_ALIAS(method, func) HTTP_STATIC_ME_ALIAS(method, func, HTTP_ARGS(HttpUtil, method))
-
-HTTP_BEGIN_ARGS(date, 0)
- HTTP_ARG_VAL(timestamp, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(absoluteUri, 1)
- HTTP_ARG_VAL(url, 0)
- HTTP_ARG_VAL(proto, 0)
- HTTP_ARG_VAL(host, 0)
- HTTP_ARG_VAL(port, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(negotiateLanguage, 1)
- HTTP_ARG_VAL(supported, 0)
- HTTP_ARG_VAL(default, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(negotiateCharset, 1)
- HTTP_ARG_VAL(supported, 0)
- HTTP_ARG_VAL(default, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(matchModified, 1)
- HTTP_ARG_VAL(last_modified, 0)
- HTTP_ARG_VAL(for_range, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(matchEtag, 1)
- HTTP_ARG_VAL(plain_etag, 0)
- HTTP_ARG_VAL(for_range, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(matchRequestHeader, 2)
- HTTP_ARG_VAL(header_name, 0)
- HTTP_ARG_VAL(header_value, 0)
- HTTP_ARG_VAL(case_sensitive, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(chunkedDecode, 1)
- HTTP_ARG_VAL(encoded_string, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(parseMessage, 1)
- HTTP_ARG_VAL(message_string, 0)
-HTTP_END_ARGS;
-
-HTTP_BEGIN_ARGS(parseHeaders, 1)
- HTTP_ARG_VAL(headers_string, 0)
-HTTP_END_ARGS;
-
-zend_class_entry *http_util_object_ce;
-zend_function_entry http_util_object_fe[] = {
- HTTP_UTIL_ALIAS(date, http_date)
- HTTP_UTIL_ALIAS(absoluteUri, http_absolute_uri)
- HTTP_UTIL_ALIAS(negotiateLanguage, http_negotiate_language)
- HTTP_UTIL_ALIAS(negotiateCharset, http_negotiate_charset)
- HTTP_UTIL_ALIAS(matchModified, http_match_modified)
- HTTP_UTIL_ALIAS(matchEtag, http_match_etag)
- HTTP_UTIL_ALIAS(matchRequestHeader, http_match_request_header)
- HTTP_UTIL_ALIAS(chunkedDecode, http_chunked_decode)
- HTTP_UTIL_ALIAS(parseMessage, http_parse_message)
- HTTP_UTIL_ALIAS(parseHeaders, http_parse_headers)
-
- EMPTY_FUNCTION_ENTRY
-};
-
-void _http_util_object_init(INIT_FUNC_ARGS)
-{
- HTTP_REGISTER_CLASS(HttpUtil, http_util_object, NULL, 0);
-}
-
-#endif /* ZEND_ENGINE_2 */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#include "php.h"
-#include "missing.h"
-
-#ifdef WONKY
-int zend_declare_property_double(zend_class_entry *ce, char *name, int name_length, double value, int access_type TSRMLS_DC)
-{
- zval *property = pemalloc(sizeof(zval), ce->type & ZEND_INTERNAL_CLASS);
- INIT_PZVAL(property);
- ZVAL_DOUBLE(property, value);
- return zend_declare_property(ce, name, name_length, property, access_type TSRMLS_CC);
-}
-
-void zend_update_property_double(zend_class_entry *scope, zval *object, char *name, int name_length, double value TSRMLS_DC)
-{
- zval *tmp = ecalloc(1, sizeof(zval));
- ZVAL_DOUBLE(tmp, value);
- zend_update_property(scope, object, name, name_length, tmp TSRMLS_CC);
-}
-
-int zend_declare_property_bool(zend_class_entry *ce, char *name, int name_length, long value, int access_type TSRMLS_DC)
-{
- zval *property = pemalloc(sizeof(zval), ce->type & ZEND_INTERNAL_CLASS);
- INIT_PZVAL(property);
- ZVAL_BOOL(property, value);
- return zend_declare_property(ce, name, name_length, property, access_type TSRMLS_CC);
-}
-
-void zend_update_property_bool(zend_class_entry *scope, zval *object, char *name, int name_length, long value TSRMLS_DC)
-{
- zval *tmp = ecalloc(1, sizeof(zval));
- ZVAL_BOOL(tmp, value);
- zend_update_property(scope, object, name, name_length, tmp TSRMLS_CC);
-}
-
-void zend_update_property_stringl(zend_class_entry *scope, zval *object, char *name, int name_length, char *value, int value_len TSRMLS_DC)
-{
- zval *tmp;
-
- ALLOC_ZVAL(tmp);
- tmp->is_ref = 0;
- tmp->refcount = 0;
- ZVAL_STRINGL(tmp, value, value_len, 1);
- zend_update_property(scope, object, name, name_length, tmp TSRMLS_CC);
-}
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_MISSING
-#define PHP_HTTP_MISSING
-
-#include "php_version.h"
-
-#if (PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION == 0)
-# define WONKY
-#endif
-
-#ifdef WONKY
-extern int zend_declare_property_double(zend_class_entry *ce, char *name, int name_length, double value, int access_type TSRMLS_DC);
-extern void zend_update_property_double(zend_class_entry *scope, zval *object, char *name, int name_length, double value TSRMLS_DC);
-
-extern int zend_declare_property_bool(zend_class_entry *ce, char *name, int name_length, long value, int access_type TSRMLS_DC);
-extern void zend_update_property_bool(zend_class_entry *scope, zval *object, char *name, int name_length, long value TSRMLS_DC);
-
-extern void zend_update_property_stringl(zend_class_entry *scope, zval *object, char *name, int name_length, char *value, int value_len TSRMLS_DC);
-#endif
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<package version="2.0" xmlns="http://pear.php.net/dtd/package-2.0"
- xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://pear.php.net/dtd/tasks-1.0
- http://pear.php.net/dtd/tasks-1.0.xsd
- http://pear.php.net/dtd/package-2.0
- http://pear.php.net/dtd/package-2.0.xsd">
- <name>pecl_http</name>
- <channel>pecl.php.net</channel>
- <summary>Extended HTTP Support</summary>
- <description><![CDATA[
-* Building absolute URIs
-* RFC compliant HTTP redirects
-* RFC compliant HTTP date handling
-* Parsing of HTTP headers and messages
-* Caching by "Last-Modified" and/or ETag
- (with 'on the fly' option for ETag generation from buffered output)
-* Sending data/files/streams with (multiple) ranges support
-* Negotiating user preferred language/charset
-* Convenient request functionality built upon libcurl
-* PHP5 classes: HttpUtil, HttpResponse (PHP-5.1), HttpRequest, HttpRequestPool, HttpMessage
-]]></description>
- <lead>
- <name>Michael Wallner</name>
- <user>mike</user>
- <email>mike@php.net</email>
- <active>yes</active>
- </lead>
- <date>2005-00-00</date>
- <version>
- <release>0.14.0</release>
- <api>0.14.0</api>
- </version>
- <stability>
- <release>beta</release>
- <api>beta</api>
- </stability>
- <license uri="http://www.php.net/license">PHP License</license>
- <notes><![CDATA[
-+ Added missing support for raw post data in HttpRequest
-+ Added missing HttpMessage::setBody()
-+ Added HttpRequest::METH_* constants
-+ Added HttpRequest::AUTH_* constants
-+ Added HttpMessage::TYPE_* constants
-+ Added HttpResponse::ETAG_* constants
-+ Added HTTP_ETAG_MHASH_* constants
-+ Added supported ETag hash algrithms to php_info() output
-+ Added ETag hashing through PHPs CRC32() implementation
-+ Added new language/charset negotiator
-
-* Changed HttpMessage::toString([include_parent = true]) to false
-* Renamed HTTP_GET etc. constants to HTTP_METH_GET
-* Fixed protected property access
-
-]]></notes>
- <contents>
- <dir name="/">
- <file role="doc" name="CREDITS"/>
- <file role="doc" name="EXPERIMENTAL"/>
- <file role="doc" name="KnownIssues.txt"/>
- <file role="doc" name="docs/functions.html"/>
- <file role="doc" name="docs/examples/Bandwidth_Throttling.php"/>
- <file role="doc" name="docs/examples/Cached_Responses.php"/>
- <file role="doc" name="docs/examples/GET_Queries.php"/>
- <file role="doc" name="docs/examples/KISS_XMLRPC_Client.php"/>
- <file role="doc" name="docs/examples/Multipart_Posts.php"/>
- <file role="doc" name="docs/examples/Parallel_Requests.php"/>
- <file role="doc" name="docs/examples/Parallel_Requests_.php"/>
- <file role="doc" name="docs/examples/Simple_Feed_Aggregator.php"/>
- <file role="doc" name="docs/examples/extract.php"/>
- <file role="doc" name="docs/examples/tutorial.txt"/>
-
- <file role="src" name="http.dsp"/>
- <file role="src" name="config.w32"/>
- <file role="src" name="config.m4"/>
- <file role="src" name="Makefile.frag"/>
-
- <dir name="phpstr">
- <file role="src" name="phpstr.h"/>
- <file role="src" name="phpstr.c"/>
- </dir>
-
- <file role="src" name="missing.h"/>
- <file role="src" name="missing.c"/>
-
- <file role="src" name="php_http.h"/>
- <file role="src" name="php_http_std_defs.h"/>
- <file role="src" name="php_http_api.h"/>
- <file role="src" name="php_http_cache_api.h"/>
- <file role="src" name="php_http_date_api.h"/>
- <file role="src" name="php_http_headers_api.h"/>
- <file role="src" name="php_http_info_api.h"/>
- <file role="src" name="php_http_message_api.h"/>
- <file role="src" name="php_http_request_api.h"/>
- <file role="src" name="php_http_request_method_api.h"/>
- <file role="src" name="php_http_request_pool_api.h"/>
- <file role="src" name="php_http_send_api.h"/>
- <file role="src" name="php_http_url_api.h"/>
- <file role="src" name="php_http_util_object.h"/>
- <file role="src" name="php_http_message_object.h"/>
- <file role="src" name="php_http_request_object.h"/>
- <file role="src" name="php_http_requestpool_object.h"/>
- <file role="src" name="php_http_response_object.h"/>
- <file role="src" name="php_http_exception_object.h"/>
-
- <file role="src" name="http.c"/>
- <file role="src" name="http_functions.c"/>
- <file role="src" name="http_api.c"/>
- <file role="src" name="http_cache_api.c"/>
- <file role="src" name="http_date_api.c"/>
- <file role="src" name="http_headers_api.c"/>
- <file role="src" name="http_info_api.c"/>
- <file role="src" name="http_message_api.c"/>
- <file role="src" name="http_request_api.c"/>
- <file role="src" name="http_request_method_api.c"/>
- <file role="src" name="http_request_pool_api.c"/>
- <file role="src" name="http_send_api.c"/>
- <file role="src" name="http_url_api.c"/>
- <file role="src" name="http_util_object.c"/>
- <file role="src" name="http_message_object.c"/>
- <file role="src" name="http_request_object.c"/>
- <file role="src" name="http_requestpool_object.c"/>
- <file role="src" name="http_response_object.c"/>
- <file role="src" name="http_exception_object.c"/>
-
- <dir name="tests">
- <file role="test" name="data.txt"/>
- <file role="test" name="skip.inc"/>
- <file role="test" name="log.inc"/>
- <file role="test" name="abs_uri_001.phpt"/>
- <file role="test" name="abs_uri_002.phpt"/>
- <file role="test" name="allowed_methods_001.phpt"/>
- <file role="test" name="allowed_methods_001_logging.phpt"/>
- <file role="test" name="chunked_decode_001.phpt"/>
- <file role="test" name="chunked_decode_002.phpt"/>
- <file role="test" name="date_001.phpt"/>
- <file role="test" name="date_002.phpt"/>
- <file role="test" name="get_request_data_001.phpt"/>
- <file role="test" name="HttpMessage_001.phpt"/>
- <file role="test" name="HttpRequestPool_001.phpt"/>
- <file role="test" name="HttpRequest_001.phpt"/>
- <file role="test" name="HttpRequest_002.phpt"/>
- <file role="test" name="HttpRequest_003.phpt"/>
- <file role="test" name="HttpResponse_001.phpt"/>
- <file role="test" name="HttpResponse_002.phpt"/>
- <file role="test" name="INI_001.phpt"/>
- <file role="test" name="parse_headers_001.phpt"/>
- <file role="test" name="parse_message_001.phpt"/>
- <file role="test" name="redirect_001.phpt"/>
- <file role="test" name="redirect_001_logging.phpt"/>
- <file role="test" name="redirect_002.phpt"/>
- <file role="test" name="redirect_002_logging.phpt"/>
- <file role="test" name="redirect_003.phpt"/>
- <file role="test" name="redirect_003_logging.phpt"/>
- <file role="test" name="send_data_001.phpt"/>
- <file role="test" name="send_data_002.phpt"/>
- <file role="test" name="send_data_003.phpt"/>
- <file role="test" name="send_data_004.phpt"/>
- <file role="test" name="send_data_005.phpt"/>
- <file role="test" name="send_data_006.phpt"/>
- <file role="test" name="send_data_007_logging.phpt"/>
- <file role="test" name="send_data_008.phpt"/>
- <file role="test" name="send_data_009.phpt"/>
- <file role="test" name="send_file_001.phpt"/>
- <file role="test" name="send_file_002.phpt"/>
- <file role="test" name="send_file_003.phpt"/>
- <file role="test" name="send_file_004.phpt"/>
- <file role="test" name="send_file_005.phpt"/>
- <file role="test" name="send_file_006.phpt"/>
- <file role="test" name="send_file_007.phpt"/>
- </dir>
- </dir>
- </contents>
- <dependencies>
- <required>
- <php>
- <min>4.3</min>
- <max>6.0.0</max>
- <exclude>6.0.0</exclude>
- </php>
- <pearinstaller>
- <min>1.4.1</min>
- </pearinstaller>
- </required>
- <optional>
- <extension>
- <name>session</name>
- </extension>
- </optional>
- </dependencies>
- <providesextension>http</providesextension>
- <extsrcrelease>
- <configureoption
- name="with-http-curl-requests"
- prompt="whether to enable cURL HTTP requests; specify libcurl directory"
- default="yes"
- />
- <configureoption
- name="with-http-mhash-etags"
- prompt="whether to enable mhash ETag generator; specify libmhash directory"
- default="yes"
- />
- <configureoption
- name="with-http-magic-mime"
- prompt="whether to enable response content type guessing; specify libmagic directory"
- default="no"
- />
- <filelist>
- <install as="functions.html" name="docs/functions.html"/>
- <install as="examples/Bandwidth_Throttling.php" name="docs/examples/Bandwidth_Throttling.php"/>
- <install as="examples/Cached_Responses.php" name="docs/examples/Cached_Responses.php"/>
- <install as="examples/GET_Queries.php" name="docs/examples/GET_Queries.php"/>
- <install as="examples/KISS_XMLRPC_Client.php" name="docs/examples/KISS_XMLRPC_Client.php"/>
- <install as="examples/Multipart_Posts.php" name="docs/examples/Multipart_Posts.php"/>
- <install as="examples/Parallel_Requests.php" name="docs/examples/Parallel_Requests.php"/>
- <install as="examples/Parallel_Requests_.php" name="docs/examples/Parallel_Requests_.php"/>
- <install as="examples/Simple_Feed_Aggregator.php" name="docs/examples/Simple_Feed_Aggregator.php"/>
- <install as="examples/extract.php" name="docs/examples/extract.php"/>
- <install as="examples/tutorial.txt" name="docs/examples/tutorial.txt"/>
- </filelist>
- </extsrcrelease>
- <changelog />
-</package>
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_EXT_HTTP_H
-#define PHP_EXT_HTTP_H
-
-#define HTTP_PEXT_VERSION "0.14.0"
-
-/* make compile on Win32 */
-#ifdef HTTP_HAVE_CURL
-# ifdef PHP_WIN32
-# include <winsock2.h>
-# endif
-# include <curl/curl.h>
-#endif
-
-#include "phpstr/phpstr.h"
-
-extern zend_module_entry http_module_entry;
-#define phpext_http_ptr &http_module_entry
-
-extern int http_module_number;
-
-ZEND_BEGIN_MODULE_GLOBALS(http)
-
-#ifdef ZEND_ENGINE_2
- zend_bool only_exceptions;
-#endif
- struct _http_globals_etag {
- long mode;
- void *ctx;
- zend_bool started;
- } etag;
-
- struct _http_globals_log {
- char *cache;
- char *redirect;
- char *allowed_methods;
- char *composite;
- } log;
-
- struct _http_globals_send {
- double throttle_delay;
- size_t buffer_size;
- char *content_type;
- char *unquoted_etag;
- time_t last_modified;
- } send;
-
- struct _http_globals_request {
- struct _http_globals_request_methods {
- char *allowed;
- HashTable custom;
- } methods;
-
-#ifdef HTTP_HAVE_CURL
- struct _http_globals_request_copies {
- zend_llist strings;
- zend_llist slists;
- zend_llist contexts;
- zend_llist convs;
- } copies;
-# ifndef HAVE_CURL_EASY_STRERROR
- char error[CURL_ERROR_SIZE + 1];
-# endif
-#endif /* HTTP_HAVE_CURL */
- } request;
-
-ZEND_END_MODULE_GLOBALS(http)
-
-#ifdef ZTS
-# include "TSRM.h"
-# define HTTP_G(v) TSRMG(http_globals_id, zend_http_globals *, v)
-# define HTTP_GLOBALS ((zend_http_globals *) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(http_globals_id)])
-#else
-# define HTTP_G(v) (http_globals.v)
-# define HTTP_GLOBALS (&http_globals)
-#endif
-#define getGlobals(G) zend_http_globals *G = HTTP_GLOBALS;
-
-PHP_FUNCTION(http_test);
-PHP_FUNCTION(http_date);
-PHP_FUNCTION(http_absolute_uri);
-PHP_FUNCTION(http_negotiate_language);
-PHP_FUNCTION(http_negotiate_charset);
-PHP_FUNCTION(http_redirect);
-PHP_FUNCTION(http_throttle);
-PHP_FUNCTION(http_send_status);
-PHP_FUNCTION(http_send_last_modified);
-PHP_FUNCTION(http_send_content_type);
-PHP_FUNCTION(http_send_content_disposition);
-PHP_FUNCTION(http_match_modified);
-PHP_FUNCTION(http_match_etag);
-PHP_FUNCTION(http_cache_last_modified);
-PHP_FUNCTION(http_cache_etag);
-PHP_FUNCTION(http_send_data);
-PHP_FUNCTION(http_send_file);
-PHP_FUNCTION(http_send_stream);
-PHP_FUNCTION(http_chunked_decode);
-PHP_FUNCTION(http_parse_message);
-PHP_FUNCTION(http_parse_headers);
-PHP_FUNCTION(http_get_request_headers);
-PHP_FUNCTION(http_get_request_body);
-PHP_FUNCTION(http_match_request_header);
-#ifdef HTTP_HAVE_CURL
-PHP_FUNCTION(http_get);
-PHP_FUNCTION(http_head);
-PHP_FUNCTION(http_post_data);
-PHP_FUNCTION(http_post_fields);
-PHP_FUNCTION(http_put_file);
-PHP_FUNCTION(http_put_stream);
-#endif /* HTTP_HAVE_CURL */
-PHP_FUNCTION(http_request_method_register);
-PHP_FUNCTION(http_request_method_unregister);
-PHP_FUNCTION(http_request_method_exists);
-PHP_FUNCTION(http_request_method_name);
-#ifndef ZEND_ENGINE_2
-PHP_FUNCTION(http_build_query);
-#endif /* ZEND_ENGINE_2 */
-PHP_FUNCTION(ob_etaghandler);
-
-PHP_MINIT_FUNCTION(http);
-PHP_MSHUTDOWN_FUNCTION(http);
-PHP_RINIT_FUNCTION(http);
-PHP_RSHUTDOWN_FUNCTION(http);
-PHP_MINFO_FUNCTION(http);
-
-#endif /* PHP_HTTP_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_API_H
-#define PHP_HTTP_API_H
-
-#include "php_http_std_defs.h"
-#include "php_http_send_api.h"
-
-#define pretty_key(key, key_len, uctitle, xhyphen) _http_pretty_key(key, key_len, uctitle, xhyphen)
-extern char *_http_pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool xhyphen);
-
-typedef void (*http_key_list_decode_t)(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC);
-#define http_key_list_default_decoder _http_key_list_default_decoder
-extern void _http_key_list_default_decoder(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC);
-
-#define http_parse_cookie(l, i) _http_parse_key_list((l), (i), ';', http_key_list_default_decoder, 1 TSRMLS_CC)
-#define http_parse_key_list(l, i, s, d, f) _http_parse_key_list((l), (i), (s), (d), (f) TSRMLS_CC)
-extern STATUS _http_parse_key_list(const char *list, HashTable *items, char separator, http_key_list_decode_t decode, zend_bool first_entry_is_name_value_pair TSRMLS_DC);
-
-#define http_error(type, code, string) _http_error_ex(type, code, "%s", string)
-#define http_error_ex _http_error_ex
-extern void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...);
-
-#define http_log(f, i, m) _http_log_ex((f), (i), (m) TSRMLS_CC)
-extern void http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC);
-
-#define http_exit(s, h) http_exit_ex((s), (h), NULL, 1)
-#define http_exit_ex(s, h, b, e) _http_exit_ex((s), (h), (b), (e) TSRMLS_CC)
-extern STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header TSRMLS_DC);
-
-#define http_check_method(m) http_check_method_ex((m), HTTP_KNOWN_METHODS)
-#define http_check_method_ex(m, a) _http_check_method_ex((m), (a))
-extern STATUS _http_check_method_ex(const char *method, const char *methods);
-
-#define HTTP_GSC(var, name, ret) HTTP_GSP(var, name, return ret)
-#define HTTP_GSP(var, name, ret) \
- if (!(var = _http_get_server_var_ex(name, strlen(name)+1, 1 TSRMLS_CC))) { \
- ret; \
- }
-#define http_got_server_var(v) (NULL != _http_get_server_var_ex((v), sizeof(v), 1 TSRMLS_CC))
-#define http_get_server_var(v) http_get_server_var_ex((v), sizeof(v))
-#define http_get_server_var_ex(v, s) _http_get_server_var_ex((v), (s), 0 TSRMLS_CC)
-PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_size, zend_bool check TSRMLS_DC);
-
-#define http_get_request_body(b, l) _http_get_request_body_ex((b), (l), 1 TSRMLS_CC)
-#define http_get_Request_body_ex(b, l, d) _http_get_request_body_ex((b), (l), (d) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_bool dup TSRMLS_DC);
-
-#define http_chunked_decode(e, el, d, dl) _http_chunked_decode((e), (el), (d), (dl) TSRMLS_CC)
-PHP_HTTP_API const char *_http_chunked_decode(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC);
-
-#define http_guess_content_type(mf, mm, d, l, m) _http_guess_content_type((mf), (mm), (d), (l), (m) TSRMLS_CC)
-PHP_HTTP_API char *_http_guess_content_type(const char *magic_file, long magic_mode, void *data_ptr, size_t data_len, http_send_mode mode TSRMLS_DC);
-
-
-#define http_locate_body _http_locate_body
-static inline const char *_http_locate_body(const char *message)
-{
- const char *cr = strstr(message, "\r\n\r\n");
- const char *lf = strstr(message, "\n\n");
-
- if (lf && cr) {
- return MIN(lf + 2, cr + 4);
- } else if (lf || cr) {
- return MAX(lf + 2, cr + 4);
- } else {
- return NULL;
- }
-}
-
-#define http_locate_eol _http_locate_eol
-static inline const char *_http_locate_eol(const char *line, int *eol_len)
-{
- const char *eol = strpbrk(line, "\r\n");
-
- if (eol_len) {
- *eol_len = eol ? ((eol[0] == '\r' && eol[1] == '\n') ? 2 : 1) : 0;
- }
- return eol;
-}
-
-#define convert_to_type(t, z) _convert_to_type((t), (z))
-static inline zval *_convert_to_type(int type, zval *z)
-{
- if (Z_TYPE_P(z) != type) {
- switch (type)
- {
- case IS_NULL: convert_to_null(z); break;
- case IS_BOOL: convert_to_boolean(z); break;
- case IS_LONG: convert_to_long(z); break;
- case IS_DOUBLE: convert_to_array(z); break;
- case IS_STRING: convert_to_string(z); break;
- case IS_ARRAY: convert_to_array(z); break;
- case IS_OBJECT: convert_to_object(z); break;
- }
- }
- return z;
-}
-#define convert_to_type_ex(t, z) _convert_to_type_ex((t), (z))
-static inline zval *_convert_to_type_ex(int type, zval *z)
-{
- if (Z_TYPE_P(z) != type) {
- switch (type)
- {
- case IS_NULL: convert_to_null_ex(&z); break;
- case IS_BOOL: convert_to_boolean_ex(&z); break;
- case IS_LONG: convert_to_long_ex(&z); break;
- case IS_DOUBLE: convert_to_array_ex(&z); break;
- case IS_STRING: convert_to_string_ex(&z); break;
- case IS_ARRAY: convert_to_array_ex(&z); break;
- case IS_OBJECT: convert_to_object_ex(&z); break;
- }
- }
- return z;
-}
-
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_CACHE_API_H
-#define PHP_HTTP_CACHE_API_H
-
-#include "zend_ini.h"
-
-#include "ext/standard/md5.h"
-#include "ext/standard/sha1.h"
-#include "ext/standard/crc32.h"
-
-#include "php_http_std_defs.h"
-#include "php_http.h"
-#include "php_http_api.h"
-#include "php_http_send_api.h"
-
-#ifdef HTTP_HAVE_MHASH
-# include <mhash.h>
-#endif
-
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
-#define http_cache_global_init() _http_cache_global_init(INIT_FUNC_ARGS_PASSTHRU)
-extern STATUS _http_cache_global_init(INIT_FUNC_ARGS);
-
-typedef enum {
- HTTP_ETAG_CRC32 = -3,
- HTTP_ETAG_MD5 = -2,
- HTTP_ETAG_SHA1 = -1,
-} http_etag_mode;
-
-#ifdef HTTP_HAVE_MHASH
-static void *http_etag_alloc_mhash_digest(size_t size)
-{
- return emalloc(size);
-}
-#endif
-
-#define http_etag_digest(d, l) _http_etag_digest((d), (l) TSRMLS_CC)
-static inline char *_http_etag_digest(const unsigned char *digest, int len TSRMLS_DC)
-{
- int i;
- char *hex = emalloc(len * 2 + 1);
- char *ptr = hex;
-
- /* optimize this --
- look at apache's make_etag */
- for (i = 0; i < len; ++i) {
- sprintf(ptr, "%02x", digest[i]);
- ptr += 2;
- }
- *ptr = '\0';
-
- return hex;
-}
-
-#define http_etag_init() _http_etag_init(TSRMLS_C)
-static inline void *_http_etag_init(TSRMLS_D)
-{
- void *ctx = NULL;
- long mode = INI_INT("http.etag_mode");
-
- switch (mode)
- {
- case HTTP_ETAG_CRC32:
- ctx = emalloc(sizeof(unsigned int));
- memset(ctx, 1, sizeof(unsigned int));
- break;
-
- case HTTP_ETAG_SHA1:
- PHP_SHA1Init(ctx = emalloc(sizeof(PHP_SHA1_CTX)));
- break;
-
- case HTTP_ETAG_MD5:
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- PHP_MD5Init(ctx = emalloc(sizeof(PHP_MD5_CTX)));
- break;
-
-#ifdef HTTP_HAVE_MHASH
- default:
- if ((mode < 0) || ((ulong)mode > mhash_count()) || (!(ctx = mhash_init(mode)))) {
- http_error_ex(HE_ERROR, HTTP_E_RUNTIME, "Invalid ETag mode: %ld", mode);
- }
- break;
-#endif
- }
-
- return ctx;
-}
-
-#define http_etag_finish(c) _http_etag_finish((c) TSRMLS_CC)
-static inline char *_http_etag_finish(void *ctx TSRMLS_DC)
-{
- char *etag = NULL;
- unsigned char digest[20];
- long mode = INI_INT("http.etag_mode");
-
- switch (mode)
- {
- case HTTP_ETAG_CRC32:
- *((unsigned int *) ctx) = ~*((unsigned int *) ctx);
- etag = http_etag_digest((const unsigned char *) ctx, sizeof(unsigned int));
- efree(ctx);
- break;
-
- case HTTP_ETAG_SHA1:
- PHP_SHA1Final(digest, ctx);
- etag = http_etag_digest(digest, 20);
- efree(ctx);
- break;
-
- case HTTP_ETAG_MD5:
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- PHP_MD5Final(digest, ctx);
- etag = http_etag_digest(digest, 16);
- efree(ctx);
- break;
-
-#ifdef HTTP_HAVE_MHASH
- default:
- {
- unsigned char *mhash_digest = mhash_end_m(ctx, http_etag_alloc_mhash_digest);
- etag = http_etag_digest(mhash_digest, mhash_get_block_size(mode));
- efree(mhash_digest);
- }
- break;
-#endif
- }
-
- return etag;
-}
-
-#define http_etag_update(c, d, l) _http_etag_update((c), (d), (l) TSRMLS_CC)
-static inline void _http_etag_update(void *ctx, const char *data_ptr, size_t data_len TSRMLS_DC)
-{
- switch (INI_INT("http.etag_mode"))
- {
- case HTTP_ETAG_CRC32:
- {
- unsigned int i, c = *((unsigned int *) ctx);
-
- for (i = 0; i < data_len; ++i) {
- c = CRC32(c, data_ptr[i]);
- }
- *((unsigned int *)ctx) = c;
- }
- break;
-
- case HTTP_ETAG_SHA1:
- PHP_SHA1Update(ctx, (const unsigned char *) data_ptr, data_len);
- break;
-
- case HTTP_ETAG_MD5:
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- PHP_MD5Update(ctx, (const unsigned char *) data_ptr, data_len);
- break;
-
-#ifdef HTTP_HAVE_MHASH
- default:
- mhash(ctx, data_ptr, data_len);
- break;
-#endif
- }
-}
-
-#define http_etag(p, l, m) _http_etag((p), (l), (m) TSRMLS_CC)
-PHP_HTTP_API char *_http_etag(const void *data_ptr, size_t data_len, http_send_mode data_mode TSRMLS_DC);
-
-#define http_last_modified(p, m) _http_last_modified((p), (m) TSRMLS_CC)
-PHP_HTTP_API time_t _http_last_modified(const void *data_ptr, http_send_mode data_mode TSRMLS_DC);
-
-#define http_match_last_modified(entry, modified) _http_match_last_modified_ex((entry), (modified), 1 TSRMLS_CC)
-#define http_match_last_modified_ex(entry, modified, ep) _http_match_last_modified_ex((entry), (modified), (ep) TSRMLS_CC)
-PHP_HTTP_API zend_bool _http_match_last_modified_ex(const char *entry, time_t t, zend_bool enforce_presence TSRMLS_DC);
-
-#define http_match_etag(entry, etag) _http_match_etag_ex((entry), (etag), 1 TSRMLS_CC)
-#define http_match_etag_ex(entry, etag, ep) _http_match_etag_ex((entry), (etag), (ep) TSRMLS_CC)
-PHP_HTTP_API zend_bool _http_match_etag_ex(const char *entry, const char *etag, zend_bool enforce_presence TSRMLS_DC);
-
-#define http_cache_last_modified(l, s, cc, ccl) _http_cache_last_modified((l), (s), (cc), (ccl) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_cache_last_modified(time_t last_modified, time_t send_modified, const char *cache_control, size_t cc_len TSRMLS_DC);
-
-#define http_cache_etag(e, el, cc, ccl) _http_cache_etag((e), (el), (cc), (ccl) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_cache_etag(const char *etag, size_t etag_len, const char *cache_control, size_t cc_len TSRMLS_DC);
-
-#define http_ob_etaghandler(o, l, ho, hl, m) _http_ob_etaghandler((o), (l), (ho), (hl), (m) TSRMLS_CC)
-PHP_HTTP_API void _http_ob_etaghandler(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC);
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_DATE_API_H
-#define PHP_HTTP_DATE_API_H
-
-#include "php_http_std_defs.h"
-
-#define http_date(t) _http_date((t) TSRMLS_CC)
-PHP_HTTP_API char *_http_date(time_t t TSRMLS_DC);
-
-#define http_parse_date(d) _http_parse_date((d))
-PHP_HTTP_API time_t _http_parse_date(const char *date);
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_EXCEPTION_OBJECT_H
-#define PHP_HTTP_EXCEPTION_OBJECT_H
-#ifdef ZEND_ENGINE_2
-
-extern zend_class_entry *http_exception_object_ce;
-extern zend_function_entry http_exception_object_fe[];
-
-#define http_exception_object_init() _http_exception_object_init(INIT_FUNC_ARGS_PASSTHRU)
-extern void _http_exception_object_init(INIT_FUNC_ARGS);
-
-#define http_exception_get_default _http_exception_get_default
-extern zend_class_entry *_http_exception_get_default();
-
-#define http_exception_get_for_code(c) _http_exception_get_for_code(c)
-extern zend_class_entry *_http_exception_get_for_code(long code);
-
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_HEADERS_API_H
-#define PHP_HTTP_HEADERS_API_H
-
-#include "php_http_std_defs.h"
-#include "php_http_info_api.h"
-
-typedef enum {
- RANGE_OK,
- RANGE_NO,
- RANGE_ERR
-} http_range_status;
-
-#define http_parse_headers(h, a) _http_parse_headers_ex((h), Z_ARRVAL_P(a), 1, http_info_default_callback, NULL TSRMLS_CC)
-#define http_parse_headers_ex(h, ht, p) _http_parse_headers_ex((h), (ht), (p), http_info_default_callback, NULL TSRMLS_CC)
-#define http_parse_headers_cb(h, ht, p, f, d) _http_parse_headers_ex((h), (ht), (p), (f), (d) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_parse_headers_ex(const char *header, HashTable *headers, zend_bool prettify, http_info_callback callback_func, void **callback_data TSRMLS_DC);
-
-#define http_get_request_headers(h) _http_get_request_headers_ex(Z_ARRVAL_P(h), 1 TSRMLS_CC)
-#define http_get_request_headers_ex(h, p) _http_get_request_headers_ex((h), (p) TSRMLS_CC)
-PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool prettify TSRMLS_DC);
-
-typedef char *(*negotiate_func_t)(const char *test, double *quality, HashTable *supported TSRMLS_DC);
-
-#define http_negotiate_language_func _http_negotiate_language_func
-extern char *_http_negotiate_language_func(const char *test, double *quality, HashTable *supported TSRMLS_DC);
-#define http_negotiate_charset_func _http_negotiate_charset_func
-extern char *_http_negotiate_charset_func(const char *test, double *quality, HashTable *supported TSRMLS_DC);
-
-#define http_negotiate_language(zsupported) http_negotiate_language_ex(Z_ARRVAL_P(zsupported))
-#define http_negotiate_language_ex(supported) http_negotiate_q("HTTP_ACCEPT_LANGUAGE", (supported), http_negotiate_language_func)
-#define http_negotiate_charset(zsupported) http_negotiate_charset_ex(Z_ARRVAL_P(zsupported))
-#define http_negotiate_charset_ex(supported) http_negotiate_q("HTTP_ACCEPT_CHARSET", (supported), http_negotiate_charset_func)
-#define http_negotiate_q(e, s, n) _http_negotiate_q((e), (s), (n) TSRMLS_CC)
-PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *supported, negotiate_func_t neg TSRMLS_DC);
-
-#define http_get_request_ranges(r, l) _http_get_request_ranges((r), (l) TSRMLS_CC)
-PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, size_t length TSRMLS_DC);
-
-#define http_match_request_header(h, v) http_match_request_header_ex((h), (v), 0)
-#define http_match_request_header_ex(h, v, c) _http_match_request_header_ex((h), (v), (c) TSRMLS_CC)
-PHP_HTTP_API zend_bool _http_match_request_header_ex(const char *header, const char *value, zend_bool match_case TSRMLS_DC);
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_INFO_API_H
-#define PHP_HTTP_INFO_API_H
-
-#define IS_HTTP_REQUEST 1
-#define IS_HTTP_RESPONSE 2
-
-#define HTTP_INFO(ptr) (ptr)->http.info
-
-typedef struct {
- char *method;
- char *URI;
-} http_request_info;
-
-typedef struct {
- int code;
- char *status;
-} http_response_info;
-
-typedef union {
- http_request_info request;
- http_response_info response;
-} http_info_t;
-
-struct http_info {
- http_info_t info;
- double version;
-};
-
-typedef struct {
- struct http_info http;
- int type;
-} http_info;
-
-typedef void (*http_info_callback)(void **callback_data, HashTable **headers, http_info *info TSRMLS_DC);
-
-#define http_info_default_callback _http_info_default_callback
-PHP_HTTP_API void _http_info_default_callback(void **nothing, HashTable **headers, http_info *info TSRMLS_DC);
-#define http_info_dtor _http_info_dtor
-PHP_HTTP_API void _http_info_dtor(http_info *info);
-#define http_info_parse(p, i) _http_info_parse_ex((p), (i), 1 TSRMLS_CC)
-#define http_info_parse_ex(p, i, s) _http_info_parse_ex((p), (i), (s) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_info_parse_ex(const char *pre_header, http_info *info , zend_bool silent TSRMLS_DC);
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_MESSAGE_API_H
-#define PHP_HTTP_MESSAGE_API_H
-
-#include "php_http_info_api.h"
-#include "phpstr/phpstr.h"
-
-typedef enum {
- HTTP_MSG_NONE = 0,
- HTTP_MSG_REQUEST = IS_HTTP_REQUEST,
- HTTP_MSG_RESPONSE = IS_HTTP_RESPONSE,
-} http_message_type;
-
-typedef struct _http_message http_message;
-
-struct _http_message {
- phpstr body;
- HashTable hdrs;
- http_message_type type;
- struct http_info http;
- http_message *parent;
-};
-
-/* required minimum length of an HTTP message "HTTP/1.1" */
-#define HTTP_MSG_MIN_SIZE 8
-
-/* shorthand for type checks */
-#define HTTP_MSG_TYPE(TYPE, msg) ((msg) && ((msg)->type == HTTP_MSG_ ##TYPE))
-
-#define http_message_new() _http_message_init_ex(NULL, 0)
-#define http_message_init(m) _http_message_init_ex((m), 0)
-#define http_message_init_ex(m, t) _http_message_init_ex((m), (t))
-PHP_HTTP_API http_message *_http_message_init_ex(http_message *m, http_message_type t);
-
-#define http_message_set_type(m, t) _http_message_set_type((m), (t))
-PHP_HTTP_API void _http_message_set_type(http_message *m, http_message_type t);
-
-#define http_message_header(m, h) _http_message_header_ex((m), (h), sizeof(h))
-#define http_message_header_ex _http_message_header_ex
-static inline zval *_http_message_header_ex(http_message *msg, char *key_str, size_t key_len)
-{
- zval **header;
- if (SUCCESS == zend_hash_find(&msg->hdrs, key_str, key_len, (void **) &header)) {
- return *header;
- }
- return NULL;
-}
-
-#define http_message_parse(m, l) http_message_parse_ex(NULL, (m), (l))
-#define http_message_parse_ex(h, m, l) _http_message_parse_ex((h), (m), (l) TSRMLS_CC)
-PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char *message, size_t length TSRMLS_DC);
-
-#define http_message_tostring(m, s, l) _http_message_tostring((m), (s), (l))
-PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_t *length);
-
-#define http_message_serialize(m, s, l) _http_message_serialize((m), (s), (l))
-PHP_HTTP_API void _http_message_serialize(http_message *message, char **string, size_t *length);
-
-#define http_message_tostruct_recursive(m, s) _http_message_tostruct_recursive((m), (s) TSRMLS_CC)
-PHP_HTTP_API void _http_message_tostruct_recursive(http_message *msg, zval *strct TSRMLS_DC);
-
-#define http_message_send(m) _http_message_send((m) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC);
-
-#define http_message_dup(m) _http_message_dup((m) TSRMLS_CC)
-PHP_HTTP_API http_message *_http_message_dup(http_message *msg TSRMLS_DC);
-
-#define http_message_dtor(m) _http_message_dtor((m))
-PHP_HTTP_API void _http_message_dtor(http_message *message);
-
-#define http_message_free(m) _http_message_free((m))
-PHP_HTTP_API void _http_message_free(http_message **message);
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_MESSAGE_OBJECT_H
-#define PHP_HTTP_MESSAGE_OBJECT_H
-#ifdef ZEND_ENGINE_2
-
-#include "php_http_message_api.h"
-
-typedef struct {
- zend_object zo;
- http_message *message;
- zend_object_value parent;
-} http_message_object;
-
-extern zend_class_entry *http_message_object_ce;
-extern zend_function_entry http_message_object_fe[];
-
-#define http_message_object_init() _http_message_object_init(INIT_FUNC_ARGS_PASSTHRU)
-extern void _http_message_object_init(INIT_FUNC_ARGS);
-#define http_message_object_new _http_message_object_new
-extern zend_object_value _http_message_object_new(zend_class_entry *ce TSRMLS_DC);
-#define http_message_object_new_ex(ce, msg) _http_message_object_new_ex(ce, msg TSRMLS_CC)
-#define http_message_object_from_msg(msg) _http_message_object_new_ex(http_message_object_ce, msg TSRMLS_CC)
-extern zend_object_value _http_message_object_new_ex(zend_class_entry *ce, http_message *msg TSRMLS_DC);
-#define http_message_object_clone(zobj) _http_message_object_clone(zobj TSRMLS_CC)
-extern zend_object_value _http_message_object_clone(zval *object TSRMLS_DC);
-#define http_message_object_free _http_message_object_free
-extern void _http_message_object_free(zend_object *object TSRMLS_DC);
-
-#define HTTP_MSG_PROPHASH_TYPE 276192743LU
-#define HTTP_MSG_PROPHASH_HTTP_VERSION 1138628683LU
-#define HTTP_MSG_PROPHASH_BODY 254474387LU
-#define HTTP_MSG_PROPHASH_HEADERS 3199929089LU
-#define HTTP_MSG_PROPHASH_PARENT_MESSAGE 2105714836LU
-#define HTTP_MSG_PROPHASH_REQUEST_METHOD 1669022159LU
-#define HTTP_MSG_PROPHASH_REQUEST_URI 3208695486LU
-#define HTTP_MSG_PROPHASH_RESPONSE_STATUS 3857097400LU
-#define HTTP_MSG_PROPHASH_RESPONSE_CODE 1305615119LU
-
-#define HTTP_MSG_CHECK_OBJ(obj, dofail) \
- if (!(obj)->message) { \
- http_error(E_WARNING, HTTP_E_MSG, "HttpMessage is empty"); \
- dofail; \
- }
-#define HTTP_MSG_CHECK_STD() HTTP_MSG_CHECK_OBJ(obj, RETURN_FALSE)
-
-#define HTTP_MSG_INIT_OBJ(obj) \
- if (!(obj)->message) { \
- (obj)->message = http_message_new(); \
- }
-#define HTTP_MSG_INIT_STD() HTTP_MSG_INIT_OBJ(obj)
-
-PHP_METHOD(HttpMessage, __construct);
-PHP_METHOD(HttpMessage, getBody);
-PHP_METHOD(HttpMessage, setBody);
-PHP_METHOD(HttpMessage, getHeaders);
-PHP_METHOD(HttpMessage, setHeaders);
-PHP_METHOD(HttpMessage, addHeaders);
-PHP_METHOD(HttpMessage, getType);
-PHP_METHOD(HttpMessage, setType);
-PHP_METHOD(HttpMessage, getResponseCode);
-PHP_METHOD(HttpMessage, setResponseCode);
-PHP_METHOD(HttpMessage, getRequestMethod);
-PHP_METHOD(HttpMessage, setRequestMethod);
-PHP_METHOD(HttpMessage, getRequestUri);
-PHP_METHOD(HttpMessage, setRequestUri);
-PHP_METHOD(HttpMessage, getHttpVersion);
-PHP_METHOD(HttpMessage, setHttpVersion);
-PHP_METHOD(HttpMessage, getParentMessage);
-PHP_METHOD(HttpMessage, send);
-PHP_METHOD(HttpMessage, toString);
-
-PHP_METHOD(HttpMessage, fromString);
-
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_REQUEST_API_H
-#define PHP_HTTP_REQUEST_API_H
-#ifdef HTTP_HAVE_CURL
-
-#include "php_http_std_defs.h"
-#include "php_http_request_method_api.h"
-
-#include "phpstr/phpstr.h"
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#endif
-
-#include <curl/curl.h>
-
-#define http_request_global_init() _http_request_global_init(INIT_FUNC_ARGS_PASSTHRU)
-extern STATUS _http_request_global_init(INIT_FUNC_ARGS);
-#define http_request_global_cleanup() _http_request_global_cleanup(TSRMLS_C)
-extern void _http_request_global_cleanup(TSRMLS_D);
-
-#define HTTP_REQUEST_BODY_CSTRING 1
-#define HTTP_REQUEST_BODY_CURLPOST 2
-#define HTTP_REQUEST_BODY_UPLOADFILE 3
-typedef struct {
- int type;
- void *data;
- size_t size;
-} http_request_body;
-
-typedef struct {
- void ***tsrm_ctx;
- void *data;
-} http_request_callback_ctx;
-
-typedef struct {
- phpstr *response;
- phpstr *request;
- curl_infotype last_info;
-} http_request_conv;
-
-#define HTTP_REQUEST_CALLBACK_DATA(from, type, var) \
- http_request_callback_ctx *__CTX = (http_request_callback_ctx *) (from); \
- TSRMLS_FETCH_FROM_CTX(__CTX->tsrm_ctx); \
- type (var) = (type) (__CTX->data)
-
-#define http_request_callback_data(data) _http_request_callback_data_ex((data), 1 TSRMLS_CC)
-#define http_request_callback_data_ex(data, copy) _http_request_callback_data_ex((data), (copy) TSRMLS_CC)
-extern http_request_callback_ctx *_http_request_callback_data_ex(void *data, zend_bool cpy TSRMLS_DC);
-
-
-#define COPY_STRING 1
-#define COPY_SLIST 2
-#define COPY_CONTEXT 3
-#define COPY_CONV 4
-#define http_request_data_copy(type, data) _http_request_data_copy((type), (data) TSRMLS_CC)
-extern void *_http_request_data_copy(int type, void *data TSRMLS_DC);
-#define http_request_data_free_string _http_request_data_free_string
-extern void _http_request_data_free_string(void *string);
-#define http_request_data_free_slist _http_request_data_free_slist
-extern void _http_request_data_free_slist(void *list);
-#define http_request_data_free_context _http_request_data_free_context
-extern void _http_request_data_free_context(void *context);
-#define http_request_data_free_conv _http_request_data_free_conv
-extern void _http_request_data_free_conv(void *conv);
-
-#define http_request_conv(ch, rs, rq) _http_request_conv((ch), (rs), (rq) TSRMLS_CC)
-extern void _http_request_conv(CURL *ch, phpstr* response, phpstr *request TSRMLS_DC);
-
-#define http_request_body_new() _http_request_body_new(TSRMLS_C)
-PHP_HTTP_API http_request_body *_http_request_body_new(TSRMLS_D);
-
-#define http_request_body_fill(b, fields, files) _http_request_body_fill((b), (fields), (files) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_body_fill(http_request_body *body, HashTable *fields, HashTable *files TSRMLS_DC);
-
-#define http_request_body_dtor(b) _http_request_body_dtor((b) TSRMLS_CC)
-PHP_HTTP_API void _http_request_body_dtor(http_request_body *body TSRMLS_DC);
-
-#define http_request_body_free(b) _http_request_body_free((b) TSRMLS_CC)
-PHP_HTTP_API void _http_request_body_free(http_request_body *body TSRMLS_DC);
-
-#define http_request_init(ch, meth, url, body, options) _http_request_init((ch), (meth), (url), (body), (options) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char *url, http_request_body *body, HashTable *options TSRMLS_DC);
-
-#define http_request_exec(ch, i, response, request) _http_request_exec((ch), (i), (response), (request) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_exec(CURL *ch, HashTable *info, phpstr *response, phpstr *request TSRMLS_DC);
-
-#define http_request_info(ch, i) _http_request_info((ch), (i) TSRMLS_CC)
-PHP_HTTP_API void _http_request_info(CURL *ch, HashTable *info TSRMLS_DC);
-
-#define http_request(meth, url, body, opt, info, resp) _http_request_ex(NULL, (meth), (url), (body), (opt), (info), (resp) TSRMLS_CC)
-#define http_request_ex(ch, meth, url, body, opt, info, resp) _http_request_ex((ch), (meth), (url), (body), (opt), (info), (resp) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_ex(CURL *ch, http_request_method meth, char *URL, http_request_body *body, HashTable *options, HashTable *info, phpstr *response TSRMLS_DC);
-
-#define http_get(u, o, i, r) _http_request_ex(NULL, HTTP_GET, (u), NULL, (o), (i), (r) TSRMLS_CC)
-#define http_get_ex(c, u, o, i, r) _http_request_ex((c), HTTP_GET, (u), NULL, (o), (i), (r) TSRMLS_CC)
-
-#define http_head(u, o, i, r) _http_request_ex(NULL, HTTP_HEAD, (u), NULL, (o), (i), (r) TSRMLS_CC)
-#define http_head_ex(c, u, o, i, r) _http_request_ex((c), HTTP_HEAD, (u), NULL, (o), (i), (r) TSRMLS_CC)
-
-#define http_post(u, b, o, i, r) _http_request_ex(NULL, HTTP_POST, (u), (b), (o), (i), (r) TSRMLS_CC)
-#define http_post_ex(c, u, b, o, i, r) _http_request_ex((c), HTTP_POST, (u), (b), (o), (i), (r) TSRMLS_CC)
-
-#define http_put(u, b, o, i, r) _http_request_ex(NULL, HTTP_PUT, (u), (b), (o), (i), (r) TSRMLS_CC)
-#define http_put_ex(c, u, b, o, i, r) _http_request_ex((c), HTTP_PUT, (u), (b), (o), (i), (r) TSRMLS_CC)
-
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_REQUEST_METHOD_API_H
-#define PHP_HTTP_REQUEST_METHOD_API_H
-
-#include "php_http_std_defs.h"
-#include "phpstr/phpstr.h"
-
-typedef enum {
- HTTP_NO_REQUEST_METHOD = 0,
- /* HTTP/1.1 */
- HTTP_GET = 1,
- HTTP_HEAD = 2,
- HTTP_POST = 3,
- HTTP_PUT = 4,
- HTTP_DELETE = 5,
- HTTP_OPTIONS = 6,
- HTTP_TRACE = 7,
- HTTP_CONNECT = 8,
- /* WebDAV - RFC 2518 */
- HTTP_PROPFIND = 9,
- HTTP_PROPPATCH = 10,
- HTTP_MKCOL = 11,
- HTTP_COPY = 12,
- HTTP_MOVE = 13,
- HTTP_LOCK = 14,
- HTTP_UNLOCK = 15,
- /* WebDAV Versioning - RFC 3253 */
- HTTP_VERSION_CONTROL = 16,
- HTTP_REPORT = 17,
- HTTP_CHECKOUT = 18,
- HTTP_CHECKIN = 19,
- HTTP_UNCHECKOUT = 20,
- HTTP_MKWORKSPACE = 21,
- HTTP_UPDATE = 22,
- HTTP_LABEL = 23,
- HTTP_MERGE = 24,
- HTTP_BASELINE_CONTROL = 25,
- HTTP_MKACTIVITY = 26,
- /* WebDAV Access Control - RFC 3744 */
- HTTP_ACL = 27,
- HTTP_MAX_REQUEST_METHOD = 28
-} http_request_method;
-
-#define http_request_method_global_init() _http_request_method_global_init(INIT_FUNC_ARGS_PASSTHRU)
-STATUS _http_request_method_global_init(INIT_FUNC_ARGS);
-
-#define HTTP_STD_REQUEST_METHOD(m) ((m > HTTP_NO_REQUEST_METHOD) && (m < HTTP_MAX_REQUEST_METHOD))
-#define HTTP_CUSTOM_REQUEST_METHOD(m) (m - HTTP_MAX_REQUEST_METHOD)
-
-#define http_request_method_name(m) _http_request_method_name((m) TSRMLS_CC)
-PHP_HTTP_API const char *_http_request_method_name(http_request_method m TSRMLS_DC);
-
-#define http_request_method_exists(u, l, c) _http_request_method_exists((u), (l), (c) TSRMLS_CC)
-PHP_HTTP_API unsigned long _http_request_method_exists(zend_bool by_name, unsigned long id, const char *name TSRMLS_DC);
-
-#define http_request_method_register(m) _http_request_method_register((m) TSRMLS_CC)
-PHP_HTTP_API unsigned long _http_request_method_register(const char *method TSRMLS_DC);
-
-#define http_request_method_unregister(mn) _http_request_method_unregister((mn) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_method_unregister(unsigned long method TSRMLS_DC);
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_REQUEST_OBJECT_H
-#define PHP_HTTP_REQUEST_OBJECT_H
-#ifdef HTTP_HAVE_CURL
-#ifdef ZEND_ENGINE_2
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#endif
-
-#include <curl/curl.h>
-
-#include "php_http_request_api.h"
-#include "php_http_request_pool_api.h"
-#include "phpstr/phpstr.h"
-
-typedef struct {
- zend_object zo;
- CURL *ch;
- http_request_pool *pool;
- phpstr response;
- phpstr request;
- phpstr history;
-} http_request_object;
-
-extern zend_class_entry *http_request_object_ce;
-extern zend_function_entry http_request_object_fe[];
-
-#define http_request_object_init() _http_request_object_init(INIT_FUNC_ARGS_PASSTHRU)
-extern void _http_request_object_init(INIT_FUNC_ARGS);
-#define http_request_object_new _http_request_object_new
-extern zend_object_value _http_request_object_new(zend_class_entry *ce TSRMLS_DC);
-#define http_request_object_free _http_request_object_free
-extern void _http_request_object_free(zend_object *object TSRMLS_DC);
-
-#define http_request_object_requesthandler(req, this, body) _http_request_object_requesthandler((req), (this), (body) TSRMLS_CC)
-extern STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ptr, http_request_body *body TSRMLS_DC);
-#define http_request_object_responsehandler(req, this) _http_request_object_responsehandler((req), (this) TSRMLS_CC)
-extern STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this_ptr TSRMLS_DC);
-
-PHP_METHOD(HttpRequest, __construct);
-PHP_METHOD(HttpRequest, __destruct);
-PHP_METHOD(HttpRequest, setOptions);
-PHP_METHOD(HttpRequest, getOptions);
-PHP_METHOD(HttpRequest, setSslOptions);
-PHP_METHOD(HttpRequest, getSslOptions);
-PHP_METHOD(HttpRequest, addHeaders);
-PHP_METHOD(HttpRequest, getHeaders);
-PHP_METHOD(HttpRequest, setHeaders);
-PHP_METHOD(HttpRequest, addCookies);
-PHP_METHOD(HttpRequest, getCookies);
-PHP_METHOD(HttpRequest, setCookies);
-PHP_METHOD(HttpRequest, setMethod);
-PHP_METHOD(HttpRequest, getMethod);
-PHP_METHOD(HttpRequest, setUrl);
-PHP_METHOD(HttpRequest, getUrl);
-PHP_METHOD(HttpRequest, setContentType);
-PHP_METHOD(HttpRequest, getContentType);
-PHP_METHOD(HttpRequest, setQueryData);
-PHP_METHOD(HttpRequest, getQueryData);
-PHP_METHOD(HttpRequest, addQueryData);
-PHP_METHOD(HttpRequest, setPostFields);
-PHP_METHOD(HttpRequest, getPostFields);
-PHP_METHOD(HttpRequest, addPostFields);
-PHP_METHOD(HttpRequest, getRawPostData);
-PHP_METHOD(HttpRequest, setRawPostData);
-PHP_METHOD(HttpRequest, addRawPostData);
-PHP_METHOD(HttpRequest, addPostFile);
-PHP_METHOD(HttpRequest, setPostFiles);
-PHP_METHOD(HttpRequest, getPostFiles);
-PHP_METHOD(HttpRequest, setPutFile);
-PHP_METHOD(HttpRequest, getPutFile);
-PHP_METHOD(HttpRequest, send);
-PHP_METHOD(HttpRequest, getResponseData);
-PHP_METHOD(HttpRequest, getResponseHeader);
-PHP_METHOD(HttpRequest, getResponseCookie);
-PHP_METHOD(HttpRequest, getResponseCode);
-PHP_METHOD(HttpRequest, getResponseBody);
-PHP_METHOD(HttpRequest, getResponseInfo);
-PHP_METHOD(HttpRequest, getResponseMessage);
-PHP_METHOD(HttpRequest, getRequestMessage);
-PHP_METHOD(HttpRequest, getHistory);
-
-PHP_METHOD(HttpRequest, get);
-PHP_METHOD(HttpRequest, head);
-PHP_METHOD(HttpRequest, postData);
-PHP_METHOD(HttpRequest, postFields);
-PHP_METHOD(HttpRequest, putFile);
-PHP_METHOD(HttpRequest, putStream);
-
-PHP_METHOD(HttpRequest, methodRegister);
-PHP_METHOD(HttpRequest, methodUnregister);
-PHP_METHOD(HttpRequest, methodName);
-PHP_METHOD(HttpRequest, methodExists);
-
-#endif
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_REQUEST_POOL_API_H
-#define PHP_HTTP_REQUEST_POOL_API_H
-#ifdef HTTP_HAVE_CURL
-
-#include "php_http_std_defs.h"
-#include "php_http_request_api.h"
-#include "phpstr/phpstr.h"
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#endif
-
-#include <curl/curl.h>
-
-typedef struct {
- CURLM *ch;
- zend_llist handles;
- zend_llist bodies;
- int unfinished;
-} http_request_pool;
-
-#define http_request_pool_responsehandler _http_request_pool_responsehandler
-extern void _http_request_pool_responsehandler(zval **req TSRMLS_DC);
-#define http_request_pool_requesthandler(r, b) _http_request_pool_requesthandler((r), (b) TSRMLS_CC)
-extern STATUS _http_request_pool_requesthandler(zval *request, http_request_body *body TSRMLS_DC);
-
-#define http_request_pool_init(p) _http_request_pool_init((p) TSRMLS_CC)
-PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool TSRMLS_DC);
-
-#define http_request_pool_attach(p, r) _http_request_pool_attach((p), (r) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *request TSRMLS_DC);
-
-#define http_request_pool_detach(p, r) _http_request_pool_detach((p), (r) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *request TSRMLS_DC);
-
-#define http_request_pool_detach_all(p) _http_request_pool_detach_all((p) TSRMLS_CC)
-PHP_HTTP_API void _http_request_pool_detach_all(http_request_pool *pool TSRMLS_DC);
-
-#define http_request_pool_send(p) _http_request_pool_send((p) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC);
-
-#define http_request_pool_select _http_request_pool_select
-PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool);
-
-#define http_request_pool_perform _http_request_pool_perform
-PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool);
-
-#define http_request_pool_dtor(p) _http_request_pool_dtor((p) TSRMLS_CC)
-PHP_HTTP_API void _http_request_pool_dtor(http_request_pool *pool TSRMLS_DC);
-
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_REQUESTPOOL_OBJECT_H
-#define PHP_HTTP_REQUESTPOOL_OBJECT_H
-#ifdef HTTP_HAVE_CURL
-#ifdef ZEND_ENGINE_2
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#endif
-
-#include <curl/curl.h>
-
-#include "php_http_request_pool_api.h"
-
-typedef struct {
- zend_object zo;
- http_request_pool pool;
- struct {
- long pos;
- } iterator;
-} http_requestpool_object;
-
-extern zend_class_entry *http_requestpool_object_ce;
-extern zend_function_entry http_requestpool_object_fe[];
-
-#define http_requestpool_object_init() _http_requestpool_object_init(INIT_FUNC_ARGS_PASSTHRU)
-extern void _http_requestpool_object_init(INIT_FUNC_ARGS);
-#define http_requestpool_object_new _http_requestpool_object_new
-extern zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC);
-#define http_requestpool_object_free _http_requestpool_object_free
-extern void _http_requestpool_object_free(zend_object *object TSRMLS_DC);
-
-PHP_METHOD(HttpRequestPool, __construct);
-PHP_METHOD(HttpRequestPool, __destruct);
-PHP_METHOD(HttpRequestPool, attach);
-PHP_METHOD(HttpRequestPool, detach);
-PHP_METHOD(HttpRequestPool, send);
-PHP_METHOD(HttpRequestPool, reset);
-PHP_METHOD(HttpRequestPool, socketPerform);
-PHP_METHOD(HttpRequestPool, socketSelect);
-PHP_METHOD(HttpRequestPool, valid);
-PHP_METHOD(HttpRequestPool, current);
-PHP_METHOD(HttpRequestPool, key);
-PHP_METHOD(HttpRequestPool, next);
-PHP_METHOD(HttpRequestPool, rewind);
-
-#endif
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_RESPONSE_OBJECT_H
-#define PHP_HTTP_RESPONSE_OBJECT_H
-#ifdef ZEND_ENGINE_2
-
-#include "missing.h"
-
-#ifndef WONKY
-
-extern zend_class_entry *http_response_object_ce;
-extern zend_function_entry http_response_object_fe[];
-
-#define http_response_object_init() _http_response_object_init(INIT_FUNC_ARGS_PASSTHRU)
-extern void _http_response_object_init(INIT_FUNC_ARGS);
-
-PHP_METHOD(HttpResponse, setHeader);
-PHP_METHOD(HttpResponse, getHeader);
-PHP_METHOD(HttpResponse, setETag);
-PHP_METHOD(HttpResponse, getETag);
-PHP_METHOD(HttpResponse, setLastModified);
-PHP_METHOD(HttpResponse, getLastModified);
-PHP_METHOD(HttpResponse, setContentDisposition);
-PHP_METHOD(HttpResponse, getContentDisposition);
-PHP_METHOD(HttpResponse, setContentType);
-PHP_METHOD(HttpResponse, getContentType);
-PHP_METHOD(HttpResponse, guessContentType);
-PHP_METHOD(HttpResponse, setCache);
-PHP_METHOD(HttpResponse, getCache);
-PHP_METHOD(HttpResponse, setCacheControl);
-PHP_METHOD(HttpResponse, getCacheControl);
-PHP_METHOD(HttpResponse, setGzip);
-PHP_METHOD(HttpResponse, getGzip);
-PHP_METHOD(HttpResponse, setThrottleDelay);
-PHP_METHOD(HttpResponse, getThrottleDelay);
-PHP_METHOD(HttpResponse, setBufferSize);
-PHP_METHOD(HttpResponse, getBufferSize);
-PHP_METHOD(HttpResponse, setData);
-PHP_METHOD(HttpResponse, getData);
-PHP_METHOD(HttpResponse, setFile);
-PHP_METHOD(HttpResponse, getFile);
-PHP_METHOD(HttpResponse, setStream);
-PHP_METHOD(HttpResponse, getStream);
-PHP_METHOD(HttpResponse, send);
-PHP_METHOD(HttpResponse, capture);
-PHP_METHOD(HttpResponse, redirect);
-PHP_METHOD(HttpResponse, status);
-PHP_METHOD(HttpResponse, getRequestHeaders);
-PHP_METHOD(HttpResponse, getRequestBody);
-
-#endif
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_SEND_API_H
-#define PHP_HTTP_SEND_API_H
-
-#include "SAPI.h"
-#include "php_streams.h"
-#include "php_http_std_defs.h"
-
-typedef enum {
- SEND_DATA,
- SEND_RSRC
-} http_send_mode;
-
-#define http_send_status(s) sapi_header_op(SAPI_HEADER_SET_STATUS, (void *) (s) TSRMLS_CC)
-#define http_send_header(n, v, r) _http_send_header_ex((n), strlen(n), (v), strlen(v), (r) TSRMLS_CC)
-#define http_send_header_ex(n, nl, v, vl, r, s) _http_send_header_ex((n), (nl), (v), (vl), (r), (s) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_header_ex(const char *name, size_t name_len, const char *value, size_t value_len, zend_bool replace, char **sent_header TSRMLS_DC);
-#define http_send_header_string(h) _http_send_status_header_ex(0, (h), 1 TSRMLS_CC)
-#define http_send_header_string_ex(h, r) _http_send_status_header_ex(0, (h), (r) TSRMLS_CC)
-#define http_send_status_header(s, h) _http_send_status_header_ex((s), (h), 1 TSRMLS_CC)
-#define http_send_status_header_ex(s, h, r) _http_send_status_header_ex((s), (h), (r) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_status_header_ex(int status, const char *header, zend_bool replace TSRMLS_DC);
-
-#define http_send_last_modified(t) _http_send_last_modified_ex((t), NULL TSRMLS_CC)
-#define http_send_last_modified_ex(t, s) _http_send_last_modified_ex((t), (s) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_last_modified_ex(time_t t, char **sent_header TSRMLS_DC);
-
-#define http_send_etag(e, l) _http_send_etag_ex((e), (l), NULL TSRMLS_CC)
-#define http_send_etag_ex(e, l, s) _http_send_etag_ex((e), (l), (s) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_etag_ex(const char *etag, size_t etag_len, char **sent_header TSRMLS_DC);
-
-#define http_send_cache_control(cc, cl) http_send_header_ex("Cache-Control", lenof("Cache-Control"), (cc), (cl), 1, NULL)
-
-#define http_send_content_type(c, l) _http_send_content_type((c), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_content_type(const char *content_type, size_t ct_len TSRMLS_DC);
-
-#define http_send_content_disposition(f, l, i) _http_send_content_disposition((f), (l), (i) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_content_disposition(const char *filename, size_t f_len, zend_bool send_inline TSRMLS_DC);
-
-#define http_send_ranges(r, d, s, m) _http_send_ranges((r), (d), (s), (m) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_t size, http_send_mode mode TSRMLS_DC);
-
-#define http_send_data(d, l) http_send((d), (l), SEND_DATA)
-#define http_send_data_ex(d, l, nc) http_send_ex((d), (l), SEND_DATA, (nc))
-#define http_send(d, s, m) _http_send_ex((d), (s), (m), 0 TSRMLS_CC)
-#define http_send_ex(d, s, m, nc) _http_send_ex((d), (s), (m), (nc) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_ex(const void *data, size_t data_size, http_send_mode mode, zend_bool no_cache TSRMLS_DC);
-
-#define http_send_file(f) http_send_stream_ex(php_stream_open_wrapper(f, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL), 1, 0)
-#define http_send_file_ex(f, nc) http_send_stream_ex(php_stream_open_wrapper(f, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL), 1, (nc))
-#define http_send_stream(s) http_send_stream_ex((s), 0, 0)
-#define http_send_stream_ex(s, c, nc) _http_send_stream_ex((s), (c), (nc) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *s, zend_bool close_stream, zend_bool no_cache TSRMLS_DC);
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_STD_DEFS_H
-#define PHP_HTTP_STD_DEFS_H
-
-#if defined(PHP_WIN32)
-# if defined(HTTP_EXPORTS)
-# define PHP_HTTP_API __declspec(dllexport)
-# elif defined(COMPILE_DL_HTTP)
-# define PHP_HTTP_API __declspec(dllimport)
-# else
-# define PHP_HTTP_API
-# endif
-#else
-# define PHP_HTTP_API
-#endif
-
-/* make functions that return SUCCESS|FAILURE more obvious */
-typedef int STATUS;
-
-/* lenof() */
-#define lenof(S) (sizeof(S) - 1)
-
-#ifndef MIN
-# define MIN(a,b) (a<b?a:b)
-#endif
-#ifndef MAX
-# define MAX(a,b) (a>b?a:b)
-#endif
-
-/* STR_SET() */
-#ifndef STR_SET
-# define STR_SET(STR, SET) \
- { \
- STR_FREE(STR); \
- STR = SET; \
- }
-#endif
-
-#define INIT_ZARR(zv, ht) \
- { \
- INIT_PZVAL(&(zv)); \
- Z_TYPE(zv) = IS_ARRAY; \
- Z_ARRVAL(zv) = (ht); \
- }
-
-/* return bool (v == SUCCESS) */
-#define RETVAL_SUCCESS(v) RETVAL_BOOL(SUCCESS == (v))
-#define RETURN_SUCCESS(v) RETURN_BOOL(SUCCESS == (v))
-/* return object(values) */
-#define RETVAL_OBJECT(o) \
- RETVAL_OBJVAL((o)->value.obj)
-#define RETURN_OBJECT(o) \
- RETVAL_OBJECT(o); \
- return
-#define RETVAL_OBJVAL(ov) \
- ZVAL_OBJVAL(return_value, ov)
-#define RETURN_OBJVAL(ov) \
- RETVAL_OBJVAL(ov); \
- return
-#define ZVAL_OBJVAL(zv, ov) \
- (zv)->is_ref = 1; \
- (zv)->type = IS_OBJECT; \
- (zv)->value.obj = (ov); \
- if (Z_OBJ_HT_P(zv)->add_ref) { \
- Z_OBJ_HT_P(zv)->add_ref((zv) TSRMLS_CC); \
- }
-
-/* function accepts no args */
-#define NO_ARGS \
- if (ZEND_NUM_ARGS()) { \
- zend_error(E_NOTICE, "Wrong parameter count for %s()", get_active_function_name(TSRMLS_C)); \
- }
-
-/* check if return value is used */
-#define IF_RETVAL_USED \
- if (!return_value_used) { \
- return; \
- } else
-
-/* CR LF */
-#define HTTP_CRLF "\r\n"
-
-/* default cache control */
-#define HTTP_DEFAULT_CACHECONTROL "private, must-revalidate, max-age=0"
-
-/* max URL length */
-#define HTTP_URL_MAXLEN 2048
-#define HTTP_URI_MAXLEN HTTP_URL_MAXLEN
-
-/* def URL arg separator */
-#define HTTP_URL_ARGSEP "&"
-#define HTTP_URI_ARGSEP HTTP_URL_ARGSEP
-
-/* send buffer size */
-#define HTTP_SENDBUF_SIZE 2097152
-
-/* CURL buffer size */
-#define HTTP_CURLBUF_SIZE 16384
-
-/* known methods */
-#define HTTP_KNOWN_METHODS \
- /* HTTP 1.1 */ \
- "GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT, " \
- /* WebDAV - RFC 2518 */ \
- "PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, " \
- /* WebDAV Versioning - RFC 3253 */ \
- "VERSION-CONTROL, REPORT, CHECKOUT, CHECKIN, UNCHECKOUT, " \
- "MKWORKSPACE, UPDATE, LABEL, MERGE, BASELINE-CONTROL, MKACTIVITY, " \
- /* WebDAV Access Control - RFC 3744 */ \
- "ACL, " \
- /* END */
-
-
-#define HTTP_PHP_INI_ENTRY(entry, default, scope, updater, global) \
- STD_PHP_INI_ENTRY(entry, default, scope, updater, global, zend_http_globals, http_globals)
-#define HTTP_PHP_INI_ENTRY_EX(entry, default, scope, updater, displayer, global) \
- STD_PHP_INI_ENTRY_EX(entry, default, scope, updater, global, zend_http_globals, http_globals, displayer)
-
-/* {{{ arrays */
-#define FOREACH_VAL(array, val) FOREACH_HASH_VAL(Z_ARRVAL_P(array), val)
-#define FOREACH_HASH_VAL(hash, val) \
- for ( zend_hash_internal_pointer_reset(hash); \
- zend_hash_get_current_data(hash, (void **) &val) == SUCCESS; \
- zend_hash_move_forward(hash))
-
-#define FOREACH_KEY(array, strkey, numkey) FOREACH_HASH_KEY(Z_ARRVAL_P(array), strkey, numkey)
-#define FOREACH_HASH_KEY(hash, strkey, numkey) \
- for ( zend_hash_internal_pointer_reset(hash); \
- zend_hash_get_current_key(hash, &strkey, &numkey, 0) != HASH_KEY_NON_EXISTANT; \
- zend_hash_move_forward(hash)) \
-
-#define FOREACH_KEYVAL(array, strkey, numkey, val) FOREACH_HASH_KEYVAL(Z_ARRVAL_P(array), strkey, numkey, val)
-#define FOREACH_HASH_KEYVAL(hash, strkey, numkey, val) \
- for ( zend_hash_internal_pointer_reset(hash); \
- zend_hash_get_current_key(hash, &strkey, &numkey, 0) != HASH_KEY_NON_EXISTANT && \
- zend_hash_get_current_data(hash, (void **) &val) == SUCCESS; \
- zend_hash_move_forward(hash)) \
-
-#define array_copy(src, dst) zend_hash_copy(Z_ARRVAL_P(dst), Z_ARRVAL_P(src), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *))
-#define array_merge(src, dst) zend_hash_merge(Z_ARRVAL_P(dst), Z_ARRVAL_P(src), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *), 1)
-#define array_append(src, dst) \
- { \
- ulong idx; \
- uint klen; \
- char *key = NULL; \
- zval **data; \
- \
- for ( zend_hash_internal_pointer_reset(Z_ARRVAL_P(src)); \
- zend_hash_get_current_key_ex(Z_ARRVAL_P(src), &key, &klen, &idx, 0, NULL) != HASH_KEY_NON_EXISTANT && \
- zend_hash_get_current_data(Z_ARRVAL_P(src), (void **) &data) == SUCCESS; \
- zend_hash_move_forward(Z_ARRVAL_P(src))) \
- { \
- if (key) { \
- zval **tmp; \
- \
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(dst), key, klen, (void **) &tmp)) { \
- if (Z_TYPE_PP(tmp) != IS_ARRAY) { \
- convert_to_array_ex(tmp); \
- } \
- add_next_index_zval(*tmp, *data); \
- } else { \
- add_assoc_zval(dst, key, *data); \
- } \
- zval_add_ref(data); \
- key = NULL; \
- } \
- } \
- }
-/* }}} */
-
-#define HTTP_LONG_CONSTANT(name, const) REGISTER_LONG_CONSTANT(name, const, CONST_CS | CONST_PERSISTENT)
-
-/* {{{ objects & properties */
-#ifdef ZEND_ENGINE_2
-
-# define HTTP_STATIC_ME_ALIAS(me, al, ai) ZEND_FENTRY(me, ZEND_FN(al), ai, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
-
-# define HTTP_REGISTER_CLASS_EX(classname, name, parent, flags) \
- { \
- zend_class_entry ce; \
- INIT_CLASS_ENTRY(ce, #classname, name## _fe); \
- ce.create_object = name## _new; \
- name## _ce = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \
- name## _ce->ce_flags |= flags; \
- memcpy(& name## _handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); \
- zend_hash_init(& name## _ce->constants_table, 0, NULL, ZVAL_INTERNAL_PTR_DTOR, 1); \
- name## _declare_default_properties(); \
- }
-
-# define HTTP_REGISTER_CLASS(classname, name, parent, flags) \
- { \
- zend_class_entry ce; \
- INIT_CLASS_ENTRY(ce, #classname, name## _fe); \
- ce.create_object = NULL; \
- name## _ce = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \
- name## _ce->ce_flags |= flags; \
- }
-
-# define HTTP_REGISTER_EXCEPTION(classname, cename, parent) \
- { \
- zend_class_entry ce; \
- INIT_CLASS_ENTRY(ce, #classname, NULL); \
- ce.create_object = NULL; \
- cename = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \
- }
-
-# define getObject(t, o) getObjectEx(t, o, getThis())
-# define getObjectEx(t, o, v) t * o = ((t *) zend_object_store_get_object(v TSRMLS_CC))
-# define putObject(t, o) zend_objects_store_put(o, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) t## _free, NULL TSRMLS_CC);
-# define OBJ_PROP(o) (o)->zo.properties
-
-# define DCL_STATIC_PROP(a, t, n, v) zend_declare_property_ ##t(ce, (#n), sizeof(#n)-1, (v), (ZEND_ACC_ ##a | ZEND_ACC_STATIC) TSRMLS_CC)
-# define DCL_STATIC_PROP_Z(a, n, v) zend_declare_property(ce, (#n), sizeof(#n)-1, (v), (ZEND_ACC_ ##a | ZEND_ACC_STATIC) TSRMLS_CC)
-# define DCL_STATIC_PROP_N(a, n) zend_declare_property_null(ce, (#n), sizeof(#n)-1, (ZEND_ACC_ ##a | ZEND_ACC_STATIC) TSRMLS_CC)
-# define GET_STATIC_PROP_EX(ce, n) zend_std_get_static_property(ce, (#n), sizeof(#n)-1, 0 TSRMLS_CC)
-# define UPD_STATIC_PROP_EX(ce, t, n, v) zend_update_static_property_ ##t(ce, #n, sizeof(#n)-1, (v) TSRMLS_CC)
-# define UPD_STATIC_STRL_EX(ce, n, v, l) zend_update_static_property_stringl(ce, #n, sizeof(#n)-1, (v), (l) TSRMLS_CC)
-# define SET_STATIC_PROP_EX(ce, n, v) zend_update_static_property(ce, #n, sizeof(#n)-1, v TSRMLS_CC)
-
-# define DCL_PROP(a, t, n, v) zend_declare_property_ ##t(ce, (#n), sizeof(#n)-1, (v), (ZEND_ACC_ ##a) TSRMLS_CC)
-# define DCL_PROP_Z(a, n, v) zend_declare_property(ce, (#n), sizeof(#n)-1, (v), (ZEND_ACC_ ##a) TSRMLS_CC)
-# define DCL_PROP_N(a, n) zend_declare_property_null(ce, (#n), sizeof(#n)-1, (ZEND_ACC_ ##a) TSRMLS_CC)
-# define UPD_PROP(o, t, n, v) UPD_PROP_EX(o, getThis(), t, n, v)
-# define UPD_PROP_EX(o, this, t, n, v) zend_update_property_ ##t(o->zo.ce, this, (#n), sizeof(#n)-1, (v) TSRMLS_CC)
-# define UPD_STRL(o, n, v, l) zend_update_property_stringl(o->zo.ce, getThis(), (#n), sizeof(#n)-1, (v), (l) TSRMLS_CC)
-# define SET_PROP(o, n, z) SET_PROP_EX(o, getThis(), n, z)
-# define SET_PROP_EX(o, this, n, z) zend_update_property(o->zo.ce, this, (#n), sizeof(#n)-1, (z) TSRMLS_CC)
-# define GET_PROP(o, n) GET_PROP_EX(o, getThis(), n)
-# define GET_PROP_EX(o, this, n) zend_read_property(o->zo.ce, this, (#n), sizeof(#n)-1, 0 TSRMLS_CC)
-
-# define DCL_CONST(t, n, v) zend_declare_class_constant_ ##t(ce, (n), sizeof(n)-1, (v) TSRMLS_CC)
-
-# define ACC_PROP_PRIVATE(ce, flags) ((flags & ZEND_ACC_PRIVATE) && (EG(scope) && ce == EG(scope))
-# define ACC_PROP_PROTECTED(ce, flags) ((flags & ZEND_ACC_PROTECTED) && (zend_check_protected(ce, EG(scope))))
-# define ACC_PROP_PUBLIC(flags) (flags & ZEND_ACC_PUBLIC)
-# define ACC_PROP(ce, flags) (ACC_PROP_PUBLIC(flags) || ACC_PROP_PRIVATE(ce, flags) || ACC_PROP_PROTECTED(ce, flags))
-
-# define INIT_PARR(o, n) \
- { \
- zval *__tmp; \
- MAKE_STD_ZVAL(__tmp); \
- array_init(__tmp); \
- SET_PROP(o, n, __tmp); \
- }
-
-# define FREE_PARR(o, p) \
- { \
- zval *__tmp = GET_PROP(o, p); \
- if (__tmp) { \
- zval_ptr_dtor(&__tmp); \
- } \
- }
-
-# define SET_EH_THROW() SET_EH_THROW_EX(zend_exception_get_default())
-# define SET_EH_THROW_HTTP() SET_EH_THROW_EX(http_exception_get_default())
-# define SET_EH_THROW_EX(ex) php_set_error_handling(EH_THROW, ex TSRMLS_CC)
-# define SET_EH_NORMAL() php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC)
-
-#endif /* ZEND_ENGINE_2 */
-/* }}} */
-
-#ifndef E_THROW
-# define E_THROW 0
-#endif
-#ifdef ZEND_ENGINE_2
-# define HE_THROW E_THROW TSRMLS_CC
-# define HE_NOTICE (HTTP_G(only_exceptions) ? E_THROW : E_NOTICE) TSRMLS_CC
-# define HE_WARNING (HTTP_G(only_exceptions) ? E_THROW : E_WARNING) TSRMLS_CC
-# define HE_ERROR (HTTP_G(only_exceptions) ? E_THROW : E_ERROR) TSRMLS_CC
-#else
-# define HE_THROW E_WARNING TSRMLS_CC
-# define HE_NOTICE E_NOTICE TSRMLS_CC
-# define HE_WARNING E_WARNING TSRMLS_CC
-# define HE_ERROR E_ERROR TSRMLS_CC
-#endif
-
-#define HTTP_E_RUNTIME 1L
-#define HTTP_E_INVALID_PARAM 2L
-#define HTTP_E_HEADER 3L
-#define HTTP_E_MALFORMED_HEADERS 4L
-#define HTTP_E_REQUEST_METHOD 5L
-#define HTTP_E_MESSAGE_TYPE 6L
-#define HTTP_E_ENCODING 7L
-#define HTTP_E_REQUEST 8L
-#define HTTP_E_REQUEST_POOL 9L
-#define HTTP_E_SOCKET 10L
-#define HTTP_E_RESPONSE 11L
-#define HTTP_E_URL 12L
-
-#ifdef ZEND_ENGINE_2
-# define HTTP_BEGIN_ARGS_EX(class, method, ret_ref, req_args) static ZEND_BEGIN_ARG_INFO_EX(args_for_ ##class## _ ##method , 0, ret_ref, req_args)
-# define HTTP_BEGIN_ARGS_AR(class, method, ret_ref, req_args) static ZEND_BEGIN_ARG_INFO_EX(args_for_ ##class## _ ##method , 1, ret_ref, req_args)
-# define HTTP_END_ARGS }
-# define HTTP_EMPTY_ARGS_EX(class, method, ret_ref) HTTP_BEGIN_ARGS_EX(class, method, ret_ref, 0) HTTP_END_ARGS
-# define HTTP_ARGS(class, method) args_for_ ##class## _ ##method
-# define HTTP_ARG_VAL(name, pass_ref) ZEND_ARG_INFO(pass_ref, name)
-# define HTTP_ARG_OBJ(class, name, allow_null) ZEND_ARG_OBJ_INFO(0, name, class, allow_null)
-#endif
-
-#ifdef ZEND_ENGINE_2
-# define EMPTY_FUNCTION_ENTRY {NULL, NULL, NULL, 0, 0}
-#else
-# define EMPTY_FUNCTION_ENTRY {NULL, NULL, NULL}
-#endif
-
-#ifdef HTTP_HAVE_CURL
-# ifdef ZEND_ENGINE_2
-# define HTTP_DECLARE_ARG_PASS_INFO() \
- static \
- ZEND_BEGIN_ARG_INFO(http_arg_pass_ref_3, 0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(1) \
- ZEND_END_ARG_INFO(); \
- \
- static \
- ZEND_BEGIN_ARG_INFO(http_arg_pass_ref_4, 0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(1) \
- ZEND_END_ARG_INFO(); \
- \
- static \
- ZEND_BEGIN_ARG_INFO(http_arg_pass_ref_5, 0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(0) \
- ZEND_ARG_PASS_INFO(1) \
- ZEND_END_ARG_INFO();
-
-# else
-# define HTTP_DECLARE_ARG_PASS_INFO() \
- static unsigned char http_arg_pass_ref_3[] = {3, BYREF_NONE, BYREF_NONE, BYREF_FORCE}; \
- static unsigned char http_arg_pass_ref_4[] = {4, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_FORCE}; \
- static unsigned char http_arg_pass_ref_5[] = {5, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_FORCE};
-# endif /* ZEND_ENGINE_2 */
-#else
-# define HTTP_DECLARE_ARG_PASS_INFO()
-#endif /* HTTP_HAVE_CURL */
-
-
-#ifndef TSRMLS_FETCH_FROM_CTX
-# ifdef ZTS
-# define TSRMLS_FETCH_FROM_CTX(ctx) void ***tsrm_ls = (void ***) ctx
-# else
-# define TSRMLS_FETCH_FROM_CTX(ctx)
-# endif
-#endif
-
-#ifndef TSRMLS_SET_CTX
-# ifdef ZTS
-# define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_ls
-# else
-# define TSRMLS_SET_CTX(ctx)
-# endif
-#endif
-
-#ifndef ZVAL_ZVAL
-#define ZVAL_ZVAL(z, zv, copy, dtor) { \
- int is_ref, refcount; \
- is_ref = (z)->is_ref; \
- refcount = (z)->refcount; \
- *(z) = *(zv); \
- if (copy) { \
- zval_copy_ctor(z); \
- } \
- if (dtor) { \
- if (!copy) { \
- ZVAL_NULL(zv); \
- } \
- zval_ptr_dtor(&zv); \
- } \
- (z)->is_ref = is_ref; \
- (z)->refcount = refcount; \
- }
-#endif
-#ifndef RETVAL_ZVAL
-#define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor)
-#endif
-#ifndef RETURN_ZVAL
-#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }
-#endif
-
-
-#endif /* PHP_HTTP_STD_DEFS_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_URL_API_H
-#define PHP_HTTP_URL_API_H
-
-#include "php_http_std_defs.h"
-
-#define http_absolute_uri(url) http_absolute_url(url)
-#define http_absolute_uri_ex(url, url_len, proto, proto_len, host, host_len, port) _http_absolute_url_ex((url), (url_len), (proto), (proto_len), (host), (host_len), (port) TSRMLS_CC)
-#define http_absolute_url(url) http_absolute_url_ex((url), strlen(url), NULL, 0, NULL, 0, 0)
-#define http_absolute_url_ex(url, url_len, proto, proto_len, host, host_len, port) _http_absolute_url_ex((url), (url_len), (proto), (proto_len), (host), (host_len), (port) TSRMLS_CC)
-PHP_HTTP_API char *_http_absolute_url_ex(const char *url, size_t url_len, const char *proto, size_t proto_len, const char *host, size_t host_len, unsigned port TSRMLS_DC);
-
-#define http_urlencode_hash(h, q) _http_urlencode_hash_ex((h), 1, NULL, 0, (q), NULL TSRMLS_CC)
-#define http_urlencode_hash_ex(h, o, p, pl, q, ql) _http_urlencode_hash_ex((h), (o), (p), (pl), (q), (ql) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_urlencode_hash_ex(HashTable *hash, zend_bool override_argsep, char *pre_encoded_data, size_t pre_encoded_len, char **encoded_data, size_t *encoded_len TSRMLS_DC);
-
-#define http_urlencode_hash_implementation(ht, formstr, argsep) \
- http_urlencode_hash_implementation_ex((ht), (formstr), (argsep), NULL, 0, NULL, 0, NULL, 0, NULL)
-#define http_urlencode_hash_implementation_ex(ht, formstr, argsep, np, npl, kp, kpl, ks, ksl, type) \
- _http_urlencode_hash_implementation_ex((ht), (formstr), (argsep), (np), (npl), (kp), (kpl), (ks), (ksl), (type) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_urlencode_hash_implementation_ex(
- HashTable *ht, phpstr *formstr, char *arg_sep,
- const char *num_prefix, int num_prefix_len,
- const char *key_prefix, int key_prefix_len,
- const char *key_suffix, int key_suffix_len,
- zval *type TSRMLS_DC);
-
-
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-/*
- +----------------------------------------------------------------------+
- | PECL :: http |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, that |
- | is bundled with this package in the file LICENSE, and is available |
- | through the world-wide-web at http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Copyright (c) 2004-2005 Michael Wallner <mike@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_HTTP_UTIL_OBJECT_H
-#define PHP_HTTP_UTIL_OBJECT_H
-#ifdef ZEND_ENGINE_2
-
-extern zend_class_entry *http_util_object_ce;
-extern zend_function_entry http_util_object_fe[];
-
-#define http_util_object_init() _http_util_object_init(INIT_FUNC_ARGS_PASSTHRU)
-extern void _http_util_object_init(INIT_FUNC_ARGS);
-
-PHP_METHOD(HttpUtil, date);
-PHP_METHOD(HttpUtil, absoluteUri);
-PHP_METHOD(HttpUtil, negotiateLanguage);
-PHP_METHOD(HttpUtil, negotiateCharset);
-PHP_METHOD(HttpUtil, matchModified);
-PHP_METHOD(HttpUtil, matchEtag);
-PHP_METHOD(HttpUtil, chunkedDecode);
-PHP_METHOD(HttpUtil, parseHeaders);
-PHP_METHOD(HttpUtil, parseMessage);
-
-#endif
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker
- * vim<600: noet sw=4 ts=4
- */
-
+++ /dev/null
-
-/* $Id$ */
-
-#include "php.h"
-#include "phpstr.h"
-
-PHPSTR_API phpstr *phpstr_init_ex(phpstr *buf, size_t chunk_size, zend_bool pre_alloc)
-{
- if (!buf) {
- buf = emalloc(sizeof(phpstr));
- }
-
- buf->size = chunk_size > 0 ? chunk_size : PHPSTR_DEFAULT_SIZE;
- buf->data = pre_alloc ? emalloc(buf->size) : NULL;
- buf->free = pre_alloc ? buf->size : 0;
- buf->used = 0;
-
- return buf;
-}
-
-PHPSTR_API phpstr *phpstr_from_string_ex(phpstr *buf, const char *string, size_t length)
-{
- buf = phpstr_init(buf);
- phpstr_append(buf, string, length);
- return buf;
-}
-
-PHPSTR_API void phpstr_resize_ex(phpstr *buf, size_t len, size_t override_size)
-{
- if (buf->free < len) {
- size_t size = override_size ? override_size : buf->size;
- while ((size + buf->free) < len) {
- size *= 2;
- }
- if (buf->data) {
- buf->data = erealloc(buf->data, buf->used + buf->free + size);
- } else {
- buf->data = emalloc(size);
- }
- buf->free += size;
- }
-}
-
-PHPSTR_API size_t phpstr_append(phpstr *buf, const char *append, size_t append_len)
-{
- phpstr_resize(buf, append_len);
- memcpy(buf->data + buf->used, append, append_len);
- buf->used += append_len;
- buf->free -= append_len;
- return append_len;
-}
-
-PHPSTR_API size_t phpstr_appendf(phpstr *buf, const char *format, ...)
-{
- va_list argv;
- char *append;
- size_t append_len;
-
- va_start(argv, format);
- append_len = vspprintf(&append, 0, format, argv);
- va_end(argv);
-
- phpstr_append(buf, append, append_len);
- efree(append);
-
- return append_len;
-}
-
-PHPSTR_API size_t phpstr_insert(phpstr *buf, const char *insert, size_t insert_len, size_t offset)
-{
- phpstr_resize(buf, insert_len);
- memmove(buf->data + offset + insert_len, buf->data + offset, insert_len);
- memcpy(buf->data + offset, insert, insert_len);
- buf->used += insert_len;
- buf->free -= insert_len;
- return insert_len;
-}
-
-PHPSTR_API size_t phpstr_insertf(phpstr *buf, size_t offset, const char *format, ...)
-{
- va_list argv;
- char *insert;
- size_t insert_len;
-
- va_start(argv, format);
- insert_len = vspprintf(&insert, 0, format, argv);
- va_end(argv);
-
- phpstr_insert(buf, insert, insert_len, offset);
- efree(insert);
-
- return insert_len;
-}
-
-PHPSTR_API size_t phpstr_prepend(phpstr *buf, const char *prepend, size_t prepend_len)
-{
- phpstr_resize(buf, prepend_len);
- memmove(buf->data + prepend_len, buf->data, buf->used);
- memcpy(buf->data, prepend, prepend_len);
- buf->used += prepend_len;
- buf->free -= prepend_len;
- return prepend_len;
-}
-
-PHPSTR_API size_t phpstr_prependf(phpstr *buf, const char *format, ...)
-{
- va_list argv;
- char *prepend;
- size_t prepend_len;
-
- va_start(argv, format);
- prepend_len = vspprintf(&prepend, 0, format, argv);
- va_end(argv);
-
- phpstr_prepend(buf, prepend, prepend_len);
- efree(prepend);
-
- return prepend_len;
-}
-
-PHPSTR_API char *phpstr_data(const phpstr *buf, char **into, size_t *len)
-{
- char *copy = ecalloc(1, buf->used + 1);
- memcpy(copy, buf->data, buf->used);
- if (into) {
- *into = copy;
- }
- if (len) {
- *len = buf->used;
- }
- return copy;
-}
-
-PHPSTR_API phpstr *phpstr_dup(const phpstr *buf)
-{
- phpstr *dup = phpstr_clone(buf);
- phpstr_append(dup, buf->data, buf->used);
- return dup;
-}
-
-PHPSTR_API size_t phpstr_cut(phpstr *buf, size_t offset, size_t length)
-{
- if (offset >= buf->used) {
- return 0;
- }
- if (offset + length > buf->used) {
- length = buf->used - offset;
- }
- memmove(buf->data + offset, buf->data + offset + length, buf->used - length);
- buf->used -= length;
- buf->free += length;
- return length;
-}
-
-PHPSTR_API phpstr *phpstr_sub(const phpstr *buf, size_t offset, size_t length)
-{
- if (offset >= buf->used) {
- return NULL;
- } else {
- size_t need = (length + offset) > buf->used ? (buf->used - offset) : (length - offset);
- phpstr *sub = phpstr_init_ex(NULL, need, 1);
- phpstr_append(sub, buf->data + offset, need);
- sub->size = buf->size;
- return sub;
- }
-}
-
-PHPSTR_API phpstr *phpstr_right(const phpstr *buf, size_t length)
-{
- if (length < buf->used) {
- return phpstr_sub(buf, buf->used - length, length);
- } else {
- return phpstr_sub(buf, 0, buf->used);
- }
-}
-
-
-PHPSTR_API phpstr *phpstr_merge_va(phpstr *buf, unsigned argc, va_list argv)
-{
- unsigned i = 0;
- buf = phpstr_init(buf);
-
- while (argc > i++) {
- phpstr_free_t f = va_arg(argv, phpstr_free_t);
- phpstr *current = va_arg(argv, phpstr *);
- phpstr_append(buf, current->data, current->used);
- FREE_PHPSTR(f, current);
- }
-
- return buf;
-}
-
-PHPSTR_API phpstr *phpstr_merge_ex(phpstr *buf, unsigned argc, ...)
-{
- va_list argv;
- phpstr *ret;
-
- va_start(argv, argc);
- ret = phpstr_merge_va(buf, argc, argv);
- va_end(argv);
- return ret;
-}
-
-PHPSTR_API phpstr *phpstr_merge(unsigned argc, ...)
-{
- va_list argv;
- phpstr *ret;
-
- va_start(argv, argc);
- ret = phpstr_merge_va(NULL, argc, argv);
- va_end(argv);
- return ret;
-}
-
-PHPSTR_API void phpstr_fix(phpstr *buf)
-{
- phpstr_resize_ex(buf, 1, 1);
- buf->data[buf->used] = '\0';
-}
-
-PHPSTR_API int phpstr_cmp(phpstr *left, phpstr *right)
-{
- if (left->used > right->used) {
- return -1;
- } else if (right->used > left->used) {
- return 1;
- } else {
- return memcmp(left->data, right->data, left->used);
- }
-}
-
-PHPSTR_API void phpstr_dtor(phpstr *buf)
-{
- STR_SET(buf->data, NULL);
- buf->used = 0;
- buf->free = 0;
-}
-
-PHPSTR_API void phpstr_free(phpstr **buf)
-{
- if (*buf) {
- phpstr_dtor(*buf);
- efree(*buf);
- *buf = NULL;
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
-
+++ /dev/null
-
-/* $Id$ */
-
-#ifndef _PHPSTR_H_
-#define _PHPSTR_H_
-
-#include "php.h"
-
-#ifndef PHPSTR_DEFAULT_SIZE
-# define PHPSTR_DEFAULT_SIZE 256
-#endif
-
-#ifndef STR_SET
-# define STR_SET(STR, SET) \
- { \
- STR_FREE(STR); \
- STR = SET; \
- }
-#endif
-
-#if defined(PHP_WIN32)
-# if defined(PHPSTR_EXPORTS)
-# define PHPSTR_API __declspec(dllexport)
-# elif defined(COMPILE_DL_PHPSTR)
-# define PHPSTR_API __declspec(dllimport)
-# else
-# define PHPSTR_API
-# endif
-#else
-# define PHPSTR_API
-#endif
-
-#define PHPSTR(p) ((phpstr *) (p))
-#define PHPSTR_VAL(p) (PHPSTR(p))->data
-#define PHPSTR_LEN(p) (PHPSTR(p))->used
-
-#define FREE_PHPSTR_PTR(STR) efree(STR)
-#define FREE_PHPSTR_VAL(STR) phpstr_dtor(STR)
-#define FREE_PHPSTR_ALL(STR) phpstr_free(&(STR))
-#define FREE_PHPSTR(free, STR) \
- switch (free) \
- { \
- case PHPSTR_FREE_NOT: break; \
- case PHPSTR_FREE_PTR: efree(STR); break; \
- case PHPSTR_FREE_VAL: phpstr_dtor(STR); break; \
- case PHPSTR_FREE_ALL: \
- { \
- phpstr *PTR = (STR); \
- phpstr_free(&PTR); \
- } \
- break; \
- default: break; \
- }
-
-#define RETURN_PHPSTR_PTR(STR) RETURN_PHPSTR((STR), PHPSTR_FREE_PTR, 0)
-#define RETURN_PHPSTR_VAL(STR) RETURN_PHPSTR((STR), PHPSTR_FREE_NOT, 0)
-#define RETVAL_PHPSTR_PTR(STR) RETVAL_PHPSTR((STR), PHPSTR_FREE_PTR, 0)
-#define RETVAL_PHPSTR_VAL(STR) RETVAL_PHPSTR((STR), PHPSTR_FREE_NOT, 0)
-/* RETURN_PHPSTR(buf, PHPSTR_FREE_PTR, 0) */
-#define RETURN_PHPSTR(STR, free, dup) \
- RETVAL_PHPSTR((STR), (free), (dup)); \
- return;
-
-#define RETVAL_PHPSTR(STR, free, dup) \
- phpstr_fix(STR); \
- RETVAL_STRINGL((STR)->data, (STR)->used, (dup)); \
- FREE_PHPSTR((free), (STR));
-
-typedef struct {
- size_t size;
- char *data;
- size_t used;
- size_t free;
-} phpstr;
-
-typedef enum {
- PHPSTR_FREE_NOT = 0,
- PHPSTR_FREE_PTR, /* efree() */
- PHPSTR_FREE_VAL, /* phpstr_dtor() */
- PHPSTR_FREE_ALL /* phpstr_free() */
-} phpstr_free_t;
-
-#define PHPSTR_ALL_FREE(STR) PHPSTR_FREE_ALL,(STR)
-#define PHPSTR_PTR_FREE(STR) PHPSTR_FREE_PTR,(STR)
-#define PHPSTR_VAL_FREE(STR) PHPSTR_FREE_VAL,(STR)
-#define PHPSTR_NOT_FREE(STR) PHPSTR_FREE_NOT,(STR)
-
-/* create a new phpstr */
-#define phpstr_new() phpstr_init(NULL)
-#define phpstr_init(b) phpstr_init_ex(b, 0, 0)
-#define phpstr_clone(phpstr_pointer) phpstr_init_ex(NULL, (phpstr_pointer)->size, 0)
-PHPSTR_API phpstr *phpstr_init_ex(phpstr *buf, size_t chunk_size, zend_bool pre_alloc);
-
-/* create a phpstr from a zval or c-string */
-#define phpstr_from_zval(z) phpstr_from_string(Z_STRVAL(z), Z_STRLEN(z))
-#define phpstr_from_zval_ex(b, z) phpstr_from_string_ex(b, Z_STRVAL(z), Z_STRLEN(z))
-#define phpstr_from_string(s, l) phpstr_from_string_ex(NULL, (s), (l))
-PHPSTR_API phpstr *phpstr_from_string_ex(phpstr *buf, const char *string, size_t length);
-
-/* usually only called from within the internal functions */
-#define phpstr_resize(b, s) phpstr_resize_ex((b), (s), 0)
-PHPSTR_API void phpstr_resize_ex(phpstr *buf, size_t len, size_t override_size);
-
-/* append data to the phpstr */
-#define phpstr_appends(b, a) phpstr_append((b), (a), sizeof(a)-1)
-#define phpstr_appendl(b, a) phpstr_append((b), (a), strlen(a))
-PHPSTR_API size_t phpstr_append(phpstr *buf, const char *append, size_t append_len);
-PHPSTR_API size_t phpstr_appendf(phpstr *buf, const char *format, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3);
-
-/* insert data at a specific position of the phpstr */
-#define phpstr_inserts(b, i, o) phpstr_insert((b), (i), sizeof(i)-1, (o))
-#define phpstr_insertl(b, i, o) phpstr_insert((b), (i), strlen(i), (o))
-PHPSTR_API size_t phpstr_insert(phpstr *buf, const char *insert, size_t insert_len, size_t offset);
-PHPSTR_API size_t phpstr_insertf(phpstr *buf, size_t offset, const char *format, ...) PHP_ATTRIBUTE_FORMAT(printf, 3, 4);
-
-/* prepend data */
-#define phpstr_prepends(b, p) phpstr_prepend((b), (p), sizeof(p)-1)
-#define phpstr_prependl(b, p) phpstr_prepend((b), (p), strlen(p))
-PHPSTR_API size_t phpstr_prepend(phpstr *buf, const char *prepend, size_t prepend_len);
-PHPSTR_API size_t phpstr_prependf(phpstr *buf, const char *format, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3);
-
-/* get a zero-terminated string */
-PHPSTR_API char *phpstr_data(const phpstr *buf, char **into, size_t *len);
-
-/* get a part of the phpstr */
-#define phpstr_mid(b, o, l) phpstr_sub((b), (o), (l))
-#define phpstr_left(b, l) phpstr_sub((b), 0, (l))
-PHPSTR_API phpstr *phpstr_right(const phpstr *buf, size_t length);
-PHPSTR_API phpstr *phpstr_sub(const phpstr *buf, size_t offset, size_t len);
-
-/* remove a substring */
-PHPSTR_API size_t phpstr_cut(phpstr *buf, size_t offset, size_t length);
-
-/* get a complete phpstr duplicate */
-PHPSTR_API phpstr *phpstr_dup(const phpstr *buf);
-
-/* merge several phpstr objects
- use like:
-
- phpstr *final = phpstr_merge(3,
- PHPSTR_NOT_FREE(&keep),
- PHPSTR_ALL_FREE(middle_ptr),
- PHPSTR_VAL_FREE(&local);
-*/
-PHPSTR_API phpstr *phpstr_merge(unsigned argc, ...);
-PHPSTR_API phpstr *phpstr_merge_ex(phpstr *buf, unsigned argc, ...);
-PHPSTR_API phpstr *phpstr_merge_va(phpstr *buf, unsigned argc, va_list argv);
-
-/* sets a trailing NUL byte */
-PHPSTR_API void phpstr_fix(phpstr *buf);
-
-/* free a phpstr objects contents */
-PHPSTR_API void phpstr_dtor(phpstr *buf);
-
-/* free a phpstr object completely */
-PHPSTR_API void phpstr_free(phpstr **buf);
-
-#endif
-
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+++ /dev/null
-#!/bin/bash
-rm -f warnings
-
-echo -n "executing phpize... "
-phpize 2>&1 >/dev/null
-if test $? -ne 0 ; then
- echo "FAILED!"
- exit 1
-fi
-echo "DONE"
-
-echo -n "configuring... "
-CFLAGS="-W -Wchar-subscripts -Wformat=2 -Wno-format-y2k -Wimplicit -Wmissing-braces -Wunused-variable -Wbad-function-cast -Wpointer-arith -Wsign-compare -Winline" \
- ./configure $@ >/dev/null
-if test $? -ne 0 ; then
- echo "FAILED!"
- exit 1
-fi
-echo "DONE"
-
-echo -n "building... "
-make clean install 2>warnings >/dev/null
-if test $? -ne 0 ; then
- echo "FAILED!"
-else
- echo "DONE"
-fi
-
-if test -s warnings; then
- cat warnings
-fi
-
+++ /dev/null
---TEST--
-HttpMessage
---SKIPIF--
-<?php
-include 'skip.inc';
-checkver(5);
-?>
---FILE--
-<?php
-echo "-TEST\n";
-$m = new HttpMessage(
- "HTTP/1.1 301\r\n".
- "Location: /anywhere\r\n".
- "HTTP/1.1 302\r\n".
- "Location: /somwhere\r\n".
- "HTTP/1.1 206\r\n".
- "Content-Range: bytes=2-3\r\n".
- "Transfer-Encoding: chunked\r\n".
- "\r\n".
- "01\r\n".
- "X\r\n".
- "00"
-);
-
-var_dump($m->getBody());
-var_dump($m->toString(true));
-var_dump(HttpMessage::fromString($m->toString(true))->toString(true));
-?>
---EXPECTF--
-%sTEST
-string(1) "X"
-string(134) "HTTP/1.1 301
-Location: /anywhere
-HTTP/1.1 302
-Location: /somwhere
-HTTP/1.1 206
-Content-Range: bytes=2-3
-Content-Length: 1
-
-X
-"
-string(134) "HTTP/1.1 301
-Location: /anywhere
-HTTP/1.1 302
-Location: /somwhere
-HTTP/1.1 206
-Content-Range: bytes=2-3
-Content-Length: 1
-
-X
-"
-
+++ /dev/null
---TEST--
-HttpRequestPool
---SKIPIF--
-<?php
-include 'skip.inc';
-checkver(5);
-checkcls('HttpRequestPool');
-checkurl('www.php.net');
-checkurl('pear.php.net');
-checkurl('pecl.php.net');
-checkurl('dev.iworks.at');
-?>
---FILE--
-<?php
-echo "-TEST\n";
-$pool = new HttpRequestPool(
- new HttpRequest('http://www.php.net/', HTTP_METH_HEAD),
- new HttpRequest('http://pear.php.net/', HTTP_METH_HEAD),
- new HttpRequest('http://pecl.php.net/', HTTP_METH_HEAD),
- $post = new HttpRequest('http://dev.iworks.at/.print_request.php', HTTP_METH_POST)
-);
-$post->addPostFields(array('a'=>1,'b'=>2)) ;
-$pool->send();
-foreach ($pool as $req) {
- echo $req->getUrl(), '=',
- $req->getResponseCode(), ':',
- $req->getResponseMessage()->getResponseCode(), "\n";
-}
-echo "Done\n";
-?>
---EXPECTF--
-%sTEST
-http://www.php.net/=200:200
-http://pear.php.net/=200:200
-http://pecl.php.net/=200:200
-http://dev.iworks.at/.print_request.php=200:200
-Done
+++ /dev/null
---TEST--
-HttpRequest options
---SKIPIF--
-<?php
-include 'skip.inc';
-checkver(5);
-checkcls('HttpRequest');
-?>
---FILE--
-<?php
-echo "-TEST\n";
-$r1 = new HttpRequest;
-$r2 = new HttpRequest;
-$r1->setOptions(array('redirect'=>11, 'headers'=>array('X-Foo'=>'Bar')));
-$r2->setOptions(array('redirect'=>99, 'headers'=>array('X-Bar'=>'Foo')));
-$o1 = $r1->getOptions();
-$o2 = $r2->getOptions();
-$r1->setOptions($o2);
-$r2->setOptions($o1);
-print_r(array($o1, $o2));
-var_dump(serialize($r1->getOptions()) === serialize($r2->getOptions()));
-$r1 = null;
-$r2 = null;
-?>
---EXPECTF--
-%sTEST
-Array
-(
- [0] => Array
- (
- [redirect] => 11
- [headers] => Array
- (
- [X-Foo] => Bar
- [X-Bar] => Foo
- )
-
- )
-
- [1] => Array
- (
- [redirect] => 99
- [headers] => Array
- (
- [X-Bar] => Foo
- [X-Foo] => Bar
- )
-
- )
-
-)
-bool(false)
+++ /dev/null
---TEST--
-HttpRequest GET/POST
---SKIPIF--
-<?php
-include 'skip.inc';
-checkver(5);
-checkcls('HttpRequest');
-checkurl('www.google.com');
-checkurl('dev.iworks.at');
-?>
---FILE--
-<?php
-echo "-TEST\n";
-
-$r = new HttpRequest('http://www.google.com', HttpRequest::METH_GET);
-$r->send();
-print_r($r->getResponseInfo());
-
-$r = new HttpRequest('http://dev.iworks.at/.print_request.php', HTTP_METH_POST);
-$r->addCookies(array('MyCookie' => 'foobar'));
-$r->addQueryData(array('gq'=>'foobar','gi'=>10));
-$r->addPostFields(array('pq'=>'foobar','pi'=>10));
-$r->addPostFile('upload', dirname(__FILE__).'/data.txt', 'text/plain');
-$r->send();
-echo $r->getResponseBody();
-var_dump($r->getResponseMessage()->getResponseCode());
-
-echo "Done";
-?>
---EXPECTF--
-%sTEST
-Array
-(
- [effective_url] => http://www.google.com/
- [response_code] => %d
- [http_connectcode] => %d
- [filetime] => %s
- [total_time] => %f
- [namelookup_time] => %f
- [connect_time] => %f
- [pretransfer_time] => %f
- [starttransfer_time] => %f
- [redirect_time] => %f
- [redirect_count] => %f
- [size_upload] => %f
- [size_download] => %d
- [speed_download] => %d
- [speed_upload] => %d
- [header_size] => %d
- [request_size] => %d
- [ssl_verifyresult] => %d
- [content_length_download] => %d
- [content_length_upload] => %d
- [content_type] => %s
- [httpauth_avail] => %d
- [proxyauth_avail] => %s
-)
-Array
-(
- [gq] => foobar
- [gi] => 10
- [pq] => foobar
- [pi] => 10
- [MyCookie] => foobar
-)
-Array
-(
- [upload] => Array
- (
- [name] => data.txt
- [type] => text/plain
- [tmp_name] => %s
- [error] => 0
- [size] => 1010
- )
-
-)
-
-int(200)
-Done
+++ /dev/null
---TEST--
-HttpRequest SSL
---SKIPIF--
-<?php
-include 'skip.inc';
-checkver(5);
-checkcls('HttpRequest');
-checkurl('arweb.info');
-?>
---FILE--
-<?php
-echo "-TEST\n";
-$r = new HttpRequest('https://ssl.arweb.info/iworks/data.txt');
-$r->send();
-var_dump($r->getResponseBody());
-?>
---EXPECTF--
-%sTEST
-string(10) "1234567890"
-
+++ /dev/null
---TEST--
-HttpResponse - send data with caching headers
---SKIPIF--
-<?php
-include 'skip.inc';
-checkver(5);
-checkcgi();
-?>
---FILE--
-<?php
-HttpResponse::setCache(true);
-HttpResponse::setCacheControl('public', 3600);
-HttpResponse::setData('foobar');
-HttpResponse::send();
-?>
---EXPECTF--
-X-Powered-By: PHP/%s
-ETag: "3858f62230ac3c915f300c664312c63f"
-Cache-Control: public, must-revalidate, max_age=3600
-Last-Modified: %s, %d %s 20%d %d:%d:%d GMT
-Content-Type: %s
-Accept-Ranges: bytes
-Content-Length: 6
-
-foobar
\ No newline at end of file
+++ /dev/null
---TEST--
-HttpResponse - send gzipped file
---SKIPIF--
-<?php
-include 'skip.inc';
-checkver(5);
-checkcgi();
-checkext('zlib');
-?>
---ENV--
-HTTP_ACCEPT_ENCODING=gzip
---FILE--
-<?php
-HttpResponse::setGzip(true);
-HttpResponse::setFile(__FILE__);
-HttpResponse::send();
-?>
---EXPECTF--
-X-Powered-By: PHP/%s
-Content-Type: %s
-Accept-Ranges: bytes
-Content-Encoding: gzip
-Vary: Accept-Encoding
-
-%s
+++ /dev/null
---TEST--
-INI entries
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---FILE--
-<?php
-echo "-TEST\n";
-ini_set('http.cache_log', 'cache.log');
-var_dump(ini_get('http.cache_log'));
-ini_set('http.allowed_methods', 'POST, HEAD, GET');
-var_dump(ini_get('http.allowed_methods'));
-ini_set('http.only_exceptions', true);
-var_dump(ini_get('http.only_exceptions'));
-echo "Done\n";
-?>
---EXPECTF--
-%sTEST
-string(9) "cache.log"
-string(15) "POST, HEAD, GET"
-string(1) "1"
-Done
-
+++ /dev/null
---TEST--
-http_absolute_uri() with relative paths
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---FILE--
-<?php
-echo "-TEST\n";
-echo http_absolute_uri('page'), "\n";
-echo http_absolute_uri('with/some/path/'), "\n";
-?>
---EXPECTF--
-%sTEST
-http://localhost/page
-http://localhost/with/some/path/
-
+++ /dev/null
---TEST--
-http_absolute_uri() with proto
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---FILE--
-<?php
-echo "-TEST\n";
-echo http_absolute_uri('sec', 'https'), "\n";
-echo http_absolute_uri('/pub', 'ftp'), "\n";
-echo http_absolute_uri('/', null), "\n";
-?>
---EXPECTF--
-%sTEST
-https://localhost/sec
-ftp://localhost/pub
-http://localhost/
-
+++ /dev/null
---TEST--
-allowed methods
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---FILE--
-<?php
-include 'log.inc';
-log_prepare(_AMETH_LOG);
-ini_set('http.allowed_methods', 'POST');
-echo "Done\n";
-?>
---EXPECTF--
-Status: 405
-Content-type: %s
-X-Powered-By: PHP/%s
-Allow: POST
-
+++ /dev/null
---TEST--
-logging allowed methods
---SKIPIF--
-include 'skip.inc';
-checkcgi();
---ENV--
-HTTP_HOST=example.com
---FILE--
-<?php
-echo "-TEST\n";
-include 'log.inc';
-log_content(_AMETH_LOG);
-echo "Done";
-?>
---EXPECTF--
-%sTEST
-%d%d%d%d-%d%d-%d%d %d%d:%d%d:%d%d [405-ALLOWED] Allow: POST <%s>
-Done
+++ /dev/null
---TEST--
-http_chunked_decode() "\r\n"
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---FILE--
-<?php
-echo "-TEST\n";
-$data =
-"02\r\n".
-"ab\r\n".
-"04\r\n".
-"ra\nc\r\n".
-"06\r\n".
-"adabra\r\n".
-"0\r\n".
-"nothing\n";
-var_dump(http_chunked_decode($data));
-?>
---EXPECTF--
-%sTEST
-string(12) "abra
-cadabra"
-
+++ /dev/null
---TEST--
-http_chunked_decode() "\n"
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---FILE--
-<?php
-echo "-TEST\n";
-$data =
-"02\n".
-"ab\n".
-"04\n".
-"ra\nc\n".
-"06\n".
-"adabra\n".
-"0\n".
-"hidden\n";
-var_dump(http_chunked_decode($data));
-?>
---EXPECTF--
-%sTEST
-string(12) "abra
-cadabra"
-
+++ /dev/null
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+++ /dev/null
---TEST--
-http_date() with timestamp
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---FILE--
-<?php
-echo "-TEST\n";
-echo http_date(1), "\n";
-echo http_date(1234567890), "\n";
-?>
---EXPECTF--
-%sTEST
-Thu, 01 Jan 1970 00:00:01 GMT
-Fri, 13 Feb 2009 23:31:30 GMT
-
+++ /dev/null
---TEST--
-http_date() without timestamp
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---INI--
-date.timezone=GMT
---FILE--
-<?php
-echo "-TEST\n";
-$d = http_date();
-$t = strtotime($d);
-var_dump($t > 1);
-echo "$t\n$d\nDone\n";
-?>
---EXPECTF--
-%sTEST
-bool(true)
-%d
-%s, %d %s %d %d:%d:%d GMT
-Done
+++ /dev/null
---TEST--
-get request data
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---ENV--
-HTTP_ACCEPT_CHARSET=iso-8859-1, *
-HTTP_ACCEPT_ENCODING=none
-HTTP_USER_AGENT=Mozilla/5.0
-HTTP_HOST=localhost
---POST--
-a=b&c=d
---FILE--
-<?php
-echo "-TEST\n";
-$h = http_get_request_headers();
-ksort($h);
-print_r($h);
-$b = http_get_request_body();
-if (php_sapi_name() == 'cli' || $b == 'a=b&c=d') {
- echo "OK\n";
-}
-?>
-===DONE===
---EXPECTF--
-%sTEST
-Array
-(
- [Accept-Charset] => iso-8859-1, *
- [Accept-Encoding] => none
- [Host] => localhost
- [User-Agent] => Mozilla/5.0
-)
-OK
-===DONE===
+++ /dev/null
---TEST--
-negotiation
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---ENV--
-HTTP_ACCEPT_LANGUAGE=de-AT,de-DE;q=0.8,en-GB;q=0.3,en-US;q=0.2
-HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7
---FILE--
-<?php
-echo "-TEST\n";
-$langs = array(
- array('de', 'en', 'es'),
-);
-$csets = array(
- array('utf-8', 'iso-8859-1'),
-);
-var_dump(http_negotiate_language($langs[0]));
-print_r(http_negotiate_language($langs[0], true));
-var_dump(http_negotiate_charset($csets[0]));
-print_r(http_negotiate_charset($csets[0], true));
-echo "Done\n";
---EXPECTF--
-%sTEST
-string(2) "de"
-Array
-(
- [de] => 500
- [en] => 0.15
-)
-string(10) "iso-8859-1"
-Array
-(
- [iso-8859-1] => 1000
- [utf-8] => 0.7
-)
-Done
+++ /dev/null
---TEST--
-http_parse_headers()
---SKIPIF--
-<?php
-include 'skip.inc';
-?>
---FILE--
-<?php
-echo "-TEST\n";
-print_r(http_parse_headers(
-"Host: localhost\r\n".
-"Host: ambigious\r\n".
-"Nospace:here\r\n".
-"Muchspace: there \r\n".
-"Empty:\r\n".
-"Empty2: \r\n".
-": invalid\r\n".
-" : bogus\r\n".
-"Folded: one\r\n".
-"\ttwo\r\n".
-" three\r\n".
-"stop\r\n"
-));
-?>
---EXPECTF--
-%sTEST
-Array
-(
- [Host] => Array
- (
- [0] => localhost
- [1] => ambigious
- )
-
- [Nospace] => here
- [Muchspace] => there
- [Empty] =>
- [Empty2] =>
- [Folded] => one
- two
- three
-)
-
+++ /dev/null
---TEST--
-http_parse_message()
---SKIPIF--
-include 'skip.inc';
-checkurl('www.google.com');
---FILE--
-<?php
-echo "-TEST\n";
-echo http_parse_message(http_get('http://www.google.com'))->body;
-echo "Done\n";
---EXPECTF--
-%sTEST
-<HTML>%sThe document has moved%s</HTML>
-Done
+++ /dev/null
---TEST--
-http_redirect() with params
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_HOST=localhost
---FILE--
-<?php
-include 'log.inc';
-log_prepare(_REDIR_LOG);
-http_redirect('redirect', array('a' => 1, 'b' => 2));
-?>
---EXPECTF--
-Status: 302
-Content-type: text/html
-X-Powered-By: PHP/%s
-Location: http://localhost/redirect?a=1&b=2
-
-Redirecting to <a href="http://localhost/redirect?a=1&b=2">http://localhost/redirect?a=1&b=2</a>.
-
+++ /dev/null
---TEST--
-logging redirects
---SKIPIF--
-include 'skip.inc';
-checkcgi();
---ENV--
-HTTP_HOST=example.com
---FILE--
-<?php
-echo "-TEST\n";
-include 'log.inc';
-log_content(_REDIR_LOG);
-echo "Done";
-?>
---EXPECTF--
-%sTEST
-%d%d%d%d-%d%d-%d%d %d%d:%d%d:%d%d [302-REDIRECT] Location: http%s <%s>
-Done
+++ /dev/null
---TEST--
-http_redirect() with session
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_HOST=localhost
---FILE--
-<?php
-include 'log.inc';
-log_prepare(_REDIR_LOG);
-session_start();
-http_redirect('redirect', array('a' => 1), true);
-?>
---EXPECTF--
-Status: 302
-Content-type: text/html
-X-Powered-By: PHP/%s
-Set-Cookie: PHPSESSID=%s; path=/
-Expires: %s
-Cache-Control: %s
-Pragma: %s
-Location: http://localhost/redirect?a=1&PHPSESSID=%s
+++ /dev/null
---TEST--
-logging redirects
---SKIPIF--
-include 'skip.inc';
-checkcgi();
---ENV--
-HTTP_HOST=example.com
---FILE--
-<?php
-echo "-TEST\n";
-include 'log.inc';
-log_content(_REDIR_LOG);
-echo "Done";
-?>
---EXPECTF--
-%sTEST
-%d%d%d%d-%d%d-%d%d %d%d:%d%d:%d%d [302-REDIRECT] Location: http%s <%s>
-Done
+++ /dev/null
---TEST--
-http_redirect() permanent
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_HOST=localhost
---FILE--
-<?php
-include 'log.inc';
-log_prepare(_REDIR_LOG);
-http_redirect('redirect', null, false, true);
-?>
---EXPECTF--
-Status: 301
-Content-type: text/html
-X-Powered-By: PHP/%s
-Location: http://localhost/redirect
-
-Redirecting to <a href="http://localhost/redirect">http://localhost/redirect</a>.
-
+++ /dev/null
---TEST--
-logging redirects
---SKIPIF--
-include 'skip.inc';
-checkcgi();
---ENV--
-HTTP_HOST=example.com
---FILE--
-<?php
-echo "-TEST\n";
-include 'log.inc';
-log_content(_REDIR_LOG);
-echo "Done";
-?>
---EXPECTF--
-%sTEST
-%d%d%d%d-%d%d-%d%d %d%d:%d%d:%d%d [301-REDIRECT] Location: http%s <%s>
-Done
+++ /dev/null
---TEST--
-http_send_data() NIL-NUM range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=-5
---FILE--
-<?php
-http_send_content_type('text/plain');
-http_send_data(str_repeat('123abc', 1000));
-?>
---EXPECTF--
-Status: 206
-X-Powered-By: PHP/%s
-Content-Type: text/plain
-Accept-Ranges: bytes
-Content-Range: bytes 5995-5999/6000
-
-23abc
\ No newline at end of file
+++ /dev/null
---TEST--
-http_send_data() NUM-NUM range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=5-6
---FILE--
-<?php
-http_send_content_type('text/plain');
-http_send_data(str_repeat('123abc', 1000));
-?>
---EXPECTF--
-Status: 206
-X-Powered-By: PHP/%s
-Content-Type: text/plain
-Accept-Ranges: bytes
-Content-Range: bytes 5-6/6000
-
-c1
\ No newline at end of file
+++ /dev/null
---TEST--
-http_send_data() NUM-NIL range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=5981-
---FILE--
-<?php
-http_send_content_type('text/plain');
-http_send_data(str_repeat('123abc', 1000));
-?>
---EXPECTF--
-Status: 206
-X-Powered-By: PHP/%s
-Content-Type: text/plain
-Accept-Ranges: bytes
-Content-Range: bytes 5981-5999/6000
-
-c123abc123abc123abc
\ No newline at end of file
+++ /dev/null
---TEST--
-http_send_data() syntactically invalid range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=123,-wtf ?
---FILE--
-<?php
-http_send_content_type('text/plain');
-http_send_data(str_repeat('123abc', 1000));
-?>
---EXPECTF--
-X-Powered-By: PHP/%s
-Content-Type: text/plain
-Accept-Ranges: bytes
-Content-Length: 6000
-
-123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc
\ No newline at end of file
+++ /dev/null
---TEST--
-http_send_data() oversized range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=5990-6000
---FILE--
-<?php
-http_send_content_type('text/plain');
-http_send_data(str_repeat('123abc', 1000));
-?>
---EXPECTF--
-Status: 416
-%s
\ No newline at end of file
+++ /dev/null
---TEST--
-http_send_data() multiple ranges
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=0-3, 4-5,9-11
---FILE--
-<?php
-http_send_content_type('text/plain');
-http_send_data(str_repeat('123abc', 1000));
-?>
---EXPECTF--
-Status: 206
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Type: multipart/byteranges; boundary=%d.%d
-
-
---%d.%d
-Content-Type: text/plain
-Content-Range: bytes 0-3/6000
-
-123a
---%d.%d
-Content-Type: text/plain
-Content-Range: bytes 4-5/6000
-
-bc
---%d.%d
-Content-Type: text/plain
-Content-Range: bytes 9-11/6000
-
-abc
---%d.%d--
+++ /dev/null
---TEST--
-http_send_data() etag caching
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_IF_NONE_MATCH="0bee89b07a248e27c83fc3d5951213c1"
---FILE--
-<?php
-include 'log.inc';
-log_prepare(_CACHE_LOG);
-http_cache_etag();
-http_send_data("abc\n");
-?>
---EXPECTF--
-Status: 304
-Content-type: text/html
-X-Powered-By: PHP/%s
-Cache-Control: private, must-revalidate, max-age=0
-%s
+++ /dev/null
---TEST--
-logging caching
---SKIPIF--
-include 'skip.inc';
-checkcgi();
---ENV--
-HTTP_HOST=example.com
---FILE--
-<?php
-echo "-TEST\n";
-include 'log.inc';
-log_content(_CACHE_LOG);
-echo "Done";
-?>
---EXPECTF--
-%sTEST
-%d%d%d%d-%d%d-%d%d %d%d:%d%d:%d%d [304-CACHE] ETag: "%s" <%s>
-Done
+++ /dev/null
---TEST--
-http_send_data() HTTP_SENDBUF_SIZE long string
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---FILE--
-<?php
-http_throttle(0.01, 20);
-http_send_data('00000000000000000000');
-?>
---EXPECTF--
-Content-type: text/html
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Length: 20
-
-00000000000000000000
\ No newline at end of file
+++ /dev/null
---TEST--
-http_send_data() last modified caching
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---FILE--
-<?php
-http_cache_last_modified(-5);
-http_send_data("abc\n");
-?>
---EXPECTF--
-Content-type: text/html
-X-Powered-By: PHP/%s
-Cache-Control: private, must-revalidate, max-age=0
-Last-Modified: %s, %d %s %d %d:%d:%d GMT
-Accept-Ranges: bytes
-Content-Length: 4
-
-abc
+++ /dev/null
---TEST--
-http_send_file()
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---FILE--
-<?php
-http_send_file('data.txt');
-?>
---EXPECTF--
-Content-type: text/html
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Length: 1010
-
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+++ /dev/null
---TEST--
-http_send_file() NUM-NUM range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=5-9
---FILE--
-<?php
-http_send_file('data.txt');
-?>
---EXPECTF--
-Status: 206
-Content-type: text/html
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Range: bytes 5-9/1010
-
-56789
\ No newline at end of file
+++ /dev/null
---TEST--
-http_send_file() NIL-NUM range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=-9
---FILE--
-<?php
-http_send_file('data.txt');
-?>
---EXPECTF--
-Status: 206
-Content-type: text/html
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Range: bytes 1001-1009/1010
-
-23456789
+++ /dev/null
---TEST--
-http_send_file() NUM-NIL range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=1000-
---FILE--
-<?php
-http_send_file('data.txt');
-?>
---EXPECTF--
-Status: 206
-Content-type: text/html
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Range: bytes 1000-1009/1010
-
-123456789
+++ /dev/null
---TEST--
-http_send_file() multiple ranges
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=0-3, 4-5,9-11
---FILE--
-<?php
-http_send_content_type('text/plain');
-http_send_file('data.txt');
-?>
---EXPECTF--
-Status: 206
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Type: multipart/byteranges; boundary=%d.%d
-
-
---%d.%d
-Content-Type: text/plain
-Content-Range: bytes 0-3/1010
-
-0123
---%d.%d
-Content-Type: text/plain
-Content-Range: bytes 4-5/1010
-
-45
---%d.%d
-Content-Type: text/plain
-Content-Range: bytes 9-11/1010
-
-901
---%d.%d--
+++ /dev/null
---TEST--
-http_send_file() syntactically invalid range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=xxx
---FILE--
-<?php
-http_send_file('data.txt');
-?>
---EXPECTF--
-Content-type: text/html
-X-Powered-By: PHP/%s
-Accept-Ranges: bytes
-Content-Length: 1010
-
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+++ /dev/null
---TEST--
-http_send_file() oversized range
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-?>
---ENV--
-HTTP_RANGE=bytes=-1111
---FILE--
-<?php
-http_send_file('data.txt');
-?>
---EXPECTF--
-Status: 416
-Content-type: text/html
-X-Powered-By: PHP/%s
+++ /dev/null
-<?php
-defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
-function skipif($if, $skip) { if ($if) { fprintf(STDOUT, "skip $skip"); exit(); }}
-function checkcgi() { skipif(!strncasecmp('CLI', PHP_SAPI, 3), 'need CGI SAPI'); }
-function checkext($ext) { skipif(!extension_loaded($ext), "need ext/$ext"); }
-function checkver($ver) { skipif(round($ver,1) > round((double) PHP_VERSION,1), "need PHP v$ver"); }
-function checkurl($url) { skipif(!@fsockopen($url, 80), "$url not responsive"); }
-function checkcls($cls) { skipif(!class_exists($cls), "need class $cls"); }
-checkext('http');
-?>