return message;
}
-PHP_HTTP_API http_message *_http_message_parse_ex(char *message, size_t message_length, zend_bool dup TSRMLS_DC)
+PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, char *message, size_t message_length, zend_bool dup TSRMLS_DC)
{
char *body = NULL;
size_t header_length = 0;
- http_message *msg;
+ zend_bool free_msg = msg ? 0 : 1;
if (message_length < HTTP_MSG_MIN_SIZE) {
return NULL;
return NULL;
}
- msg = http_message_new();
+ msg = http_message_init(msg);
msg->len = message_length;
msg->raw = dup ? estrndup(message, message_length) : message;
} else {
header_length = message_length;
}
-
- http_parse_headers_cb(message, header_length, &msg->hdrs, 1, http_message_parse_headers_callback, (void **) &msg);
-
+
+ if (SUCCESS != http_parse_headers_cb(message, header_length, &msg->hdrs, 1, http_message_parse_headers_callback, (void **) &msg)) {
+ if (free_msg) {
+ http_message_free(msg);
+ }
+ return NULL;
+ }
+
if (body) {
phpstr_from_string_ex(PHPSTR(msg), body, message_length - header_length);
}
-
+
return msg;
}
{
http_message *old = (http_message *) *message;
http_message *new;
-
+
if (old->type || zend_hash_num_elements(&old->hdrs) || PHPSTR_LEN(old)) {
new = http_message_new();
-
+
new->nested = old;
*message = new;
*headers = &new->hdrs;
} else {
new = old;
}
-
+
// 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.status = atoi(http_line + lenof("HTTP/1.1 "));
+ 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."))) {
case HTTP_MSG_RESPONSE:
phpstr_appendf(&str, "HTTP/%1.1f %d" HTTP_CRLF,
msg->info.response.http_version,
- msg->info.response.status);
+ msg->info.response.code);
break;
}
case IS_STRING:
phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(header));
break;
-
+
case IS_ARRAY:
FOREACH_VAL(*header, single_header) {
phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(single_header));
}
break;
}
-
+
key = NULL;
}
}
phpstr_dtor(PHPSTR(message));
if (message->raw) {
efree(message->raw);
+ message->raw = NULL;
}
if (message->type == HTTP_MSG_REQUEST) {
if (message->info.request.method) {
efree(message->info.request.method);
+ message->info.request.method = NULL;
}
if (message->info.request.URI) {
efree(message->info.request.URI);
+ message->info.request.URI = NULL;
}
}
}