Benjamin Sergeant
f090c7659b
(ixwebsocket) Expose setHandshakeTimeout method
2021-03-07 19:29:28 -08:00
Benjamin Sergeant
7c195219cd
reorder methods in IXWebSocket.h
2021-03-07 19:25:53 -08:00
Duncan Ogilvie
d739662a7c
Allow customizing the websocket handshake timeout ( #264 )
2021-03-07 19:23:43 -08:00
Benjamin Sergeant
39cc0ed32f
add comment in WebSocketServer::makeBroadcastServer
2021-01-28 21:04:18 -08:00
Benjamin Sergeant
f6e34e4b34
stop using C++14 lambda capture init, code should be C++11 compatible
2021-01-03 11:44:05 -08:00
Benjamin Sergeant
d0359a1764
new makeBroadcastServer websocket server method for classic servers, used by ws
2021-01-03 11:24:12 -08:00
Benjamin Sergeant
fabc07d598
(ws) trim ws dependencies no more ixcrypto and ixcore deps
2020-12-25 16:25:58 -08:00
Benjamin Sergeant
0b7919834a
(ws) trim ws dependencies, only depends on ixcrypto and ixcore
2020-12-25 15:17:46 -08:00
Benjamin Sergeant
1d0432c8c5
(build) rename makefile to makefile.dev to ease cmake BuildExternal ( fix #261 )
2020-12-22 21:42:39 -08:00
Benjamin Sergeant
461a645704
(ws) Implement simple header based websocket authorization technique to reject
2020-12-17 22:42:14 -08:00
Benjamin Sergeant
93ad709dfd
fix ws curl error message + some Windows warnings
2020-12-12 11:01:22 -08:00
Benjamin Sergeant
75e9c84388
fix buggy message and remove un-needed include
2020-11-19 14:27:10 -08:00
Benjamin Sergeant
223cd41b3c
(ixwebsocket) Handle EINTR return code in ix::poll and IXSelectInterrupt
2020-11-16 13:53:09 -08:00
Benjamin Sergeant
60aeaec734
hand EINTR in IXSelectInterruptPipe::notify and IXSelectInterruptPipe::read
2020-11-16 13:52:13 -08:00
Benjamin Sergeant
fcf114e2b2
Handle EINTR in ix::poll on Unix
2020-11-16 10:14:59 -08:00
Benjamin Sergeant
866670a906
(ixwebsocket) Fix #252 / regression in 11.0.2 with string comparisons
2020-11-16 08:41:08 -08:00
Benjamin Sergeant
23606b45c7
C++11 compatible
2020-11-15 21:09:58 -08:00
Benjamin Sergeant
2aac0afca3
compile attempt 2 with old OpenSSL versions
2020-11-15 11:32:50 -08:00
Benjamin Sergeant
508d8c7253
compile attempt with old OpenSSL versions
2020-11-15 11:23:44 -08:00
Benjamin Sergeant
8f5134528b
(ixwebsocket) use a C++11 compatible make_unique shim
2020-11-15 09:56:54 -08:00
Benjamin Sergeant
738c6040f7
fix memory leak in dns unittest
2020-11-12 13:07:31 -08:00
Benjamin Sergeant
4e2a40e031
(socket) replace a std::vector with an std::array used as a tmp buffer in Socket::readBytes
2020-11-11 21:39:31 -08:00
Benjamin Sergeant
723c208f22
fix version
2020-11-11 09:18:03 -08:00
Benjamin Sergeant
21758f1183
(openssl security fix) in the client to server connection, peer verification is not done in all cases. See https://github.com/machinezone/IXWebSocket/pull/250
2020-11-11 09:16:14 -08:00
jb-gcx
422febf15d
(openssl) Always set verify peer when it is not disabled ( #250 )
2020-11-11 09:12:39 -08:00
Benjamin Sergeant
51ec32405d
(docker) build docker container with zlib disabled
2020-11-07 11:22:52 -08:00
Benjamin Sergeant
6a90dc7259
(cmake) DEFLATE -> Deflate in CMake to stop warnings about casing
2020-11-07 09:40:54 -08:00
Benjamin Sergeant
262f32857f
(ws autoroute) Display result in compliant way (AUTOROUTE IXWebSocket :: N ms) so that result can be parsed easily
2020-11-07 09:34:54 -08:00
Benjamin Sergeant
91fb3992ac
(ws gunzip + IXGZipCodec) Can decompress gziped data with libdeflate. ws gunzip computed output filename was incorrect (was the extension aka gz) instead of the file without the extension. Also check whether the output file is writeable.
2020-11-07 09:34:54 -08:00
Benjamin Sergeant
d0562664ad
(http code) With zlib disabled, some code should not be reached
2020-10-19 13:37:42 -07:00
SeanOMik
d9b4beff8b
Fix an issue with disabling zlib and getting linker errors from the http client. ( #247 )
...
* (http client) #ifdefs so we dont try to compress http requests with zlib
* (http client) Remove some #ifdefs for including zlib and removing fields
2020-10-19 13:36:04 -07:00
Benjamin Sergeant
b2f21840c6
(ws curl) Add support for --data-binary option, to set the request body. When present the request will be sent with the POST verb
2020-10-12 14:03:01 -07:00
Benjamin Sergeant
67cb48537a
(http client + server + ws) Add support for compressing http client requests with gzip. --compress_request argument is used in ws to enable this. The Content-Encoding is set to gzip, and decoded on the server side if present.
2020-10-09 17:51:56 -07:00
Benjamin Sergeant
fa0408e70b
(http client + server + ws) Add support for uploading files with ws -F foo=@filename, new -D http server option to debug incoming client requests, internal api changed for http POST, PUT and PATCH to supply an HttpFormDataParameters
2020-10-08 12:43:18 -07:00
Benjamin Sergeant
032ed9af9c
IXExponentialBackoff.cpp: fix typo in source code file name in the header block
2020-10-05 10:39:11 -07:00
Benjamin Sergeant
dc84080401
Add support for gzip compression through libdeflate
2020-09-30 14:34:03 -07:00
Benjamin Sergeant
82e759732b
(cmake) Stop using FetchContent cmake module to retrieve jsoncpp third party dependency
2020-09-30 14:24:04 -07:00
Benjamin Sergeant
61dbcc2b84
fix docker and linux build
2020-09-28 11:56:49 -07:00
Benjamin Sergeant
e61680ff0f
linux build fix about memset not being found
2020-09-28 11:01:59 -07:00
Benjamin Sergeant
6f188a5131
(ws) add gzip and gunzip ws sub commands
2020-09-28 10:19:27 -07:00
Benjamin Sergeant
6077f86af8
(cmake) use FetchContent cmake module to retrieve jsoncpp third party dependency
2020-09-26 14:11:40 -07:00
Benjamin Sergeant
2526a94454
(cmake) use FetchContent cmake module to retrieve spdlog third party dependency
2020-09-26 13:51:19 -07:00
Benjamin Sergeant
97cc543e53
(cobra connection) retrieve cobra server connection id from the cobra handshake message and display it in ws clients, metrics publisher and bots
2020-09-22 09:30:19 -07:00
Benjamin Sergeant
62d220f49a
(cobra 2 cobra) specify as an HTTP header which channel we will republish to
2020-09-22 08:55:21 -07:00
Benjamin Sergeant
49995e32f0
(cobra bots) change an error log to a warning log when reconnecting because no messages were received for a minute
2020-09-18 15:25:10 -07:00
Benjamin Sergeant
d525c28907
(cobra connection and bots) set an HTTP header when connecting to help with debugging bots
2020-09-18 15:11:20 -07:00
carr-7
39c84c7d51
Rename HttpResponse's payload to body ( #245 )
...
* rename payload to body
* Fixed ws cmd line tool to use the renamed body
Co-authored-by: Jay <jasoncarr@Jasons-MacBook-Pro.local>
2020-09-12 19:01:37 -07:00
Benjamin Sergeant
128bc0afa9
(http server) read body request when the Content-Length is specified + set timeout to read the request to 30 seconds max by default, and make it configurable as a constructor parameter
2020-09-12 14:17:06 -07:00
Benjamin Sergeant
b04e5c5529
http server: use socket->readBytes which reads in bulk instead of N calls to socket->readByte
2020-09-12 14:09:25 -07:00
Benjamin Sergeant
1e8c421d66
formatting
2020-09-12 13:55:27 -07:00
carr-7
72d6651ded
Read body in parseRequest for HttpServer ( #244 )
...
Co-authored-by: Jay <jasoncarr@Jasons-MacBook-Pro.local>
2020-09-12 13:53:56 -07:00
Benjamin Sergeant
a4e5d1b47a
(ws) autoroute command exit on its own once all messages have been received
2020-09-09 18:01:38 -07:00
Benjamin Sergeant
9f51a54a83
(docker) ws docker file installs strace
2020-09-04 13:47:12 -07:00
Benjamin Sergeant
a40003e85a
(ws) echo_client command renamed to autoroute. Command exit once the server close the connection. push_server commands exit once N messages have been sent.
2020-09-03 09:13:23 -07:00
Benjamin Sergeant
5896d3740f
(ws + cobra bots) add a cobra_to_cobra ws subcommand to subscribe to a channel and republish received events to a different channel
2020-08-31 13:45:00 -07:00
Benjamin Sergeant
73b9c0b89b
(socket servers) merge the ConnectionInfo class with the ConnectionState one, which simplify all the server apis
2020-08-28 14:55:40 -07:00
Benjamin Sergeant
08640d877f
(ws) set the main thread name, to help with debugging in XCode, gdb, lldb etc...
2020-08-26 13:38:45 -07:00
Benjamin Sergeant
ed5c63144e
(ws) cobra to python bot / take a module python name as argument foo.bar.baz instead of a path foo/bar/baz.py
2020-08-19 10:00:00 -07:00
Benjamin Sergeant
ee69aed2b0
(ws) on Linux with mbedtls, when the system ca certs are specified (the default) pick up sensible OS supplied paths (tested with CentOS and Alpine)
2020-08-19 09:31:57 -07:00
Benjamin Sergeant
fcb92f862d
(ws push_server) on the server side, stop sending and close the connection when the remote end has disconnected
2020-08-18 14:09:27 -07:00
Benjamin Sergeant
e1502017ce
(ixwebsocket) replace std::unique_ptr<unsigned char[]> with std::array for some fixed arrays (which are in C++11)
2020-08-17 16:48:26 -07:00
Benjamin Sergeant
72472f2899
IXWebSocketPerMessageDeflateCodec: use std::array instead of std::unique_ptr for a fixed size array
2020-08-17 16:36:24 -07:00
Benjamin Sergeant
42f71364ca
IXHttpClient.cpp: use std::array instead of std::unique_ptr for a fixed size array
2020-08-17 16:25:55 -07:00
Benjamin Sergeant
3dabd3a556
(ws) merge all ws_*.cpp files into a single one to speedup compilation
2020-08-15 19:30:17 -07:00
Benjamin Sergeant
0498e2fa98
IXBench.h is missing a pragma once
2020-08-15 18:58:46 -07:00
Benjamin Sergeant
2aaf59651e
(socket server) in the loop accepting connections, call select without a timeout on unix to avoid busy looping, and only wake up when a new connection happens
2020-08-15 18:32:59 -07:00
Benjamin Sergeant
cd4e51eacf
(socket server) instead of busy looping with a sleep, only wake up the GC thread when a new thread will have to be joined, (we know that thanks to the ConnectionState OnSetTerminated callback
2020-08-15 16:24:35 -07:00
Benjamin Sergeant
785842de03
(socket server) add a callback to the ConnectionState to be invoked when the connection is terminated. This will be used by the SocketServer in the future to know on time that the associated connection thread can be terminated.
2020-08-15 16:03:40 -07:00
Benjamin Sergeant
261095fa12
(socket server) do not create a select interrupt object everytime when polling for notifications while waiting for new connections, instead use a persistent one which is a member variable
2020-08-15 15:28:15 -07:00
Benjamin Sergeant
ed2ed0f7ae
(ixwebsocket client) handle HTTP redirects
2020-08-14 18:13:34 -07:00
Benjamin Sergeant
d3bcbdac26
(ws) upgrade to latest version of nlohmann json (3.9.1 from 3.2.0)
2020-08-13 22:10:38 -07:00
Benjamin Sergeant
8c5b28adce
(websocket proxy server) add ability to map different hosts to different websocket servers, using a json config file
2020-08-13 21:20:42 -07:00
Benjamin Sergeant
dcbafae35a
(ws) on macOS, with OpenSSL or MbedTLS, use /etc/ssl/cert.pem as the system certs
2020-08-12 18:55:13 -07:00
Benjamin Sergeant
b8265bf7f2
(ws) -q option imply info log level, not warning log level
2020-08-11 15:44:06 -07:00
Benjamin Sergeant
12f36b61ff
(websocket server) Handle programmer error when the server callback is not registered properly ( fix #227 )
2020-08-06 04:40:32 -07:00
Benjamin Sergeant
6e47c62c06
(ws) Add a new ws sub-command, push_server. This command runs a server which sends many messages in a loop to a websocket client. We can receive above 200,000 messages per second (cf #235 ).
2020-08-02 12:41:34 -07:00
Benjamin Sergeant
bcae7f326d
(ws) Add a new ws sub-command, echo_client. This command send a message to an echo server, and send back to a server whatever message it does receive. When connecting to a local ws echo_server, on my MacBook Pro 2015 I can send/receive around 30,000 messages per second. (cf #235 )
2020-08-02 12:09:13 -07:00
Benjamin Sergeant
6f0307fb35
(build) make using zlib optional, with the caveat that some http and websocket features are not available when zlib is absent
2020-07-31 22:54:57 -07:00
Benjamin Sergeant
2e3d625c1e
(websocket client) onProgressCallback not called for short messages on a websocket ( fix #233 )
2020-07-29 17:47:33 -07:00
Benjamin Sergeant
4d51098c86
(websocket client) heartbeat is not sent at the requested frequency ( fix #232 )
2020-07-29 11:24:42 -07:00
Benjamin Sergeant
e85f975ab0
compiler warning fixes
2020-07-28 21:46:26 -07:00
Benjamin Sergeant
dc77d62a5d
(ixcobra) CobraConnection: unsubscribe from all subscriptions when disconnecting
2020-07-28 10:32:18 -07:00
Benjamin Sergeant
4f41f209a2
(socket utility) move ix::getFreePort to ixwebsocket library
2020-07-27 18:17:13 -07:00
Benjamin Sergeant
22dffd5b7e
WebSocket::close is re-entrant
2020-07-27 17:38:33 -07:00
Benjamin Sergeant
847fc142d1
(ixwebsocket server) change legacy api with 2 nested callbacks, so that the first api takes a weak_ptr<WebSocket> as its first argument
2020-07-25 11:42:07 -07:00
Benjamin Sergeant
0388459bd0
(ixwebsocket) add WebSocketProxyServer, from ws. Still need to make the interface better.
2020-07-25 11:26:06 -07:00
Benjamin Sergeant
e34f1c30d6
(ws) port broadcast_server sub-command to the new server API
2020-07-24 14:35:07 -07:00
Benjamin Sergeant
b146e93a3a
(unittest) port most unittests to the new server API
2020-07-24 12:49:36 -07:00
Benjamin Sergeant
9957ec9724
(ws) port ws snake to the new server API
2020-07-24 12:33:17 -07:00
Benjamin Sergeant
e78019dad6
(ws) port ws transfer to the new server API
2020-07-24 11:52:16 -07:00
Benjamin Sergeant
0f026c5da2
(websocket client) reset WebSocketTransport onClose callback in the WebSocket destructor
2020-07-24 10:03:29 -07:00
Benjamin Sergeant
c26a2d5d39
(websocket server) reset client websocket callback when the connection is closed
2020-07-24 09:41:02 -07:00
Benjamin Sergeant
2798886c0b
(websocket server) add a new simpler API to handle client connections / that API does not trigger a memory leak while the previous one did
2020-07-23 19:29:41 -07:00
Benjamin Sergeant
ffde283a4b
(build) merge platform specific files which were used to have different implementations for setting a thread name into a single file, to make it easier to include every source files and build the ixwebsocket library ( fix #226 )
2020-07-17 11:58:06 -07:00
Benjamin Sergeant
f7031d0d3e
set thread name in only one file
2020-07-17 11:43:50 -07:00
Benjamin Sergeant
595e6c57df
IXSelectInterruptPipe.h included in cmake on windows but compiled out
2020-07-17 11:33:02 -07:00
Benjamin Sergeant
87709c201e
(socket server) bump default max connection count from 32 to 128
2020-07-10 17:11:11 -07:00
Benjamin Sergeant
e70d83ace1
(snake) implement super simple stream sql expression support in snake server
2020-07-10 16:10:59 -07:00
Benjamin Sergeant
b21306376b
uwp build fix + more ivp6 support
2020-07-08 12:38:55 -07:00
Benjamin Sergeant
fbd17685a1
(socket+websocket+http+redis+snake servers) expose the remote ip and remote port when a new connection is made (see #222 ) / only ipv4 is handled
2020-07-08 12:10:35 -07:00
Benjamin Sergeant
3a673575dd
clang format
2020-07-08 10:39:46 -07:00
Benjamin Sergeant
d5e51840ab
use const iterators
2020-07-08 10:34:14 -07:00
Benjamin Sergeant
543c2086b2
more templates in WebSocketTransport
2020-07-07 21:26:42 -07:00
Benjamin Sergeant
95eab59c08
WebSocketPerMessageDeflateCompressor can work with vector or std::string
2020-07-07 21:26:04 -07:00
Benjamin Sergeant
7c1b57c8cd
(cmake) change the way zlib and openssl are searched
2020-07-07 10:58:20 -07:00
Benjamin Sergeant
dddf00e3b1
(cobra python bots) remove the test which stop the bot when events do not follow cobra metrics system schema with an id and a device entry
2020-07-06 16:15:24 -07:00
Benjamin Sergeant
cc47fb1c83
(cobra bots) remove bots which is not required now that we can use Python extensions
2020-06-26 16:49:08 -07:00
Benjamin Sergeant
68c97da518
(cmake) new python code is optional and enabled at cmake time with -DUSE_PYTHON=1
2020-06-25 10:05:02 -07:00
Benjamin Sergeant
615f1778c3
new cobra to python bot (still sending to statsd)
...
values + string building can be done in python (we are embedding it)
2020-06-24 23:21:19 -07:00
Benjamin Sergeant
c45b197c85
(cobra metrics to statsd bot) fps slow frame info : do not include os name
2020-06-19 18:10:49 -07:00
Benjamin Sergeant
78713895dd
(cobra metrics to statsd bot) send info about memory warnings
2020-06-19 17:46:59 -07:00
Benjamin Sergeant
10c014bf98
(http client) fix deadlock when following redirects
2020-06-19 00:11:06 -07:00
Benjamin Sergeant
9bb3643fc7
(cobra metrics to statsd bot) send info about net requests
2020-06-18 11:25:48 -07:00
Benjamin Sergeant
565a08b229
(cobra client and bots) add batch_size subscription option for retrieving multiple messages at once
2020-06-17 17:13:45 -07:00
Benjamin Sergeant
558daf8911
(websocket) WebSocketServer is not a final class, so that users can extend it ( fix #215 )
2020-06-15 18:29:42 -07:00
Benjamin Sergeant
7ba7ff4b2a
(cobra bots) minor aesthetic change, in how we display http headers with a : then space as key value separator instead of :: with
...
no space
2020-06-15 16:09:31 -07:00
Benjamin Sergeant
aa142df486
(cobra metrics to statsd bot) change from a statsd type of gauge to a timing one
2020-06-12 13:47:01 -07:00
Benjamin Sergeant
5e200a440f
(redis cobra bots) capture most used devices in a zset
2020-06-11 18:49:45 -07:00
Benjamin Sergeant
ac9710d5d6
(ws) add bare bone redis-cli like sub-command, with command line editing powered by libnoise
2020-06-11 17:30:42 -07:00
Benjamin Sergeant
7603d1a71b
(redis cobra bots) ws cobra metrics to redis / hostname invalid parsing
2020-06-11 08:33:36 -07:00
Benjamin Sergeant
d0cd4aed5a
(redis cobra bots) xadd with maxlen + fix bug in xadd client implementation and ws cobra metrics to redis command argument parsing
2020-06-11 08:20:03 -07:00
Benjamin Sergeant
c5aadffa08
(redis cobra bots) update the cobra to redis bot to use the bot framework, and change it to report fps metrics into redis streams.
2020-06-10 22:30:55 -07:00
Benjamin Sergeant
ee8a3a52ec
compile tweak on linux + version bump
2020-06-04 15:01:16 -07:00
Benjamin Sergeant
531bd624b5
remove spaces in keys + verbose statsd
2020-06-04 14:57:36 -07:00
Benjamin Sergeant
c317100b47
(statsd cobra bots) statsd improvement: prefix does not need a dot as a suffix, message size can be larger than 256 bytes, error handling was invalid, use core logger for logging instead of std::cerr
2020-06-04 09:35:55 -07:00
Benjamin Sergeant
268f528423
httpd gzip compression / set a response header and search for gzip in the request header in case deflate is added to gzip in there
2020-06-01 17:11:42 -07:00
Benjamin Sergeant
4872b59fac
fix windows build (or operator is not supported || is required
2020-05-29 17:18:09 -07:00
Benjamin Sergeant
bb1be240ec
fix linux compile failure
2020-05-29 16:53:57 -07:00
Benjamin Sergeant
b008c97c83
(http server) support gzip compression
2020-05-29 16:49:29 -07:00
Benjamin Sergeant
16eb269e1e
bump version for (compiler fix) support clang 5 and earlier (contributed by @LunarWatcher) #206
2020-05-20 10:58:30 -07:00
Benjamin Sergeant
2319dec278
(cmake) revert CMake changes to fix #203 and be able to use an external OpenSSL
2020-05-20 10:56:58 -07:00
Olivia Zoe
f1be48aff1
Re-enable support for clang 5 and earlier ( #206 )
2020-05-20 10:56:24 -07:00
Benjamin Sergeant
54d4d81bf4
(cmake) make install cmake files optional to not conflict with vcpkg
...
See https://github.com/microsoft/vcpkg/pull/11030
2020-05-17 20:36:46 -07:00
Benjamin Sergeant
ea207d8199
(windows + tls) mbedtls is the default windows tls backend + add ability to load system certificates with mbdetls on windows
2020-05-17 20:36:46 -07:00
Benjamin Sergeant
1af39bf0eb
(ixbots) add options to limit how many messages per minute should be processed
2020-05-12 21:40:17 -07:00
Benjamin Sergeant
2e904801a0
(ixbots) add new class to configure a bot to simplify passing options around
2020-05-12 19:08:16 -07:00
Benjamin Sergeant
4773af8f2f
(openssl tls) (openssl < 1.1) logic inversion - crypto locking callback are not registered properly
2020-05-08 09:54:42 -07:00
Benjamin Sergeant
c1403df74a
(cmake) default TLS back to mbedtls on Windows Universal Platform
2020-05-08 09:31:53 -07:00
Benjamin Sergeant
0772ef7ef5
(cobra bots) add a --heartbeat_timeout option to specify when the bot should terminate because no events are received
2020-05-06 22:01:48 -07:00
Benjamin Sergeant
c030a62c8b
openSSLLockingCallback should be static
2020-05-06 16:57:53 -07:00
Benjamin Sergeant
931530b101
only register the crypto lock callback if no-one has registered them before us
2020-05-06 16:49:04 -07:00
Benjamin Sergeant
6c205b983e
(openssl tls) when OpenSSL is older than 1.1, register the crypto locking callback to be thread safe. Should fix lots of CI failures
2020-05-06 16:26:30 -07:00
Benjamin Sergeant
a65b334961
assert that the timeout is non zero in makeCancellationRequestWithTimeout
2020-05-06 15:53:27 -07:00
Benjamin Sergeant
2de8aafcbc
another windows build error in IXUdpSocket ...
2020-05-05 08:29:39 -07:00
Benjamin Sergeant
f075f586e1
fix windows compile error with UdpSocket::recvfrom
2020-05-05 08:15:01 -07:00
Benjamin Sergeant
93cb898989
fix compile error with UdpSocket::recvfrom
2020-05-05 08:03:04 -07:00
Benjamin Sergeant
2b4c06e6d2
UdpSocket::recvfrom last argument does not have to be a uint32_t
2020-05-05 07:49:07 -07:00
tostc
7337ed34a6
Added asynchronous udp receive function ( #193 )
...
* Added asynchronous udp receive function
* Remove receive_async and added low level recv, which is non-blocking.
* Remove thread include
* Moved unix include to IXNetSystem.h
2020-05-05 07:47:41 -07:00
Benjamin Sergeant
15355188d5
(http client) rework a bit PATCH pull request, fix compile error with setForceBody and initialize _forceBody to false
2020-05-05 07:43:55 -07:00
Liz3
8760c87635
add PATCH and add option to enforce a http request body write ( #195 )
...
* add PATCH and add option to enforce a http request body write
* remove private bool prop
2020-05-05 07:38:55 -07:00