This patch defines a new argument to get_headers. "header" to get a specified header and returns it as a string.
? get_headers.patch
Index: ext/standard/url.c
===================================================================
RCS file: /repository/php-src/ext/standard/url.c,v
retrieving revision 1.87
diff -u -r1.87 url.c
--- ext/standard/url.c 9 Aug 2005 14:17:28 -0000 1.87
+++ ext/standard/url.c 11 Aug 2005 01:26:31 -0000
@@ -662,8 +662,10 @@
zval **prev_val, **hdr = NULL;
HashPosition pos;
long format = 0;
+ char *header = NULL;
+ int header_len;
- 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|ls", &url, &url_len, &format, &header, &header_len) == FAILURE) {
return;
}
@@ -671,40 +673,54 @@
RETURN_FALSE;
}
- array_init(return_value);
+ if (header_len == 0) {
+ header = NULL;
+ }
+
+ if (header == NULL) {
+ array_init(return_value);
+ }
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 (!format && header == NULL) {
no_name_header:
add_next_index_stringl(return_value, Z_STRVAL_PP(hdr), Z_STRLEN_PP(hdr), 1);
} else {
- char c;
char *s, *p;
if ((p = strchr(Z_STRVAL_PP(hdr), ':'))) {
- c = *p;
*p = '\0';
s = p + 1;
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 {
+ } else if (header == NULL) {
goto no_name_header;
}
}
zend_hash_move_forward_ex(HASH_OF(stream->wrapperdata), &pos);
}
+ if (header != NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Header \"%s\" not found.", header);
+ RETVAL_FALSE;
+ }
+done:
php_stream_close(stream);
}
/* }}} */