better fix for robs issue
[m6w6/ext-http] / http_message_api.c
index 87689da915717e5b8118d7f1ce3df5fb0e1ef684..e85774fbb1c7d25a191554180b5bea75a9aefbb5 100644 (file)
@@ -6,7 +6,7 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2006, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2007, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
@@ -91,20 +91,16 @@ PHP_HTTP_API http_message *_http_message_init_env(http_message *message, http_me
        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), ZEND_STRL("HTTP/"))) {
-                               inf.http.version = atof(Z_STRVAL_P(sval) + lenof("HTTP/"));
+                       if ((sval = http_get_server_var("SERVER_PROTOCOL", 1)) && !strncmp(Z_STRVAL_P(sval), "HTTP/", lenof("HTTP/"))) {
+                               inf.http.version = zend_strtod(Z_STRVAL_P(sval) + lenof("HTTP/"), NULL);
                        } 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));
-                       } else {
-                               inf.http.info.request.method = ecalloc(1, 1);
                        }
                        if ((sval = http_get_server_var("REQUEST_URI", 1))) {
                                inf.http.info.request.url = estrdup(Z_STRVAL_P(sval));
-                       } else {
-                               inf.http.info.request.url = ecalloc(1, 1);
                        }
                        
                        http_message_set_info(message, &inf);
@@ -170,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)
 {
-       message->http.version = info->http.version;
        http_message_set_type(message, info->type);
+       message->http.version = info->http.version;
        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:
@@ -383,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:
@@ -408,13 +397,41 @@ PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_
                        zval **single_header;
 
                        switch (Z_TYPE_PP(header)) {
+                               case IS_BOOL:
+                                       phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_BVAL_PP(header)?"true":"false");
+                                       break;
+                                       
+                               case IS_LONG:
+                                       phpstr_appendf(&str, "%s: %ld" HTTP_CRLF, key.str, Z_LVAL_PP(header));
+                                       break;
+                                       
+                               case IS_DOUBLE:
+                                       phpstr_appendf(&str, "%s: %f" HTTP_CRLF, key.str, Z_DVAL_PP(header));
+                                       break;
+                                       
                                case IS_STRING:
                                        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.str, Z_STRVAL_PP(single_header));
+                                               switch (Z_TYPE_PP(single_header)) {
+                                                       case IS_BOOL:
+                                                               phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_BVAL_PP(single_header)?"true":"false");
+                                                               break;
+                                                               
+                                                       case IS_LONG:
+                                                               phpstr_appendf(&str, "%s: %ld" HTTP_CRLF, key.str, Z_LVAL_PP(single_header));
+                                                               break;
+                                                               
+                                                       case IS_DOUBLE:
+                                                               phpstr_appendf(&str, "%s: %f" HTTP_CRLF, key.str, Z_DVAL_PP(single_header));
+                                                               break;
+                                                               
+                                                       case IS_STRING:
+                                                               phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key.str, Z_STRVAL_PP(single_header));
+                                                               break;
+                                               }
                                        }
                                        break;
                        }
@@ -521,12 +538,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: