X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_message_api.c;h=7f22d17095d1a5afb90da96969edc411914e2e73;hp=1c977bf3dbc18798f263692c7f127754556be675;hb=6a5ec2c676458f24e191801ee20bce02691138b6;hpb=c2b4f0332ead5425b183d2487ab5f25663f1009f diff --git a/http_message_api.c b/http_message_api.c index 1c977bf..7f22d17 100644 --- a/http_message_api.c +++ b/http_message_api.c @@ -26,7 +26,7 @@ #include "php_http_message_api.h" #include "php_http_headers_api.h" #include "php_http_send_api.h" -#include "php_http_curl_api.h" +#include "php_http_request_api.h" #include "php_http_url_api.h" #include "phpstr/phpstr.h" @@ -59,14 +59,14 @@ static void _http_message_headers_cb(const char *http_line, HashTable **headers, // response if (!strncmp(http_line, "HTTP/1.", lenof("HTTP/1."))) { new->type = HTTP_MSG_RESPONSE; - new->info.response.http_version = atof(http_line + lenof("HTTP/")); + new->info.response.http_version = (float) atof(http_line + lenof("HTTP/")); new->info.response.code = atoi(http_line + lenof("HTTP/1.1 ")); } else // request if (!strncmp(http_line + line_length - lenof("HTTP/1.1"), "HTTP/1.", lenof("HTTP/1."))) { const char *method_sep_uri = strchr(http_line, ' '); new->type = HTTP_MSG_REQUEST; - new->info.request.http_version = atof(http_line + line_length - lenof("1.1")); + new->info.request.http_version = (float) atof(http_line + line_length - lenof("1.1")); new->info.request.method = estrndup(http_line, method_sep_uri - http_line); new->info.request.URI = estrndup(method_sep_uri + 1, http_line + line_length - method_sep_uri - 1 - lenof(" HTTP/1.1")); } @@ -182,8 +182,21 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char char *decoded; size_t decoded_len; + /* decode and replace Transfer-Encoding with Content-Length header */ if (continue_at = http_chunked_decode(body, message + message_length - body, &decoded, &decoded_len)) { phpstr_from_string_ex(PHPSTR(msg), decoded, decoded_len); + efree(decoded); + { + zval *len; + char *tmp; + + spprintf(&tmp, 0, "%lu", decoded_len); + MAKE_STD_ZVAL(len); + ZVAL_STRING(len, tmp, 0); + + zend_hash_del(&msg->hdrs, "Transfer-Encoding", sizeof("Transfer-Encoding")); + zend_hash_add(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL); + } } } } else @@ -273,9 +286,11 @@ PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_ } } - phpstr_appends(&str, HTTP_CRLF); - phpstr_append(&str, PHPSTR_VAL(msg), PHPSTR_LEN(msg)); - phpstr_appends(&str, HTTP_CRLF); + if (PHPSTR_LEN(msg)) { + phpstr_appends(&str, HTTP_CRLF); + phpstr_append(&str, PHPSTR_VAL(msg), PHPSTR_LEN(msg)); + phpstr_appends(&str, HTTP_CRLF); + } data = phpstr_data(&str, string, length); if (!string) { @@ -295,7 +310,7 @@ PHP_HTTP_API void _http_message_serialize(http_message *message, char **string, do { http_message_tostring(message, &buf, &len); - phpstr_append(&str, buf, len); + phpstr_prepend(&str, buf, len); efree(buf); } while (message = message->parent); @@ -367,7 +382,8 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC) } if (!strcasecmp("POST", message->info.request.method)) { - rs = http_post_data(uri, PHPSTR_VAL(message), PHPSTR_LEN(message), Z_ARRVAL(options), NULL, NULL); + http_request_body body = {HTTP_REQUEST_BODY_CSTRING, PHPSTR_VAL(message), PHPSTR_LEN(message)}; + rs = http_post(uri, &body, Z_ARRVAL(options), NULL, NULL); } else if (!strcasecmp("GET", message->info.request.method)) { rs = http_get(uri, Z_ARRVAL(options), NULL, NULL); @@ -396,6 +412,21 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC) return rs; } +PHP_HTTP_API http_message *_http_message_dup(http_message *msg TSRMLS_DC) +{ + /* + * TODO: unroll + */ + http_message *new; + char *serialized_data; + size_t serialized_length; + + http_message_serialize(msg, &serialized_data, &serialized_length); + new = http_message_parse(serialized_data, serialized_length); + efree(serialized_data); + return new; +} + PHP_HTTP_API void _http_message_dtor(http_message *message) { if (message) { @@ -434,4 +465,3 @@ PHP_HTTP_API void _http_message_free(http_message *message) * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */ -