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])
)
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 ----
AC_DEFINE([HTTP_HAVE_MAGIC], [1], [Have magic mime support])
fi
+dnl ----
+dnl HASH
+dnl ----
+
+ dnl TODO
+
dnl ----
dnl DONE
dnl ----
dnl outside src dir, adds install-http target
PHP_ADD_MAKEFILE_FRAGMENT
dnl within src dir, installs http headers
- ifdef([PHP_INSTALL_HEADERS], [PHP_INSTALL_HEADERS(ext/http, $PHP_HTTP_HEADER_FILES)], [ ])
+ ifdef([PHP_INSTALL_HEADERS], [PHP_INSTALL_HEADERS(ext/http, $PHP_HTTP_HEADERS)], [ ])
AC_DEFINE([HAVE_HTTP], [1], [Have extended HTTP support])
fi
}
if (PHP_HASH != "no") {
- if (glob(configure_module_dirname +"\\..\\hash\\php_hash_sha.h").length) {
- ADD_FLAG("CFLAGS_HTTP", "/I"+ configure_module_dirname +"\\..\\hash");
- AC_DEFINE("HTTP_HAVE_HASH_EXT_INCLUDES", 1, "");
+ var f;
+ STDOUT.Write("Checking for ext/hash ... ");
+ if (glob((f = configure_module_dirname +"\\..\\hash") +"\\php_hash.h").length ||
+ glob((f = configure_module_dirname +"\\..\\..\\..\\pecl\\hash") +"\\php_hash.h").length) {
+ ADD_FLAG("CFLAGS_HTTP", "/I"+ f);
+ AC_DEFINE("HTTP_HAVE_EXT_HASH", 1, "");
+ ADD_EXTENSION_DEP("http", "hash", true);
+ STDOUT.WriteLine(condense_path(f));
+ } else {
+ STDOUT.WriteLine("<not found>");
}
}
- 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") &&
<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 /><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">, </span><span style="color: #0000BB">$result</span><span style="color: #007700">);<br /><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 /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span><br />
</span></code></blockquote></p>
<p></pre></p>
+<h2 id="http_negotiate_content_type">string http_negotiate_ctype(array supported[, array &result])</h2>
+<p>This function negotiates the clients preferred content type based on its<br />
+Accept HTTP header. The qualifier is recognized and content types <br />
+without qualifier are rated highest.</p>
+<p>Expects an array as parameter cotaining the supported content types as values.<br />
+If the optional second parameter is supplied, it will be filled with an<br />
+array containing the negotiation results.</p>
+<p>Returns the negotiated content type or the default content type <br />
+(i.e. first array entry) if none match.</p>
+<p>Example:</p><pre><blockquote><code><span style="color: #000000"><br />
+<span style="color: #0000BB"><?php<br />$ctypes </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'application/xhtml+xml'</span><span style="color: #007700">, </span><span style="color: #DD0000">'text/html'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">http_send_content_type</span><span style="color: #007700">(</span><span style="color: #0000BB">http_negotiate_content_type</span><span style="color: #007700">(</span><span style="color: #0000BB">$ctypes</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?></span><br />
+</span></code></blockquote></p>
+<p></pre></p>
<h2 id="http_send_status">bool http_send_status(int status)</h2>
<p>Send HTTP status code.</p>
<p>Expects an HTTP status code as parameter.</p>
and SSL requests can be issued <br />
<li> HTTP_SUPPORT_ENCODINGS: whether ext/http was linked against zlib,<br />
and compressed HTTP responses can be decoded<br />
- <li> HTTP_SUPPORT_MHASHETAGS: whether ext/http was linked against libmhash,<br />
- and ETags can be generated with the available mhash algorithms<br />
<li> HTTP_SUPPORT_MAGICMIME: whether ext/http was linked against libmagic,<br />
and the HttpResponse::guessContentType() method is usable<br />
</ul></p>
<p>Accepts a bool parameter which specifies whether the returned string<br />
should also contain any parent messages.</p>
<p>Returns the full message as string.</p>
+<h3 id="HttpMessage_count">int HttpMessage::count()</h3>
+<p>Implements Countable.</p>
+<p>Returns the number of parent messages + 1.</p>
+<h3 id="HttpMessage_serialize">string HttpMessage::serialize()</h3>
+<p>Implements Serializable.</p>
+<p>Returns the serialized representation of the HttpMessage.</p>
+<h3 id="HttpMessage_unserialize">void HttpMessage::unserialize(string serialized)</h3>
+<p>Implements Serializable.</p>
+<p>Re-constructs the HttpMessage based upon the serialized string.</p>
<hr noshade>
<h1 id="http_request_object.c">http_request_object.c</h1>
<h2 id="HttpRequest" class="o">HttpRequest</h2>
references the last received response. Use HttpMessage::getParentMessage()<br />
to access the data of previously sent requests whithin this request<br />
cycle.</p>
+<p>Note that the internal request message is immutable, that means that the<br />
+request message received through HttpRequest::getRequestMessage() will<br />
+always look the same for the same request, regardless of any changes you<br />
+may have made to the returned object.</p>
+<p>Throws HttpMalformedHeadersException, HttpEncodingException.</p>
<h3 id="HttpRequest_getHistory">HttpMessage HttpRequest::getHistory()</h3>
<p>Get all sent requests and received responses as an HttpMessage object.</p>
<p>If you don't want to record history at all, set the instance variable<br />
history.</p>
<p>The object references the last received response, use HttpMessage::getParentMessage() <br />
to access the data of previously sent requests and received responses.</p>
-<p>Throws HttpMalformedHeaderException.</p>
+<p>Note that the internal history is immutable, that means that any changes<br />
+you make the the message list won't affect a history message list newly <br />
+created by another call to HttpRequest::getHistory().</p>
+<p>Throws HttpMalformedHeaderException, HttpEncodingException.</p>
<h3 id="HttpRequest_clearHistory">void HttpRequest::clearHistory()</h3>
<p>Clear the history.</p>
<h3 id="HttpRequest_send">HttpMessage HttpRequest::send()</h3>
<p>Send the HTTP request.</p>
<p>Returns the received response as HttpMessage object.</p>
+<p>NOTE: While an exception may be thrown, the transfer could have succeeded <br />
+at least partially, so you might want to check the return values of various<br />
+HttpRequest::getResponse*() methods.</p>
<p>Throws HttpRuntimeException, HttpRequestException, <br />
HttpMalformedHeaderException, HttpEncodingException.</p>
<p>GET example:</p><pre><blockquote><code><span style="color: #000000"><br />
<p>Implements Iterator::next().</p>
<h3 id="HttpRequestPool_rewind">void HttpRequestPool::rewind()</h3>
<p>Implements Iterator::rewind().</p>
+<h3 id="HttpRequestPool_count">int HttpRequestPool::count()</h3>
+<p>Implements Countable.</p>
+<p>Returns the number of attached HttpRequest objects.</p>
<h3 id="HttpRequestPool_getAttachedRequests">array HttpRequestPool::getAttachedRequests()</h3>
<p>Get attached HttpRequest objects.</p>
<p>Returns an array containing all currently attached HttpRequest objects.</p>
</li>
<li><a href="#http_negotiate_charset">http_negotiate_charset</a>
</li>
+<li><a href="#http_negotiate_content_type">http_negotiate_content_type</a>
+</li>
<li><a href="#http_send_status">http_send_status</a>
</li>
<li><a href="#http_send_last_modified">http_send_last_modified</a>
<li><a href="#HttpMessage_getParentMessage">HttpMessage::getParentMessage()</a></li>
<li><a href="#HttpMessage_send">HttpMessage::send()</a></li>
<li><a href="#HttpMessage_toString">HttpMessage::toString()</a></li>
+<li><a href="#HttpMessage_count">HttpMessage::count()</a></li>
+<li><a href="#HttpMessage_serialize">HttpMessage::serialize()</a></li>
+<li><a href="#HttpMessage_unserialize">HttpMessage::unserialize()</a></li>
</li>
</ul>
</li>
<li><a href="#HttpRequestPool_key">HttpRequestPool::key()</a></li>
<li><a href="#HttpRequestPool_next">HttpRequestPool::next()</a></li>
<li><a href="#HttpRequestPool_rewind">HttpRequestPool::rewind()</a></li>
+<li><a href="#HttpRequestPool_count">HttpRequestPool::count()</a></li>
<li><a href="#HttpRequestPool_getAttachedRequests">HttpRequestPool::getAttachedRequests()</a></li>
<li><a href="#HttpRequestPool_getFinishedRequests">HttpRequestPool::getFinishedRequests()</a></li>
</li>
</li>
</ul>
</div>
- <p><b>Generated at: Fri, 04 Nov 2005 12:29:06 +0100</b></p>
+ <p><b>Generated at: Mon, 21 Nov 2005 16:56:18 +0100</b></p>
</body>
</html>
; disable if you want php not to exit in case of redirects and cache hits
;http.force_exit = 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 = HTTP_ETAG_MHASH_TIGER ; same as 7
-http.etag_mode = HTTP_ETAG_MD5
+; the hashing algorithm with wich ETags are generated (MD5, SHA1, CRC32B)
+; if ext/hash is available, this can be set to any hash algorithm ext/hash supports
+; MD5 is the default and fallback algorithm
+http.etag_mode = "MD5"
; allowed request methods
; by default PHP ignores unkown request methods
# endif
# include <curl/curl.h>
#endif
-#ifdef HTTP_HAVE_MHASH
-# include <mhash.h>
-#endif
#ifdef HTTP_HAVE_ZLIB
# include <zlib.h>
#endif
return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
}
-#undef CASE_HTTP_ETAG_HASH
-#define CASE_HTTP_ETAG_HASH(HASH) \
- case HTTP_ETAG_##HASH: \
- ZEND_WRITE("HTTP_ETAG_"#HASH, lenof("HTTP_ETAG_"#HASH)); \
- break;
-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)
- {
-#ifdef HTTP_HAVE_HASH_EXT
- CASE_HTTP_ETAG_HASH(RIPEMD160);
- CASE_HTTP_ETAG_HASH(RIPEMD128);
- CASE_HTTP_ETAG_HASH(SHA512);
- CASE_HTTP_ETAG_HASH(SHA384);
- CASE_HTTP_ETAG_HASH(SHA256);
-#endif
- CASE_HTTP_ETAG_HASH(CRC32);
- CASE_HTTP_ETAG_HASH(SHA1);
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- CASE_HTTP_ETAG_HASH(MD5);
-
-#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
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)
- HTTP_PHP_INI_ENTRY_EX("http.etag_mode", "-2", PHP_INI_ALL, OnUpdateLong, http_etag_mode_displayer, etag.mode)
+ HTTP_PHP_INI_ENTRY("http.etag_mode", "MD5", PHP_INI_ALL, OnUpdateString, etag.mode)
#ifdef ZEND_ENGINE_2
HTTP_PHP_INI_ENTRY("http.only_exceptions", "0", PHP_INI_ALL, OnUpdateBool, only_exceptions)
#endif
if ( (SUCCESS != PHP_MINIT_CALL(http_support)) ||
(SUCCESS != PHP_MINIT_CALL(http_headers)) ||
- (SUCCESS != PHP_MINIT_CALL(http_cache)) ||
#ifdef HTTP_HAVE_CURL
(SUCCESS != PHP_MINIT_CALL(http_request)) ||
#endif /* HTTP_HAVE_CURL */
#else
php_info_print_table_row(2, "zlib GZIP Encodings", "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_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_HASH_EXT
- ", SHA256, SHA384, SHA512, RIPEMD128, RIPEMD160"
-#endif
- );
-#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");
{
# 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 libmhash.lib 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
+# 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
# 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 libmhash.lib 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
+# 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
HTTP_LONG_CONSTANT("HTTP_SUPPORT_REQUESTS", HTTP_SUPPORT_REQUESTS);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_MAGICMIME", HTTP_SUPPORT_MAGICMIME);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_ENCODINGS", HTTP_SUPPORT_ENCODINGS);
- HTTP_LONG_CONSTANT("HTTP_SUPPORT_MHASHETAGS", HTTP_SUPPORT_MHASHETAGS);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_SSLREQUESTS", HTTP_SUPPORT_SSLREQUESTS);
return SUCCESS;
support |= HTTP_SUPPORT_SSLREQUESTS;
# endif
#endif
-#ifdef HTTP_HAVE_MHASH
- support |= HTTP_SUPPORT_MHASHETAGS;
-#endif
#ifdef HTTP_HAVE_MAGIC
support |= HTTP_SUPPORT_MAGICMIME;
#endif
#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_send_api.h"
#include "php_http_date_api.h"
-#ifdef HTTP_HAVE_MHASH
-# include <mhash.h>
-#endif
-
ZEND_EXTERN_MODULE_GLOBALS(http);
-PHP_MINIT_FUNCTION(http_cache)
-{
- 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_HASH_EXT
- HTTP_LONG_CONSTANT("HTTP_ETAG_SHA256", HTTP_ETAG_SHA256);
- HTTP_LONG_CONSTANT("HTTP_ETAG_SHA384", HTTP_ETAG_SHA384);
- HTTP_LONG_CONSTANT("HTTP_ETAG_SHA512", HTTP_ETAG_SHA512);
- HTTP_LONG_CONSTANT("HTTP_ETAG_RIPEMD128", HTTP_ETAG_RIPEMD128);
- HTTP_LONG_CONSTANT("HTTP_ETAG_RIPEMD160", HTTP_ETAG_RIPEMD160);
-#endif
-
-#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)
{
}
if (SUCCESS != ss) {
- http_etag_free(&ctx);
+ efree(ctx);
return NULL;
} else {
size_t ssb_len;
}
}
- return http_etag_finish(&ctx);
+ return http_etag_finish(ctx);
}
/* }}} */
{
if (HTTP_G(etag).started) {
HTTP_G(etag).started = 0;
- http_etag_free(&HTTP_G(etag).ctx);
+ if (HTTP_G(etag).ctx) {
+ efree(HTTP_G(etag).ctx);
+ HTTP_G(etag).ctx = NULL;
+ }
return 1;
}
return 0;
/* finish */
if (mode & PHP_OUTPUT_HANDLER_END) {
char *sent_header = NULL;
- char *etag = http_etag_finish(&HTTP_G(etag).ctx);
+ char *etag = http_etag_finish(HTTP_G(etag).ctx);
+
+ HTTP_G(etag).ctx = NULL;
http_send_cache_control(HTTP_DEFAULT_CACHECONTROL, lenof(HTTP_DEFAULT_CACHECONTROL));
http_send_etag_ex(etag, strlen(etag), &sent_header);
* and SSL requests can be issued
* <li> HTTP_SUPPORT_ENCODINGS: whether ext/http was linked against zlib,
* and compressed HTTP responses can be decoded
- * <li> HTTP_SUPPORT_MHASHETAGS: whether ext/http was linked against libmhash,
- * and ETags can be generated with the available mhash algorithms
* <li> HTTP_SUPPORT_MAGICMIME: whether ext/http was linked against libmagic,
* and the HttpResponse::guessContentType() method is usable
* </ul>
#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
DCL_CONST(long, "REDIRECT_PERM", HTTP_REDIRECT_PERM);
DCL_CONST(long, "REDIRECT_POST", HTTP_REDIRECT_POST);
DCL_CONST(long, "REDIRECT_TEMP", HTTP_REDIRECT_TEMP);
-
- 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_HASH_EXT
- DCL_CONST(long, "ETAG_SHA256", HTTP_ETAG_SHA256);
- DCL_CONST(long, "ETAG_SHA384", HTTP_ETAG_SHA384);
- DCL_CONST(long, "ETAG_SHA512", HTTP_ETAG_SHA512);
- DCL_CONST(long, "ETAG_RIPEMD128", HTTP_ETAG_RIPEMD128);
- DCL_CONST(long, "ETAG_RIPEMD160", HTTP_ETAG_RIPEMD160);
-# endif
-
-# 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 */
}
<notes><![CDATA[
* Fixed bug in http_negotiate_*() when client sends spaces within accept headers
+- Removed support for ETag hashing through libmhash
+
+ Added http_negotiate_content_type()
]]></notes>
<contents>
<file role="test" name="etag_mode_042.phpt"/>
<file role="test" name="etag_mode_043.phpt"/>
<file role="test" name="etag_mode_044.phpt"/>
- <file role="test" name="etag_mode_crc.phpt"/>
<file role="test" name="exceptions.phpt"/>
<file role="test" name="get_request_data_001.phpt"/>
<file role="test" name="HttpMessage_001.phpt"/>
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"
ZEND_BEGIN_MODULE_GLOBALS(http)
struct _http_globals_etag {
- long mode;
+ char *mode;
void *ctx;
zend_bool started;
} etag;
#define HTTP_SUPPORT_REQUESTS 0x02L
#define HTTP_SUPPORT_MAGICMIME 0x04L
#define HTTP_SUPPORT_ENCODINGS 0x08L
-#define HTTP_SUPPORT_MHASHETAGS 0x10L
#define HTTP_SUPPORT_SSLREQUESTS 0x20L
extern PHP_MINIT_FUNCTION(http_support);
#include "zend_ini.h"
-#include "ext/standard/md5.h"
-#include "ext/standard/sha1.h"
#include "ext/standard/crc32.h"
+#include "ext/standard/sha1.h"
+#include "ext/standard/md5.h"
#include "php_http_std_defs.h"
#include "php_http.h"
#include "php_http_api.h"
#include "php_http_send_api.h"
-#if defined(HAVE_HASH_EXT) && !defined(COMPILE_DL_HASH) && defined(HTTP_HAVE_HASH_EXT_INCLUDES)
-# define HTTP_HAVE_HASH_EXT
+#ifdef HTTP_HAVE_EXT_HASH
# include "php_hash.h"
-# include "php_hash_sha.h"
-# include "php_hash_ripemd.h"
-#endif
-
-#ifdef HTTP_HAVE_MHASH
-# include <mhash.h>
#endif
ZEND_EXTERN_MODULE_GLOBALS(http);
-typedef enum {
-#ifdef HTTP_HAVE_HASH_EXT
- HTTP_ETAG_RIPEMD160 = -8,
- HTTP_ETAG_RIPEMD128 = -7,
- HTTP_ETAG_SHA512 = -6,
- HTTP_ETAG_SHA384 = -5,
- HTTP_ETAG_SHA256 = -4,
-#endif
- HTTP_ETAG_CRC32 = -3,
- HTTP_ETAG_MD5 = -2,
- HTTP_ETAG_SHA1 = -1,
-} http_etag_mode;
-
-extern PHP_MINIT_FUNCTION(http_cache);
-
-#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)
+#define http_etag_digest(d, l) _http_etag_digest((d), (l))
+static inline char *_http_etag_digest(const unsigned char *digest, int len)
{
static const char hexdigits[16] = "0123456789abcdef";
int i;
return hex;
}
-#undef CASE_HTTP_ETAG_HASH
-#define CASE_HTTP_ETAG_HASH(HASH) \
- case HTTP_ETAG_##HASH: \
- PHP_##HASH##Init(ctx = emalloc(sizeof(PHP_##HASH##_CTX))); \
- break;
#define http_etag_init() _http_etag_init(TSRMLS_C)
static inline void *_http_etag_init(TSRMLS_D)
{
void *ctx = NULL;
- long mode = HTTP_G(etag).mode;
-
- switch (mode)
- {
- case HTTP_ETAG_CRC32:
- ctx = emalloc(sizeof(uint));
- *((uint *) ctx) = ~0;
- break;
-
-#ifdef HTTP_HAVE_HASH_EXT
- CASE_HTTP_ETAG_HASH(RIPEMD160);
- CASE_HTTP_ETAG_HASH(RIPEMD128);
- CASE_HTTP_ETAG_HASH(SHA512);
- CASE_HTTP_ETAG_HASH(SHA384);
- CASE_HTTP_ETAG_HASH(SHA256);
-#endif
- CASE_HTTP_ETAG_HASH(SHA1);
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- CASE_HTTP_ETAG_HASH(MD5);
-
-#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
+ char *mode = HTTP_G(etag).mode;
+
+#ifdef HTTP_HAVE_EXT_HASH
+ php_hash_ops *eho = NULL;
+
+ if (mode && (eho = php_hash_fetch_ops(mode, strlen(mode)))) {
+ ctx = emalloc(eho->context_size);
+ eho->hash_init(ctx);
+ } else
+#endif
+ if (mode && ((!strcasecmp(mode, "crc32")) || (!strcasecmp(mode, "crc32b")))) {
+ ctx = emalloc(sizeof(uint));
+ *((uint *) ctx) = ~0;
+ } else if (mode && !strcasecmp(mode, "sha1")) {
+ PHP_SHA1Init(ctx = emalloc(sizeof(PHP_SHA1_CTX)));
+ } else {
+ PHP_MD5Init(ctx = emalloc(sizeof(PHP_MD5_CTX)));
}
return ctx;
}
-#undef CASE_HTTP_ETAG_HASH
-#define CASE_HTTP_ETAG_HASH(HASH) \
- case HTTP_ETAG_##HASH: \
- if (*((PHP_##HASH##_CTX **) ctx_ptr)) { \
- efree(*((PHP_##HASH##_CTX **) ctx_ptr)); \
- *((PHP_##HASH##_CTX **) ctx_ptr) = NULL; \
- } \
- break;
-#define http_etag_free(cp) _http_etag_free((cp) TSRMLS_CC)
-static inline void _http_etag_free(void **ctx_ptr TSRMLS_DC)
-{
- switch (HTTP_G(etag).mode)
- {
- case HTTP_ETAG_CRC32:
- if (*((uint **) ctx_ptr)) {
- efree(*((uint **) ctx_ptr));
- *((uint **) ctx_ptr) = NULL;
- }
- break;
-
-#ifdef HTTP_HAVE_HASH_EXT
- CASE_HTTP_ETAG_HASH(RIPEMD160);
- CASE_HTTP_ETAG_HASH(RIPEMD128);
- CASE_HTTP_ETAG_HASH(SHA512);
- CASE_HTTP_ETAG_HASH(SHA384);
- CASE_HTTP_ETAG_HASH(SHA256);
-#endif
- CASE_HTTP_ETAG_HASH(SHA1);
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- CASE_HTTP_ETAG_HASH(MD5);
-
-#ifdef HTTP_HAVE_MHASH
- default:
- /* mhash gets already freed in http_etag_finish() */
- if (*((MHASH *) ctx_ptr)) {
- mhash_deinit(*((MHASH *) ctx_ptr), NULL);
- *((MHASH *) ctx_ptr) = NULL;
- }
- break;
-#endif
- }
-}
-
-#undef CASE_HTTP_ETAG_HASH
-#define CASE_HTTP_ETAG_HASH(HASH, len) \
- case HTTP_ETAG_##HASH##: \
- PHP_##HASH##Final(digest, *((PHP_##HASH##_CTX **) ctx_ptr)); \
- etag = http_etag_digest(digest, len); \
- break;
#define http_etag_finish(c) _http_etag_finish((c) TSRMLS_CC)
-static inline char *_http_etag_finish(void **ctx_ptr TSRMLS_DC)
+static inline char *_http_etag_finish(void *ctx TSRMLS_DC)
{
+ unsigned char digest[128] = {0};
char *etag = NULL;
- unsigned char digest[128];
- long mode = HTTP_G(etag).mode;
- switch (mode)
- {
- case HTTP_ETAG_CRC32:
- **((uint **) ctx_ptr) = ~**((uint **) ctx_ptr);
- etag = http_etag_digest(*((const unsigned char **) ctx_ptr), sizeof(uint));
- break;
-
-#ifdef HTTP_HAVE_HASH_EXT
- CASE_HTTP_ETAG_HASH(RIPEMD160, 20);
- CASE_HTTP_ETAG_HASH(RIPEMD128, 16);
- CASE_HTTP_ETAG_HASH(SHA512, 64);
- CASE_HTTP_ETAG_HASH(SHA384, 48);
- CASE_HTTP_ETAG_HASH(SHA256, 32);
-#endif
- CASE_HTTP_ETAG_HASH(SHA1, 20);
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- CASE_HTTP_ETAG_HASH(MD5, 16);
-
-#ifdef HTTP_HAVE_MHASH
- default:
- {
- unsigned char *mhash_digest = mhash_end_m(*((MHASH *) ctx_ptr), http_etag_alloc_mhash_digest);
- etag = http_etag_digest(mhash_digest, mhash_get_block_size(mode));
- efree(mhash_digest);
- /* avoid double free */
- *((MHASH *) ctx_ptr) = NULL;
- }
- break;
-#endif
- }
+#ifdef HTTP_HAVE_EXT_HASH
+ php_hash_ops *eho = NULL;
+ char *mode = HTTP_G(etag).mode;
- http_etag_free(ctx_ptr);
+ if (mode && (eho = php_hash_fetch_ops(mode, strlen(mode)))) {
+ eho->hash_final(digest, ctx);
+ etag = http_etag_digest(digest, eho->digest_size);
+ } else
+#endif
+ if (mode && ((!strcasecmp(mode, "crc32")) || (!strcasecmp(mode, "crc32b")))) {
+ *((uint *) ctx) = ~*((uint *) ctx);
+ etag = http_etag_digest((const unsigned char *) ctx, sizeof(uint));
+ } else if (mode && (!strcasecmp(mode, "sha1"))) {
+ PHP_SHA1Final(digest, ctx);
+ etag = http_etag_digest(digest, 20);
+ } else {
+ PHP_MD5Final(digest, ctx);
+ etag = http_etag_digest(digest, 16);
+ }
+ efree(ctx);
return etag;
}
-#undef CASE_HTTP_ETAG_HASH
-#define CASE_HTTP_ETAG_HASH(HASH) \
- case HTTP_ETAG_##HASH: \
- PHP_##HASH##Update(ctx, (const unsigned char *) data_ptr, data_len); \
- break;
#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 (HTTP_G(etag).mode)
- {
- case HTTP_ETAG_CRC32:
- {
- uint i, c = *((uint *) ctx);
-
- for (i = 0; i < data_len; ++i) {
- c = CRC32(c, data_ptr[i]);
- }
- *((uint *)ctx) = c;
+#ifdef HTTP_HAVE_EXT_HASH
+ php_hash_ops *eho = NULL;
+ char *mode = HTTP_G(etag).mode;
+
+ if (mode && (eho = php_hash_fetch_ops(mode, strlen(mode)))) {
+ eho->hash_update(ctx, (const unsigned char *) data_ptr, data_len);
+ } else
+#endif
+ if (mode && ((!strcasecmp(mode, "crc32")) || (!strcasecmp(mode, "crc32b")))) {
+ uint i, c = *((uint *) ctx);
+ for (i = 0; i < data_len; ++i) {
+ c = CRC32(c, data_ptr[i]);
}
- break;
-
-#ifdef HTTP_HAVE_HASH_EXT
- CASE_HTTP_ETAG_HASH(RIPEMD160);
- CASE_HTTP_ETAG_HASH(RIPEMD128);
- CASE_HTTP_ETAG_HASH(SHA512);
- CASE_HTTP_ETAG_HASH(SHA384);
- CASE_HTTP_ETAG_HASH(SHA256);
-#endif
- CASE_HTTP_ETAG_HASH(SHA1);
-#ifndef HTTP_HAVE_MHASH
- default:
-#endif
- CASE_HTTP_ETAG_HASH(MD5);
-
-#ifdef HTTP_HAVE_MHASH
- default:
- mhash(ctx, data_ptr, data_len);
- break;
-#endif
+ *((uint *)ctx) = c;
+ } else if (mode && (!strcasecmp(mode, "sha1"))) {
+ PHP_SHA1Update(ctx, (const unsigned char *) data_ptr, data_len);
+ } else {
+ PHP_MD5Update(ctx, (const unsigned char *) data_ptr, data_len);
}
}
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_CRC32);
+ini_set('http.etag_mode', 'crc32');
http_cache_etag();
http_send_data("abc\n");
?>
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA1);
+ini_set('http.etag_mode', 'sha1');
http_cache_etag();
http_send_data("abc\n");
?>
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MD5);
+ini_set('http.etag_mode', 'md5');
http_cache_etag();
http_send_data("abc\n");
?>
--TEST--
-mhash etag
+ext/hash etag
--SKIPIF--
<?php
include 'skip.inc';
checkcgi();
checkmax(5.0);
-skipif(!http_support(HTTP_SUPPORT_MHASHETAGS), 'need mhash support');
-skipif(!defined('HTTP_ETAG_MHASH_WHIRLPOOL'), 'need whirlpool mhash support');
+skipif(!extension_loaded('hash'), 'need ext/hash support');
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MHASH_WHIRLPOOL);
+ini_set('http.etag_mode', 'sha256');
http_cache_etag();
http_send_data("abc\n");
?>
X-Powered-By: PHP/%s
Cache-Control: private, must-revalidate, max-age=0
Accept-Ranges: bytes
-ETag: "53efa9e423f86dabd449b3e23dd0350def661b9e7055b23ceb2230c8b61bc0766514957ea9d349a88ef794715a1a17a409b549edfd6f43d696e63407fff3541c"
+ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
Content-Length: 4
abc
+++ /dev/null
---TEST--
-ext/hash etag
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-checkmax(5.0);
-skipif(!defined('HTTP_ETAG_SHA256'), 'need ext/hash support');
-?>
---FILE--
-<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA256);
-http_cache_etag();
-http_send_data("abc\n");
-?>
---EXPECTF--
-Content-type: %s
-X-Powered-By: PHP/%s
-Cache-Control: private, must-revalidate, max-age=0
-Accept-Ranges: bytes
-ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
-Content-Length: 4
-
-abc
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_CRC32);
+ini_set('http.etag_mode', 'crc32');
http_cache_etag();
print("abc\n");
?>
include 'skip.inc';
checkcgi();
checkmax(5.0);
-skipif(!http_support(HTTP_SUPPORT_MHASHETAGS), 'need mhash support');
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA1);
+ini_set('http.etag_mode', 'sha1');
http_cache_etag();
print("abc\n");
?>
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MD5);
+ini_set('http.etag_mode', 'md5');
http_cache_etag();
print("abc\n");
?>
--TEST--
-ob mhash etag
+ob ext/hash etag
--SKIPIF--
<?php
include 'skip.inc';
checkcgi();
checkmax(5.0);
-skipif(!http_support(HTTP_SUPPORT_MHASHETAGS), 'need mhash support');
-skipif(!defined('HTTP_ETAG_MHASH_WHIRLPOOL'), 'need whirlpool mhash support');
+skipif(!extension_loaded('hash'), 'need ext/hash support');
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MHASH_WHIRLPOOL);
+ini_set('http.etag_mode', 'sha256');
http_cache_etag();
print("abc\n");
?>
Content-type: %s
X-Powered-By: PHP/%s
Cache-Control: private, must-revalidate, max-age=0
-ETag: "53efa9e423f86dabd449b3e23dd0350def661b9e7055b23ceb2230c8b61bc0766514957ea9d349a88ef794715a1a17a409b549edfd6f43d696e63407fff3541c"
+ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
abc
+++ /dev/null
---TEST--
-ob ext/hash etag
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-checkmax(5.0);
-skipif(!defined('HTTP_ETAG_SHA256'), 'need ext/hash support');
-?>
---FILE--
-<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA256);
-http_cache_etag();
-print("abc\n");
-?>
---EXPECTF--
-Content-type: %s
-X-Powered-By: PHP/%s
-Cache-Control: private, must-revalidate, max-age=0
-ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
-
-abc
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_CRC32);
+ini_set('http.etag_mode', 'crc32');
http_cache_etag();
http_send_data("abc\n");
?>
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA1);
+ini_set('http.etag_mode', 'SHA1');
http_cache_etag();
http_send_data("abc\n");
?>
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MD5);
+ini_set('http.etag_mode', 'MD5');
http_cache_etag();
http_send_data("abc\n");
?>
--TEST--
-mhash etag
+ext/hash etag
--SKIPIF--
<?php
include 'skip.inc';
checkcgi();
-checkmax(5.0);
-skipif(!http_support(HTTP_SUPPORT_MHASHETAGS), 'need mhash support');
-skipif(!defined('HTTP_ETAG_MHASH_WHIRLPOOL'), 'need whirlpool mhash support');
+checkmin(5.1);
+skipif(!extension_loaded('hash'), 'need ext/hash support');
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MHASH_WHIRLPOOL);
+ini_set('http.etag_mode', 'sha256');
http_cache_etag();
http_send_data("abc\n");
?>
X-Powered-By: PHP/%s
Cache-Control: private, must-revalidate, max-age=0
Accept-Ranges: bytes
-ETag: "53efa9e423f86dabd449b3e23dd0350def661b9e7055b23ceb2230c8b61bc0766514957ea9d349a88ef794715a1a17a409b549edfd6f43d696e63407fff3541c"
+ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
Content-Length: 4
abc
+++ /dev/null
---TEST--
-ext/hash etag
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-checkmin(5.1);
-skipif(!defined('HTTP_ETAG_SHA256'), 'need ext/hash support');
-?>
---FILE--
-<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA256);
-http_cache_etag();
-http_send_data("abc\n");
-?>
---EXPECTF--
-X-Powered-By: PHP/%s
-Cache-Control: private, must-revalidate, max-age=0
-Accept-Ranges: bytes
-ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
-Content-Length: 4
-Content-type: %s
-
-abc
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_CRC32);
+ini_set('http.etag_mode', 'crc32');
http_cache_etag();
print("abc\n");
?>
include 'skip.inc';
checkcgi();
checkmin(5.1);
-skipif(!http_support(HTTP_SUPPORT_MHASHETAGS), 'need mhash support');
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA1);
+ini_set('http.etag_mode', 'SHA1');
http_cache_etag();
print("abc\n");
?>
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MD5);
+ini_set('http.etag_mode', 'bogus');
http_cache_etag();
print("abc\n");
?>
--TEST--
-ob mhash etag
+ob ext/hash etag
--SKIPIF--
<?php
include 'skip.inc';
checkcgi();
checkmin(5.1);
-skipif(!http_support(HTTP_SUPPORT_MHASHETAGS), 'need mhash support');
-skipif(!defined('HTTP_ETAG_MHASH_WHIRLPOOL'), 'need whirlpool mhash support');
+skipif(!extendion_loaded('hash'), 'need mhash support');
?>
--FILE--
<?php
-ini_set('http.etag_mode', HTTP_ETAG_MHASH_WHIRLPOOL);
+ini_set('http.etag_mode', 'sha256');
http_cache_etag();
print("abc\n");
?>
--EXPECTF--
X-Powered-By: PHP/%s
Cache-Control: private, must-revalidate, max-age=0
-ETag: "53efa9e423f86dabd449b3e23dd0350def661b9e7055b23ceb2230c8b61bc0766514957ea9d349a88ef794715a1a17a409b549edfd6f43d696e63407fff3541c"
+ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
Content-type: %s
abc
+++ /dev/null
---TEST--
-ob ext/hash etag
---SKIPIF--
-<?php
-include 'skip.inc';
-checkcgi();
-checkmin(5.1);
-skipif(!defined('HTTP_ETAG_SHA256'), 'need ext/hash support');
-?>
---FILE--
-<?php
-ini_set('http.etag_mode', HTTP_ETAG_SHA256);
-http_cache_etag();
-print("abc\n");
-?>
---EXPECTF--
-X-Powered-By: PHP/%s
-Cache-Control: private, must-revalidate, max-age=0
-ETag: "edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb"
-Content-type: %s
-
-abc
+++ /dev/null
---TEST--
-sane crc etags
---SKIPIF--
-<?php
-include 'skip.inc';
-checkmin(5.1);
-skipif(!http_support(HTTP_SUPPORT_MHASHETAGS), 'need mhash support');
-skipif(!defined('HTTP_ETAG_MHASH_CRC32'), 'need CRC32 mhash support');
-skipif(!defined('HTTP_ETAG_MHASH_CRC32B'), 'need CRC32B mhash support');
-?>
---FILE--
-<?php
-echo "-TEST\n";
-
-ini_set('http.etag_mode', HTTP_ETAG_CRC32);
-HttpResponse::setData("abc");
-$php = HttpResponse::getEtag();
-
-ini_set('http.etag_mode', HTTP_ETAG_MHASH_CRC32);
-HttpResponse::setData("abc");
-$crc = HttpResponse::getEtag();
-
-ini_set('http.etag_mode', HTTP_ETAG_MHASH_CRC32B);
-HttpResponse::setData("abc");
-$equ = HttpResponse::getEtag();
-
-echo $php,"\n", $equ,"\n", $crc,"\n";
-
-var_dump($equ === $php);
-var_dump($equ !== $crc);
-
-echo "Done\n";
---EXPECTF--
-%sTEST
-c2412435
-c2412435
-73bb8c64
-bool(true)
-bool(true)
-Done