/* $Id$ */
-#define _WINSOCKAPI_
-#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
-
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
}
/* }}} */
-/* {{{ proto string http_absolute_uri(string url[, string proto])
+/* {{{ 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,
*/
PHP_FUNCTION(http_absolute_uri)
{
- char *url = NULL, *proto = NULL;
- int url_len = 0, proto_len = 0;
+ 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|s", &url, &url_len, &proto, &proto_len) != SUCCESS) {
+ 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(url, proto), 0);
+ RETURN_STRING(http_absolute_uri_ex(url, url_len, proto, proto_len, host, host_len, port), 0);
}
/* }}} */
}
/* }}} */
-/* {{{ proto bool http_match_modified([int timestamp])
+/* {{{ 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, "|l", &t) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lb", &t, &for_range) != SUCCESS) {
RETURN_FALSE;
}
t = (long) time(NULL);
}
- RETURN_BOOL(http_modified_match("HTTP_IF_MODIFIED_SINCE", t) || http_modified_match("HTTP_IF_UNMODIFIED_SINCE", t));
+ if (for_range) {
+ RETURN_BOOL(http_modified_match("HTTP_IF_UNMODIFIED_SINCE", t));
+ }
+ RETURN_BOOL(http_modified_match("HTTP_IF_MODIFIED_SINCE", t));
}
/* }}} */
-/* {{{ proto bool http_match_etag(string etag)
+/* {{{ 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.
{
int etag_len;
char *etag;
+ zend_bool for_range = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &etag, &etag_len) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &etag, &etag_len, &for_range) != SUCCESS) {
RETURN_FALSE;
}
- RETURN_BOOL(http_etag_match("HTTP_IF_NONE_MATCH", etag) || http_etag_match("HTTP_IF_MATCH", etag));
+ if (for_range) {
+ RETURN_BOOL(http_etag_match("HTTP_IF_MATCH", etag));
+ }
+ RETURN_BOOL(http_etag_match("HTTP_IF_NONE_MATCH", etag));
}
/* }}} */
*/
PHP_FUNCTION(http_cache_etag)
{
- char *etag;
+ char *etag = NULL;
int etag_len = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &etag, &etag_len) != SUCCESS) {
}
}
- URI = http_absolute_uri(url, NULL);
+ URI = http_absolute_uri(url);
+
if (query_len) {
snprintf(LOC, HTTP_URI_MAXLEN + sizeof("Location: "), "Location: %s?%s", URI, query);
sprintf(RED, "Redirecting to <a href=\"%s?%s\">%s?%s</a>.\n", URI, query, URI, query);
convert_to_string_ex(&zdata);
http_send_header("Accept-Ranges: bytes");
- RETURN_SUCCESS(http_send_data(zdata));
+ RETURN_SUCCESS(http_send_data(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata)));
}
/* }}} */
*/
PHP_FUNCTION(http_send_file)
{
- zval *zfile;
+ char *file;
+ int flen = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zfile) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &flen) != SUCCESS) {
+ RETURN_FALSE;
+ }
+ if (!flen) {
RETURN_FALSE;
}
- convert_to_string_ex(&zfile);
http_send_header("Accept-Ranges: bytes");
- RETURN_SUCCESS(http_send_file(zfile));
+ RETURN_SUCCESS(http_send_file(file));
}
/* }}} */
* 0 => array(
* 'Status' => '200 Ok',
* 'Content-Type' => 'text/plain',
+
* 'Content-Language' => 'en-US'
* ),
* 1 => "Hello World!"
RETURN_FALSE;
}
- convert_to_string_ex(&zresponse);
+ convert_to_string(zresponse);
MAKE_STD_ZVAL(zbody);
MAKE_STD_ZVAL(zheaders);
header_len = rnrn - header + 2;
}
if (SUCCESS != http_parse_headers(header, header_len, return_value)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not parse HTTP header");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not parse HTTP headers");
zval_dtor(return_value);
RETURN_FALSE;
}
*/
PHP_FUNCTION(http_get_request_headers)
{
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
+ NO_ARGS;
array_init(return_value);
http_get_request_headers(return_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
* </pre>
*
* The optional third parameter will be filled with some additional information
* }
* return false;
* }
- *
* if (!http_auth_basic_cb('auth_cb')) {
* die('<h1>Authorization failed</h1>');
* }
/* }}}*/
/* {{{ Sara Golemons http_build_query() */
-#ifndef ZEND_ENGINE_2
+#ifndef ZEND_ENGINE_2
/* {{{ proto string http_build_query(mixed formdata [, string prefix])
Generates a form-encoded query string from an associative array or object. */
* End:
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
- */
\ No newline at end of file
+ */
+