+ zval *headers;
+ getObjectEx(http_message_object, obj, object);
+ http_message *msg = obj->message;
+
+#define ASSOC_PROP(obj, ptype, name, val) \
+ { \
+ zval array; \
+ char *m_prop_name; \
+ int m_prop_len; \
+ Z_ARRVAL(array) = OBJ_PROP(obj); \
+ zend_mangle_property_name(&m_prop_name, &m_prop_len, "*", 1, name, lenof(name), 1); \
+ add_assoc_ ##ptype## _ex(&array, m_prop_name, sizeof(name)+4, val); \
+ }
+#define ASSOC_STRING(obj, name, val) ASSOC_STRINGL(obj, name, val, strlen(val))
+#define ASSOC_STRINGL(obj, name, val, len) \
+ { \
+ zval array; \
+ char *m_prop_name; \
+ int m_prop_len; \
+ Z_ARRVAL(array) = OBJ_PROP(obj); \
+ zend_mangle_property_name(&m_prop_name, &m_prop_len, "*", 1, name, lenof(name), 1); \
+ add_assoc_stringl_ex(&array, m_prop_name, m_prop_len, val, len, val != empty_string); \
+ }
+
+ ASSOC_PROP(obj, long, "type", msg->type);
+ ASSOC_STRINGL(obj, "raw", msg->raw, msg->len)
+ ASSOC_STRINGL(obj, "body", PHPSTR_VAL(msg), PHPSTR_LEN(msg));
+
+ MAKE_STD_ZVAL(headers);
+ array_init(headers);
+
+ zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+ ASSOC_PROP(obj, zval, "headers", headers);
+
+ switch (msg->type)
+ {
+ case HTTP_MSG_REQUEST:
+ ASSOC_PROP(obj, double, "httpVersion", msg->info.request.http_version);
+ ASSOC_PROP(obj, long, "responseStatus", 0);
+ ASSOC_STRING(obj, "requestMethod", msg->info.request.method);
+ ASSOC_STRING(obj, "requestUri", msg->info.request.URI);
+ break;
+
+ case HTTP_MSG_RESPONSE:
+ ASSOC_PROP(obj, double, "httpVersion", msg->info.response.http_version);
+ ASSOC_PROP(obj, long, "responseStatus", msg->info.response.status);
+ ASSOC_STRING(obj, "requestMethod", empty_string);
+ ASSOC_STRING(obj, "requestUri", empty_string);
+ break;
+
+ case HTTP_MSG_NONE:
+ default:
+ ASSOC_PROP(obj, double, "httpVersion", 0.0);
+ ASSOC_PROP(obj, long, "responseStatus", 0);
+ ASSOC_STRING(obj, "requestMethod", empty_string);
+ ASSOC_STRING(obj, "requestUri", empty_string);
+ break;
+ }
+
+ return OBJ_PROP(obj);