1 #ifndef SERIAL___RPCBASE__HPP
2 #define SERIAL___RPCBASE__HPP
59 template <
class TRequest,
class TReply>
76 unsigned int try_limit)
87 virtual void Ask(
const TRequest& request, TReply& reply)
88 {
x_Ask(request, reply); }
120 return GetAffinity(
dynamic_cast<const TRequest&
>(request));
157 template<
class TRequest,
class TReply>
162 if ( !m_Args.empty() ) {
165 "Error sending additional request arguments");
168 if ( m_RetryCtx.IsSetArgs() ) {
172 "Error sending retry context arguments");
174 }
else if (x_extra !=
nullptr && !m_Affinity.empty()) {
177 "Error sending request affinity");
180 if (x_extra ==
nullptr) {
184 memset(x_extra, 0,
sizeof(*x_extra));
185 x_extra->
data = &m_RetryCtx;
188 const char* user_header = GetContentTypeHeader(
GetFormat());
189 if (user_header !=
NULL && *user_header !=
'\0') {
192 "Error sending user header");
197 template<
class TRequest,
class TReply>
201 if (m_AsyncStream.get() !=
nullptr) {
202 m_AsyncStream->SetTimeout(
eIO_Open, m_Timeout);
204 x_SetStream(m_AsyncStream.release());
206 }
else if ( m_RetryCtx.IsSetUrl() ) {
207 x_ConnectURL(m_RetryCtx.GetUrl());
213 x_FillConnNetInfo(*net_info, &x_extra);
215 unique_ptr<CConn_ServiceStream> stream
218 if ( m_Canceler.NotNull() ) {
219 stream->SetCanceledCallback(m_Canceler.GetNonNullPointer());
221 x_SetStream(stream.release());
225 template<
class TRequest,
class TReply>
233 x_FillConnNetInfo(*net_info,
nullptr);
242 if ( m_Canceler.NotNull() ) {
243 stream->SetCanceledCallback(m_Canceler.GetNonNullPointer());
245 x_SetStream(stream.release());
249 template<
class TRequest,
class TReply>
256 const STimeout* old_timeout = m_Timeout;
257 if (sx_IsSpecial(timeout)) {
262 if ( !sx_IsSpecial(old_timeout) ) {
263 delete const_cast<STimeout*
>(old_timeout);
270 return conn_stream->
SetTimeout(direction, timeout);
271 }
else if ( !m_Stream.get() ) {
279 template<
class TRequest,
class TReply>
295 template<
class TRequest,
class TReply>
304 x_FillConnNetInfo(*net_info, &x_extra);
313 if ( m_Canceler.NotNull() ) {
314 m_AsyncStream->SetCanceledCallback(m_Canceler.GetNonNullPointer());
316 if (handle_buf !=
nullptr) {
317 CONN conn = m_AsyncStream->GetCONN();
318 if (
conn !=
nullptr) {
321 && sock !=
nullptr) {
330 template<
class TRequest,
class TReply>
349 template<
class TRequest,
class TReply>
Helper hook-up class that installs default logging/registry/locking (but only if they have not yet be...
This stream exchanges data with an HTTP server located at the URL: http[s]://host[:port]/path[?...
Base class, inherited from "std::iostream", does both input and output, using the specified CONNECTOR...
This stream exchanges data with a named service, in a constraint that the service is implemented as o...
HTTP-specific retry context implementation.
Base class for CRPCClient template - defines methods independent of request and response types.
CRPCClient – prototype client for ASN.1/XML-based RPC.
Base class for all serializable objects.
std::ofstream out("events_result.xml")
main entry point for tests
static CS_CONNECTION * conn
element_type * get(void) const
Get pointer.
const STimeout * GetTimeout(EIO_Event direction) const
EIO_Status SetTimeout(EIO_Event direction, const STimeout *timeout) const
Set connection timeout for "direction".
FHTTP_ParseHeader parse_header
EHTTP_HeaderParse
The extended version HTTP_CreateConnectorEx() is able to track the HTTP response chain and also chang...
EIO_Status CONN_GetSOCK(CONN conn, SOCK *sock)
Get an underlying SOCK handle for connection that is implemented as a socket.
@ fHTTP_NoAutoRetry
No auto-retries allowed.
@ fHTTP_AutoReconnect
See HTTP_CreateConnectorEx()
@ eHTTP_HeaderContinue
Parse succeeded, continue with body.
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
CRPCClient(const string &service=kEmptyStr)
EIO_Status AsyncConnect(void *handle_buf, size_t handle_size)
virtual void x_WriteRequest(CObjectOStream &out, const CSerialObject &request) override
void x_ConnectURL(const string &url)
Connect to a URL.
CRPCClient(const string &service, ESerialDataFormat format)
virtual void ReadReply(CObjectIStream &in, TReply &reply)
static bool sx_IsSpecial(const STimeout *timeout)
CRPCClient(const string &service, ESerialDataFormat format, unsigned int try_limit)
static EHTTP_HeaderParse sx_ParseHeader(const char *http_header, void *user_data, int server_error)
virtual ~CRPCClient(void)
virtual void Ask(const TRequest &request, TReply &reply)
virtual void x_Connect(void) override
These run with m_Mutex already acquired.
virtual void WriteRequest(CObjectOStream &out, const TRequest &request)
const STimeout * GetTimeout(EIO_Event direction=eIO_Read) const
virtual void x_ReadReply(CObjectIStream &in, CSerialObject &reply) override
void x_FillConnNetInfo(SConnNetInfo &net_info, SSERVICE_Extra *x_extra)
static void Delete(SConnNetInfo *net_info)
virtual string GetAffinity(const TRequest &) const
unique_ptr< CConn_ServiceStream > m_AsyncStream
EIO_Status SetTimeout(const STimeout *timeout, EIO_Event direction=eIO_ReadWrite)
ESerialDataFormat
Data file format.
const STimeout * m_Timeout
Cloned if not special.
void x_Ask(const CSerialObject &request, CSerialObject &reply)
virtual string x_GetAffinity(const CSerialObject &request) const override
@ eSerial_AsnBinary
ASN.1 binary.
void ParseHeader(const char *http_header)
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
@ fSERV_DelayOpen
Don't open service until use.
EIO_Status SOCK_GetOSHandle(SOCK sock, void *handle_buf, size_t handle_size)
Same as SOCK_GetOSHandleEx(sock, handle_buf, handle_size, eNoOwnership).
int ConnNetInfo_OverrideUserHeader(SConnNetInfo *net_info, const char *header)
int ConnNetInfo_ParseURL(SConnNetInfo *net_info, const char *url)
int ConnNetInfo_AppendArg(SConnNetInfo *net_info, const char *arg, const char *val)
int ConnNetInfo_PostOverrideArg(SConnNetInfo *net_info, const char *arg, const char *val)
SConnNetInfo * ConnNetInfo_Create(const char *service)
struct STimeoutTag STimeout
Timeout structure.
EIO_Event
I/O event (or direction).
void ConnNetInfo_Destroy(SConnNetInfo *net_info)
@ eIO_NotSupported
operation is not supported or is not available
@ eIO_Success
everything is fine, no error occurred
@ eIO_ReadWrite
eIO_Read | eIO_Write (also, eCONN_OnFlush)
@ eIO_Open
also serves as no-event indicator in SOCK_Poll
static const STimeout kZeroTimeout
Multi-threading – mutexes; rw-locks; semaphore.
std::istream & in(std::istream &in_, double &x_)
ESerialDataFormat GetFormat(const string &name)
Functor template for deleting object.