95 lines
3.0 KiB
C++
95 lines
3.0 KiB
C++
#include "precompile.h"
|
|
|
|
#include <a8/sysutils.h>
|
|
#include <a8/mutable_xobject.h>
|
|
|
|
#include "httpproxy.h"
|
|
#include "app.h"
|
|
#include "jsondatamgr.h"
|
|
|
|
#include "framework/cpp/httpclientpool.h"
|
|
|
|
struct HttpProxyRequest
|
|
{
|
|
std::string req_id;
|
|
a8::XParams param;
|
|
f8::AsyncHttpOnOkFunc on_ok;
|
|
f8::AsyncHttpOnErrorFunc on_error;
|
|
const char* url = nullptr;
|
|
a8::XObject url_params;
|
|
};
|
|
|
|
void HttpProxy::Init()
|
|
{
|
|
request_prefix_ = "game2006_" + a8::XValue(a8::GetMilliSecond()).GetString() + "_";
|
|
}
|
|
|
|
void HttpProxy::UnInit()
|
|
{
|
|
|
|
}
|
|
|
|
std::string HttpProxy::HttpGet(a8::XParams param,
|
|
f8::AsyncHttpOnOkFunc on_ok,
|
|
f8::AsyncHttpOnErrorFunc on_error,
|
|
const char* url,
|
|
a8::XObject url_params
|
|
)
|
|
{
|
|
HttpProxyRequest* request = new HttpProxyRequest();
|
|
request->req_id = CreateRequestId();
|
|
request->param = param;
|
|
request->on_ok = on_ok;
|
|
request->on_error = on_error;
|
|
request->url = url;
|
|
request->url_params = url_params;
|
|
if (request_hash_.find(request->req_id) != request_hash_.end()) {
|
|
abort();
|
|
}
|
|
request_hash_[request->req_id] = request;
|
|
|
|
a8::MutableXObject* proxy_url_params = a8::MutableXObject::NewObject();
|
|
proxy_url_params->SetVal("seq_id", request->req_id);
|
|
proxy_url_params->SetVal("target_url", std::string(url));
|
|
proxy_url_params->SetVal("params", url_params.ToJsonStr());
|
|
proxy_url_params->SetVal("cb_url", a8::Format("http://%s:%d/webapp/index.php?c=Proxy&a=callback",
|
|
{
|
|
JsonDataMgr::Instance()->ip,
|
|
JsonDataMgr::Instance()->listen_port
|
|
}));
|
|
std::string proxy_url;
|
|
JsonDataMgr::Instance()->GetHttpProxyUrl(proxy_url);
|
|
f8::HttpClientPool::Instance()->HttpGet
|
|
(a8::XParams()
|
|
.SetSender(request),
|
|
[] (a8::XParams& param, a8::XObject& data)
|
|
{
|
|
HttpProxyRequest* req = (HttpProxyRequest*)(param.sender.GetUserData());
|
|
req->on_ok(req->param, data);
|
|
HttpProxy::Instance()->DestoryRequest(req);
|
|
},
|
|
[] (a8::XParams& param, const std::string& response)
|
|
{
|
|
HttpProxyRequest* req = (HttpProxyRequest*)(param.sender.GetUserData());
|
|
req->on_error(req->param, response);
|
|
HttpProxy::Instance()->DestoryRequest(req);
|
|
},
|
|
proxy_url.c_str(),
|
|
*proxy_url_params,
|
|
rand() % MAX_SYS_HTTP_NUM
|
|
);
|
|
delete proxy_url_params;
|
|
return request->req_id;
|
|
}
|
|
|
|
std::string HttpProxy::CreateRequestId()
|
|
{
|
|
return request_prefix_ + a8::XValue(App::Instance()->NewUuid()).GetString();
|
|
}
|
|
|
|
void HttpProxy::DestoryRequest(HttpProxyRequest* request)
|
|
{
|
|
request_hash_.erase(request->req_id);
|
|
delete request;
|
|
}
|