+/* }}} HttpUtil */
+
+/* {{{ HttpMessage */
+zend_class_entry *http_message_ce;
+static zend_object_handlers http_message_object_handlers;
+
+#define HTTP_MSG_PROPHASH_TYPE 276192743LU
+#define HTTP_MSG_PROPHASH_HTTP_VERSION 1138628683LU
+#define HTTP_MSG_PROPHASH_RAW 2090679983LU
+#define HTTP_MSG_PROPHASH_BODY 254474387LU
+#define HTTP_MSG_PROPHASH_HEADERS 3199929089LU
+#define HTTP_MSG_PROPHASH_NESTED_MESSAGE 3652857165LU
+#define HTTP_MSG_PROPHASH_REQUEST_METHOD 1669022159LU
+#define HTTP_MSG_PROPHASH_REQUEST_URI 3208695486LU
+#define HTTP_MSG_PROPHASH_RESPONSE_STATUS 3857097400LU
+
+#define http_message_object_read_prop _http_message_object_read_prop
+static zval *_http_message_object_read_prop(zval *object, zval *member, int type TSRMLS_DC)
+{
+ getObjectEx(http_message_object, obj, object);
+ http_message *msg = obj->message;
+ zval *return_value;
+
+ if (!EG(scope) || !instanceof_function(EG(scope), obj->zo.ce TSRMLS_CC)) {
+ zend_error(E_WARNING, "Cannot access protected property %s::$%s", obj->zo.ce->name, Z_STRVAL_P(member));
+ return EG(uninitialized_zval_ptr);
+ }
+
+ ALLOC_ZVAL(return_value);
+ return_value->refcount = 0;
+
+#if 1
+ fprintf(stderr, "Reading property: %s(%d==%d) (%lu)\n", Z_STRVAL_P(member), Z_STRLEN_P(member), strlen(Z_STRVAL_P(member)),
+ zend_get_hash_value(Z_STRVAL_P(member), strlen(Z_STRVAL_P(member)) + 1)
+ );
+#endif
+
+ switch (zend_get_hash_value(Z_STRVAL_P(member), strlen(Z_STRVAL_P(member)) + 1))
+ {
+ case HTTP_MSG_PROPHASH_TYPE:
+ RETVAL_LONG(msg->type);
+ break;
+
+ case HTTP_MSG_PROPHASH_HTTP_VERSION:
+ switch (msg->type)
+ {
+ case HTTP_MSG_NONE:
+ RETVAL_NULL();
+ break;
+
+ case HTTP_MSG_REQUEST:
+ RETVAL_DOUBLE(msg->info.request.http_version);
+ break;
+
+ case HTTP_MSG_RESPONSE:
+ RETVAL_DOUBLE(msg->info.response.http_version);
+ break;
+ }
+ break;
+
+ case HTTP_MSG_PROPHASH_RAW:
+ if (msg->raw) {
+ if (msg->len) {
+ RETVAL_STRINGL(msg->raw, msg->len, 1);
+ } else {
+ RETVAL_STRINGL(empty_string, 0, 0);
+ }
+ } else {
+ RETVAL_NULL();
+ }
+ break;
+
+ case HTTP_MSG_PROPHASH_BODY:
+ phpstr_fix(PHPSTR(msg));
+ RETVAL_PHPSTR(PHPSTR(msg), 0, 1);
+ break;
+
+ case HTTP_MSG_PROPHASH_HEADERS:
+ Z_TYPE_P(return_value) = IS_ARRAY;
+ Z_ARRVAL_P(return_value) = &msg->hdrs;
+ break;
+
+ case HTTP_MSG_PROPHASH_NESTED_MESSAGE:
+ RETVAL_NULL();
+ break;
+
+ case HTTP_MSG_PROPHASH_REQUEST_METHOD:
+ if (msg->type == HTTP_MSG_REQUEST && msg->info.request.method) {
+ RETVAL_STRING(msg->info.request.method, 1);
+ } else {
+ RETVAL_NULL();
+ }
+ break;
+
+ case HTTP_MSG_PROPHASH_REQUEST_URI:
+ if (msg->type == HTTP_MSG_REQUEST && msg->info.request.URI) {
+ RETVAL_STRING(msg->info.request.URI, 1);
+ } else {
+ RETVAL_NULL();
+ }
+ break;
+
+ case HTTP_MSG_PROPHASH_RESPONSE_STATUS:
+ if (msg->type == HTTP_MSG_RESPONSE) {
+ RETVAL_LONG(msg->info.response.status);
+ } else {
+ RETVAL_NULL();
+ }
+ break;
+
+ default:
+ RETVAL_NULL();
+ break;
+ }
+
+ return return_value;
+}
+
+#define http_message_object_write_prop _http_message_object_write_prop
+static void _http_message_object_write_prop(zval *object, zval *member, zval *value TSRMLS_DC)
+{
+ getObjectEx(http_message_object, obj, object);
+ http_message *msg = obj->message;
+
+ if (!EG(scope) || !instanceof_function(EG(scope), obj->zo.ce TSRMLS_CC)) {
+ zend_error(E_WARNING, "Cannot access protected property %s::$%s", obj->zo.ce->name, Z_STRVAL_P(member));
+ }
+
+#if 1
+ fprintf(stderr, "Writing property: %s(%d==%d) (%lu)\n", Z_STRVAL_P(member), Z_STRLEN_P(member), strlen(Z_STRVAL_P(member)),
+ zend_get_hash_value(Z_STRVAL_P(member), strlen(Z_STRVAL_P(member)) + 1)
+ );
+#endif
+
+ switch (zend_get_hash_value(Z_STRVAL_P(member), strlen(Z_STRVAL_P(member)) + 1))
+ {
+ case HTTP_MSG_PROPHASH_TYPE:
+ msg->type = Z_LVAL_P(value);
+ break;
+
+ case HTTP_MSG_PROPHASH_HTTP_VERSION:
+ switch (msg->type)
+ {
+ case HTTP_MSG_REQUEST:
+ msg->info.request.http_version = (float) Z_DVAL_P(value);
+ break;
+
+ case HTTP_MSG_RESPONSE:
+ msg->info.response.http_version = (float) Z_DVAL_P(value);
+ break;
+ }
+ break;
+
+ case HTTP_MSG_PROPHASH_RAW:
+ http_message_dtor(msg);
+ http_message_parse_ex(msg, Z_STRVAL_P(value), Z_STRLEN_P(value), 1);
+ break;
+
+ case HTTP_MSG_PROPHASH_BODY:
+ phpstr_dtor(PHPSTR(msg));
+ phpstr_from_string_ex(PHPSTR(msg), Z_STRVAL_P(value), Z_STRLEN_P(value));
+ break;
+
+ case HTTP_MSG_PROPHASH_HEADERS:
+ zend_hash_clean(&msg->hdrs);
+ zend_hash_copy(&msg->hdrs, Z_ARRVAL_P(value), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+ break;
+
+ case HTTP_MSG_PROPHASH_NESTED_MESSAGE:
+ break;
+
+ case HTTP_MSG_PROPHASH_REQUEST_METHOD:
+ if (msg->type == HTTP_MSG_REQUEST) {
+ if (msg->info.request.method) {
+ efree(msg->info.request.method);
+ }
+ msg->info.request.method = estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value));
+ }
+ break;
+
+ case HTTP_MSG_PROPHASH_REQUEST_URI:
+ if (msg->type == HTTP_MSG_REQUEST) {
+ if (msg->info.request.URI) {
+ efree(msg->info.request.URI);
+ }
+ msg->info.request.URI = estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value));
+ }
+ break;
+
+ case HTTP_MSG_PROPHASH_RESPONSE_STATUS:
+ if (msg->type == HTTP_MSG_RESPONSE) {
+ msg->info.response.status = Z_LVAL_P(value);
+ }
+ break;
+ }
+}