/* $Id$ */
+#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+#include <ctype.h>
+
#include "php.h"
#include "php_version.h"
#include "php_streams.h"
#include "php_http.h"
#include "php_http_api.h"
-#include <ctype.h>
-#if defined(HAVE_CURL) && HAVE_CURL
+#ifdef HTTP_HAVE_CURL
+
+#ifdef PHP_WIN32
+#include <winsock2.h>
+#include <sys/types.h>
+#endif
+
#include <curl/curl.h>
#include <curl/easy.h>
#endif
+
ZEND_DECLARE_MODULE_GLOBALS(http)
/* {{{ day/month names */
static int check_tzone(char *tzone);
/* {{{ HAVE_CURL */
-#if defined(HAVE_CURL) && HAVE_CURL
+#ifdef HTTP_HAVE_CURL
#define http_curl_initbuf(m) _http_curl_initbuf((m) TSRMLS_CC)
static inline void _http_curl_initbuf(http_curlbuf_member member TSRMLS_DC);
#define http_curl_freebuf(m) _http_curl_freebuf((m) TSRMLS_CC)
/* }}} */
/* {{{ HAVE_CURL */
-#if defined(HAVE_CURL) && HAVE_CURL
+#ifdef HTTP_HAVE_CURL
/* {{{ static inline void http_curl_initbuf(http_curlbuf_member) */
static inline void _http_curl_initbuf(http_curlbuf_member member TSRMLS_DC)
curl_easy_setopt(ch, CURLOPT_AUTOREFERER, 1);
curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, http_curl_body_callback);
curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, http_curl_hdrs_callback);
-#if defined(ZTS)
+#ifdef ZTS
curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1);
#endif
-#if defined(PHP_DEBUG)
- curl_easy_setopt(ch, CURLOPT_VERBOSE, 1);
-#endif
if ((!options) || (1 > zend_hash_num_elements(options))) {
return;
if (mode & PHP_OUTPUT_HANDLER_END) {
PHP_MD5Final(digest, &HTTP_G(etag_md5));
-
+
/* just do that if desired */
if (HTTP_G(etag_started)) {
- make_digest(etag, digest);
+ make_digest(etag, digest);
- if (http_etag_match("HTTP_IF_NONE_MATCH", etag)) {
- http_send_status(304);
- } else {
- http_send_etag(etag, 32);
- }
+ if (http_etag_match("HTTP_IF_NONE_MATCH", etag)) {
+ http_send_status(304);
+ } else {
+ http_send_etag(etag, 32);
+ }
}
}
chr_ptr = 0;
}
retval = (t <= http_parse_date(modified));
-#if defined(PHP_DEBUG)
- fprintf(stderr,
- "\nComparing Last-Modified %s(%s)==%d:\n\t%d\n\t%d\n\n",
- get_active_function_name(TSRMLS_C), entry, retval, t,
- http_parse_date(modified));
-#endif
efree(modified);
return retval;
}
} else {
result = (NULL != strstr(Z_STRVAL_P(zetag), quoted_etag));
}
-#if defined(PHP_DEBUG)
- fprintf(stderr,
- "\nComparing E-Tag %s(%s)==%d:\n\t<%s>\n\t<%s>\n\n",
- get_active_function_name(TSRMLS_C), entry, result,
- Z_STRVAL_P(zetag), quoted_etag);
-#endif
efree(quoted_etag);
return result;
}
date = http_date(t);
strcat(modified, date);
efree(date);
-
+
/* remember */
HTTP_G(lmod) = t;
-
+
return http_send_header(modified);
}
/* }}} */
snprintf(etag_header, header_len, "ETag: \"%s\"", etag);
ret = http_send_header(etag_header);
efree(etag_header);
-
+
/* remember */
if (HTTP_G(etag)) {
efree(HTTP_G(etag));
}
HTTP_G(etag) = estrdup(etag);
-
+
return ret;
}
/* }}} */
if (NULL != (q_ptr = strrchr(Z_STRVAL_PP(zentry), ';'))) {
qual = strtod(q_ptr + 3, NULL);
} else {
- qual = 1000.0 - 1;
+ qual = 1000.0 - i;
}
/* walk through the supported array */
PHP_HTTP_API http_range_status _http_get_request_ranges(zval *zranges,
const size_t length TSRMLS_DC)
{
- zval *zrange, *zentry, **zentries;
+ zval *zrange;
char *range, c;
long begin = -1, end = -1, *ptr;
case ' ':
/* IE - ignore for now */
break;
-
+
case 0:
case ',':
break;
}
}
-
- zentry = (zval *) zentries++;
- MAKE_STD_ZVAL(zentry);
- array_init(zentry);
- add_index_long(zentry, 0, begin);
- add_index_long(zentry, 1, end);
- add_next_index_zval(zranges, zentry);
-
- begin = -1;
- end = -1;
- ptr = &begin;
+ {
+ zval *zentry;
+ MAKE_STD_ZVAL(zentry);
+ array_init(zentry);
+ add_index_long(zentry, 0, begin);
+ add_index_long(zentry, 1, end);
+ add_next_index_zval(zranges, zentry);
+
+ begin = -1;
+ end = -1;
+ ptr = &begin;
+ }
break;
default:
{
char *new_etag = NULL;
int is_range_request = http_is_range_request();
-
+
if (!data_ptr) {
return FAILURE;
}
/* etag handling */
if (HTTP_G(etag_started)) {
new_etag = (char *) emalloc(33);
-
+
/* never ever use the output to compute the ETag if http_send() is used */
HTTP_G(etag_started) = 0;
php_end_ob_buffer(0, 0 TSRMLS_CC);
http_send_etag(new_etag, 32);
efree(new_etag);
}
-
+
/* send 304 Not Modified if last-modified matches*/
if ((!is_range_request) && http_modified_match("HTTP_IF_MODIFIED_SINCE", HTTP_G(lmod))) {
return http_send_status(304);
((!zend_hash_exists(HTTP_SERVER_VARS, "HTTP_IF_UNMODIFIED_SINCE", 25)) ||
http_modified_match("HTTP_IF_UNMODIFIED_SINCE", HTTP_G(lmod)))
) {
-
+
STATUS result = FAILURE;
zval *zranges = NULL;
MAKE_STD_ZVAL(zranges);
/* }}} */
/* {{{ HAVE_CURL */
-#if defined(HAVE_CURL) && HAVE_CURL
+#ifdef HTTP_HAVE_CURL
/* {{{ STATUS http_get(char *, HashTable *, HashTable *, char **, size_t *) */
PHP_HTTP_API STATUS _http_get(const char *URL, HashTable *options,