X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_message_api.c;h=4f1ac7fb3641b61d53db8339cca84d37b4c826f3;hb=3ad8127ad3632ca474914c599fca810f217768bf;hp=4da4e88e517b498dc56c82e573ccf4e0f467cb8f;hpb=864a85259b0369033e49666603eed6661b01606c;p=m6w6%2Fext-http diff --git a/http_message_api.c b/http_message_api.c index 4da4e88..4f1ac7f 100644 --- a/http_message_api.c +++ b/http_message_api.c @@ -104,17 +104,17 @@ PHP_HTTP_API void _http_message_set_type(http_message *message, http_message_typ 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: @@ -308,27 +308,20 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_t *length) { phpstr str; - char *key, *data; - ulong idx; + HashKey key = initHashKey(0); zval **header; + char *data; HashPosition pos1; phpstr_init_ex(&str, 4096, 0); 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: @@ -336,24 +329,22 @@ PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_ break; } - FOREACH_HASH_KEYVAL(pos1, &msg->hdrs, key, idx, header) { - if (key) { + FOREACH_HASH_KEYVAL(pos1, &msg->hdrs, key, header) { + if (key.type == HASH_KEY_IS_STRING) { HashPosition pos2; zval **single_header; switch (Z_TYPE_PP(header)) { case IS_STRING: - phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(header)); + 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, Z_STRVAL_PP(single_header)); + phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_STRVAL_PP(single_header)); } break; } - - key = NULL; } } @@ -457,12 +448,12 @@ PHP_HTTP_API void _http_message_tostruct_recursive(http_message *msg, zval *obj { 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: @@ -500,16 +491,13 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC) switch (message->type) { case HTTP_MSG_RESPONSE: { - char *key; - uint len; - ulong idx; + HashKey key = initHashKey(0); zval **val; HashPosition pos; - FOREACH_HASH_KEYLENVAL(pos, &message->hdrs, key, len, idx, val) { - if (key) { - http_send_header_zval_ex(key, len-1, val, 1); - key = NULL; + FOREACH_HASH_KEYVAL(pos, &message->hdrs, key, val) { + if (key.type == HASH_KEY_IS_STRING) { + http_send_header_zval_ex(key.str, key.len-1, val, 1); } } rs = SUCCESS == http_send_status(message->http.info.response.code) &&