| 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-2007, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
*/
return message;
}
+PHP_HTTP_API http_message *_http_message_init_env(http_message *message, http_message_type type TSRMLS_DC ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ int free_msg;
+ http_info inf;
+ zval *sval, tval;
+ char *body_str;
+ size_t body_len;
+
+ if ((free_msg = !message)) {
+ message = http_message_init_rel(NULL, HTTP_MSG_NONE);
+ }
+
+ 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), "HTTP/", lenof("HTTP/"))) {
+ inf.http.version = zend_strtod(Z_STRVAL_P(sval) + lenof("HTTP/"), NULL);
+ } else {
+ inf.http.version = 1.1;
+ }
+ if ((sval = http_get_server_var("REQUEST_METHOD", 1))) {
+ inf.http.info.request.method = estrdup(Z_STRVAL_P(sval));
+ }
+ if ((sval = http_get_server_var("REQUEST_URI", 1))) {
+ inf.http.info.request.url = estrdup(Z_STRVAL_P(sval));
+ }
+
+ http_message_set_info(message, &inf);
+ http_get_request_headers(&message->hdrs);
+ if (SUCCESS == http_get_request_body_ex(&body_str, &body_len, 0)) {
+ phpstr_from_string_ex(&message->body, body_str, body_len);
+ }
+ break;
+
+ case HTTP_MSG_RESPONSE:
+ if (!SG(sapi_headers).http_status_line || SUCCESS != http_info_parse_ex(SG(sapi_headers).http_status_line, &inf, 0)) {
+ inf.http.version = 1.1;
+ inf.http.info.response.code = 200;
+ inf.http.info.response.status = estrdup("Ok");
+ }
+
+ http_message_set_info(message, &inf);
+ http_get_response_headers(&message->hdrs);
+ if (SUCCESS == php_ob_get_buffer(&tval TSRMLS_CC)) {
+ message->body.data = Z_STRVAL(tval);
+ message->body.used = Z_STRLEN(tval);
+ message->body.free = 1; /* "\0" */
+ }
+ break;
+
+ default:
+ if (free_msg) {
+ http_message_free(&message);
+ } else {
+ message = NULL;
+ }
+ break;
+ }
+ http_info_dtor(&inf);
+
+ return message;
+}
PHP_HTTP_API void _http_message_set_type(http_message *message, http_message_type type)
{
PHP_HTTP_API void _http_message_set_info(http_message *message, http_info *info)
{
+ http_message_set_type(message, info->type);
message->http.version = info->http.version;
-
- switch (message->type = info->type) {
+ switch (message->type) {
case IS_HTTP_REQUEST:
- HTTP_INFO(message).request.url = estrdup(HTTP_INFO(info).request.url);
- STR_SET(HTTP_INFO(message).request.method, estrdup(HTTP_INFO(info).request.method));
+ STR_SET(HTTP_INFO(message).request.url, HTTP_INFO(info).request.url ? estrdup(HTTP_INFO(info).request.url) : NULL);
+ STR_SET(HTTP_INFO(message).request.method, HTTP_INFO(info).request.method ? estrdup(HTTP_INFO(info).request.method) : NULL);
break;
case IS_HTTP_RESPONSE:
HTTP_INFO(message).response.code = HTTP_INFO(info).response.code;
- STR_SET(HTTP_INFO(message).response.status, estrdup(HTTP_INFO(info).response.status));
+ STR_SET(HTTP_INFO(message).response.status, HTTP_INFO(info).response.status ? estrdup(HTTP_INFO(info).response.status) : NULL);
break;
default:
switch (msg->type) {
case HTTP_MSG_REQUEST:
- phpstr_appendf(&str, "%s %s HTTP/%1.1f" HTTP_CRLF,
- msg->http.info.request.method?msg->http.info.request.method:"UNKNOWN",
- msg->http.info.request.url?msg->http.info.request.url:"/",
- msg->http.version);
+ phpstr_appendf(&str, HTTP_INFO_REQUEST_FMT_ARGS(&msg->http, HTTP_CRLF));
break;
case HTTP_MSG_RESPONSE:
- phpstr_appendf(&str, "HTTP/%1.1f %d%s%s" HTTP_CRLF,
- msg->http.version,
- msg->http.info.response.code,
- msg->http.info.response.status&&*msg->http.info.response.status ? " ":"",
- STR_PTR(msg->http.info.response.status));
+ phpstr_appendf(&str, HTTP_INFO_RESPONSE_FMT_ARGS(&msg->http, HTTP_CRLF));
break;
case HTTP_MSG_NONE:
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;
}
{
case HTTP_MSG_RESPONSE:
add_assoc_long(&strct, "responseCode", msg->http.info.response.code);
- add_assoc_string(&strct, "responseStatus", msg->http.info.response.status, 1);
+ add_assoc_string(&strct, "responseStatus", STR_PTR(msg->http.info.response.status), 1);
break;
case HTTP_MSG_REQUEST:
- add_assoc_string(&strct, "requestMethod", msg->http.info.request.method, 1);
- add_assoc_string(&strct, "requestUrl", msg->http.info.request.url, 1);
+ add_assoc_string(&strct, "requestMethod", STR_PTR(msg->http.info.request.method), 1);
+ add_assoc_string(&strct, "requestUrl", STR_PTR(msg->http.info.request.url), 1);
break;
case HTTP_MSG_NONE:
#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