- add dbg output
[m6w6/ext-http] / http_message_api.c
index 85b2b005bf1ebbc83c29a1854b65ee8fb3c3846c..6ac56ca37d618d9ea77a6554b84254898296bc4f 100644 (file)
@@ -76,6 +76,68 @@ PHP_HTTP_API http_message *_http_message_init_ex(http_message *message, http_mes
        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 = atof(Z_STRVAL_P(sval) + lenof("HTTP/"));
+                       } 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)
 {
@@ -104,17 +166,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:
@@ -317,18 +379,11 @@ PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_
 
        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:
@@ -455,12 +510,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: