Skip to content

Commit 5f6c566

Browse files
author
Roberto De Ioris
committed
added delegate support to IHttpRequest
1 parent 1c8fbc0 commit 5f6c566

File tree

4 files changed

+66
-4
lines changed

4 files changed

+66
-4
lines changed

Source/UnrealEnginePython/Private/UEPyIHttpRequest.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
132169
static 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[] = {
150188
static 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

156194
static 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

Source/UnrealEnginePython/Private/UEPyIHttpRequest.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include "Runtime/Online/HTTP/Public/Interfaces/IHttpRequest.h"
66
#include "Runtime/Online/HTTP/Public/HttpModule.h"
77

8+
#include "UEPyIHttpRequest.generated.h"
9+
810

911
struct ue_PyIHttpBaseType;
1012

@@ -16,3 +18,23 @@ typedef struct {
1618

1719

1820
void ue_python_init_ihttp_request(PyObject *);
21+
22+
UCLASS()
23+
class UPythonHttpDelegate : public UPythonDelegate
24+
{
25+
GENERATED_BODY()
26+
27+
public:
28+
void OnRequestComplete(FHttpRequestPtr request, FHttpResponsePtr response, bool successful);
29+
30+
void SetPyHttpRequest(ue_PyIHttpRequest *request) {
31+
py_http_request = request;
32+
Py_INCREF(py_http_request);
33+
}
34+
35+
~UPythonHttpDelegate() {
36+
Py_XDECREF(py_http_request);
37+
}
38+
protected:
39+
ue_PyIHttpRequest *py_http_request;
40+
};

Source/UnrealEnginePython/Private/UEPyIHttpResponse.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ void ue_python_init_ihttp_response(PyObject *ue_module) {
7272
PyObject *py_ue_new_ihttp_response(IHttpResponse *response) {
7373
ue_PyIHttpResponse *ret = (ue_PyIHttpResponse *)PyObject_New(ue_PyIHttpResponse, &ue_PyIHttpResponseType);
7474
ret->http_response = response;
75-
//TSharedRef<IHttpBase> ref(response);
76-
//ret->base.http_base = ref;
75+
ret->base.http_base = response;
7776
return (PyObject *)ret;
7877
}

Source/UnrealEnginePython/Public/PythonDelegate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class UPythonDelegate : public UObject
2424
void PyFOnAssetPostImport(UFactory *factory, UObject *u_object);
2525
#endif
2626

27-
private:
27+
protected:
2828
UFunction *signature;
2929
bool signature_set;
3030

0 commit comments

Comments
 (0)