1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
class HttpResourceHandler :public CefResourceHandler { public: HttpResourceHandler(const CefRefPtr<CefRequest> req) :m_req(req), m_dataOffset(0) {}
HttpResourceHandler(const HttpResourceHandler&) = delete; HttpResourceHandler& operator=(const HttpResourceHandler&) = delete;
bool Open(CefRefPtr<CefRequest> request, bool& handle_request, CefRefPtr<CefCallback> callback) override { DCHECK(!CefCurrentlyOn(TID_UI) && !CefCurrentlyOn(TID_IO));
handle_request = false; return false; }
bool ProcessRequest(CefRefPtr<CefRequest> request, CefRefPtr<CefCallback> callback) override { CEF_REQUIRE_IO_THREAD();
this->m_client = CefRefPtr<UrlRequestClient>(new UrlRequestClient(callback)); CefURLRequest::Create(this->m_req, this->m_client, nullptr);
return true; }
void GetResponseHeaders(CefRefPtr<CefResponse> response, int64& response_length, CefString& redirectUrl) override { CEF_REQUIRE_IO_THREAD(); }
void Cancel() override { CEF_REQUIRE_IO_THREAD(); }
bool Read(void* data_out, int bytes_to_read, int& bytes_read, CefRefPtr<CefResourceReadCallback> callback) override { DCHECK(!CefCurrentlyOn(TID_UI) && !CefCurrentlyOn(TID_IO));
bool has_data = false; bytes_read = 0; auto data = this->m_client->data();
if (m_dataOffset < data.size()) { int transferSize = std::min(bytes_to_read, static_cast<int>(data.size() - m_dataOffset)); memcpy(data_out, data.c_str() + m_dataOffset, transferSize); m_dataOffset += transferSize; bytes_read = transferSize; has_data = true; }
return has_data; }
private: size_t m_dataOffset; CefRefPtr<CefRequest> m_req; CefRefPtr<UrlRequestClient> m_client;
IMPLEMENT_REFCOUNTING(HttpResourceHandler); };
|