$darkmode
Qore Programming Language - C/C++ Library 1.19.2
QoreHttpClientObject.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreHttpClientObject.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2006 - 2023 Qore Technologies, s.r.o.
8 
9  Permission is hereby granted, free of charge, to any person obtaining a
10  copy of this software and associated documentation files (the "Software"),
11  to deal in the Software without restriction, including without limitation
12  the rights to use, copy, modify, merge, publish, distribute, sublicense,
13  and/or sell copies of the Software, and to permit persons to whom the
14  Software is furnished to do so, subject to the following conditions:
15 
16  The above copyright notice and this permission notice shall be included in
17  all copies or substantial portions of the Software.
18 
19  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25  DEALINGS IN THE SOFTWARE.
26 
27  Note that the Qore library is released under a choice of three open-source
28  licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
29  information.
30 */
31 
32 #ifndef QORE_HTTP_CLIENT_OBJECT_H_
33 #define QORE_HTTP_CLIENT_OBJECT_H_
34 
35 #include <qore/common.h>
36 #include <qore/QoreSocketObject.h>
37 #include <qore/OutputStream.h>
38 
39 #define HTTPCLIENT_DEFAULT_PORT 80
40 #define HTTPCLIENT_DEFAULT_HOST "localhost"
41 
42 #define HTTPCLIENT_DEFAULT_TIMEOUT 300000
43 #define HTTPCLIENT_DEFAULT_CONNECT_TIMEOUT 60000
44 
45 #define HTTPCLIENT_DEFAULT_MAX_REDIRECTS 5
46 
47 class Queue;
48 
50 
52 class QoreHttpClientObject : public QoreSocketObject {
53  friend struct qore_httpclient_priv;
54  friend class HttpClientConnectSendRecvPollOperation;
55 
56 public:
58  DLLEXPORT QoreHttpClientObject();
59 
61  DLLEXPORT virtual ~QoreHttpClientObject();
62 
64 
67 
69 
71  DLLEXPORT QoreObject* startPollSendRecv(ExceptionSink* xsink, QoreObject* self, const QoreString* method,
72  const QoreString* path, const AbstractQoreNode* data_save, const void* data, size_t size,
73  const QoreHashNode* headers, const QoreEncoding* enc = nullptr);
74 
76 
97  DLLEXPORT int setOptions(const QoreHashNode* opts, ExceptionSink* xsink);
98 
100 
102  DLLEXPORT void setDefaultPort(int prt);
103 
105 
107  DLLEXPORT void setDefaultPath(const char* pth);
108 
110 
112  DLLEXPORT const char* getDefaultPath() const;
113 
115 
117  DLLEXPORT const char* getConnectionPath() const;
118 
120 
122  DLLEXPORT void setConnectionPath(const char* path);
123 
125 
127  DLLEXPORT void addProtocol(const char* prot, int port, bool ssl = false);
128 
130  DLLEXPORT void setTimeout(int to);
131 
133  DLLEXPORT int getTimeout() const;
134 
136  DLLEXPORT void setEncoding(const QoreEncoding* qe);
137 
139  DLLEXPORT const QoreEncoding* getEncoding() const;
140 
142 
147  DLLEXPORT int setHTTPVersion(const char* version, ExceptionSink* xsink);
148 
150 
153  DLLEXPORT const char* getHTTPVersion() const;
154 
156 
159  DLLEXPORT void setHTTP11(bool h11);
160 
162  DLLEXPORT bool isHTTP11() const;
163 
165 
169  DLLEXPORT int setURL(const char* url, ExceptionSink* xsink);
170 
172 
175  DLLEXPORT QoreStringNode* getURL();
176 
178 
184 
186 
190  DLLEXPORT void setUserPassword(const char* user, const char* pass);
191 
193  DLLEXPORT void clearUserPassword();
194 
196 
200  DLLEXPORT int setProxyURL(const char* proxy, ExceptionSink* xsink);
201 
203 
207 
209 
215 
217  DLLEXPORT void clearProxyURL();
218 
220 
225  DLLEXPORT void setProxyUserPassword(const char* user, const char* pass);
226 
228  DLLEXPORT void clearProxyUserPassword();
229 
231 
235  DLLEXPORT QoreStringNode* getUsername() const;
236 
238 
242  DLLEXPORT QoreStringNode* getPassword() const;
243 
245 
249  DLLEXPORT QoreStringNode* getProxyUsername() const;
250 
252 
256  DLLEXPORT QoreStringNode* getProxyPassword() const;
257 
259  DLLEXPORT void setSecure(bool is_secure);
260 
262  DLLEXPORT bool isSecure() const;
263 
265  DLLEXPORT void setProxySecure(bool is_secure);
266 
268  DLLEXPORT bool isProxySecure() const;
269 
271  DLLEXPORT void setMaxRedirects(int max);
272 
274  DLLEXPORT int getMaxRedirects() const;
275 
277 
279  DLLEXPORT int connect(ExceptionSink* xsink);
280 
282  DLLEXPORT void disconnect();
283 
285 
300  DLLEXPORT QoreHashNode* send(const char* meth, const char* path, const QoreHashNode* headers, const void* data,
301  unsigned size, bool getbody, QoreHashNode* info, ExceptionSink* xsink);
302 
303  DLLEXPORT QoreHashNode* send(const char* meth, const char* path, const QoreHashNode* headers,
304  const QoreStringNode& body, bool getbody, QoreHashNode* info, ExceptionSink* xsink);
305 
306  DLLEXPORT QoreHashNode* sendWithSendCallback(const char* meth, const char* mpath, const QoreHashNode* headers,
307  const ResolvedCallReferenceNode* send_callback, bool getbody, QoreHashNode* info, int timeout_ms,
308  ExceptionSink* xsink);
309 
310  DLLEXPORT void sendWithRecvCallback(const char* meth, const char* mpath, const QoreHashNode* headers,
311  const void* data, unsigned size, bool getbody, QoreHashNode* info, int timeout_ms,
312  const ResolvedCallReferenceNode* recv_callback, QoreObject* obj, ExceptionSink* xsink);
313 
314  DLLEXPORT void sendWithRecvCallback(const char* meth, const char* mpath, const QoreHashNode* headers,
315  const QoreStringNode& body, bool getbody, QoreHashNode* info, int timeout_ms,
316  const ResolvedCallReferenceNode* recv_callback, QoreObject* obj, ExceptionSink* xsink);
317 
318  DLLEXPORT void sendWithCallbacks(const char* meth, const char* mpath, const QoreHashNode* headers,
319  const ResolvedCallReferenceNode* send_callback, bool getbody, QoreHashNode* info, int timeout_ms,
320  const ResolvedCallReferenceNode* recv_callback, QoreObject* obj, ExceptionSink* xsink);
321 
323 
325  DLLEXPORT void sendWithOutputStream(const char* meth, const char* mpath, const QoreHashNode* headers,
326  const void* data, unsigned size, bool getbody, QoreHashNode* info, int timeout_ms,
327  const ResolvedCallReferenceNode* recv_callback, QoreObject* obj, OutputStream *os, ExceptionSink* xsink);
328 
330 
332  DLLEXPORT void sendWithOutputStream(const char* meth, const char* mpath, const QoreHashNode* headers,
333  const QoreStringNode& body, bool getbody, QoreHashNode* info, int timeout_ms,
334  const ResolvedCallReferenceNode* recv_callback, QoreObject* obj, OutputStream *os, ExceptionSink* xsink);
335 
337 
339  DLLEXPORT void sendChunked(const char* meth, const char* mpath, const QoreHashNode* headers, bool getbody,
340  QoreHashNode* info, int timeout_ms, const ResolvedCallReferenceNode* recv_callback, QoreObject* obj,
341  OutputStream *os, InputStream* is, size_t max_chunk_size,
342  const ResolvedCallReferenceNode* trailer_callback, ExceptionSink* xsink);
343 
345 
356  DLLEXPORT AbstractQoreNode* get(const char* path, const QoreHashNode* headers, QoreHashNode* info,
357  ExceptionSink* xsink);
358 
360 
369  DLLEXPORT QoreHashNode* head(const char* path, const QoreHashNode* headers, QoreHashNode* info,
370  ExceptionSink* xsink);
371 
373 
386  DLLEXPORT AbstractQoreNode* post(const char* path, const QoreHashNode* headers, const void* data, unsigned size,
387  QoreHashNode* info, ExceptionSink* xsink);
388 
390 
402  DLLEXPORT AbstractQoreNode* post(const char* path, const QoreHashNode* headers, const QoreStringNode& body,
403  QoreHashNode* info, ExceptionSink* xsink);
404 
406 
410  DLLEXPORT void setDefaultHeaderValue(const char* header, const char* val);
411 
413 
417  DLLEXPORT void addDefaultHeaders(const QoreHashNode* hdr);
418 
420 
424  DLLEXPORT QoreHashNode* getDefaultHeaders() const;
425 
428 
431  DLLEXPORT virtual void deref(ExceptionSink* xsink);
432 
434 
437  DLLEXPORT void setConnectTimeout(int ms);
438 
440 
443  DLLEXPORT int getConnectTimeout() const;
444 
446 
455  DLLEXPORT int setNoDelay(bool nodelay);
456 
458  DLLEXPORT void setEventQueue(Queue* cbq, ExceptionSink* xsink);
459 
461  DLLEXPORT void setEventQueue(ExceptionSink* xsink, Queue* q, QoreValue arg, bool with_data);
462 
464  DLLEXPORT bool getNoDelay() const;
465 
467  DLLEXPORT bool isConnected() const;
468 
470  DLLEXPORT void setPersistent(ExceptionSink* xsink);
471 
472  DLLEXPORT void clearWarningQueue(ExceptionSink* xsink);
473  DLLEXPORT void setWarningQueue(ExceptionSink* xsink, int64 warning_ms, int64 warning_bs, Queue* wq, QoreValue arg,
474  int64 min_ms = 1000);
475  DLLEXPORT QoreHashNode* getUsageInfo() const;
476  DLLEXPORT void clearStats();
477 
479 
481  DLLEXPORT bool setErrorPassthru(bool set);
482 
484 
486  DLLEXPORT bool getErrorPassthru() const;
487 
489 
491  DLLEXPORT bool setRedirectPassthru(bool set);
492 
494 
496  DLLEXPORT bool getRedirectPassthru() const;
497 
499 
501  DLLEXPORT bool setEncodingPassthru(bool set);
502 
504 
506  DLLEXPORT bool getEncodingPassthru() const;
507 
509 
511  DLLEXPORT QoreStringNode* getHostHeaderValue() const;
512 
514 
516  DLLEXPORT void setAssumedEncoding(const char* enc);
517 
519 
521  DLLEXPORT QoreStringNode* getAssumedEncoding() const;
522 
524 
526  DLLEXPORT bool setPreEncodedUrls(bool set);
527 
529 
531  DLLEXPORT bool getPreEncodedUrls() const;
532 
533  DLLLOCAL static void static_init();
534 
535  DLLLOCAL void cleanup(ExceptionSink* xsink);
536 
537 protected:
538  DLLEXPORT void lock();
539  DLLEXPORT void unlock();
540 
541 private:
543  struct qore_httpclient_priv* http_priv;
544 
547 
549  DLLLOCAL QoreHttpClientObject& operator=(const QoreHttpClientObject&);
550 };
551 
552 #endif
virtual DLLLOCAL void deref()
decrements the reference count of the object without the possibility of throwing a Qore-language exce...
Definition: AbstractPrivateData.h:65
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:57
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:50
Interface for private data of input streams.
Definition: InputStream.h:44
Interface for private data of output streams.
Definition: OutputStream.h:44
defines string encoding functions in Qore
Definition: QoreEncoding.h:83
This is the hash or associative list container type in Qore, dynamically allocated only,...
Definition: QoreHashNode.h:50
provides a way to communicate with HTTP servers using Qore data structures
Definition: QoreHttpClientObject.h:52
DLLEXPORT QoreStringNode * getProxyUsername() const
Returns the username for the proxy connection, if any.
DLLEXPORT AbstractQoreNode * post(const char *path, const QoreHashNode *headers, const void *data, unsigned size, QoreHashNode *info, ExceptionSink *xsink)
sends an HTTP "POST" message to the remote server and returns the message body of the response
DLLEXPORT bool setEncodingPassthru(bool set)
sets the new and returns the old encoding_passthru status
DLLEXPORT bool isHTTP11() const
returns true if HTTP 1.1 protocol compliance has been set
virtual DLLEXPORT ~QoreHttpClientObject()
destroys the object and frees all associated memory
DLLEXPORT void clearUserPassword()
clears the username and password for the connection
DLLEXPORT bool setPreEncodedUrls(bool set)
sets the new and returns the old pre_encoded_urls flag
DLLEXPORT bool getErrorPassthru() const
returns the current error_passthru status
DLLEXPORT int getMaxRedirects() const
returns the value of the max_redirects option
DLLEXPORT void setProxyUserPassword(const char *user, const char *pass)
sets the username and password for the proxy connection
DLLEXPORT void setConnectionPath(const char *path)
sets or clears the connection path
DLLEXPORT QoreHashNode * send(const char *meth, const char *path, const QoreHashNode *headers, const void *data, unsigned size, bool getbody, QoreHashNode *info, ExceptionSink *xsink)
sends a message to the remote server and returns the entire response as a hash
DLLEXPORT void sendChunked(const char *meth, const char *mpath, const QoreHashNode *headers, bool getbody, QoreHashNode *info, int timeout_ms, const ResolvedCallReferenceNode *recv_callback, QoreObject *obj, OutputStream *os, InputStream *is, size_t max_chunk_size, const ResolvedCallReferenceNode *trailer_callback, ExceptionSink *xsink)
send a chunked HTTP message through an InputStream and receive the response to an OutputStream
DLLEXPORT bool setErrorPassthru(bool set)
sets the new and returns the old error_passthru status
DLLEXPORT int getConnectTimeout() const
returns the connect timeout in ms, negative numbers mean no timeout
DLLEXPORT QoreStringNode * getAssumedEncoding() const
gets the assumed encoding
DLLEXPORT void clearProxyURL()
clears the proxy URL
DLLEXPORT void setDefaultPort(int prt)
sets the default port
DLLEXPORT void setTimeout(int to)
sets the connection and response packet timeout value in milliseconds
DLLEXPORT int getTimeout() const
returns the connection and response packet timeout value in milliseconds
DLLEXPORT QoreStringNode * getUsername() const
Returns the username for the connection, if any.
DLLEXPORT const char * getDefaultPath() const
returns the default path or 0 if none is set
DLLEXPORT const char * getConnectionPath() const
returns the current connection path or 0 if none is set
DLLEXPORT QoreObject * startPollConnect(ExceptionSink *xsink, QoreObject *self)
Starts a socket connect poll operation.
DLLEXPORT int connect(ExceptionSink *xsink)
opens a connection and returns a code giving the result
DLLEXPORT QoreStringNode * getSafeURL()
returns the connection parameters as a URL without any password
DLLEXPORT QoreStringNode * getURL()
returns the connection parameters as a URL
DLLEXPORT void setEventQueue(Queue *cbq, ExceptionSink *xsink)
sets the event queue, must be already referenced before call
DLLEXPORT bool isSecure() const
returns the SSL connection parameter flag
DLLEXPORT void setProxySecure(bool is_secure)
sets the SSL flag for use in the next connection to the proxy
DLLEXPORT QoreObject * startPollSendRecv(ExceptionSink *xsink, QoreObject *self, const QoreString *method, const QoreString *path, const AbstractQoreNode *data_save, const void *data, size_t size, const QoreHashNode *headers, const QoreEncoding *enc=nullptr)
Starts a non-blocking, polling HTTP send/receive operation.
DLLEXPORT bool getNoDelay() const
returns the value of the TCP_NODELAY flag on the object
DLLEXPORT void setDefaultHeaderValue(const char *header, const char *val)
sets the value of a default header to send with every outgoing message
virtual DLLLOCAL void deref(ExceptionSink *xsink)
decrements the reference count of the object
Definition: AbstractPrivateData.h:59
DLLEXPORT void setAssumedEncoding(const char *enc)
sets the assumed encoding
DLLEXPORT AbstractQoreNode * get(const char *path, const QoreHashNode *headers, QoreHashNode *info, ExceptionSink *xsink)
sends an HTTP "GET" method and returns the value of the message body returned
DLLEXPORT int setNoDelay(bool nodelay)
sets the TCP_NODELAY flag on the object
DLLEXPORT bool getEncodingPassthru() const
returns the current encoding_passthru status
DLLEXPORT const QoreEncoding * getEncoding() const
returns the default encoding for the object
DLLEXPORT void setEncoding(const QoreEncoding *qe)
sets the default encoding for the object
DLLEXPORT void addDefaultHeaders(const QoreHashNode *hdr)
Sets the value of multiple headers to send with every outgoing message.
DLLEXPORT QoreStringNode * getProxyPassword() const
Returns the password for the proxy connection, if any.
DLLEXPORT bool isProxySecure() const
returns the SSL proxy connection parameter flag
DLLEXPORT QoreStringNode * getProxyURL()
returns the proxy connection parameters as a URL (or 0 if there is none)
DLLEXPORT void setConnectTimeout(int ms)
sets the connect timeout in ms
DLLEXPORT bool getPreEncodedUrls() const
returns the current pre_encoded_urls flag
DLLEXPORT void setSecure(bool is_secure)
sets the SSL flag for use in the next connection
DLLEXPORT int setHTTPVersion(const char *version, ExceptionSink *xsink)
sets the http version from a string
DLLEXPORT QoreHashNode * head(const char *path, const QoreHashNode *headers, QoreHashNode *info, ExceptionSink *xsink)
sends an HTTP "HEAD" method and returns the headers returned, the caller owns the QoreHashNode refere...
DLLEXPORT int setProxyURL(const char *proxy, ExceptionSink *xsink)
sets the proxy URL
DLLEXPORT void clearProxyUserPassword()
clears the username and password for the proxy connection
DLLEXPORT void setMaxRedirects(int max)
sets the max_redirects option
DLLEXPORT void setUserPassword(const char *user, const char *pass)
sets the username and password for the connection
DLLEXPORT bool isConnected() const
returns the connection status of the object
DLLEXPORT QoreStringNode * getPassword() const
Returns the password for the connection, if any.
DLLEXPORT QoreStringNode * getHostHeaderValue() const
returns the Host header value
DLLEXPORT void setPersistent(ExceptionSink *xsink)
temporarily disables implicit reconnections; must be called when the server is already connected
DLLEXPORT bool getRedirectPassthru() const
returns the current redirect_passthru status
DLLEXPORT QoreHashNode * getDefaultHeaders() const
Returns a hash of default headers to be sent with every outgoing request.
DLLEXPORT void setDefaultPath(const char *pth)
sets the default path
DLLEXPORT void addProtocol(const char *prot, int port, bool ssl=false)
adds a protocol
DLLEXPORT void sendWithOutputStream(const char *meth, const char *mpath, const QoreHashNode *headers, const void *data, unsigned size, bool getbody, QoreHashNode *info, int timeout_ms, const ResolvedCallReferenceNode *recv_callback, QoreObject *obj, OutputStream *os, ExceptionSink *xsink)
make an HTTP request and receive the response to an OutputStream
DLLEXPORT int setOptions(const QoreHashNode *opts, ExceptionSink *xsink)
set options with a hash, returns -1 if an exception was thrown, 0 for OK
DLLEXPORT bool setRedirectPassthru(bool set)
sets the new and returns the old redirect_passthru status
DLLEXPORT QoreHttpClientObject()
creates the QoreHttpClientObject object
DLLEXPORT QoreStringNode * getSafeProxyURL()
returns the proxy connection parameters as a URL without any password (or 0 if there is none)
DLLEXPORT const char * getHTTPVersion() const
returns the http version as a string (either "1.0" or "1.1")
DLLEXPORT int setURL(const char *url, ExceptionSink *xsink)
sets the connection URL
DLLEXPORT void setHTTP11(bool h11)
sets or clears HTTP 1.1 protocol compliance
DLLEXPORT void disconnect()
disconnects from the remote server
the implementation of Qore's object data type, reference counted, dynamically-allocated only
Definition: QoreObject.h:60
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:93
Qore's string value type, reference counted, dynamically-allocated only.
Definition: QoreStringNode.h:50
base class for resolved call references
Definition: CallReferenceNode.h:109
long long int64
64bit integer type, cannot use int64_t here since it breaks the API on some 64-bit systems due to equ...
Definition: common.h:260
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:276