@@ -129,7 +129,45 @@ static PyObject *py_ue_ihttp_request_get_response(ue_PyIHttpRequest *self, PyObj
129129 return py_ue_new_ihttp_response (response.Get ());
130130}
131131
132+ void UPythonHttpDelegate::OnRequestComplete (FHttpRequestPtr request, FHttpResponsePtr response, bool successful) {
133+ FScopePythonGIL gil;
134+
135+ if (!request.IsValid () || !response.IsValid ()) {
136+ UE_LOG (LogPython, Error, TEXT (" Unable to retrieve HTTP infos" ));
137+ return ;
138+ }
139+
140+ PyObject *ret = PyObject_CallFunction (py_callable, (char *)" OOO" , py_http_request, py_ue_new_ihttp_response (response.Get ()), successful ? Py_True : Py_False);
141+ if (!ret) {
142+ unreal_engine_py_log_error ();
143+ return ;
144+ }
145+ Py_DECREF (ret);
146+ }
147+
148+ static PyObject *py_ue_ihttp_request_bind_on_process_request_complete (ue_PyIHttpRequest *self, PyObject * args) {
149+
150+ PyObject *py_callable;
151+ if (!PyArg_ParseTuple (args, " O:bind_on_process_request_complete" , &py_callable)) {
152+ return NULL ;
153+ }
154+
155+ if (!PyCallable_Check (py_callable)) {
156+ return PyErr_Format (PyExc_Exception, " argument is not a callable" );
157+ }
158+
159+ UPythonHttpDelegate *py_delegate = NewObject<UPythonHttpDelegate>();
160+ py_delegate->SetPyCallable (py_callable);
161+ // this trick avoids generating a new python object
162+ py_delegate->SetPyHttpRequest (self);
163+ self->http_request ->OnProcessRequestComplete ().BindUObject (py_delegate, &UPythonHttpDelegate::OnRequestComplete);
164+
165+ Py_INCREF (Py_None);
166+ return Py_None;
167+ }
168+
132169static PyMethodDef ue_PyIHttpRequest_methods[] = {
170+ { " bind_on_process_request_complete" , (PyCFunction)py_ue_ihttp_request_bind_on_process_request_complete, METH_VARARGS, " " },
133171 { " append_to_header" , (PyCFunction)py_ue_ihttp_request_append_to_header, METH_VARARGS, " " },
134172 { " cancel_request" , (PyCFunction)py_ue_ihttp_request_cancel_request, METH_VARARGS, " " },
135173 { " get_elapsed_time" , (PyCFunction)py_ue_ihttp_request_get_elapsed_time, METH_VARARGS, " " },
@@ -150,7 +188,7 @@ static PyMethodDef ue_PyIHttpRequest_methods[] = {
150188static PyObject *ue_PyIHttpRequest_str (ue_PyIHttpRequest *self)
151189{
152190 return PyUnicode_FromFormat (" <unreal_engine.IHttpRequest '%p'>" ,
153- self->http_request .Get ());
191+ & self->http_request .Get ());
154192}
155193
156194static PyTypeObject ue_PyIHttpRequestType = {
@@ -213,6 +251,9 @@ void ue_python_init_ihttp_request(PyObject *ue_module) {
213251
214252 ue_PyIHttpRequestType.tp_base = &ue_PyIHttpBaseType;
215253
254+ ue_PyIHttpRequestType.tp_getattro = PyObject_GenericGetAttr;
255+ ue_PyIHttpRequestType.tp_setattro = PyObject_GenericSetAttr;
256+
216257 if (PyType_Ready (&ue_PyIHttpRequestType) < 0 )
217258 return ;
218259
0 commit comments