X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_request_object.c;h=3bf2f9871c0556d5be618989d3de579929e4846d;hb=7904ebbfd747d11f0821d2b2712600ab07a36ff6;hp=ef8445c30c122f8c56e95af711b0ceaf6023007f;hpb=1052c4986a794b051dc48ba4118dbd6fd8f83c49;p=m6w6%2Fext-http diff --git a/http_request_object.c b/http_request_object.c index ef8445c..3bf2f98 100644 --- a/http_request_object.c +++ b/http_request_object.c @@ -313,7 +313,6 @@ zend_object_value _http_request_object_new_ex(zend_class_entry *ce, CURL *ch, ht o = ecalloc(1, sizeof(http_request_object)); o->zo.ce = ce; o->request = http_request_init_ex(NULL, ch, 0, NULL); - phpstr_init(&o->history); if (ptr) { *ptr = o; @@ -343,7 +342,6 @@ zend_object_value _http_request_object_clone_obj(zval *this_ptr TSRMLS_DC) } zend_objects_clone_members(&new_obj->zo, new_ov, old_zo, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC); - phpstr_append(&new_obj->history, old_obj->history.data, old_obj->history.used); phpstr_append(&new_obj->request->conv.request, old_obj->request->conv.request.data, old_obj->request->conv.request.used); phpstr_append(&new_obj->request->conv.response, old_obj->request->conv.response.data, old_obj->request->conv.response.used); @@ -368,7 +366,7 @@ static inline void _http_request_object_declare_default_properties(TSRMLS_D) DCL_PROP(PRIVATE, string, rawPostData, ""); DCL_PROP(PRIVATE, string, queryData, ""); DCL_PROP(PRIVATE, string, putFile, ""); - + DCL_PROP_N(PRIVATE, history); DCL_PROP(PUBLIC, bool, recordHistory, 0); #ifndef WONKY @@ -431,7 +429,6 @@ void _http_request_object_free(zend_object *object TSRMLS_DC) FREE_HASHTABLE(OBJ_PROP(o)); } http_request_free(&o->request); - phpstr_dtor(&o->history); efree(o); } @@ -453,7 +450,7 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ case HTTP_PUT: { php_stream_statbuf ssb; - php_stream *stream = php_stream_open_wrapper(Z_STRVAL_P(GET_PROP(putFile)), "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); + php_stream *stream = php_stream_open_wrapper_ex(Z_STRVAL_P(GET_PROP(putFile)), "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL, HTTP_DEFAULT_STREAM_CONTEXT); if (stream && !php_stream_stat(stream, &ssb)) { obj->request->body = http_request_body_init_ex(obj->request->body, HTTP_REQUEST_BODY_UPLOADFILE, stream, ssb.sb.st_size, 1); @@ -481,7 +478,7 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ zval **ct_header; /* only override if not already set */ - if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(headers), "Content-Type", sizeof("Content-Type"), (void **) &ct_header)) && (Z_TYPE_PP(ct_header) == IS_STRING)) { + if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(headers), "Content-Type", sizeof("Content-Type"), (void **) &ct_header))) { add_assoc_stringl(*headers, "Content-Type", Z_STRVAL_P(ctype), Z_STRLEN_P(ctype), 1); } } else { @@ -554,44 +551,38 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this_ptr TSRMLS_DC) { + STATUS ret; + zval *info; http_message *msg; + /* always fetch info */ + MAKE_STD_ZVAL(info); + array_init(info); + http_request_info(obj->request, Z_ARRVAL_P(info)); + SET_PROP(responseInfo, info); + zval_ptr_dtor(&info); + + /* parse response message */ phpstr_fix(&obj->request->conv.request); phpstr_fix(&obj->request->conv.response); - msg = http_message_parse(PHPSTR_VAL(&obj->request->conv.response), PHPSTR_LEN(&obj->request->conv.response)); - - if (!msg) { - return FAILURE; - } else { + if ((msg = http_message_parse(PHPSTR_VAL(&obj->request->conv.response), PHPSTR_LEN(&obj->request->conv.response)))) { char *body; size_t body_len; - zval *headers, *message, *resp, *info; + zval *headers, *message, *resp; if (zval_is_true(GET_PROP(recordHistory))) { - /* we need to act like a zipper, as we'll receive - * the requests and the responses in separate chains - * for redirects - */ - http_message *response = msg, *request = http_message_parse(PHPSTR_VAL(&obj->request->conv.request), PHPSTR_LEN(&obj->request->conv.request)); - http_message *free_msg = request; - - do { - char *message; - size_t msglen; - - http_message_tostring(response, &message, &msglen); - phpstr_append(&obj->history, message, msglen); - efree(message); - - http_message_tostring(request, &message, &msglen); - phpstr_append(&obj->history, message, msglen); - efree(message); - - } while ((response = response->parent) && (request = request->parent)); - - http_message_free(&free_msg); - phpstr_fix(&obj->history); + zval *hist, *history = GET_PROP(history); + http_message *response = http_message_parse(PHPSTR_VAL(&obj->request->conv.response), PHPSTR_LEN(&obj->request->conv.response)); + http_message *request = http_message_parse(PHPSTR_VAL(&obj->request->conv.request), PHPSTR_LEN(&obj->request->conv.request)); + + MAKE_STD_ZVAL(hist); + ZVAL_OBJVAL(hist, http_message_object_new_ex(http_message_object_ce, http_message_interconnect(response, request), NULL), 0); + if (Z_TYPE_P(history) == IS_OBJECT) { + http_message_object_prepend(hist, history); + } + SET_PROP(history, hist); + zval_ptr_dtor(&hist); } UPD_PROP(long, responseCode, msg->http.info.response.code); @@ -613,18 +604,53 @@ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this SET_PROP(responseMessage, message); zval_ptr_dtor(&message); - MAKE_STD_ZVAL(info); - array_init(info); - http_request_info(obj->request, Z_ARRVAL_P(info)); - SET_PROP(responseInfo, info); - zval_ptr_dtor(&info); + ret = SUCCESS; + } else { + /* update properties with empty values*/ + zval *resp = GET_PROP(responseData), *znull; + + MAKE_STD_ZVAL(znull); + ZVAL_NULL(znull); + SET_PROP(responseMessage, znull); + zval_ptr_dtor(&znull); - if (zend_hash_exists(&Z_OBJCE_P(getThis())->function_table, "onfinish", sizeof("onfinish"))) { - zend_call_method_with_0_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "onfinish", NULL); + if (Z_TYPE_P(resp) == IS_ARRAY) { + zend_hash_clean(Z_ARRVAL_P(resp)); + } + + UPD_PROP(long, responseCode, 0); + UPD_PROP(string, responseStatus, ""); + + /* append request message to history */ + if (zval_is_true(GET_PROP(recordHistory))) { + http_message *request; + + if ((request = http_message_parse(PHPSTR_VAL(&obj->request->conv.request), PHPSTR_LEN(&obj->request->conv.request)))) { + zval *hist, *history = GET_PROP(history); + + MAKE_STD_ZVAL(hist); + ZVAL_OBJVAL(hist, http_message_object_new_ex(http_message_object_ce, request, NULL), 0); + if (Z_TYPE_P(history) == IS_OBJECT) { + http_message_object_prepend(hist, history); + } + SET_PROP(history, hist); + zval_ptr_dtor(&hist); + } } - return SUCCESS; + ret = FAILURE; } + + if (zend_hash_exists(&Z_OBJCE_P(getThis())->function_table, "onfinish", sizeof("onfinish"))) { + zval *param; + + MAKE_STD_ZVAL(param); + ZVAL_BOOL(param, ret == SUCCESS); + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "onfinish", NULL, param); + zval_ptr_dtor(¶m); + } + + return ret; } #define http_request_object_set_options_subr(key, ow) \ @@ -1542,7 +1568,6 @@ PHP_METHOD(HttpRequest, getResponseCookies) if (Z_TYPE_PP(header) == IS_ARRAY) { zval **single_header; - HashPosition pos; FOREACH_VAL(pos2, *header, single_header) { ZVAL_ADDREF(*single_header); @@ -1808,8 +1833,8 @@ PHP_METHOD(HttpRequest, getRawResponseMessage) * * Get all sent requests and received responses as an HttpMessage object. * - * If you don't want to record history at all, set the instance variable - * HttpRequest::$recordHistory to FALSE. + * If you want to record history, set the instance variable + * HttpRequest::$recordHistory to TRUE. * * Returns an HttpMessage object representing the complete request/response * history. @@ -1817,23 +1842,21 @@ PHP_METHOD(HttpRequest, getRawResponseMessage) * The object references the last received response, use HttpMessage::getParentMessage() * to access the data of previously sent requests and received responses. * - * Note that the internal history is immutable, that means that any changes - * you make the the message list won't affect a history message list newly - * created by another call to HttpRequest::getHistory(). - * - * Throws HttpMalformedHeaderException, HttpEncodingException. + * Throws HttpRuntimeException. */ PHP_METHOD(HttpRequest, getHistory) { NO_ARGS; IF_RETVAL_USED { - http_message *msg; - getObject(http_request_object, obj); - + zval *hist; + SET_EH_THROW_HTTP(); - if ((msg = http_message_parse(PHPSTR_VAL(&obj->history), PHPSTR_LEN(&obj->history)))) { - RETVAL_OBJVAL(http_message_object_new_ex(http_message_object_ce, msg, NULL), 0); + hist = GET_PROP(history); + if (Z_TYPE_P(hist) == IS_OBJECT) { + RETVAL_OBJECT(hist, 1); + } else { + http_error(HE_WARNING, HTTP_E_RUNTIME, "The history is empty"); } SET_EH_NORMAL(); } @@ -1847,8 +1870,12 @@ PHP_METHOD(HttpRequest, getHistory) PHP_METHOD(HttpRequest, clearHistory) { NO_ARGS { - getObject(http_request_object, obj); - phpstr_dtor(&obj->history); + zval *hist; + + MAKE_STD_ZVAL(hist); + ZVAL_NULL(hist); + SET_PROP(history, hist); + zval_ptr_dtor(&hist); } } /* }}} */