| modification, are permitted provided that the conditions mentioned |
| in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
- | Copyright (c) 2004-2006, Michael Wallner <mike@php.net> |
+ | Copyright (c) 2004-2010, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
*/
memset(&inf, 0, sizeof(http_info));
switch (inf.type = type) {
case HTTP_MSG_REQUEST:
- if ((sval = http_get_server_var("SERVER_PROTOCOL", 1)) && !strncmp(Z_STRVAL_P(sval), ZEND_STRL("HTTP/"))) {
- inf.http.version = atof(Z_STRVAL_P(sval) + lenof("HTTP/"));
+ if ((sval = http_get_server_var("SERVER_PROTOCOL", 1)) && !strncmp(Z_STRVAL_P(sval), "HTTP/", lenof("HTTP/"))) {
+ inf.http.version = zend_strtod(Z_STRVAL_P(sval) + lenof("HTTP/"), NULL);
} else {
inf.http.version = 1.1;
}
http_message_set_info(message, &inf);
http_get_response_headers(&message->hdrs);
+#ifdef PHP_OUTPUT_NEWAPI
+ if (SUCCESS == php_output_get_contents(&tval TSRMLS_CC)) {
+#else
if (SUCCESS == php_ob_get_buffer(&tval TSRMLS_CC)) {
+#endif
message->body.data = Z_STRVAL(tval);
message->body.used = Z_STRLEN(tval);
message->body.free = 1; /* "\0" */
#ifdef HTTP_HAVE_ZLIB
/* check for compressed data */
- if ((c = http_message_header(msg, "Vary"))) {
- zval_ptr_dtor(&c);
-
- if ((c = http_message_header(msg, "Content-Encoding"))) {
- char *decoded = NULL;
- size_t decoded_len = 0;
-
- if ( !strcasecmp(Z_STRVAL_P(c), "gzip") ||
- !strcasecmp(Z_STRVAL_P(c), "x-gzip") ||
- !strcasecmp(Z_STRVAL_P(c), "deflate")) {
- http_encoding_inflate(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
- }
-
- if (decoded) {
- zval *len, **original_len;
- char *tmp;
- int tmp_len;
-
- tmp_len = (int) spprintf(&tmp, 0, "%zu", decoded_len);
- MAKE_STD_ZVAL(len);
- ZVAL_STRINGL(len, tmp, tmp_len, 0);
-
- ZVAL_ADDREF(c);
- zend_hash_update(&msg->hdrs, "X-Original-Content-Encoding", sizeof("X-Original-Content-Encoding"), (void *) &c, sizeof(zval *), NULL);
- zend_hash_del(&msg->hdrs, "Content-Encoding", sizeof("Content-Encoding"));
- if (SUCCESS == zend_hash_find(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &original_len)) {
- ZVAL_ADDREF(*original_len);
- zend_hash_update(&msg->hdrs, "X-Original-Content-Length", sizeof("X-Original-Content-Length"), (void *) original_len, sizeof(zval *), NULL);
- zend_hash_update(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL);
- } else {
- zend_hash_update(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL);
- }
-
- phpstr_dtor(PHPSTR(msg));
- PHPSTR(msg)->data = decoded;
- PHPSTR(msg)->used = decoded_len;
- PHPSTR(msg)->free = 1;
+ if ((c = http_message_header(msg, "Content-Encoding"))) {
+ char *decoded = NULL;
+ size_t decoded_len = 0;
+
+ if ( !strcasecmp(Z_STRVAL_P(c), "gzip") ||
+ !strcasecmp(Z_STRVAL_P(c), "x-gzip") ||
+ !strcasecmp(Z_STRVAL_P(c), "deflate")) {
+ http_encoding_inflate(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
+ }
+
+ if (decoded) {
+ zval *len, **original_len;
+ char *tmp;
+ int tmp_len;
+
+ tmp_len = (int) spprintf(&tmp, 0, "%zu", decoded_len);
+ MAKE_STD_ZVAL(len);
+ ZVAL_STRINGL(len, tmp, tmp_len, 0);
+
+ ZVAL_ADDREF(c);
+ zend_hash_update(&msg->hdrs, "X-Original-Content-Encoding", sizeof("X-Original-Content-Encoding"), (void *) &c, sizeof(zval *), NULL);
+ zend_hash_del(&msg->hdrs, "Content-Encoding", sizeof("Content-Encoding"));
+ if (SUCCESS == zend_hash_find(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &original_len)) {
+ ZVAL_ADDREF(*original_len);
+ zend_hash_update(&msg->hdrs, "X-Original-Content-Length", sizeof("X-Original-Content-Length"), (void *) original_len, sizeof(zval *), NULL);
+ zend_hash_update(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL);
+ } else {
+ zend_hash_update(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL);
}
-
- zval_ptr_dtor(&c);
+
+ phpstr_dtor(PHPSTR(msg));
+ PHPSTR(msg)->data = decoded;
+ PHPSTR(msg)->used = decoded_len;
+ PHPSTR(msg)->free = 1;
}
+
+ zval_ptr_dtor(&c);
}
#endif /* HTTP_HAVE_ZLIB */
}
zval **single_header;
switch (Z_TYPE_PP(header)) {
+ case IS_BOOL:
+ phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_BVAL_PP(header)?"true":"false");
+ break;
+
+ case IS_LONG:
+ phpstr_appendf(&str, "%s: %ld" HTTP_CRLF, key.str, Z_LVAL_PP(header));
+ break;
+
+ case IS_DOUBLE:
+ phpstr_appendf(&str, "%s: %f" HTTP_CRLF, key.str, Z_DVAL_PP(header));
+ break;
+
case IS_STRING:
phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_STRVAL_PP(header));
break;
case IS_ARRAY:
FOREACH_VAL(pos2, *header, single_header) {
- phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_STRVAL_PP(single_header));
+ switch (Z_TYPE_PP(single_header)) {
+ case IS_BOOL:
+ phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_BVAL_PP(single_header)?"true":"false");
+ break;
+
+ case IS_LONG:
+ phpstr_appendf(&str, "%s: %ld" HTTP_CRLF, key.str, Z_LVAL_PP(single_header));
+ break;
+
+ case IS_DOUBLE:
+ phpstr_appendf(&str, "%s: %f" HTTP_CRLF, key.str, Z_DVAL_PP(single_header));
+ break;
+
+ case IS_STRING:
+ phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_STRVAL_PP(single_header));
+ break;
+ }
}
break;
}
#ifdef HTTP_HAVE_CURL
char *uri = NULL;
http_request request;
- zval **zhost, options, headers;
-
- INIT_PZVAL(&options);
- INIT_PZVAL(&headers);
- array_init(&options);
- array_init(&headers);
- zend_hash_copy(Z_ARRVAL(headers), &message->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
- add_assoc_zval(&options, "headers", &headers);
+ zval **zhost, *options, *headers;
+
+ MAKE_STD_ZVAL(options);
+ MAKE_STD_ZVAL(headers);
+ array_init(options);
+ array_init(headers);
+ zend_hash_copy(Z_ARRVAL_P(headers), &message->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+ add_assoc_zval(options, "headers", headers);
/* check host header */
- if (SUCCESS == zend_hash_find(&message->hdrs, "Host", sizeof("Host"), (void *) &zhost)) {
+ if (SUCCESS == zend_hash_find(&message->hdrs, "Host", sizeof("Host"), (void *) &zhost) && Z_TYPE_PP(zhost) == IS_STRING) {
char *colon = NULL;
php_url parts, *url = php_url_parse(message->http.info.request.url);
http_request_init_ex(&request, NULL, request.meth, uri);
request.body = http_request_body_init_ex(&body, HTTP_REQUEST_BODY_CSTRING, PHPSTR_VAL(message), PHPSTR_LEN(message), 0);
- if (SUCCESS == (rs = http_request_prepare(&request, NULL))) {
+ if (SUCCESS == (rs = http_request_prepare(&request, Z_ARRVAL_P(options)))) {
http_request_exec(&request);
}
http_request_dtor(&request);
message->http.info.request.method);
}
efree(uri);
+ zval_ptr_dtor(&options);
#else
http_error(HE_WARNING, HTTP_E_RUNTIME, "HTTP requests not supported - ext/http was not linked against libcurl.");
#endif