Connexus/Core/HttpClient.mqh
2025-06-05 11:54:55 -03:00

142 lines
No EOL
5.6 KiB
MQL5

//+------------------------------------------------------------------+
//| Include files |
//+------------------------------------------------------------------+
#include "HttpRequest.mqh"
#include "HttpResponse.mqh"
#include "../Constants/HttpMethod.mqh"
#include "Interface/IHttpTransport.mqh"
#include "Interface/IHttpObserver.mqh"
#include "HttpTransport.mqh"
//+------------------------------------------------------------------+
//| class : CHttpClient |
//| |
//| [PROPERTY] |
//| Name : CHttpClient |
//| Heritage : No heritage |
//| Description : Class responsible for linking the request and |
//| response object with the transport layer. |
//| |
//+------------------------------------------------------------------+
class CHttpClient
{
private:
IHttpTransport *m_transport; // Instance to store the transport implementation
IHttpObserver *m_observers[]; // Array of observers
public:
CHttpClient(IHttpTransport *transport);
CHttpClient(void);
~CHttpClient(void);
//--- Observers
void RegisterObserver(IHttpObserver *observer);
void UnregisterObserver(IHttpObserver *observer);
void OnSendNotifyObservers(CHttpRequest *request);
void OnRecvNotifyObservers(CHttpResponse *response);
//--- Basis function
bool Send(CHttpRequest &request, CHttpResponse &response);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CHttpClient::CHttpClient(IHttpTransport *transport)
{
m_transport = transport;
}
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CHttpClient::CHttpClient(void)
{
m_transport = new CHttpTransport();
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CHttpClient::~CHttpClient(void)
{
delete m_transport;
}
//+------------------------------------------------------------------+
//| Add observer pointer to observer list |
//+------------------------------------------------------------------+
void CHttpClient::RegisterObserver(IHttpObserver *observer)
{
int size = ArraySize(m_observers);
ArrayResize(m_observers,size+1);
m_observers[size] = observer;
}
//+------------------------------------------------------------------+
//| Remove observer pointer to observer list |
//+------------------------------------------------------------------+
void CHttpClient::UnregisterObserver(IHttpObserver *observer)
{
int size = ArraySize(m_observers);
for(int i=0;i<size;i++)
{
if(GetPointer(m_observers[i]) == GetPointer(observer))
{
ArrayRemove(m_observers,i,1);
break;
}
}
}
//+------------------------------------------------------------------+
//| Notifies observers that a request has been made |
//+------------------------------------------------------------------+
void CHttpClient::OnSendNotifyObservers(CHttpRequest *request)
{
int size = ArraySize(m_observers);
for(int i=0;i<size;i++)
{
m_observers[i].OnSend(request);
}
}
//+------------------------------------------------------------------+
//| Notifies observers that a response has been received |
//+------------------------------------------------------------------+
void CHttpClient::OnRecvNotifyObservers(CHttpResponse *response)
{
int size = ArraySize(m_observers);
for(int i=0;i<size;i++)
{
m_observers[i].OnRecv(response);
}
}
//+------------------------------------------------------------------+
//| Basis function |
//+------------------------------------------------------------------+
bool CHttpClient::Send(CHttpRequest &request, CHttpResponse &response)
{
//--- Request
uchar body_request[];
request.Body().ToBinaryArray(body_request);
//--- Response
uchar body_response[];
string headers_response;
//--- Notify observer of request
this.OnSendNotifyObservers(GetPointer(request));
//--- Send
ulong start = GetMicrosecondCount();
int status_code = m_transport.Request(request.Method().GetMethodName(),request.Url().GetFullUrl(),request.Header().ToString(),request.GetTimeout(),body_request,body_response,headers_response);
ulong end = GetMicrosecondCount();
//--- Notify observer of response
this.OnRecvNotifyObservers(GetPointer(response));
//--- Add data in Response
response.Clear();
response.SetDuration((end-start)/1000);
response.StatusCode() = status_code;
response.Body().AddBinary(body_response);
response.Header().Parse(headers_response);
//--- Return is success
return(response.StatusCode().IsSuccess());
}
//+------------------------------------------------------------------+