| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #include "libhv_bindings.hpp"
- #include "HttpMessage.h"
- struct libhv_HttpRequest {
- HttpRequestPtr ptr;
- libhv_HttpRequest(HttpRequestPtr ptr) : ptr(ptr) {}
- };
- void libhv_HttpRequest_create(py_OutRef out, HttpRequestPtr ptr) {
- py_Type type = py_gettype("libhv", py_name("HttpRequest"));
- libhv_HttpRequest* self =
- (libhv_HttpRequest*)py_newobject(out, type, 2, sizeof(libhv_HttpRequest));
- new (self) libhv_HttpRequest(ptr);
- }
- py_Type libhv_register_HttpRequest(py_GlobalRef mod) {
- py_Type type = py_newtype("HttpRequest", tp_object, mod, [](void* ud) {
- ((libhv_HttpRequest*)ud)->~libhv_HttpRequest();
- });
- py_bindmagic(type, __new__, [](int argc, py_Ref argv) {
- return py_exception(tp_NotImplementedError, "");
- });
- py_bindproperty(
- type,
- "method",
- [](int argc, py_Ref argv) {
- PY_CHECK_ARGC(1);
- libhv_HttpRequest* req = (libhv_HttpRequest*)py_touserdata(argv);
- py_newstr(py_retval(), req->ptr->Method());
- return true;
- },
- NULL);
- py_bindproperty(
- type,
- "url",
- [](int argc, py_Ref argv) {
- PY_CHECK_ARGC(1);
- libhv_HttpRequest* req = (libhv_HttpRequest*)py_touserdata(argv);
- py_newstr(py_retval(), req->ptr->Url().c_str());
- return true;
- },
- NULL);
- py_bindproperty(
- type,
- "path",
- [](int argc, py_Ref argv) {
- PY_CHECK_ARGC(1);
- libhv_HttpRequest* req = (libhv_HttpRequest*)py_touserdata(argv);
- py_newstr(py_retval(), req->ptr->Path().c_str());
- return true;
- },
- NULL);
- // headers (cache in slots[0])
- py_bindproperty(
- type,
- "headers",
- [](int argc, py_Ref argv) {
- PY_CHECK_ARGC(1);
- libhv_HttpRequest* req = (libhv_HttpRequest*)py_touserdata(argv);
- py_Ref headers = py_getslot(argv, 0);
- if(py_isnil(headers)) {
- py_newdict(headers);
- py_Ref _0 = py_pushtmp();
- py_Ref _1 = py_pushtmp();
- for(auto& kv: req->ptr->headers) {
- py_newstr(_0, kv.first.c_str()); // TODO: tolower
- py_newstr(_1, kv.second.c_str());
- py_dict_setitem(headers, _0, _1);
- }
- py_shrink(2);
- }
- py_assign(py_retval(), headers);
- return true;
- },
- NULL);
- // data (cache in slots[1])
- py_bindproperty(
- type,
- "data",
- [](int argc, py_Ref argv) {
- PY_CHECK_ARGC(1);
- libhv_HttpRequest* req = (libhv_HttpRequest*)py_touserdata(argv);
- py_Ref data = py_getslot(argv, 1);
- if(py_isnil(data)) {
- auto content_type = req->ptr->ContentType();
- bool is_text_data = content_type == TEXT_PLAIN ||
- content_type == APPLICATION_JSON ||
- content_type == APPLICATION_XML || content_type == TEXT_HTML ||
- content_type == CONTENT_TYPE_NONE;
- if(is_text_data) {
- c11_sv sv;
- sv.data = req->ptr->body.data();
- sv.size = req->ptr->body.size();
- py_newstrv(data, sv);
- } else {
- unsigned char* buf = py_newbytes(data, req->ptr->body.size());
- memcpy(buf, req->ptr->body.data(), req->ptr->body.size());
- }
- }
- py_assign(py_retval(), data);
- return true;
- },
- NULL);
- return type;
- }
|