remote/network/RemoteResourceHandler.cpp (80 lines of code) (raw):

#include "RemoteResourceHandler.h" #include "../CefUtils.h" #include "../handlers/RemoteClientHandler.h" #include "../network/RemoteRequest.h" #include "../network/RemoteResponse.h" #include "../callback/RemoteCallback.h" #include "../log/Log.h" namespace { const bool doTrace = getBoolEnv("CEF_SERVER_TRACE_RemoteResourceHandler"); } RemoteResourceHandler::RemoteResourceHandler( int bid, std::shared_ptr<ServerHandlerContext> service, thrift_codegen::RObject peer) : RemoteJavaObject( service, peer.objId, [=](JavaService service) { service->ResourceHandler_Dispose(peer.objId); }), myBid(bid) { TRACE(); } RemoteResourceHandler::~RemoteResourceHandler() { TRACE(); // simple protection for leaking via callbacks for (auto c: myCallbacks) RemoteCallback::dispose(c); } /// /// Begin processing the request. To handle the request return true and call /// CefCallback::Continue() once the response header information is available /// (CefCallback::Continue() can also be called from inside this method if /// header information is available immediately). To cancel the request return /// false. /// /// WARNING: This method is deprecated. Use Open instead. /// /*--cef()--*/ bool RemoteResourceHandler::ProcessRequest(CefRefPtr<CefRequest> request, CefRefPtr<CefCallback> callback) { TRACE(); RemoteRequest::Holder req(request); std::shared_ptr<RemoteCallback> rc = RemoteCallback::wrapDelegate(callback); const bool handled = myCtx->javaServiceIO()->exec<bool>([&](JavaService s){ return s->ResourceHandler_ProcessRequest(myPeerId, req.serverId(), rc->serverId()); }, false); if (!handled) RemoteCallback::dispose(rc->getId()); else myCallbacks.insert(rc->getId()); return handled; } /// /// Retrieve response header information. If the response length is not known /// set |response_length| to -1 and ReadResponse() will be called until it /// returns false. If the response length is known set |response_length| /// to a positive value and ReadResponse() will be called until it returns /// false or the specified number of bytes have been read. Use the |response| /// object to set the mime type, http status code and other optional header /// values. To redirect the request to a new URL set |redirectUrl| to the new /// URL. |redirectUrl| can be either a relative or fully qualified URL. /// It is also possible to set |response| to a redirect http status code /// and pass the new URL via a Location header. Likewise with |redirectUrl| it /// is valid to set a relative or fully qualified URL as the Location header /// value. If an error occured while setting up the request you can call /// SetError() on |response| to indicate the error condition. /// void RemoteResourceHandler::GetResponseHeaders(CefRefPtr<CefResponse> response, int64_t& response_length, CefString& redirectUrl) { TRACE(); RemoteResponse::Holder resp(response); thrift_codegen::ResponseHeaders _return; myCtx->javaServiceIO()->exec([&](JavaService s){ s->ResourceHandler_GetResponseHeaders(_return, myPeerId, resp.serverId()); }); response_length = _return.length; if (_return.__isset.redirectUrl) redirectUrl = CefString(_return.redirectUrl); } /// Read response data. If data is available immediately copy up to /// |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of /// bytes copied, and return true. To read the data at a later time set /// |bytes_read| to 0, return true and call CefCallback::Continue() when the /// data is available. To indicate response completion return false. bool RemoteResourceHandler::ReadResponse(void* data_out, int bytes_to_read, int& bytes_read, CefRefPtr<CefCallback> callback) { TRACE(); std::shared_ptr<RemoteCallback> rc = RemoteCallback::wrapDelegate(callback); thrift_codegen::ResponseData _return; _return.bytes_read = 0; myCtx->javaServiceIO()->exec([&](JavaService s){ s->ResourceHandler_ReadResponse(_return, myPeerId, bytes_to_read, rc->serverId()); }); if (!_return.continueRead) RemoteCallback::dispose(rc->getId()); else myCallbacks.insert(rc->getId()); bytes_read = _return.bytes_read; if (bytes_read > 0) memcpy(data_out, _return.data.c_str(), _return.data.size()); return _return.continueRead; } void RemoteResourceHandler::Cancel() { TRACE(); myCtx->javaServiceIO()->exec([&](JavaService s){ s->ResourceHandler_Cancel(myPeerId); }); }