if (message) {
zend_hash_destroy(&message->hdrs);
phpstr_dtor(PHPSTR(message));
- if (message->dup && message->raw.dup) {
- efree(message->raw.dup);
+ if (message->raw) {
+ efree(message->raw);
}
if (message->type == HTTP_MSG_REQUEST) {
if (message->info.request.method) {
return message;
}
-PHP_HTTP_API http_message *_http_message_parse_ex(const char *message, size_t length, zend_bool dup TSRMLS_DC)
+PHP_HTTP_API http_message *_http_message_parse_ex(char *message, size_t length, zend_bool dup TSRMLS_DC)
{
- const char *message_start = message, *body = NULL;
+ char *message_start = message, *body = NULL;
size_t message_length = length, header_length = 0;
http_message *msg;
msg = http_message_init();
+ msg->len = length;
+ msg->raw = dup ? estrndup(message, length) : message;
+
// response
if (!strncmp(message, "HTTP/1.", lenof("HTTP/1."))) {
msg->type = HTTP_MSG_RESPONSE;
message_start += lenof(HTTP_CRLF);
message_length -= message_start - message;
- if (msg->dup = dup) {
- msg->len = length;
- msg->raw.dup = estrndup(message, length);
- } else {
- msg->len = length;
- msg->raw.ptr = message;
- }
-
if (body = strstr(message_start, HTTP_CRLF HTTP_CRLF)) {
body += lenof(HTTP_CRLF HTTP_CRLF);
header_length = body - message_start;
zval **header;
phpstr_init_ex(&str, msg->len, 1);
+ str.size = 4096;
switch (msg->type)
{
FOREACH_HASH_KEYVAL(&msg->hdrs, key, idx, header) {
if (key) {
- phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(header));
+ switch (Z_TYPE_PP(header))
+ {
+ case IS_STRING:
+ phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(header));
+ break;
+
+ case IS_ARRAY:
+ {
+ zval **single_header;
+
+ FOREACH_VAL(*header, single_header) {
+ phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(single_header));
+ }
+ }
+ break;
+ }
+
key = NULL;
}
}
phpstr_appends(&str, HTTP_CRLF);
- phpstr_append(&str, msg->body.data, msg->body.used);
+ phpstr_append(&str, PHPSTR_VAL(msg), PHPSTR_LEN(msg));
phpstr_fix(&str);
data = phpstr_data(&str, string, length);