This is a update of the get_headers patch i sent in a long time ago and was
ignored. Patch is written with the latest cvs snapshot of 5.1. Hope it makes it
way to 5.1.1
Info:
mixed get_headers ( string url [, bool format | string header [,resource
context]])
2nd arg can eather be bool or string
bool:
true returns an numeric indexed array with headers
false returns key index array with header name as key
string:
returns only the header with the same name.
passing long will cast E_STRICT but still work the old way
3nd arg is a context to pass header/data to the url.
Index: ext/standard/url.c
===================================================================
RCS file: /repository/php-src/ext/standard/url.c,v
retrieving revision 1.86.2.1
diff -u -r1.86.2.1 url.c
--- ext/standard/url.c 16 Aug 2005 14:20:41 -0000 1.86.2.1
+++ ext/standard/url.c 25 Nov 2005 03:47:30 -0000
@@ -36,6 +36,8 @@
#endif /*APACHE*/
#endif /*_OSD_POSIX*/
+#include "ext/standard/file.h"
+
/* {{{ free_url
*/
PHPAPI void php_url_free(php_url *theurl)
@@ -624,15 +626,51 @@
{
char *url;
int url_len;
+ zval *zcontext = NULL;
+ zval *format = NULL;
php_stream_context *context = NULL;
php_stream *stream;
zval **prev_val, **hdr = NULL;
HashPosition pos;
- long format = 0;
+ char *header = NULL;
+ int header_len;
+ int retformat = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &url,
&url_len, &format) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zr", &url,
&url_len, &format, &zcontext) == FAILURE) {
return;
}
+ if (zcontext) {
+ context = php_stream_context_from_zval(zcontext, 1);
+ }
+ if (format) {
+ switch (Z_TYPE_P(format)) {
+ case IS_BOOL:
+ if (Z_LVAL_P(format)) {
+ retformat = 1;
+ }
+ break;
+
+ case IS_STRING:
+ header = Z_STRVAL_P(format);
+ header_len = Z_STRLEN_P(format);
+ break;
+
+ case IS_NULL:
+ // Use default
+ break;
+
+ case IS_LONG:
+ retformat = Z_LVAL_P(format);
+ php_error_docref(NULL TSRMLS_CC, E_STRICT,
"Using long for 2nd parameter is deprecated");
+ break;
+
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
"The 2nd parameter should be either a string or bool");
+ break;
+ }
+ }
+
+
if (!(stream = php_stream_open_wrapper_ex(url, "r", REPORT_ERRORS |
STREAM_USE_URL | STREAM_ONLY_GET_HEADERS, NULL, context))) {
RETURN_FALSE;
@@ -642,7 +680,7 @@
zend_hash_internal_pointer_reset_ex(HASH_OF(stream->wrapperdata), &pos);
while (zend_hash_get_current_data_ex(HASH_OF(stream->wrapperdata),
(void**)&hdr, &pos) != FAILURE) {
- if (!format) {
+ if (!retformat && header == NULL) {
no_name_header:
add_next_index_stringl(return_value, Z_STRVAL_PP(hdr),
Z_STRLEN_PP(hdr), 1);
} else {
@@ -656,13 +694,19 @@
while (isspace((int)*(unsigned char *)s)) {
s++;
}
-
- if (zend_hash_find(HASH_OF(return_value),
Z_STRVAL_PP(hdr), (p - Z_STRVAL_PP(hdr) + 1), (void **) &prev_val) == FAILURE) {
- add_assoc_stringl_ex(return_value,
Z_STRVAL_PP(hdr), (p - Z_STRVAL_PP(hdr) + 1), s, (Z_STRLEN_PP(hdr) - (s -
Z_STRVAL_PP(hdr))), 1);
- } else { /* some headers may occur more then
once, therefor we need to remake the string into an array */
- convert_to_array(*prev_val);
- add_next_index_stringl(*prev_val, s,
(Z_STRLEN_PP(hdr) - (s - Z_STRVAL_PP(hdr))), 1);
- }
+ if (header == NULL) {
+ if
(zend_hash_find(HASH_OF(return_value), Z_STRVAL_PP(hdr), (p - Z_STRVAL_PP(hdr)
+ 1), (void **) &prev_val) == FAILURE) {
+
add_assoc_stringl_ex(return_value, Z_STRVAL_PP(hdr), (p - Z_STRVAL_PP(hdr) +
1), s, (Z_STRLEN_PP(hdr) - (s - Z_STRVAL_PP(hdr))), 1);
+ } else { /* some headers may occur more
then once, therefor we need to remake the string into an array */
+ convert_to_array(*prev_val);
+
add_next_index_stringl(*prev_val, s, (Z_STRLEN_PP(hdr) - (s -
Z_STRVAL_PP(hdr))), 1);
+ }
+ } else {
+ if (!strncmp(header, Z_STRVAL_PP(hdr),
header_len)) {
+ RETVAL_STRING(s,1);
+ goto done;
+ }
+ }
*p = c;
} else {
@@ -671,7 +715,11 @@
}
zend_hash_move_forward_ex(HASH_OF(stream->wrapperdata), &pos);
}
+ if (header != NULL) {
+ RETVAL_FALSE;
+ }
+done:
php_stream_close(stream);
}
/* }}} */
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php