Compare commits

..

810 Commits

Author SHA1 Message Date
bdee582203 add sentry native project 2020-03-06 11:53:36 -08:00
4ef04b8339 (websocket server) fix regression with disabling zlib extension on the server side. If a client does not support this extension the server will handle it fine. We still need to figure out how to disable the option. cc #160 2020-03-02 16:53:08 -08:00
e581f29b42 Move zlib include_directories before add_subdirectory (#159) 2020-02-28 09:30:37 -08:00
a42f115f79 compatibility: add node.js example server 2020-02-26 12:17:34 -08:00
5ce1a596cf add a python echo server that does not close the connection after each received messages 2020-02-26 12:11:31 -08:00
21db7b6c5b add a simple pytho echo client 2020-02-26 11:50:24 -08:00
e15a2900e7 (websocket) traffic tracker received bytes is message size while it should be wire size 2020-02-26 11:24:41 -08:00
140a21c8b3 (ws_connect) display sent/received bytes statistics on exit 2020-02-26 11:23:36 -08:00
6d0c568aaa update doc / fix incorrect comment about sending defaultint to binary mode 2020-02-24 16:24:32 -08:00
c96abcef1c build status github badge 2020-02-23 09:46:08 -08:00
4a9b0b9dfd (server) give thread name to some usual worker threads / unittest is broken !! 2020-02-23 09:44:58 -08:00
8837d5e784 (websocket server) fix regression from 8.1.2, where per-deflate message compression was always disabled 2020-02-22 10:15:43 -08:00
242c945400 (client + server) Fix #155 / http header parser should treat the space(s) after the : delimiter as optional. Fixing this bug made us discover that websocket sub-protocols are not properly serialiazed, but start with a , 2020-02-21 14:05:38 -08:00
feab4dee0f split httpd test case into 2 test cases 2020-02-21 12:24:22 -08:00
8175829b4b unittest / add extra test for checking headers 2020-02-21 12:22:37 -08:00
4c66a7561e (WebSocketServer) add option to disable deflate compression, exposed with the -x option to ws echo_server 2020-02-18 21:38:28 -08:00
111475e65c (ws cobra to statsd and sentry sender) exit if no messages are received for one minute, which is a sign that something goes wrong on the server side. That should be changed to be configurable in the future 2020-02-18 12:43:07 -08:00
45061b0b14 (http client + sentry minidump upload) Multipart stream closing boundary is invalid + mark some options as mandatory in the command line toolsj 2020-02-13 12:25:18 -08:00
1bb847a51c bump version for #154 fix which was about removing the unused subtree which was causing some way of installing to break 2020-02-12 11:21:46 -08:00
ce9feeafdf try to delete subtree usocket again 2020-02-12 10:08:42 -08:00
415f0b3e6d CI/CD no need to run redis anymore, as we have our fake limited one 2020-02-07 17:15:16 -08:00
94431756ff trigger a github action 2020-02-07 17:08:25 -08:00
5f6c54bb90 (snake) add an option to disable answering pongs as response to pings, to test cobra client behavior with hanged connections 2020-01-31 16:55:54 -08:00
f994a41845 (IXCobraConnection) set a ping timeout of 90 seconds. If no pong messages are received as responses to ping for a while, give up and close the connection 2020-01-31 16:25:45 -08:00
f3760318b7 (cobra to sentry) remove noisy logging 2020-01-31 16:07:36 -08:00
c2362e6875 (ixcobra) check if we are authenticated in publishNext before trying to publish a message 2020-01-30 20:52:11 -08:00
d91b24723d version 8.0.2: add severity level for log sentry events (#152)
* script to update version

* version 8.0.2: add severity level for log sentry events
2020-01-28 14:04:18 -08:00
2d28b7d4ff bump version and update changelog 2020-01-28 10:50:03 -08:00
86d3fc8621 quit checkConnection after sleeping if requested to stop (iterate on #151) 2020-01-28 10:46:04 -08:00
422c7ff855 wait with a condition variable instead of a this_thread::sleep_for so that waiting can be cancelled when we stop/shutdown the data thread (see #151) 2020-01-28 10:04:32 -08:00
1c7ccbae12 bump version 2020-01-27 17:41:27 -08:00
ed2a81f115 Fix #148 2020-01-27 17:29:44 -08:00
7ed8ac208a bind returns zero on success (#149) 2020-01-27 17:15:44 -08:00
aa12098cb5 add -6 option to ws echo_server / cf #148 2020-01-26 16:44:44 -08:00
5d4bb90703 (SocketServer) add ability to bind on an ipv6 address 2020-01-26 16:21:56 -08:00
fad9f89846 (ws) add a dnslookup sub-command, to get the ip address of a remote host 2020-01-26 16:21:56 -08:00
527308a049 Remove 'handleConnect() done' info message (#147) 2020-01-26 10:03:17 -08:00
68b318ab97 Doc update for Conan (#146)
* Doc update for Conan

* Migration notice
2020-01-17 07:15:41 -08:00
65bae2736d fix #144 - get rid of stubbed windows ssl schannel backend 2020-01-14 13:39:48 -08:00
a923caec0b install gdb in the alpine dockerfile 2020-01-14 13:37:28 -08:00
4d7332c4ee activate chat test on Windows 2020-01-13 16:44:10 -08:00
4f3f1f3e4c simplify socket interface 2020-01-12 22:30:16 -08:00
2a954b5b5b use curl code for large apple ssl send 2020-01-12 22:04:06 -08:00
b96b3b099f test broadcast server 2020-01-12 21:32:26 -08:00
bb31612ebe more doc 2020-01-12 11:16:54 -08:00
d2c5ab1cc4 (openssl + mbedssl) fix #140, can send large files with ws send over ssl / still broken with apple ssl 2020-01-12 11:08:44 -08:00
a01584ad9d compatibility websocket server / add non ssl echo_server which does not run into the ssl error (#140) 2020-01-12 10:34:33 -08:00
9651f3823d (apple ssl) model write method after the OpenSSL one for consistency
More test code for #140.
2020-01-10 18:32:34 -08:00
0544cdedeb fix broken autobahn link 2020-01-09 15:30:33 -08:00
df0239ae68 poll: handle POLLNVAL 2020-01-09 13:45:58 -08:00
c8bf2a0d82 formatting 2020-01-09 13:45:31 -08:00
4d96804b22 ws send / detect disconnection earlier 2020-01-09 13:30:08 -08:00
ce9db42c23 socket polling / handle more error case such as hanged socket 2020-01-09 12:26:57 -08:00
a844dbc587 websocket closing / handle failure to flush send buffer as an error case 2020-01-09 12:17:37 -08:00
28952cb0b0 ws send / check that we are connected when waiting for the send buffer to be flushed, and if so, abort 2020-01-09 12:16:12 -08:00
fe29579755 refactor receiving socket code in its own method 2020-01-09 12:00:42 -08:00
b816f1fbda Allow custom OpenSSL lib, only include openssl/x509v3.h when used. (#143)
* Allow custom OpenSSL lib, only include openssl/x509v3.h when used.

Using fnmatch on Unix systems, PathMatchSpecA is the best WINAPI equivalent.

* Moved shlwapi into WIN32 block.
2020-01-08 13:57:57 -08:00
1320e4ddaf Windows ws build fix 2020-01-07 17:37:38 -08:00
f4a7277d61 using centos8 for the default Dockerfile, to get a gdb that display source code when running on OpenShift 2020-01-07 14:58:40 -08:00
34d7b18c85 Allow configuration of Mbed TLS use. (#142)
* Allow configuration of Mbed TLS use.

* Added option for OpenSSL support.

* Fixed elseif/else mixup from 5ebad24040
2020-01-07 14:57:47 -08:00
d72d516a92 Fixed build error with vcpkg installed. (#141) 2020-01-07 10:40:36 -08:00
f6c482c65d (apple ssl) unify read and write ssl utility code 2020-01-06 15:19:14 -08:00
dec8a2b9ab apple ssl: aesthetic change (get rid of yoda comparisons/conditionals) 2020-01-06 14:45:05 -08:00
a5bc39be55 (websocket client) better error propagation when errors are detected while sending data + (ws send) detect failures to send big files, terminate in those cases and report error (troubleshooting #140) 2020-01-06 14:34:43 -08:00
c62ad5f466 add reference ssl echo server using websockets and nginx reverse proxy to terminate ssl 2020-01-05 15:26:35 -08:00
effa115ed2 Merge commit 'c992cb4e42cc223f67ede0e48d7ff3f4947af0c6' as 'test/compatibility/C/uWebSockets' 2020-01-04 15:41:03 -08:00
c992cb4e42 Squashed 'test/compatibility/C/uWebSockets/' content from commit 03681cc
git-subtree-dir: test/compatibility/C/uWebSockets
git-subtree-split: 03681ccbe630eb4db6322557e6bfe8cda8f41526
2020-01-04 15:41:03 -08:00
b9504fcd44 add another compatibility python client 2020-01-04 15:37:40 -08:00
299bcd4b92 Add a simple python program to send a file (debugging #140) 2020-01-04 15:18:02 -08:00
f56098dd4c (ws send) add option (-x) to disable per message deflate compression 2020-01-04 15:08:36 -08:00
e0187b2d8e fix typo in ws embedded help 2020-01-04 14:37:53 -08:00
31682f5f2d (ws send + receive) handle all message types (ping + pong + fragment) / investigate #140 2020-01-04 13:45:07 -08:00
221087ffff Install source code when making a Docker container 2020-01-04 13:44:02 -08:00
c7fc4f0f8e add user list in readme 2019-12-30 22:16:29 -08:00
2eece1d11a correct version number 2019-12-30 22:14:53 -08:00
5ba05212ec tag version 2019-12-30 17:17:28 -08:00
9e457871b4 Update IXSocketMbedTLS.cpp (#139)
fix bug with mbedtls server certificate loading.
2019-12-30 16:11:34 -08:00
b5481262fb Update IXSocketMbedTLS.cpp (#138)
fix bug just introduced.

mbedstl_pk_setup() gets automatically called later.
2019-12-30 15:14:50 -08:00
98e98f083e [2nd try] Update IXSocketMbedTLS.cpp (#137)
* Update IXSocketMbedTLS.cpp

fix initialization of mbedtls context.
without this, crashes under certain conditions.

* Update IXSocketMbedTLS.cpp

removed newline on 46
2019-12-30 14:38:25 -08:00
d60777b9cc clang-format 2019-12-30 08:46:18 -08:00
8b5e42fe84 (ws cobra to sentry/statsd) fix for handling null events properly for empty queues + use queue to send data to statsd 2019-12-28 17:28:05 -08:00
d89d152ad7 (ws cobra to sentry) handle null events for empty queues 2019-12-28 10:16:18 -08:00
47a3736b24 (ws cobra to sentry) game is picked in a fair manner, so that all games get the same share of sent events 2019-12-27 19:10:15 -08:00
1cd7cf340a (ws cobra to sentry) refactor queue related code into a class 2019-12-27 18:24:45 -08:00
3a25a05d9c (ws cobra to sentry) bound the queue size used to hold up cobra messages before they are sent to sentry. Default queue size is a 100 messages. Without such limit the program runs out of memory when a subscriber receive a lot of messages that cannot make it to sentry 2019-12-25 22:15:57 -08:00
d2acfd5d1f (ws client) use correct compilation defines so that spdlog is not used as a header only library (reduce binary size and increase compilation speed) 2019-12-25 09:03:57 -08:00
9dfcd8ea69 (ws client) all commands use spdlog instead of std::cerr or std::cout for logging 2019-12-24 21:55:34 -08:00
ee65f95fe3 (cobra client) send a websocket ping every 30s to keep the connection opened 2019-12-24 17:16:41 -08:00
b9cc6d7e23 (tls / apple) minor refactoring, move functions out of the anonymous namespace to become static member functions 2019-12-23 16:30:38 -08:00
1e97e5e536 socket tls options: display ciphers 2019-12-23 12:25:25 -08:00
440a1058b3 (doc) fix typo 2019-12-22 20:33:14 -08:00
ff489515be v7.6.4 2019-12-22 20:32:10 -08:00
536a502b60 (client) error handling, quote url in error case when failing to parse on 2019-12-22 20:30:29 -08:00
db0ff4ecd1 (ws) ws_cobra_publish: register callbacks before connecting 2019-12-22 20:29:37 -08:00
e4aed56d72 (doc) mention mbedtls in supported ssl server backend 2019-12-22 20:28:44 -08:00
1427a97dd9 update gitignore file 2019-12-20 15:21:36 -08:00
d7318f97e6 (tls) add a simple description of the TLS configuration routine for debugging 2019-12-20 15:18:04 -08:00
d1a4cab134 (mbedtls) correct support for using own certificate and private key 2019-12-20 15:13:26 -08:00
8e7d310439 (ws commands) in websocket proxy, disable automatic reconnections + in Dockerfile, use alpine 3.11 2019-12-20 09:51:21 -08:00
9347664622 (cobra) Add TLS options to all cobra commands and classes. Add example to the doc. 2019-12-19 20:49:28 -08:00
4e240e4992 formatting 2019-12-19 19:13:55 -08:00
626e190d91 (cobra-to-sentry) capture application version from device field 2019-12-18 15:41:59 -08:00
1933da7044 IXSentryClient: remove duplicated line 2019-12-18 15:29:53 -08:00
494f408320 (tls) Experimental TLS server support with mbedtls (windows) + process cert tlsoption (client + server) 2019-12-18 11:51:02 -08:00
299afc1425 (tls servers) Make it clear that apple ssl and mbedtls backends do not support SSL in server mode 2019-12-18 10:43:05 -08:00
0679b6399f (tls options client) TLSOptions struct _validated member should be initialized to false 2019-12-17 14:10:28 -08:00
862f8ea2d4 (websocket client) improve the error message when connecting to a non websocket server 2019-12-16 17:57:43 -08:00
cae016564e (server) attempt at fixing #131 by using blocking writes in server mode 2019-12-12 12:17:29 -08:00
e223f8fac2 (ws) cobra to sentry - created events with sentry tags based on tags present in the cobra messages 2019-12-11 17:28:11 -08:00
c86fa8ad3b update spdlog 2019-12-06 22:05:12 -08:00
ba4cf75e0f (mac) convert SSL errors to utf8 2019-12-06 16:45:49 -08:00
9f98628709 Add script to extract the version from the header file and remove DOCKER_VERSION 2019-12-06 16:44:05 -08:00
0b2d816320 (ws) cobra to sentry. Handle Error 429 Too Many Requests and politely wait before sending more data to sentry 2019-12-05 15:59:29 -08:00
8b1c4ff081 Using Alpine edge distribution to live on the edge 2019-12-05 15:46:01 -08:00
fde0b717d3 sentry minidump upload timeout 2019-12-05 15:19:27 -08:00
228cdca250 bunch of docker compose dev changes 2019-12-05 15:18:02 -08:00
18386ae66f (ws) #125 / fix build problem when jsoncpp is not installed locally 2019-12-03 17:18:16 -08:00
5c5ea6dec1 (ws) #125 / cmake detects an already installed jsoncpp and will try to use this one if present 2019-12-03 16:01:46 -08:00
2e1657167f Meta: documentation fixes (#127)
* Clarify versions, minor punctuation fix

* Copyediting, borked URL

* Fix Python comments in C++ code

* Copyediting

* Pretty code

* Copyediting, pretty code

* Typo

* Pretty code
2019-12-03 09:28:18 -08:00
c91a0d2a35 (http client) use std::unordered_map instead of std::map for HttpParameters and HttpFormDataParameters class aliases 2019-12-03 09:25:00 -08:00
d465511812 [#113] Mention StreamSSL as an example windows schannel implementation 2019-12-03 09:22:27 -08:00
6b98694caa (client) internal IXDNSLookup class requires a valid cancellation request function callback to be passed in 2019-12-02 14:52:19 -08:00
d82e05f72d (client) fix an overflow in the exponential back off code 2019-12-02 13:51:45 -08:00
48622a24db ws cobra_subscribe / sleep 1s instead of 10ms in the main loop 2019-12-02 09:52:52 -08:00
94a274ced4 Improve the limitation section in the doc about TLS, cf bug #113 2019-12-02 09:52:05 -08:00
a7977cf1a5 ws cobra subcommands / channel is not a positional argument anymore 2019-11-28 15:17:13 -08:00
3fffd2ed0b add doc about using ws to run a cobra server/publisher/subscriber 2019-11-27 09:26:45 -08:00
a0d5f37402 (http client) Add support for multipart HTTP POST upload + (ixsentry) Add support for uploading a minidump to sentry 2019-11-25 21:11:11 -08:00
1b11ef006a Update README.md 2019-11-23 12:44:24 -08:00
155bbfa984 On Darwin SSL, add ability to skip peer verification. 2019-11-20 13:58:08 -08:00
89aae8b344 bump version for 32-bit fix 2019-11-20 11:35:07 -08:00
28a0ba4768 tweaks to the test python proxy code / (moved here) https://gist.github.com/bsergean/bad452fa543ec7df6b7fd496696b2cd8 2019-11-20 11:32:21 -08:00
708969c126 Compile bug (#122)
* 1) IXWebSocketTransport: BUG: int type has no warranty of number of bits. It depends on compiler and architecture. In my system (64 bit) is 32 bit.
1 << 63 is bad idea in this case because the final number is 0 by overflow.
The symptom observed is that the server can't receive messages.

2) IXSocketFactory: Compilation Warning: Variable not in use.

* Better aproach suggested by Benjamin.
2019-11-20 11:12:24 -08:00
cc492bf1a3 add a python websocket proxy which works on Linux, while ws proxy_server does not 2019-11-18 13:46:11 -08:00
901c21e499 ws proxy_server / remote server close not forwarded to the client 2019-11-16 14:21:44 -08:00
16c6f08e2d fix android build + proxy work 2019-11-16 06:51:53 -08:00
6e9f27d63c bump version 2019-11-15 17:19:06 -08:00
5b282ce3b4 document new proxy command 2019-11-15 17:18:32 -08:00
c7b2446164 proxy works but crash when the connection is refused 2019-11-15 17:07:31 -08:00
0e43c618a5 add stub code for ws proxy server 2019-11-15 14:30:20 -08:00
af6100b90f fix typo 2019-11-15 14:28:30 -08:00
a4cd248368 update readme / add contributing notes 2019-11-15 14:21:28 -08:00
6e52723c8c update changelog 2019-11-06 23:12:45 -08:00
a3ad92b9d9 update readme 2019-11-06 23:12:45 -08:00
b07827790f check max frame size (#119) 2019-10-28 21:53:31 -07:00
85e00a195c docker build fixes 2019-10-26 11:47:08 -07:00
081dd2c4bb Add unittest to IXSentryClient to lua backtrace parsing code 2019-10-26 10:54:47 -07:00
bbfa76a2c9 move sentry code around and add a stub unittest for it 2019-10-25 14:54:31 -07:00
16a060131a ws cobra to sentry / simplify sent and received message statistic reporting 2019-10-25 14:34:48 -07:00
6dabc68d29 remove unused quiet argument of ws cobra_metrics_to_redis command 2019-10-25 14:02:56 -07:00
ac0593bfb3 Add cobra_metrics_to_redis sub-command to create streams for each cobra metric event being received. 2019-10-24 14:42:36 -07:00
ac3e9eab25 Create SECURITY.md 2019-10-17 06:58:22 -07:00
6de426a574 remove unused code in ws cobra_publish 2019-10-14 11:15:14 -07:00
c3a619f114 Add client support for websocket subprotocol. Look for the new addSubProtocol method for details 2019-10-13 13:37:34 -07:00
128545cc2b OpenSSL: add an extra cipher to the default cipher set, which let us connect to wss//echo.websocket.org 2019-10-10 09:37:27 -07:00
8152898c4e add more docs about ws 2019-10-09 22:42:03 -07:00
852bf452b6 Freebsd (#117)
* add file

* CMake freebsd fix
2019-10-09 17:00:32 -07:00
b38e80f846 (freebsd compile fix) add some missing socket related headers 2019-10-09 15:38:40 -07:00
a383ac10d9 make sure the unittest pass withouth SSL 2019-10-03 09:41:17 -07:00
2c32f5c593 add a target for building wihout ssl + take Matt Boer updated script to run ws test with SSL (still broken for large payload) 2019-10-03 07:47:34 -07:00
41cbee2cd2 ws: Signal handling code isn't include on Windows 2019-10-01 16:12:32 -07:00
1f8944852a bump version 2019-10-01 16:01:32 -07:00
95dd03b298 Add mbed tls version in user agent string + set user agent properly when enabling openssl on macOS 2019-10-01 15:58:35 -07:00
a0cfaff528 Implement SSL server with OpenSSL backend / still flaky 2019-10-01 15:43:37 -07:00
d6542383ed Add --tls option to pass to ws server command, to enable/disable tls 2019-10-01 13:54:46 -07:00
afed387bcf Socket Factory has only one function which works for server and client code, and can do tls for both 2019-09-30 22:06:46 -07:00
313949f087 SocketServer::handleConnection takes an std::shared_ptr<Socket> instead of a file descriptor 2019-09-30 21:48:55 -07:00
e5c8e2e7f4 openSSLHandshake -> openSSLClientHandshake 2019-09-30 21:24:25 -07:00
845bbc5208 all ws subcommands propagate tls options to servers (unimplemented) or ws or http client (implemented) (contributed by Matt DeBoer) 2019-09-30 18:21:20 -07:00
7a26ff4de8 clang-format 2019-09-30 17:52:39 -07:00
a1f3c40a2d ws has a --version option 2019-09-30 17:31:33 -07:00
1fdbc2bc22 bump version number 2019-09-29 22:10:07 -07:00
0f4def2338 fix windows compile error in include/spdlog/details/pattern_formatter-inl.h 2019-09-29 22:00:57 -07:00
7939f7ad50 docs: WITH_TLS => USE_TLS 2019-09-29 21:31:13 -07:00
8bfc3c5ea6 document basic usage 2019-09-29 21:29:28 -07:00
bf46f3fe8f unittest / specify a cacert for tls client tests 2019-09-29 21:24:22 -07:00
55141aa875 ws curl + http client tls option handling + ca cert processing for mbedtls 2019-09-29 21:13:11 -07:00
4e4792d6dc update copyright dates and authors 2019-09-29 20:09:51 -07:00
2aca019d84 openssl client: handle TLS options 2019-09-29 20:07:53 -07:00
864249b62d most ws command take tls options, no-op for now (contributed by Matt DeBoer) 2019-09-29 18:29:51 -07:00
d1fb34694c SocketTLSOptions: more methods (contributed by Matt DeBoer) 2019-09-29 17:35:18 -07:00
d1fc31b894 ws transfer + send + receive / improved logging (contributed by Matt DeBoer) 2019-09-29 17:21:52 -07:00
f6bf2531bb Add ability to use OpenSSL on apple platforms. 2019-09-29 15:34:58 -07:00
681390f22f update and change how we build with spdlog 2019-09-29 11:13:24 -07:00
0ee675e554 ixcobra / fix crash in CobraConnection::publishNext when the queue is empty + handle CobraConnection_PublishMode_Batch in CobraMetricsThreadedPublisher 2019-09-28 10:36:47 -07:00
7e1a60e61d DNS lookup test works on windows 2019-09-27 14:34:47 -07:00
4cd11fdbc7 mbedtls fixes / the unittest now pass on macOS, and hopefully will on Windows/AppVeyor as well. 2019-09-27 14:07:01 -07:00
05c7a26e3a Export port 8008 for Docker + test_ws.sh is /bin/sh compatible 2019-09-26 14:36:14 -07:00
6762978ddf http server unittest + refactoring 2019-09-26 09:45:59 -07:00
658650cf24 http server: in redirect mode, POST request are given a 200 status code and an empty response 2019-09-26 09:27:27 -07:00
8a662b35e1 Http server: add options to ws https to redirect all requests to a given url. 2019-09-26 09:10:30 -07:00
3cd7c0194f Stop having ws send subcommand send a binary message in text mode, which would cause error in make ws_test shell script test 2019-09-25 15:39:43 -07:00
05f29639e5 fix doc 2019-09-24 15:42:28 -07:00
5c18ffdae2 speedup base64 code by reserving memory 2019-09-24 14:17:03 -07:00
d3cee46e93 wrong mutex being used ... 2019-09-24 14:10:41 -07:00
94c589f696 Fix 2 race conditions detected with TSan, one in CobraMetricsPublisher::push and another one in WebSocketTransport::sendData (that one was bad). 2019-09-24 11:46:54 -07:00
490fbf4cb5 try to enable more tests on windows 2019-09-23 21:52:32 -07:00
d46ce7eb63 fix tsan errors on macOS when running the unittest 2019-09-23 21:51:55 -07:00
169e225ccd fix warning + add redis server logging 2019-09-23 21:14:20 -07:00
ceb0c602c9 Add simple Redis Server which is only capable of doing publish / subscribe. New ws redis_server sub-command to use it. The server is used in the unittest, so that we can run on CI in environment where redis isn not available like github actions env. 2019-09-23 21:04:01 -07:00
95722e3bbb fix linux compilation error, by ordering dependant libraries properly 2019-09-23 12:32:04 -07:00
1cde26771a move snake code to its own subfolder like ixcobra, ixcrypto, etc... 2019-09-23 11:46:16 -07:00
cd3c9d879c reformat everything with clang-format 2019-09-23 10:25:23 -07:00
398c4fbf99 fix unittest 2019-09-22 19:40:33 -07:00
e7b4a985b4 fix unittest compiler warnings 2019-09-22 19:22:48 -07:00
6f76fea188 compile fixes 2019-09-22 18:52:57 -07:00
f6b8e7f234 add gihub actions 2019-09-22 18:45:30 -07:00
041fa3e340 compiled fixes on mac and windows 2019-09-22 18:43:57 -07:00
408ee41990 WIP: support configurable certificates/keys, and root trust CAs (#114)
* wip: tls options implemented in openssl

* update naming, remove #define guard

* assert compiled with USE_TLS for tls options

* apply autoformatter

* include tls options impl

* style cleanup; auto ssl_err

* ssl_err -> sslErr

* be explicit about SSL_VERIFY_NONE
2019-09-22 18:06:15 -07:00
ed4be773a2 Fix crash in the Linux unittest in the HTTP client code, in Socket::readBytes. Cobra Metrics Publisher code returns the message id of the message that got published, to be used to validated that it got sent properly when receiving an ack. 2019-09-21 09:23:58 -07:00
fcdb57f31d missing file in ws tool 2019-09-19 12:51:34 -07:00
47b3368f78 In DNS lookup code, make sure the weak pointer we use lives through the expected scope (if branch) 2019-09-19 12:51:11 -07:00
20ce498d23 On error while doing a client handshake, additionally display port number next to the host name 2019-09-17 12:08:52 -07:00
354c9b412e rename test file 2019-09-17 12:07:31 -07:00
1c08cedd8a make test target does not try to install anything into /usr/local 2019-09-12 11:45:31 -07:00
e2121d809e fix unittest warnings + remove trailing spaces 2019-09-12 11:43:52 -07:00
9c1065bc1b update pre-commit file 2019-09-10 22:18:16 -07:00
27136bbce8 update clang format file 2019-09-10 22:17:08 -07:00
c3238b7e02 build fixes 2019-09-10 14:05:07 -07:00
b11640b477 update appveyor file to new directory structure 2019-09-10 12:33:47 -07:00
2453f5b717 restructure project 2019-09-10 12:19:22 -07:00
65c5c5f894 update ws CLI11 (our command line argument parsing library) to the latest, which fix a compiler bug about optional 2019-09-09 21:25:33 -07:00
64d3c99f99 improve some websocket error messages + add a utility function with unittest to parse status line and stop using scanf which triggers warnings on Windows 2019-09-09 21:23:57 -07:00
6c0890594b improve some websocket error messages + add a utility function with unittest to parse status line and stop using scanf which triggers warnings on Windows 2019-09-09 17:34:36 -07:00
fb271953f7 websocket and http server: server does not close the bound client socket in many cases 2019-09-09 16:48:26 -07:00
7080c5679f move poll wrapper on top of select (only used on Windows) to the ix namespace 2019-09-08 11:15:08 -07:00
427db5bd59 Fix Windows CI with appveyor (#110)
Fix windows CI with appveyor + minor tweaks.
2019-09-07 14:07:00 -07:00
c09eac49c9 README: update link to the doc 2019-09-06 10:42:48 -07:00
ae6f87eb42 ci 2019-09-05 22:32:54 -07:00
82b3c5e2f3 travis linux 2019-09-05 22:29:00 -07:00
e41ba279e9 ci tweak / install redis 2019-09-05 22:14:55 -07:00
c259c918ac cobra metrics publisher test uses random free port 2019-09-05 22:05:00 -07:00
2f7438f0d5 cobra chat test uses random free port 2019-09-05 22:02:10 -07:00
37a7b362d8 add cobra metrics publisher + server unittest 2019-09-05 21:57:05 -07:00
c0f098a578 Add new cobra unittest, using server and client 2019-09-05 20:49:58 -07:00
21404c23dd snake unsubscription fixes 2019-09-05 20:47:15 -07:00
eeefc9cf4b Fix compiler warning 2019-09-05 20:29:14 -07:00
24b2475b11 ws snake (cobra simple server) add basic support for unsubscription + subscribe send the proper subscription data + redis client subscription can be cancelled 2019-09-05 20:28:34 -07:00
2defe6f597 IXCobraConnection / pdu handlers can crash if they receive json data which is not an object 2019-09-05 20:24:42 -07:00
f9dc460325 cobra publish fix 2019-09-05 14:31:28 -07:00
30b83b5ff0 Update README.md 2019-09-05 14:30:51 -07:00
003afc8b56 all client autobahn test should pass ! last failing one was ...
+- zlib/deflate has a bug with windowsbits == 8, so we silently upgrade it to 9/ (fix autobahn test 13.X which uses 8 for the windows size)
2019-09-04 21:01:30 -07:00
95a97a197a Fragmentation: for sent messages which are compressed, the continuation fragments should not have the rsv1 bit set (fix all autobahn tests for zlib compression 12.X)
Websocket Server / do a case insensitive string search when looking for an Upgrade header whose value is websocket. (some client use WebSocket with some upper-case characters)
2019-09-04 18:23:56 -07:00
eccd8b3c0e ws autobahn / use condition variables for stopping test case + add more logging on errors 2019-09-04 12:21:54 -07:00
a43046c921 ws autobahn / report progress with spdlog::info to get timing info 2019-09-04 10:16:32 -07:00
b360fb9ca0 truncate module 2019-09-03 20:14:35 -07:00
0bf185e143 Per message deflate/compression: handle fragmented messages (fix autobahn test: 12.1.X and probably others) 2019-09-03 17:42:48 -07:00
da3d134be0 Receiving invalid UTF-8 TEXT message should fail and close the connection (fix remaining autobahn test: 6.X UTF-8 Handling) 2019-09-03 16:07:48 -07:00
b4c4746d43 IXWebSocketTransport message processing refactoring 2019-09-03 15:48:55 -07:00
fdd1ad9b17 Validate close codes. Autobahn 7.9.* 2019-09-03 15:43:16 -07:00
1be8d9d46f Validate that the close reason is proper utf-8. Autobahn 7.5.1 2019-09-03 14:35:40 -07:00
51799353a6 Sending invalid UTF-8 TEXT message should fail and close the connection (fix remaining autobahn test: 6.X UTF-8 Handling) 2019-09-03 14:12:40 -07:00
3ad13a592d Framentation: data and continuation blocks received out of order (fix autobahn test: 5.9 through 5.20 Fragmentation) 2019-09-03 12:02:56 -07:00
55934918ff Sending invalid UTF-8 TEXT message should fail and close the connection (fix **tons** of autobahn test: 6.X UTF-8 Handling) 2019-09-03 10:30:22 -07:00
ab93e4f168 Message type (TEXT or BINARY) is invalid for received fragmented messages (fix autobahn test: 5.3 through 5.8 Fragmentation) 2019-09-03 09:13:38 -07:00
e1ad0b0889 bump version 2019-09-02 10:14:15 -07:00
cbe3e7617c Ping and Pong messages cannot be fragmented (autobahn test: 5.1 and 5.2 Fragmentation) 2019-09-02 10:13:40 -07:00
94c8966e86 Close connections when reserved bits are used (autobahn test: 3 Reserved Bits) 2019-09-01 16:23:00 -07:00
d973a062c2 changelog 2019-09-01 11:39:00 -07:00
ba41dbc69a readme 2019-09-01 11:38:39 -07:00
96380dd462 doc 2019-09-01 11:28:27 -07:00
61bd765784 compute test case count properly 2019-09-01 11:17:28 -07:00
4a0f06193b refactoring 2019-09-01 11:10:27 -07:00
826917ef17 condition variable instead of busy looping 2019-09-01 10:50:16 -07:00
4e1dbbbecf quiet mode 2019-09-01 10:45:51 -07:00
b5b0de2083 +add utf-8 validation code, not hooked up properly yet
+ws autobahn / Add code to test websocket client compliance with the autobahn test-suite
+Ping received with a payload too large (> 125 bytes) trigger a connection closure
+cobra / add tracking about published messages
+cobra / publish returns a message id, that can be used when
+cobra / new message type in the message received handler when publish/ok is received (can be used to implement an ack system).
2019-08-31 16:47:10 -07:00
a95fcbbdbf user agent 2019-08-30 12:50:56 -07:00
7a73ec7c06 New option to cap the max wait between reconnection attempts. Still default to 10s. (setMaxWaitBetweenReconnectionRetries) (#108) 2019-08-30 12:46:35 -07:00
0c1f2252a1 readme 2019-08-26 22:49:40 -07:00
98a397696c readme 2019-08-26 22:29:10 -07:00
225b7d7db7 doc / bring back detailed APIs 2019-08-26 22:11:35 -07:00
f968d4c333 one last tweak 2019-08-26 22:02:24 -07:00
59e15be524 readme tweaks 2019-08-26 21:57:05 -07:00
ccabe93ae8 new simple readme 2019-08-26 21:55:00 -07:00
56def6def4 Add md doc made with mkdocs 2019-08-26 21:25:45 -07:00
3b1a1efed2 fix #104 - change ZLIB find_package to be optional 2019-08-26 14:51:33 -07:00
185869e628 tentative gcc build fix 2019-08-26 14:29:16 -07:00
108f6238e3 bump version 2019-08-26 10:20:01 -07:00
d3e5a63fa2 ws connect has a new option to send HTTP headers + use WebSocketHttpHeaders instead of unordered_map<string, string> 2019-08-26 10:19:09 -07:00
0847e60d2a CobraConnection: sets a unique id field for all messages sent to [cobra](https://github.com/machinezone/cobra).
CobraConnection: sets a counter as a field for each event published.
2019-08-26 09:51:37 -07:00
ac60ec4320 put windows poll in the global namespace, not ix namespace 2019-08-26 09:51:37 -07:00
93debc00dc Add client handshake extra headers (#105)
Even though 6455 defines all the necessary headers needed for
client/server handshake, in practice most of the cases websocket servers
expect few more headers. Therefore adding this functionality.
2019-08-26 09:37:40 -07:00
ff75846d2d Windows: use select instead of WSAPoll, through a poll wrapper 2019-08-22 10:34:17 -07:00
53c767140d add new makefile target to make git tags 2019-08-20 09:21:30 -07:00
839a747ce8 bump version + talk about Windows fix in the changelog 2019-08-20 09:20:02 -07:00
f78a3f88ff add poll alias to WSAPoll on Windows 2019-08-19 22:26:25 -07:00
142987259c fix #101 / wrong include in IXSocket.cpp on Windows 2019-08-19 22:19:39 -07:00
c8d41f987f README tweaks 2019-08-19 20:35:26 -07:00
d139dd88e8 README / formatting 2019-08-19 20:33:56 -07:00
7898a5f4eb README.md: add reference to WSAStartup to initialize the networking system 2019-08-19 09:47:59 -07:00
53efbf3ca9 (CI) linux: install libmbedtls 2019-08-14 21:49:43 -07:00
b6e5ff2f3d (CI) try to build Linux on Ubuntu Bionic 2019-08-14 21:44:49 -07:00
ae1386a1d7 bump version 2019-08-14 21:36:20 -07:00
2f730303c2 CobraMetricThreadedPublisher _enable flag is an atomic, and CobraMetricsPublisher is enabled by default 2019-08-14 19:54:30 -07:00
e98ec9ec75 clang format 2019-08-13 10:59:18 -07:00
ffecef901a fix #99 / Connect error descriptions are invalid 2019-08-13 10:49:11 -07:00
5c13cbb08f update readme 2019-08-06 20:55:44 -07:00
64cfbe9514 fix #98 2019-08-02 17:11:53 -07:00
5cc21c87fb new options for cobra commands
- ws cobra_subscribe has a new -q (quiet) option
- ws cobra_subscribe knows to and display msg stats (count and # of messages received per second)
- ws cobra_subscribe, cobra_to_statsd and cobra_to_sentry commands have a new option, --filter to restrict the events they want to receive
2019-08-01 15:22:24 -07:00
505e0c79d9 ws connect command has a new option to send in binary mode (still default to text) 2019-07-25 15:48:45 -07:00
ca9d59c1c1 add better line editing capability to ws connect, thanks to linenoise-cpp 2019-07-25 11:54:50 -07:00
8319dbb56a README.md / cosmetic 2019-07-23 14:04:45 -07:00
b1b6697c37 fix typo in README 2019-07-23 13:52:16 -07:00
280716394d README: add reference to conan/vcpk to the build section 2019-07-22 20:41:06 -07:00
5795f72eab do not update homebrew when installing a package 2019-07-03 14:49:39 -07:00
7e16c8959b ci / get mbedtls from homebrew on mac 2019-07-03 14:46:05 -07:00
dfc188a24d do not use mbed tls for the unittest 2019-07-03 14:39:46 -07:00
d18bae0c95 add new docker file to run the unittest with tsan on latest Ubuntu 2019-06-30 23:37:25 -07:00
747746cba1 dns / use cancellable instead of blocking 2019-06-30 23:26:14 -07:00
5b73edec8c make IXDNSLookup more robust 2019-06-26 19:12:48 -07:00
3750781bce simplify IXDNSLookup 2019-06-26 16:25:07 -07:00
e646e53dac use poll instead of select in SocketServer 2019-06-25 17:18:24 -07:00
6b8aa43ec0 switch from select to poll to deal with Android 9 giving us high socket fds when calling ::connect 2019-06-25 17:11:27 -07:00
e8a20c7e8a refactor select code + add protection against large fds (cf Android 9) 2019-06-25 15:41:39 -07:00
0423ed01a6 Add extra check in IXWebSocketCloseTest.cpp 2019-06-25 14:10:39 -07:00
4a600c2611 select refactoring IXSocket::select -> IXSocket::poll 2019-06-25 10:16:40 -07:00
e5faa23d4f disable CI on Windows 2019-06-25 00:28:11 -07:00
b2f9c219b1 cmake use_tls fix 2019-06-24 23:34:31 -07:00
77d65760f0 do not build mbedtls on ci 2019-06-24 23:28:35 -07:00
98d0460af0 try to disable TLS for unittesting 2019-06-24 23:27:44 -07:00
de8d93341c CI / build zlib and mbedtls locally 2019-06-24 23:17:19 -07:00
0b6a773087 CI work 2019-06-24 10:17:57 -07:00
dc1aa676c4 try to activate CI on windows again 2019-06-23 18:32:18 -07:00
5ae9cc1cd7 bump docker version 2019-06-23 18:17:24 -07:00
f84bc53c8d Feature/httpd (#94)
* Stub code for http server

* can send a response, cannot process body yet

* write headers to the response

* remove commented code

* add simple test + set default http handler

* tweak CI + unittest

* add missing file

* rewrite http::trim in a simple way

* doc
2019-06-23 14:54:21 -07:00
b26e9d0338 IXDNSLookup. Uses weak pointer + smart_ptr + shared_from_this instead of static sets + mutex to handle object going away before dns lookup has resolved 2019-06-19 00:43:59 -07:00
dbd62b8622 cobra_to_sentry / backtraces are reversed and line number is not extracted correctly 2019-06-13 10:18:40 -07:00
20c80352bf disable windows on CI for now 2019-06-10 22:10:43 -07:00
9d70fb2b86 disable building ws on windows on travis 2019-06-10 22:01:19 -07:00
71aad26d44 (cmake) missing find_package(Threads) on UNIX 2019-06-10 13:39:22 -07:00
3a1918eb2f Add -DUSE_VENDORED_THIRD_PARTY=1 to build ws 2019-06-10 13:26:41 -07:00
a1709c07d9 - mbedtls and zlib are searched with find_package, and we use the vendored version if nothing is found 2019-06-10 11:18:27 -07:00
b8c1176c79 - travis CI uses g++ on Linux 2019-06-09 14:27:45 -07:00
03b5a57474 compile error in IXWebSocketMessageQTest 2019-06-09 12:25:36 -07:00
f58cf4826a fix IXWebSocketMessageQTest.cpp 2019-06-09 12:08:00 -07:00
d050cc5e13 fix changelog 2019-06-09 12:02:38 -07:00
6ef88b6303 update README to reflect the new API 2019-06-09 12:02:02 -07:00
3e15840b14 - WebSocket::send() sends message in TEXT mode by default
- WebSocketMessage sets a new binary field, which tells whether the received incoming message is binary or text
2019-06-09 11:56:47 -07:00
0d147cbd94 WebSocket::send takes a third arg, binary which default to true (can be text too) 2019-06-09 11:35:31 -07:00
be93f7480a WebSocket callback only take one object, a const ix::WebSocketMessagePtr& msg 2019-06-09 11:33:17 -07:00
2e5f24f1f8 ... 2019-06-09 10:22:27 -07:00
23cf4bd59b Add explicite WebSocket::sendBinary
New headers + WebSocketMessage class to hold message data, still not used across the board
2019-06-09 10:10:33 -07:00
051c34bc5d Add test/compatibility folder with small servers and clients written in different languages and different libraries to test compatibility. 2019-06-08 09:46:26 -07:00
9623ceb4d5 ws echo_server has a -g option to print a greeting message on connect 2019-06-08 09:16:33 -07:00
e1a7395880 IXSocketMbedTLS: better error handling in close and connect 2019-06-06 14:59:22 -07:00
51aeeca024 add a changelog 2019-06-06 13:59:12 -07:00
076e8bf6a3 add an option to easily disable per message deflate compression 2019-06-06 13:48:53 -07:00
73c5b9b847 fix Dockerfile link 2019-06-05 19:38:44 -07:00
f4f3eed78d cobra to sentry / more error handling 2019-06-05 19:37:51 -07:00
89909c15bc cobra to sentry fixes 2019-06-05 18:47:48 -07:00
78b3d7ff2d Feature/http async (#90)
* unittest working / uses shared_ptr for a bunch of things 🗿

* fix command line tools

* fix ws + add doc

* add more logging
2019-06-05 17:04:24 -07:00
012193c74e Fix compile error with JSON uint64_t 🚯 2019-06-04 13:45:29 -07:00
539abe5151 HttpResponse is a struct, not a tuple 🉐 2019-06-03 22:12:52 -07:00
7e5aba140e http / PUT fix 🐚 2019-06-03 21:12:39 -07:00
6b933391e5 http client: stop hardcoding Accept header, and use a default value if one is passed in 👭 2019-06-03 14:02:54 -07:00
1e2a5ee21d Add simple HTTP and HTTPS client test ㊙️ 2019-06-03 12:23:35 -07:00
225a5ef808 (http client) / Add DEL and PUT method, make requests and other utilities public 👐 2019-06-03 11:38:56 -07:00
396d0d9bdc Feature/ws windows (#86)
* try to build ws on window on travis 📮

* cmake invocation fixed on windows 🐝

* Can use mbedtls to calculate hmac + no openssl config option

* build only windows on travis 🕢

* run msbuild 💷

* proper command to build 🕛

* some build fixes

* change weird sizeof call 🐙

* warning and missing includes fixes 💮

* ifdef out statsd code on windows 🐍

* logic invertion in ifdef 👄

* bring back makefile 📜

* command line tool is built with mbedtls 🏥
2019-06-02 20:46:20 -07:00
88c8fb74bb play with podmena 2019-06-02 11:03:44 -07:00
fd902c7a58 add notes about mbedtls CMake 2019-06-01 18:00:25 -07:00
06cbebe22e Feature/mbedtls (#84)
* try to import mbedtls and build it

* add stubs socket class

* some boilterplate, read and write function implemented

* more boilterplate / current error in handshake because no CA cert is setup

* add something so skip ca verification, can ws curl https://google.com !

* cleanup / close implemented

* tweak CMakefiles

* typo in include

* update readme

* disable unittests
2019-06-01 17:41:48 -07:00
ba4a9e1586 (clang format) fix indent and make (rarely) accessor/setters in class on a single line 2019-05-31 00:53:14 -07:00
285386e47f fix cobra to sentry + change ws docker file to use alpine (much smaller footprint) 2019-05-31 00:43:22 -07:00
c65fec7271 clang format, based on cpprest 2019-05-30 08:46:50 -07:00
879a4b38aa std::chrono::duration is not initialized to 0 units of time 2019-05-26 14:16:15 -07:00
13c87e38ed do not select on a closed file descriptor (doing so crash on Android) 2019-05-22 18:58:22 -07:00
718154cfb4 enable IXWebSocketMessageQTest.cpp on mac and windows 2019-05-22 11:03:13 -07:00
26de9b9714 Clean (#82)
Thanks
2019-05-21 12:14:58 -07:00
3365facf9f Fix ping (#80)
* let poll do his job when closing

* try fix test

* try fix test

* Update IXWebSocketTransport.cpp

* add log to find issue on CI

* add log to find issue on CI

* add log to find issue on CI

* add log to find issue on CI

* add log to find issue on CI

* change state immediately, and send close frame after

* add immediate close test

* disable test for windows

* reenable ping / ping timeout tests

* add time to let windows close client

* reenable ping timeout test

* add 100ms more

* disable test for windows
2019-05-21 09:35:41 -07:00
8a4826164b fix close bug and tests : let poll do his job when closing (#79)
* let poll do his job when closing

* try fix test

* try fix test

* Update IXWebSocketTransport.cpp

* add log to find issue on CI

* add log to find issue on CI

* add log to find issue on CI

* add log to find issue on CI

* add log to find issue on CI

* change state immediately, and send close frame after

* add immediate close test

* disable test for windows
2019-05-21 09:34:08 -07:00
d6eabae4f0 one cpu on windows for executing tests 2019-05-17 15:45:31 -07:00
6bd81bb92e add back IXWebSocketMessageQueue, with its unittest disabled 2019-05-16 22:41:39 -07:00
126a91dfec Linux build fix: strncpy needs <string.h> 2019-05-16 22:21:15 -07:00
51fa147b99 Revert "Merge branch 'Dimon4eg-message-queue'"
This reverts commit 13fa325134, reversing
changes made to aecd5e9c94.
2019-05-16 22:15:17 -07:00
6160877167 Fix Address Sanitizer heap-buffer-overflow in WebSocketHandshakeKeyGen::generate
=================================================================
==5077==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6070000077e0 at pc 0x00010ba18c54 bp 0x70000dd45b10 sp 0x70000dd45b08
READ of size 1 at 0x6070000077e0 thread T12
    #0 0x10ba18c53 in WebSocketHandshakeKeyGen::generate(char const*, char*) libwshandshake.hpp:113
    #1 0x10ba2065a in ix::WebSocketHandshake::serverHandshake(int, int) IXWebSocketHandshake.cpp:356
    #2 0x10b9c4952 in ix::WebSocketTransport::connectToSocket(int, int) IXWebSocketTransport.cpp:190
    #3 0x10b97e4c2 in ix::WebSocket::connectToSocket(int, int) IXWebSocket.cpp:193
2019-05-16 21:59:03 -07:00
717f049579 Merge branch 'Dimon4eg-message-queue' 2019-05-16 19:26:45 -07:00
f71331056c bring back socket mutex which is needed, some CI failures are happening without it 2019-05-16 19:23:32 -07:00
c131ff2662 disable socket mutex usage in WebSocketTransport 2019-05-16 19:23:32 -07:00
616447e01d remove dead code 2019-05-16 19:23:32 -07:00
8c1d66bcf3 refactor connect unittest so that it hits a local server instead of a remote server 2019-05-16 19:23:32 -07:00
bea580b906 travis makefile fix 2019-05-16 19:23:32 -07:00
c513e02b24 try to run ws test on linux + macOS on travis 2019-05-16 19:23:32 -07:00
90d71deb0f Add constants for closing code and messages 2019-05-16 19:23:32 -07:00
fc0776303a first socket test hit a local server instead of a remote server / this can help with a windows intermittent failure 2019-05-16 19:23:32 -07:00
bb0c6f9a8a build ws on travis (mac + linux) 2019-05-16 19:23:32 -07:00
dae21e7681 use a regular mutex instead of a recursive one + stop properly 2019-05-16 19:23:32 -07:00
d28437ecc0 adding logging to IXWebSocketTestConnectionDisconnection makes it fails reliably 2019-05-16 19:23:32 -07:00
7fec24af67 Update README.md 2019-05-16 19:23:32 -07:00
0de3637569 Update README.md 2019-05-16 19:23:32 -07:00
f94c7cef59 -j option actually work ... 2019-05-16 19:23:32 -07:00
7734d63b1b unittest / add options to set the number of jobs 2019-05-16 19:23:32 -07:00
f894504761 enum class HttpErrorCode derives from int 2019-05-16 19:23:32 -07:00
7aa9b4ee64 try to re-enable some tests 2019-05-16 19:23:32 -07:00
a12250dc16 recursive mutex + enable test that was breaking on Ubuntu Xenial + gcc + tsan 2019-05-16 19:23:32 -07:00
d8fbe1a63e comment failing test 2019-05-16 19:23:32 -07:00
91e1760719 comment failing test 2019-05-16 19:23:32 -07:00
02c8a62e7d do not build ws for now on travis 2019-05-16 19:23:32 -07:00
0c9bcfb8ac more protection against socket when closing 2019-05-16 19:23:32 -07:00
bd4c5037c7 fix compile errors with C++ enum class 2019-05-16 19:23:32 -07:00
ccaaedf38f close and stop with code and reason + docker = ubuntu xenial 2019-05-16 19:23:32 -07:00
751f294164 add isEnabledAutomaticReconnection (#75)
* add isEnabledAutomaticReconnection

* test isEnabledAutomaticReconnection

* rename
2019-05-16 19:23:32 -07:00
e2acbe8499 Revert "Revert "fix cast warning caught on windows""
This reverts commit 25eaf730bc.
2019-05-16 19:23:32 -07:00
aba880a6b3 Revert "fix cast warning caught on windows"
This reverts commit 4edb7447df.
2019-05-16 19:23:32 -07:00
616e8da0a5 fix cast warning caught on windows 2019-05-16 19:23:32 -07:00
a220774a3b add more time to let client close (#73) 2019-05-16 19:23:32 -07:00
4fc8224264 build with gcc on Linux 2019-05-16 19:23:32 -07:00
66dae5840c use spdlog for logging in the unittest 2019-05-16 19:23:32 -07:00
89b9e6e531 fix inverted conditional 2019-05-16 19:23:31 -07:00
fc4623381a server code / add dedicated thread to close/join terminated connection threads 2019-05-16 19:23:31 -07:00
1023e925f6 travis cmake version on macOS does not know --parallel option 2019-05-16 19:23:31 -07:00
5d65365751 build in parallel + stop building linux + clang 2019-05-16 19:23:31 -07:00
ee64a6ec7e disable ping tests for now as they are not super reliable 2019-05-16 19:23:31 -07:00
9bc09105d7 Feature/windows ci (#76)
* close with params

* ...

* different generator

* core size = 1

* disable more tests to get something working on windows

* try to enable another test on windows

* enable all OS

* set proper version of linux

* another try

* try again with just env variables

* Revert "core size = 1"

This reverts commit 29af74bba6.

* add windows and mac

* Revert "close with params"

This reverts commit 6bb00b6788.
2019-05-16 19:23:31 -07:00
4b96632a69 save timepoints after connect and not in contructor, adjusted tests (#72)
* save timepoints after connect and not in contructor, adjusted tests

* move call into setReadyState

* more time to detect client close in test
2019-05-16 19:20:29 -07:00
22a806ca6f fix for Windows (#69)
* fix for Windows

* fix condition

* make condition only on Windows
2019-05-16 19:20:29 -07:00
d8dc977fc1 Fix run.py (#71)
* fix run.py

* run.py: fix Windows support

* fix test listing
2019-05-16 19:20:29 -07:00
6d900b8ffb bring back socket mutex which is needed, some CI failures are happening without it 2019-05-16 15:58:20 -07:00
5a2c070898 disable socket mutex usage in WebSocketTransport 2019-05-16 15:46:32 -07:00
58f17ddb09 remove dead code 2019-05-16 15:05:20 -07:00
47c9786bab refactor connect unittest so that it hits a local server instead of a remote server 2019-05-16 14:25:31 -07:00
e5edbeacb4 travis makefile fix 2019-05-16 14:02:24 -07:00
964fb20df9 try to run ws test on linux + macOS on travis 2019-05-16 13:57:33 -07:00
309ed80446 Add constants for closing code and messages 2019-05-16 12:46:53 -07:00
01f2eb6615 first socket test hit a local server instead of a remote server / this can help with a windows intermittent failure 2019-05-16 12:24:58 -07:00
3a55c7aaba build ws on travis (mac + linux) 2019-05-16 07:01:15 -07:00
243f41bf28 use a regular mutex instead of a recursive one + stop properly 2019-05-15 19:26:02 -07:00
934b28f5b6 adding logging to IXWebSocketTestConnectionDisconnection makes it fails reliably 2019-05-15 19:26:02 -07:00
edfc03bed2 Update README.md 2019-05-15 19:22:05 -07:00
59ce71b64d Update README.md 2019-05-15 18:57:17 -07:00
d473a7dc22 -j option actually work ... 2019-05-15 18:15:45 -07:00
efb063d600 unittest / add options to set the number of jobs 2019-05-15 17:52:03 -07:00
12fe55905c enum class HttpErrorCode derives from int 2019-05-15 16:50:00 -07:00
aed831c075 try to re-enable some tests 2019-05-15 16:28:29 -07:00
5ad15fad8b recursive mutex + enable test that was breaking on Ubuntu Xenial + gcc + tsan 2019-05-15 16:01:05 -07:00
a7d328896c comment failing test 2019-05-15 15:44:14 -07:00
1274a151d0 comment failing test 2019-05-15 15:37:30 -07:00
d93d639345 do not build ws for now on travis 2019-05-15 15:26:49 -07:00
e0d9a16985 more protection against socket when closing 2019-05-15 15:18:46 -07:00
7f1070dde6 fix compile errors with C++ enum class 2019-05-15 15:18:46 -07:00
7f1e70329c close and stop with code and reason + docker = ubuntu xenial 2019-05-15 15:18:46 -07:00
186c8fbb62 add isEnabledAutomaticReconnection (#75)
* add isEnabledAutomaticReconnection

* test isEnabledAutomaticReconnection

* rename
2019-05-14 11:26:37 -07:00
c935be6a49 Revert "Revert "fix cast warning caught on windows""
This reverts commit 25eaf730bc.
2019-05-13 22:16:49 -07:00
4ee502fa1a Revert "fix cast warning caught on windows"
This reverts commit 4edb7447df.
2019-05-13 21:35:34 -07:00
084805b248 fix cast warning caught on windows 2019-05-13 21:29:47 -07:00
eaebd258c0 add more time to let client close (#73) 2019-05-13 21:26:34 -07:00
2843a20814 build with gcc on Linux 2019-05-13 17:35:21 -07:00
08a56726a8 use spdlog for logging in the unittest 2019-05-13 17:32:57 -07:00
7cad8654e5 fix inverted conditional 2019-05-13 17:18:07 -07:00
841cfe37dd server code / add dedicated thread to close/join terminated connection threads 2019-05-13 17:17:35 -07:00
849a41293f travis cmake version on macOS does not know --parallel option 2019-05-13 17:17:35 -07:00
5b17edb3f9 build in parallel + stop building linux + clang 2019-05-13 17:06:56 -07:00
9f2047dad6 disable ping tests for now as they are not super reliable 2019-05-13 17:01:22 -07:00
c01c53c5c7 Feature/windows ci (#76)
* close with params

* ...

* different generator

* core size = 1

* disable more tests to get something working on windows

* try to enable another test on windows

* enable all OS

* set proper version of linux

* another try

* try again with just env variables

* Revert "core size = 1"

This reverts commit 29af74bba6.

* add windows and mac

* Revert "close with params"

This reverts commit 6bb00b6788.
2019-05-13 16:51:58 -07:00
27bf1684cb save timepoints after connect and not in contructor, adjusted tests (#72)
* save timepoints after connect and not in contructor, adjusted tests

* move call into setReadyState

* more time to detect client close in test
2019-05-13 09:08:46 -07:00
be2aee3354 fix for Windows (#69)
* fix for Windows

* fix condition

* make condition only on Windows
2019-05-12 22:21:56 -07:00
5f42a07d0d Fix run.py (#71)
* fix run.py

* run.py: fix Windows support

* fix test listing
2019-05-12 18:37:22 -07:00
8a94c945b7 Merge branch 'master' into message-queue 2019-05-12 22:00:10 +03:00
7740028291 all derived class use final keyword 2019-05-12 11:43:21 -07:00
7369e9c233 add setOnMessageCallback with r-value 2019-05-12 20:59:18 +03:00
8c66825a78 correct style 2019-05-12 20:16:02 +03:00
a56f8272a9 fix warnings 2019-05-12 20:05:28 +03:00
e846ca392f update comment 2019-05-12 20:00:15 +03:00
f9ec89cf7a update test 2019-05-12 19:57:31 +03:00
b935bc526a added message queue test 2019-05-12 01:50:41 +03:00
97617ced4a Added WebSocketMessageQueue 2019-05-12 01:49:06 +03:00
d575c7c2a9 bump version to 2.0.0 2019-05-11 14:22:41 -07:00
99a3bbc4f9 use C++11 enums (#67)
* use C++11 enums

* small rename

* update tests

* update tests

* update ws

* update ws

* update README.md
2019-05-11 14:22:06 -07:00
80226cb7d3 add comment about why a unittest is disabled 2019-05-11 12:25:40 -07:00
6189e0cd50 remove irrelevant comment 2019-05-11 12:24:11 -07:00
2254421ead minor improvements (#66)
* minor improvements

* fix build

* improve tests code
2019-05-11 12:20:58 -07:00
4934f5846b minor tweaks to have full feature parity before unittest broke 2019-05-11 11:54:21 -07:00
c8c1aabf20 fix race condition in SelectInteruptPipe, where _fildes are not protected (caught by fedora tsan) 2019-05-11 11:45:26 -07:00
93b901a286 remove more iostream includes (#65) 2019-05-11 11:27:58 -07:00
518a445074 rename some variables, minor cleanup 2019-05-11 10:24:28 -07:00
080a6db657 uncomment test 2019-05-11 10:15:22 -07:00
d49b1bd78a fix crash on close 2019-05-11 10:15:22 -07:00
bd96050d84 fix crash on close 2019-05-11 10:12:33 -07:00
2a90ad9e53 Fix crash during closing on Windows (#64)
* fix crash on close

* Improve calculateRetryWaitMilliseconds (#63)

* improve calculateRetryWaitMilliseconds

* update comment

* cout -> spdlog

* fix crash on close

* uncomment test

* Revert "uncomment test"

This reverts commit 27df86ee8f.
2019-05-11 09:51:26 -07:00
16758293ff fix warning in statsd_client about %m gnu only printf special char 2019-05-11 09:22:29 -07:00
e965322a98 fix overflow warning in msgpack11.cpp 2019-05-10 21:17:05 -07:00
fcf5c41b43 add env var to display the ws command typed in 2019-05-10 16:27:23 -07:00
88adbf0ca2 cout -> spdlog 2019-05-10 12:33:34 -07:00
3df142db7a Improve calculateRetryWaitMilliseconds (#63)
* improve calculateRetryWaitMilliseconds

* update comment
2019-05-10 12:31:21 -07:00
f90fc4bfa2 fix static analyzer thing with un-used variable 2019-05-09 16:57:58 -07:00
dc1f9fb243 use spdlog for logging in ws + unittest + remove un-needed mutex 2019-05-09 15:30:44 -07:00
7c30c8aa07 cout -> cerr 2019-05-09 15:06:42 -07:00
b1d13105e7 Fixed pong synchronization issue (#62)
* Fixed pong synchronization issue

* Minor optimization in lock by scoping it to necessary changes.

* Fixing compilation issues
2019-05-09 15:06:05 -07:00
287537b34a tweak unittest sleep duration to fix gcc+linux CI 2019-05-09 11:10:39 -07:00
fe04014e1c Fail test GCC TSAN (#61)
* test that fails on Run 8

* commented the failing test
2019-05-09 09:33:18 -07:00
094b5834b7 warning police 2019-05-09 09:25:56 -07:00
1eb98cc74f fix ping, fix send frame close (#49)
* fix ping, fix send frame close

* fixes for data race on _closeCode etc. and fix test

* fixing one TC

* fix waiting forever if no time to change of readyState, and poll never end

* add 1005 code if no status code received

* fixes for 1005 code

* fix test issue

* fix macOS issue

* revert to master tests and renaming
2019-05-09 09:21:05 -07:00
232aa069d2 IXCobraMetricsThreadedPublisher.cpp uses a lambda to log instead of std::cerr 2019-05-08 18:53:32 -07:00
a69408fa25 rename ptr 2019-05-09 01:05:47 +03:00
75011d0b4e simplify bindWebsocket 2019-05-09 00:23:16 +03:00
28ae70ed20 use lock_guard 2019-05-09 00:20:26 +03:00
2727d39fa4 update comments 2019-05-09 00:16:37 +03:00
467f99b3bb Rename to WebSocketMessageQueue 2019-05-09 00:09:51 +03:00
d53c9c5ecf change default ports for the ws command line tool 2019-05-08 13:56:42 -07:00
48c19b4f3c ws connect display more accurate messages for incoming messages 2019-05-08 13:56:42 -07:00
16e5b08a0f Remove redundant iostream includes (#60) 2019-05-08 13:33:21 -07:00
636a69e9e1 qf 2019-05-08 22:24:39 +03:00
45d40dc159 Added IXWebSocketPoll class 2019-05-08 22:02:56 +03:00
88abb79a96 set thread name for Windows (#57) 2019-05-08 07:43:43 -07:00
1e1d5c3f7d update appveyor windows build file 2019-05-06 17:50:55 -07:00
95e9faff95 update README.md (#54)
Yeah !
2019-05-06 15:02:16 -07:00
979ff60a6b Use LUrlParser to fix issue of Windows (#53)
LGTM
2019-05-06 14:45:02 -07:00
ea2e8f0787 added tests for IXUrlParser (#52)
* added tests for IXUrlParser

* add me as author
2019-05-06 12:47:15 -07:00
3893c12054 socket server / used wrong mutex to protect _connectionsThreads 2019-05-06 12:24:20 -07:00
8ad47a315b Fix windows (#51)
* More fixes for Windows

* fix tests for windows

* qf for linux

* clean up
2019-05-06 12:22:57 -07:00
3b576c3047 Update README.md 2019-05-06 09:22:52 -07:00
4d83dab4f3 Fix for windows (#50) 2019-05-06 09:13:42 -07:00
28a7ec4f35 doc: add reference to the conan file built at https://github.com/Zinnion/conan-IXWebSocket 2019-05-01 21:31:32 -07:00
b5aae88a0b remove un-needed _backgroundThreadRunning variable 2019-05-01 11:09:25 -07:00
bee97237d9 Make AutomaticReconnection optional (#47)
* unittest pass + commands behave as expected

* cleanup
2019-04-29 21:12:34 -07:00
8c8e950455 build fix 2019-04-29 20:54:00 -07:00
ad8b344298 tsan fixes on ubuntu xenial (what travis run) 2019-04-29 20:48:16 -07:00
6d310d417a dns lookup: fix race condition accessing _errMsg 2019-04-29 19:29:27 -07:00
9dca893ce7 tsan linux tentative fix / copy string instead of passing a const reference 2019-04-29 17:27:53 -07:00
e3444e666b rename _blocking to _backgroundThreadRunning and invert the naming 2019-04-29 16:54:08 -07:00
e37e69311b fix data race on _thread 2019-04-29 16:46:16 -07:00
6918f863b1 fix data race on _useMask 2019-04-29 16:41:34 -07:00
9ee05bf591 ws connect mode / add a flag to disable automatic reconnection, not hooked up yet 2019-04-29 14:31:29 -07:00
e15700235e enable tsan on travis for all configs 2019-04-29 09:11:16 -07:00
1c7c07e128 initialize netSystem (aka winsock on windows) explicitely 2019-04-25 16:38:15 -07:00
4fbc4e3be9 Fixes for windows (#45)
* init Net system on Windows

* propagate DNS error

* Add zlib 1.2.11 sources

* link zlib statically for windows

* remove not implemented function declaration

* fix connect on Windows
2019-04-25 16:26:53 -07:00
e251c81d43 fix indentation of greatestCommonDivisor 2019-04-25 16:21:36 -07:00
f30a5074ab Remove commented code 2019-04-25 16:16:52 -07:00
f6ae490723 Fix data race in WebSocket where _url is accessed without protection in setThreadName
Also fix with url usage + docker container uses fedora and works with tsan
2019-04-25 16:11:46 -07:00
7f96c43d6f disable failing unittest temporarily 2019-04-25 09:04:35 -07:00
52260a63fb Speedup build for Windows (#43)
* Speedup build for Windows

* add space :)
2019-04-25 07:41:01 -07:00
82b528ee30 tsan fix for the IXWebSocketServerTest test, where there's a data race for connectionId 2019-04-24 22:11:14 -07:00
a443bbdf80 Fix data races in DNSLookup (tsan) 2019-04-24 21:53:31 -07:00
26ee46b246 better server termination / another try at preventing thread join failures 2019-04-24 09:45:53 -07:00
cf37816602 compiler warning police 2019-04-24 09:45:03 -07:00
b8087f6c48 Fix #38 Add some docker doc in the README 2019-04-23 20:51:58 -07:00
28cbe8fbeb ws cobra publish stress mode fix 2019-04-23 20:51:58 -07:00
28210ee31d add boolean and add missing protocol error close constant (#41) 2019-04-23 04:31:55 -07:00
0caf875399 add example websocket C++ server snake which supports basic cobra ops (publish and subscribe without stream sql 2019-04-22 17:33:45 -07:00
323684efff (server) attempt to fix broken macOS unittest on travis CI 2019-04-22 09:36:16 -07:00
678ee0615d Expand build section in the main README 2019-04-21 21:11:08 -07:00
6c889def37 Merge branch 'dhruvkakadiya-readme/fix' 2019-04-21 16:14:35 -07:00
93586deb6f For #39, fixed setOnMessageCallback() in README. 2019-04-21 14:56:02 -07:00
b6b9ffd15c doc cobra 2019-04-21 11:52:38 -07:00
1189b5f693 new target to uninstall files 2019-04-21 11:47:57 -07:00
1c2b6d59da Fix #37 / add directives to install headers and library 2019-04-21 11:42:37 -07:00
eacc28fedf move cobra files to their own subfolder 2019-04-21 11:20:17 -07:00
5c85ee1214 add cobra metrics publisher 2019-04-21 11:16:33 -07:00
7df7453365 indentation / comestic changes 2019-04-19 16:57:38 -07:00
3d8297247e (test) / use a random number generator to get a free port, when the bind to port 0 strategy does not work out 2019-04-19 16:50:04 -07:00
662f66e501 (socket server) wait for all connections threads to be terminated before exiting stop method 2019-04-19 16:31:33 -07:00
9131cb4790 default sanitizer choice 2019-04-19 15:13:59 -07:00
3b616676c6 disable clang sanitizers in CI on any platforms but Darwin 2019-04-19 15:09:01 -07:00
cce759b8dd fix Linux cast warning 2019-04-19 15:03:49 -07:00
98b6c9b89e (unittest) upgrade to Catch2 version 2.7.1 2019-04-19 14:41:03 -07:00
5370201df8 add locks around Socket::send and Socket::recv to see if it helps with thread sanitizer error in Linux CI 2019-04-19 14:28:51 -07:00
419c395966 uses sh syntax to capture output 2019-04-19 12:40:39 -07:00
2962ce9a0f (ci) verbose mode to figure out Linux build problems on travis 2019-04-19 12:10:43 -07:00
c96398aa0c Windows nmake does not have a -j flag 2019-04-19 11:58:02 -07:00
e68ce1d680 Windows + unittest python script fixes 2019-04-19 11:54:58 -07:00
d34f10b4ea fix warning / ws_cobra_subscribe does not need a verbose flag 2019-04-19 11:45:42 -07:00
7e2c1f274b (test) build dir is an absolute path 2019-04-19 11:45:02 -07:00
9fe3811c45 (ws) fix compiler warnings 2019-04-19 09:48:46 -07:00
b74bccee0a fix test execution on travis which was broken / unify running test locally and on travis 2019-04-19 09:46:17 -07:00
a2d170f415 fix bad merge in IXWebSocketTransport.cpp ... 2019-04-19 09:41:16 -07:00
03f762db86 Socket::Poll does not need a callback 2019-04-19 09:32:49 -07:00
aea859af52 Ping timeout use constant (#36)
* use constant for ping timeout

* change close code types
2019-04-19 09:16:25 -07:00
f61fd7b7f1 Link zlib statically for windows (#35)
* Add zlib 1.2.11 sources

* link zlib statically for windows
2019-04-19 09:14:03 -07:00
5682129b1d fix close code/reason issue (#34)
* fix close code/reason issue

* added code 1006 for abnormal closure
2019-04-18 10:02:31 -07:00
c3431f19bf Real ping (#32)
* close method change and fix code

* missing mutex

* wip

* renaming and fixes

* renaming, fixes

* added enablePong/disablePong, add tests

* added new test cases

* add 1 test case

* fix gcd name to greatestCommonDivisor

* move ping and ping timeout checks into socket poll, local var in test cases and indent fixes

* indent issue
2019-04-18 09:24:16 -07:00
65b11cb968 docker container works with SSL + fix compiler warnings in statsd third_party module 2019-04-18 09:11:12 -07:00
f4f60d38b8 docker + linux build fix 2019-04-17 22:52:03 -07:00
4337345103 setter method does not need to return anything, make it void 2019-04-17 20:36:26 -07:00
52f460f66d (doc) Add more doc to SocketServer 2019-04-17 20:36:26 -07:00
d486c72e02 websocket server: closed connection threads are joined properly 2019-04-17 20:36:26 -07:00
bdfc55b951 Bug/30 server connection problem (#31)
* use threads instead of std::async, need to cleanup threads

* less buggy server connection per thread system
2019-04-16 22:19:44 -07:00
b0f6026c23 make closeWireSize a default parameter of WebSocketTransport::close 2019-04-16 09:55:12 -07:00
b2aca491b6 close method change and fix code (#28)
* close method change and fix code

* missing mutex
2019-04-16 08:58:34 -07:00
401fc39879 fix windows build (#29)
* fix windows build

* fix for Unix

* Fix build if TLS is OFF

* add OpenSSL req to ws

* Fix build on Mac

* fix tests for windows
2019-04-16 08:51:57 -07:00
d4b0839328 move security framework linking to ixwebsocket (#26) 2019-04-14 17:13:24 -07:00
37c64841ff fix warning 2019-04-13 21:16:04 -07:00
8f8dd076ff ws: new command to subscribe to a cobra server and send an event to a sentry server 2019-04-11 16:03:05 -07:00
51fcf65424 (ws) add subcommands: cobra subscribe, and cobra subscribe to statsd bridge 2019-04-08 21:56:01 -07:00
56b19fa2b0 linux ci tentative fix 2019-04-03 22:02:10 -07:00
fe38dab405 better unittest runner / can run through lldb and produce a junit XML artifact 2019-03-29 15:54:05 -07:00
6cb2aaab65 Bump sleep time in test shell script 2019-03-29 09:36:56 -07:00
c604c4591f (redis_subscribe) in verbose mode, received message gets printed with a 'received: ' header 2019-03-29 09:35:19 -07:00
f0f54434cb Add clarification notice about third party modules 2019-03-29 09:34:17 -07:00
f9de85c257 offline version of remark-latest 2019-03-28 16:06:43 -07:00
44f817646e redis conf slides 2019-03-28 14:17:19 -07:00
91786779f8 slides 2019-03-27 16:27:52 -07:00
27d0aed2c9 add redis-conf slides 2019-03-27 15:53:55 -07:00
7767c96a9e ws redis command improvements + test script 2019-03-27 13:41:46 -07:00
3388bb50e1 (ws) redis_subscribe and redis_publish can take a password + display subscribe response 2019-03-26 09:33:22 -07:00
1554c587b3 update doc 2019-03-24 21:48:14 -07:00
ce70e73a34 remove Formula folder
Homebrew stuff is at https://github.com/bsergean/homebrew-IXWebSocket
2019-03-24 21:43:38 -07:00
804ec9246f (server) fix masking bug 2019-03-22 15:33:04 -07:00
f029321664 can send TEXT message (we only support BINARY messages now) 2019-03-22 14:24:22 -07:00
d41b7f64e4 unmasked code is broken 2019-03-22 14:24:15 -07:00
0366d1afb9 remove printf + unittest fix 2019-03-22 09:56:28 -07:00
4ef3073ca4 (server) server should not mask data when sending to client (some python client libraries enforce that and assert) 2019-03-22 09:53:56 -07:00
68a53aa884 (server) HTTP response is malformed 2019-03-22 09:52:19 -07:00
2358b3ff26 minor cleanup 2019-03-21 13:51:25 -07:00
00ed1d2817 HTTP/1.1 response should contains a reason (websocket server)
Fix compatibility problem with websockets python library, where the response does not contains a reason

File "/.../lib/python3.7/site-packages/websockets/http.py", line 126, in read_response
version, status_code, reason = status_line[:-2].split(b' ', 2)
ValueError: not enough values to unpack (expected 3, got 2)

The above exception was the direct cause of the following exception:

websockets.exceptions.InvalidMessage: Malformed HTTP message
2019-03-21 13:43:47 -07:00
5b6fdb6526 cleanup, remove dead method 2019-03-21 10:06:59 -07:00
fe700d1e7b (cmake) add a warning about 32/64 conversion problems. 2019-03-20 21:51:38 -07:00
eac611ab1e Feature/connection state (#25)
* (cmake) add a warning about 32/64 conversion problems.

* fix typo

* New connection state for server code + fix OpenSSL double init bug

* update README
2019-03-20 18:34:24 -07:00
0635313566 Feature/redis (#23)
* Fix warning

* (cmake) add a warning about 32/64 conversion problems.

* simple redis clients

* can publish to redis

* redis subscribe

* display messages received per second

* verbose flag

* (cmake) use clang only compile option -Wshorten-64-to-32 when compiling with clang
2019-03-20 14:29:02 -07:00
663299c91e Fixed heartbeat typos (#22) 2019-03-19 21:31:43 -07:00
523a6e989a make PollResultType an enum class 2019-03-19 09:29:57 -07:00
13f4aee5ee fix bug with isReadyToWrite 2019-03-18 22:05:04 -07:00
bbc0e2106c workaround bug in Socket::isReadyToWrite 2019-03-18 20:37:33 -07:00
eb6ee52aaa use milliseconds 2019-03-18 20:17:44 -07:00
80e330d4c3 ws / log subcommand name 2019-03-18 17:54:06 -07:00
a3adc49d8c disable sigpipe on osx when writing/reading into a dead pipe 2019-03-18 17:52:01 -07:00
9c6eeed0f8 edit homebrew install steps 2019-03-18 15:45:33 -07:00
705e9a93f8 add an install target 2019-03-18 15:11:08 -07:00
572a217050 no default parameters for isReadyToWrite and isReadyToRead 2019-03-18 14:31:21 -07:00
d58798e36c when trying to flush the send buffer, use select to wait until it is possible instead of using sleep to retry at a given frequency 2019-03-18 14:25:27 -07:00
e98634a277 Fix typo (#19) 2019-03-17 16:08:28 -07:00
f1f08eced0 remove unused gitmodule file 2019-03-17 10:38:48 -07:00
6c2da9f0e4 remove unused folder 2019-03-17 10:38:19 -07:00
e158635f57 linux hangs when closing 2019-03-16 11:38:23 -07:00
5a241e77da edit README 2019-03-16 11:32:46 -07:00
68e397ab34 use pipe to abort select on Linux as well as macOS 2019-03-15 17:46:40 -07:00
4c78b94cd8 missing assert include on Linux 2019-03-15 11:43:27 -07:00
3a9cc9b079 cleanup 2019-03-15 11:41:57 -07:00
6ff8c6e7f3 unittest fix 2019-03-14 18:58:16 -07:00
6f90425154 linux compile fix 2019-03-14 18:55:33 -07:00
49ec9b1d9e linux fixes 2019-03-14 18:54:47 -07:00
a0e35ad644 build fix 2019-03-14 18:53:21 -07:00
b91dc77d6f select interrupt cleanup 2019-03-14 18:37:38 -07:00
b462b5a5c8 linux build fix 2019-03-14 15:17:17 -07:00
b5e7fb20b6 replace uint8_t with uint64_t for the send/close requests types / use named variable to index into the _fildes array 2019-03-14 15:03:57 -07:00
9d245add9c set a default close reason string 2019-03-14 14:52:51 -07:00
ded03ed743 do not busy loop while sending 2019-03-14 14:48:08 -07:00
6cc260c04e remove docker folder 2019-03-14 14:48:02 -07:00
5b4354a6f3 send optimization + ws file transfer test 2019-03-14 14:47:53 -07:00
34de36fe01 Update README.md
Stop lying about Windows support ...
2019-03-13 23:10:40 -07:00
08c2cdbf1d send can fail silently when sending would block (EWOULDBLOCK return for send) (#18)
* try to use a pipe for communication

* flush send buffer on the background thread

* cleanup

* linux fix / linux still use event fd for now

* cleanup
2019-03-13 23:09:45 -07:00
dedbeb3eab websocket send: make sure all data in the kernel buffer is sent 2019-03-11 22:16:55 -07:00
d88bf16500 add new message type when receiving message fragments 2019-03-11 11:12:43 -07:00
ad9c8318a7 ws broacast_server / can set serving hostname 2019-03-10 16:36:44 -07:00
f2778c0729 debian 9 unittest build fix 2019-03-10 16:07:48 -07:00
03ca73658c asan test suite fix 2019-03-09 10:45:40 -08:00
1da5f6c30c unittest + warning fix 2019-03-09 10:37:14 -08:00
bee8a99a34 add ability to run with asan on macOS 2019-03-05 17:07:28 -08:00
f5efd41dc1 fix compiler warnings in ws command line tool 2019-03-04 13:56:30 -08:00
c202f8cf1d Socket code refactoring, plus stop polling with a 1s timeout in readBytes while we only want to poll with a 1ms timeout 2019-03-04 13:40:15 -08:00
0c226c7629 readBytes does not read bytes one by one but in chunks 2019-03-02 21:11:16 -08:00
a9e772f330 create a blocking + cancellable Socket::readBytes method 2019-03-02 15:16:46 -08:00
86cc76388e create a blocking + cancellable Socket::readBytes method 2019-03-02 11:01:51 -08:00
0f4e9af172 more ws doc 2019-02-28 22:07:45 -08:00
3a1352c8ec more ws doc 2019-02-28 22:03:48 -08:00
2c86fd947f Feature/http (#16)
* add skeleton and broken http client code.

GET returns "Resource temporarily unavailable" errors...

* linux compile fix

* can GET some pages

* Update formatting in README.md

* unittest for sending large messages

* document bug

* Feature/send large message (#14)

* introduce send fragment

* can pass a fin frame

* can send messages which are a perfect multiple of the chunk size

* set fin only for last fragment

* cleanup

* last fragment should be of type CONTINUATION

* Add simple send and receive programs

* speedups receiving + better way to wait for thing

* receive speedup by using linked list of chunks instead of large array

* document bug

* use chunks to receive data

* trailing spaces

* Update README.md

Add note about message fragmentation.

* Feature/ws cli (#15)

* New command line tool for transfering files / still very beta.

* add readme

* use cli11 for argument parsing

* json -> msgpack

* stop using base64 and use binary which can be stored in message pack

* add target for building with homebrew

* all CMakeLists are referenced by the top level one

* add ws_chat and ws_connect sub commands to ws

* cleanup

* add echo and broadcast server as ws sub-commands

* add gitignore

* comments

* ping pong added to ws

* mv cobra_publisher under ws folder

* Update README.md

* linux build fix

* linux build fix

* move http_client to a ws sub-command

* simple HTTP post support (urlencode parameters)

* can specify extra headers

* chunk encoding / simple redirect support / -I option

* follow redirects is optional

* make README vim markdown plugin friendly

* cleanup argument parsing + add socket creation factory

* add missing file

* http gzip compression

* cleanup

* doc

* Feature/send large message (#14)

* introduce send fragment

* can pass a fin frame

* can send messages which are a perfect multiple of the chunk size

* set fin only for last fragment

* cleanup

* last fragment should be of type CONTINUATION

* Add simple send and receive programs

* speedups receiving + better way to wait for thing

* receive speedup by using linked list of chunks instead of large array

* document bug

* use chunks to receive data

* trailing spaces
2019-02-28 21:54:03 -08:00
927484a71f Update README.md 2019-02-22 21:53:29 -08:00
88adb8f5ef mv cobra_publisher under ws folder 2019-02-22 21:51:03 -08:00
98e7f5cb22 ping pong added to ws 2019-02-22 21:47:57 -08:00
67e5957064 comments 2019-02-22 21:27:49 -08:00
8c3473a91a add gitignore 2019-02-22 21:26:25 -08:00
1c775cb759 add echo and broadcast server as ws sub-commands 2019-02-22 21:25:56 -08:00
c4054d4984 cleanup 2019-02-22 20:51:22 -08:00
76e2f9f3ac add ws_chat and ws_connect sub commands to ws 2019-02-22 20:49:26 -08:00
41a40b8b9f all CMakeLists are referenced by the top level one 2019-02-21 22:21:29 -08:00
6b8694bfbf add target for building with homebrew 2019-02-21 22:05:30 -08:00
2d696b6806 Feature/ws cli (#15)
* New command line tool for transfering files / still very beta.

* add readme

* use cli11 for argument parsing

* json -> msgpack

* stop using base64 and use binary which can be stored in message pack
2019-02-21 21:24:53 -08:00
709a5ec89a Update README.md
Add note about message fragmentation.
2019-02-21 14:08:27 -08:00
932bb732e0 Feature/send large message (#14)
* introduce send fragment

* can pass a fin frame

* can send messages which are a perfect multiple of the chunk size

* set fin only for last fragment

* cleanup

* last fragment should be of type CONTINUATION

* Add simple send and receive programs

* speedups receiving + better way to wait for thing

* receive speedup by using linked list of chunks instead of large array

* document bug

* use chunks to receive data

* trailing spaces
2019-02-20 18:59:07 -08:00
dd4e29542c document bug 2019-02-16 10:33:37 -08:00
726e66ca66 unittest for sending large messages 2019-02-16 10:32:02 -08:00
474fd70ec7 Update formatting in README.md 2019-02-05 23:04:45 -08:00
5074dbc3c6 more conf in CI 2019-01-29 17:50:19 -08:00
eb54e7f1ae get free port that can be used by non root users (> 1024) 2019-01-28 15:24:19 -08:00
8983dd97a1 use dynamically generated port number to configure servers in unittest 2019-01-28 15:24:19 -08:00
7eaea28970 Merge pull request #13 from machinezone/user/bsergeant/poll
User/bsergeant/poll
2019-01-27 10:47:38 -08:00
907605c59c windows build fix 2019-01-27 10:46:02 -08:00
58921592c8 constexpr to declare number of fds 2019-01-26 21:01:36 -08:00
b9c49c38ed linux fix 2019-01-26 20:57:48 -08:00
76c97027c8 remove shutdown call 2019-01-26 20:54:23 -08:00
5db3620f49 rebase poll branch 2019-01-26 20:50:25 -08:00
a2e6fa0b16 insensitive string compare when validating server connection header 2019-01-25 16:17:51 -08:00
1d359f0fc4 Merge pull request #12 from machinezone/user/bsergeant/heart-beat
Add an optional heartbeat
2019-01-25 16:14:28 -08:00
885d245afb heartbeat correct 2019-01-25 16:11:39 -08:00
75d01c0c11 close server socket on exit 2019-01-24 21:16:32 -08:00
ea219e3ddd unittest fix 2019-01-24 19:54:10 -08:00
e9cd54b2f4 add an heartbeat test 2019-01-24 18:50:07 -08:00
a8b6573f96 hearbeat 2019-01-24 12:42:49 -08:00
4e158c8ba7 Update README.md 2019-01-15 09:36:43 -08:00
121c84a2d1 check and validate the Connection: Upgrade header in client/server 2019-01-15 09:31:37 -08:00
bfb76de9ab Merge pull request #10 from tonylin0826/master
Fix missing "Upgrade" header error
2019-01-15 09:22:11 -08:00
2434605c06 Fix missing upgrade header error 2019-01-15 15:35:37 +08:00
a0f15bfb56 C++14 + use make_unique and make_shared to make shared pointers 2019-01-11 21:25:06 -08:00
7fabd14a63 add travis badge 2019-01-08 10:13:23 -08:00
6b4d2aeb07 travis -> osx 2019-01-08 10:04:47 -08:00
5ab61b46b5 Revert "Revert "try asan on Linux"" [Back to asan on Linux]
This reverts commit 02a704a8c7.
2019-01-07 21:13:48 -08:00
39c9691d70 travis-ci: try to use clang on Linux 2019-01-07 20:49:03 -08:00
d00960b33f Revert "try asan on Linux"
This reverts commit dd2360ed70.
2019-01-07 20:47:25 -08:00
4a5cfac2ea try asan on Linux 2019-01-07 18:29:44 -08:00
7e1d21239f build with osx on travis 2019-01-07 18:16:29 -08:00
1a8b870a9e fix simple compile error in test/IXTest.h 2019-01-07 18:08:11 -08:00
3e150db493 add a travis file for real 2019-01-07 18:05:55 -08:00
1cf8b7e952 add a travis file 2019-01-07 18:04:28 -08:00
ea75432f12 update test remote ws url 2019-01-07 11:28:53 -08:00
85370dfd21 remove cmake sanitizer submodule 2019-01-07 11:26:23 -08:00
8a0afef825 check select errors better 2019-01-07 11:18:00 -08:00
76f196206b sanitizer cmake stuff 2019-01-06 18:54:16 -08:00
bf3e8195f7 DNSLookup _id member does not need to be an atomic 2019-01-06 18:32:19 -08:00
bce3071a12 DNSLookup: fix #8 2019-01-06 18:27:26 -08:00
911f684e4d DNSLookup: copy hostname and port instead of accessing member 2019-01-06 18:17:12 -08:00
49bc156a56 return false -> return -1 2019-01-06 18:10:39 -08:00
791c3701d7 add new unittest 2019-01-06 15:14:13 -08:00
372af54e46 remove dead file 2019-01-06 14:26:11 -08:00
20c8953e5b remove openssl testing bits for apple build 2019-01-06 14:21:49 -08:00
2f9ad54bae gcc linux compile fix 2019-01-06 12:12:39 -08:00
57c22cddb8 make a class hierarchy for server code (IXWebSocketServer <- IXSocketServer) 2019-01-06 12:09:31 -08:00
a5026849a3 add log 2019-01-05 21:16:13 -08:00
60dc765178 unittest + compiler warnings 2019-01-05 21:10:08 -08:00
5e1c150024 windows compile fix 2019-01-05 21:02:55 -08:00
0fd06bb592 int -> ssize_t for socker recv and send 2019-01-05 20:53:50 -08:00
9641c8cf49 header refactoring 2019-01-05 20:38:43 -08:00
4ca31be4a2 windows connect (compile fix) 2019-01-05 17:35:50 -08:00
667f18cbfe windows connect potential fix 2019-01-05 17:32:21 -08:00
4df5050760 more accurate description of errors 2019-01-05 17:18:43 -08:00
f50881a72f SocketTest / more debug info 2019-01-05 17:10:01 -08:00
b80696af00 windows (compile) fix 2019-01-05 17:04:09 -08:00
3cb2f6dcf7 windows fix 2019-01-05 17:02:39 -08:00
b1e2c4ce72 test failure is not noticed 2019-01-05 16:30:22 -08:00
89ff9dd5ac fix gcc warning 2019-01-05 16:26:11 -08:00
8b95b173cd makefile tweak 2019-01-05 14:43:21 -08:00
80a877ddab add dns lookup test 2019-01-05 14:40:17 -08:00
e892b21872 openssl cleanup 2019-01-05 11:42:25 -08:00
c344913ae8 Merge pull request #7 from bsergean/user/bsergeant/appveyor_first
unittest on appveyor
2019-01-04 17:29:23 -08:00
3eef8fba27 unittest on appveyor 2019-01-04 17:28:13 -08:00
d34e47f716 windows fixes 2019-01-04 15:23:57 -08:00
9bfba28d01 Merge pull request #6 from machinezone/user/bsergeant/server
Add support for writing websocket servers (IXWebSocketServer)
2019-01-03 18:47:30 -08:00
cc43357fb4 Socket::readLine works with arbitrary long lines 2019-01-03 18:47:01 -08:00
bce5ef2dca timeout is configurable 2019-01-03 18:33:08 -08:00
3021ac4b95 remove useless FIXME comment 2019-01-03 18:02:03 -08:00
385e80d185 new doc 2019-01-03 18:00:48 -08:00
bd1c8873d0 capture path/uri when connecting, and pass it back through callbacks in the openInfo member 2019-01-03 17:44:10 -08:00
6ac3bdb94a implement a max connections (default = 32) settings 2019-01-03 17:05:44 -08:00
e964a0a1f0 correct validation of the request (request line + headers) 2019-01-03 13:41:06 -08:00
97255fbd62 cancellation refactoring 2019-01-03 12:53:44 -08:00
d5041f64be rename test file 2019-01-02 21:59:06 -08:00
64f649d1f9 split handshake code into its own files, so that Transport file is less massive 2019-01-02 20:07:54 -08:00
097c7e5397 server unittest for validating client request / new timeout cancellation handling (need refactoring) 2019-01-02 16:08:32 -08:00
c6adc00eac add new broadcast server example 2019-01-02 08:17:03 -08:00
b1710bfa31 server per message deflate support 2019-01-02 08:12:29 -08:00
0e52c42970 echo server example is a real echo server, not a broadcast server 2019-01-02 08:10:39 -08:00
2b136b2981 refactoring + cancellation was buggy during http upgrade 2019-01-02 07:45:07 -08:00
b95e5e36dc use select to detect new incoming connections 2019-01-01 22:21:07 -08:00
1bc5bc7f1c add a way to run in blocking more, which is useful for server mode to have N*thread instead of 2N*thread for N connections 2019-01-01 21:25:15 -08:00
946d7015a2 more named constants 2019-01-01 19:23:27 -08:00
4adf5720f0 gitignore stuff 2019-01-01 17:14:31 -08:00
973a3f03c3 linux fix + unittest works with Linux 2019-01-01 17:13:26 -08:00
06177afd6a unittest starts a server 2019-01-01 16:34:05 -08:00
e5937638d4 crash when server failed to start 2019-01-01 16:14:46 -08:00
7c4f14f941 thread accepting connections can be cancelled/stopped externally 2019-01-01 16:11:27 -08:00
ead54d6c37 listen job run in its own thread, non blocking 2019-01-01 14:52:14 -08:00
b749f3c724 (nitpick) reformat 2019-01-01 14:29:57 -08:00
d279aecb87 cleanup / remove printf, add mutex, remove hardcoded values, can pass in a binding host 2019-01-01 14:28:41 -08:00
67de0fc8da use shared_ptr 2019-01-01 13:53:13 -08:00
8ed2399517 unittest pass 2019-01-01 13:47:25 -08:00
cf340011e2 record workers in a map instead of a vector 2018-12-31 14:52:59 -08:00
ec2ad37860 add a print statement when the connection is closed / still need to terminate server thread 2018-12-31 12:47:42 -08:00
3443e82812 more cleanup to propagate server connection error and let onOpen callback execute 2018-12-31 12:43:47 -08:00
63138507d6 only bind to localhost 2018-12-31 11:48:49 -08:00
b2eb07db14 server code has a callback that takes a websocket 2018-12-30 22:12:13 -08:00
379a845166 cleanup / use a websocket instead of raw websockettransport 2018-12-30 22:00:49 -08:00
266cf93584 can accept multiple connection / server can send data back to client 2018-12-30 21:16:05 -08:00
0ee71e9a09 proof of concept server implementation 2018-12-29 23:15:27 -08:00
ea07afcc0b can create a socket from a fd 2018-12-29 21:53:33 -08:00
43cd6d34ca add simple unittest 2018-12-29 18:34:08 -08:00
3b67032adb add missing src files (IXSetThreadName.{cpp,h}) ... 2018-12-23 14:19:30 -08:00
2d46a0605b fix warning: field '_eventCallback' will be initialized after field '_publishMode' 2018-12-23 14:18:53 -08:00
ba54664748 Fix warning: field '_done' will be initialized after field '_wait' [-Wreorder] _done(false), 2018-12-23 14:17:30 -08:00
a79f4c10a1 set thread name / rename example 2018-12-23 14:14:38 -08:00
bd04b28b9e async dns lookup fix 2018-12-14 17:49:42 -08:00
cbadecab33 non blocking dns lookup 2018-12-14 16:28:17 -08:00
8c079787f0 add cancellation support while connecting, to speed up WebSocket::stop 2018-12-09 17:56:20 -08:00
62528e6a0b http upgrade and connections use non blocking sockets 2018-12-09 14:07:40 -08:00
49bf8bd830 threading race condition fixes, detected by TSAN 2018-12-06 08:27:28 -08:00
c64bc20bb5 cleanup 2018-11-14 15:52:28 -08:00
54da891f79 per-message deflate compression fixes 2018-11-13 17:46:05 -08:00
e847716076 move files around 2018-11-12 17:56:59 -08:00
3a68bbd1b2 update readme / remove reference to missing compression support now that it is supported ... 2018-11-12 09:01:42 -08:00
9cb1d03411 tweaks doc / license + send proper error code when closing the connecion 2018-11-12 09:00:55 -08:00
4fed156b90 per message deflate support (with zlib) 2018-11-09 18:42:09 -08:00
de8bcd36e8 (satori_publisher) better error handling 2018-11-07 14:54:44 -08:00
135cfe3238 Add some example shell scripts to build on Linux 2018-11-07 12:33:33 -08:00
6dbfe28427 Add new example folder for publishing events to satori, with a minimal satori sdk 2018-11-07 12:26:32 -08:00
2b203c4616 Add missing files ... 2018-11-07 12:25:38 -08:00
f12e655cf8 Add DockerFile + parse rsv1 field 2018-11-07 11:45:17 -08:00
cf0045a483 stopping connection on Linux does not close the socket, which can create problem when re-starting the connection 2018-11-01 17:02:49 -07:00
9c81eeace0 add stop and start directives to ws_connect + display close info 2018-10-31 10:27:17 -07:00
5b333f91f6 update readme.md 2018-10-27 11:46:11 -07:00
912d926260 Handle Sec-WebSocket-Accept correctly 2018-10-27 10:24:48 -07:00
a8dfd640a7 capture an error code and a reason when the server closes the connection 2018-10-25 18:51:19 -07:00
390044b716 add doc about ping/pong 2018-10-25 15:14:31 -07:00
8ac36e6ee5 ping pong example: more error handling 2018-10-25 14:46:23 -07:00
208c693088 ping / pong support / fix bug in dispatching received message type 2018-10-25 14:43:35 -07:00
eae2f7d113 Better ping/pong support 2018-10-25 14:43:35 -07:00
45f92115f9 New ws_connect example. Close to wscat node.js tool. 2018-10-25 14:43:35 -07:00
42f3adc7a2 Update README.md 2018-10-08 21:50:55 -07:00
71b40c6d6c Windows support (no TLS yet) 2018-10-08 21:44:54 -07:00
af12089e7a make TLS support optional 2018-10-08 15:24:36 -07:00
33677c4b2b move examples around 2018-10-08 15:24:36 -07:00
376c8c2e00 Update IXWebSocket.h
Remove dead code
2018-10-07 15:49:07 -07:00
8232e9e8ce Update README.md
Advanced usage -> API
2018-10-07 15:47:38 -07:00
436bf8deb5 more ssl peer validation stuff 2018-10-05 18:45:44 -07:00
c858a1c9e5 Update README.md 2018-10-05 14:35:09 -07:00
110 changed files with 6410 additions and 712 deletions

View File

@ -1,7 +1,8 @@
name: C/C++ CI
name: unittest
on: [push]
# fake comment to trigger an action 1
jobs:
linux:
runs-on: ubuntu-latest
@ -16,16 +17,16 @@ jobs:
steps:
- uses: actions/checkout@v1
- name: install redis
run: brew install redis
- name: start redis server
run: brew services start redis
- name: make test
run: make test
# We don't need to have redis running anymore, as we have our fake limited one
# - name: install redis
# run: brew install redis
#
# - name: start redis server
# run: brew services start redis
# # Windows does not work yet, I'm stuck at getting CMake to run + finding vcpkg
# win:
# runs-on: windows-2016

View File

@ -113,22 +113,24 @@ else()
list( APPEND IXWEBSOCKET_HEADERS ixwebsocket/IXSelectInterruptEventFd.h)
endif()
if (WIN32)
set(USE_MBED_TLS TRUE)
endif()
option(USE_TLS "Enable TLS support" FALSE)
if (USE_TLS)
if (WIN32)
option(USE_MBED_TLS "Use Mbed TLS" ON)
else()
option(USE_MBED_TLS "Use Mbed TLS" OFF)
endif()
option(USE_OPEN_SSL "Use OpenSSL" OFF)
if (USE_MBED_TLS)
list( APPEND IXWEBSOCKET_HEADERS ixwebsocket/IXSocketMbedTLS.h)
list( APPEND IXWEBSOCKET_SOURCES ixwebsocket/IXSocketMbedTLS.cpp)
elseif (APPLE AND NOT USE_OPEN_SSL)
list( APPEND IXWEBSOCKET_HEADERS ixwebsocket/IXSocketAppleSSL.h)
list( APPEND IXWEBSOCKET_SOURCES ixwebsocket/IXSocketAppleSSL.cpp)
elseif (WIN32)
list( APPEND IXWEBSOCKET_HEADERS ixwebsocket/IXSocketSChannel.h)
list( APPEND IXWEBSOCKET_SOURCES ixwebsocket/IXSocketSChannel.cpp)
else()
set(USE_OPEN_SSL TRUE)
set(USE_OPEN_SSL ON)
list( APPEND IXWEBSOCKET_HEADERS ixwebsocket/IXSocketOpenSSL.h)
list( APPEND IXWEBSOCKET_SOURCES ixwebsocket/IXSocketOpenSSL.cpp)
endif()
@ -145,19 +147,15 @@ if (USE_TLS)
target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_MBED_TLS)
elseif (USE_OPEN_SSL)
target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_OPEN_SSL)
elseif (APPLE)
elseif (WIN32)
else()
target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_OPEN_SSL)
endif()
endif()
if (APPLE AND USE_TLS AND NOT USE_MBED_TLS)
if (APPLE AND USE_TLS AND NOT USE_MBED_TLS AND NOT USE_OPEN_SSL)
target_link_libraries(ixwebsocket "-framework foundation" "-framework security")
endif()
if (WIN32)
target_link_libraries(ixwebsocket wsock32 ws2_32)
target_link_libraries(ixwebsocket wsock32 ws2_32 shlwapi)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
@ -174,7 +172,9 @@ if (USE_TLS AND USE_OPEN_SSL)
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} /usr/local/opt/openssl/include)
endif()
find_package(OpenSSL REQUIRED)
if(NOT OPENSSL_FOUND)
find_package(OpenSSL REQUIRED)
endif()
add_definitions(${OPENSSL_DEFINITIONS})
message(STATUS "OpenSSL: " ${OPENSSL_VERSION})
include_directories(${OPENSSL_INCLUDE_DIR})
@ -201,13 +201,13 @@ if (ZLIB_FOUND)
include_directories(${ZLIB_INCLUDE_DIRS})
target_link_libraries(ixwebsocket ${ZLIB_LIBRARIES})
else()
add_subdirectory(third_party/zlib)
include_directories(third_party/zlib ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib)
add_subdirectory(third_party/zlib)
target_link_libraries(ixwebsocket zlibstatic)
endif()
set( IXWEBSOCKET_INCLUDE_DIRS
.
${CMAKE_CURRENT_SOURCE_DIR}
)
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
@ -232,6 +232,7 @@ if (USE_WS OR USE_TEST)
add_subdirectory(ixsentry)
add_subdirectory(third_party/spdlog spdlog)
add_subdirectory(third_party/sentry-native sentry-native)
if (USE_WS)
add_subdirectory(ws)

View File

@ -1,35 +0,0 @@
FROM alpine:3.11 as build
RUN apk add --no-cache gcc g++ musl-dev linux-headers cmake openssl-dev
RUN apk add --no-cache make
RUN apk add --no-cache zlib-dev
RUN addgroup -S app && adduser -S -G app app
RUN chown -R app:app /opt
RUN chown -R app:app /usr/local
# There is a bug in CMake where we cannot build from the root top folder
# So we build from /opt
COPY --chown=app:app . /opt
WORKDIR /opt
USER app
RUN [ "make", "ws_install" ]
FROM alpine:3.11 as runtime
RUN apk add --no-cache libstdc++
RUN apk add --no-cache strace
RUN addgroup -S app && adduser -S -G app app
COPY --chown=app:app --from=build /usr/local/bin/ws /usr/local/bin/ws
RUN chmod +x /usr/local/bin/ws
RUN ldd /usr/local/bin/ws
# Now run in usermode
USER app
WORKDIR /home/app
ENTRYPOINT ["ws"]
EXPOSE 8008
CMD ["--help"]

1
Dockerfile Symbolic link
View File

@ -0,0 +1 @@
docker/Dockerfile.centos

View File

@ -1,6 +1,6 @@
## Hello world
![Build status badge](https://travis-ci.org/machinezone/IXWebSocket.svg?branch=master)
![Build status](https://github.com/machinezone/IXWebSocket/workflows/unittest/badge.svg)
IXWebSocket is a C++ library for WebSocket client and server development. It has minimal dependencies (no boost), is very simple to use and support everything you'll likely need for websocket dev (SSL, deflate compression, compiles on most platforms, etc...). HTTP client and server code is also available, but it hasn't received as much testing.
@ -38,4 +38,10 @@ Interested? Go read the [docs](https://machinezone.github.io/IXWebSocket/)! If t
IXWebSocket is actively being developed, check out the [changelog](https://machinezone.github.io/IXWebSocket/CHANGELOG/) to know what's cooking. If you are looking for a real time messaging service (the chat-like 'server' your websocket code will talk to) with many features such as history, backed by Redis, look at [cobra](https://github.com/machinezone/cobra).
IXWebSocket client code is autobahn compliant beginning with the 6.0.0 version. See the current [test results](https://bsergean.github.io/IXWebSocket/autobahn/index.html). Some tests are still failing in the server code.
IXWebSocket client code is autobahn compliant beginning with the 6.0.0 version. See the current [test results](https://bsergean.github.io/autobahn/reports/clients/index.html). Some tests are still failing in the server code.
## Users
If your company or project is using this library, feel free to open an issue or PR to amend this list.
- [Machine Zone](https://www.mz.com)

View File

@ -1,4 +1,4 @@
FROM alpine as build
FROM alpine:3.11 as build
RUN apk add --no-cache gcc g++ musl-dev linux-headers cmake openssl-dev
RUN apk add --no-cache make
@ -15,20 +15,25 @@ WORKDIR /opt
USER app
RUN [ "make", "ws_install" ]
RUN [ "rm", "-rf", "build" ]
FROM alpine as runtime
FROM alpine:3.11 as runtime
RUN apk add --no-cache libstdc++
RUN apk add --no-cache strace
RUN apk add --no-cache gdb
RUN addgroup -S app && adduser -S -G app app
COPY --chown=app:app --from=build /usr/local/bin/ws /usr/local/bin/ws
RUN chmod +x /usr/local/bin/ws
RUN ldd /usr/local/bin/ws
# Copy source code for gcc
COPY --chown=app:app --from=build /opt /opt
# Now run in usermode
USER app
WORKDIR /home/app
ENTRYPOINT ["ws"]
EXPOSE 8008
CMD ["--help"]

35
docker/Dockerfile.centos Normal file
View File

@ -0,0 +1,35 @@
FROM centos:8 as build
RUN yum install -y gcc-c++ make cmake zlib-devel openssl-devel redhat-rpm-config
RUN groupadd app && useradd -g app app
RUN chown -R app:app /opt
RUN chown -R app:app /usr/local
# There is a bug in CMake where we cannot build from the root top folder
# So we build from /opt
COPY --chown=app:app . /opt
WORKDIR /opt
USER app
RUN [ "make", "ws_install" ]
RUN [ "rm", "-rf", "build" ]
FROM centos:8 as runtime
RUN yum install -y gdb strace
RUN groupadd app && useradd -g app app
COPY --chown=app:app --from=build /usr/local/bin/ws /usr/local/bin/ws
RUN chmod +x /usr/local/bin/ws
RUN ldd /usr/local/bin/ws
# Copy source code for gcc
COPY --chown=app:app --from=build /opt /opt
# Now run in usermode
USER app
WORKDIR /home/app
ENTRYPOINT ["ws"]
EXPOSE 8008

View File

@ -1,7 +1,136 @@
# Changelog
All changes to this project will be documented in this file.
## [7.7.0] - 2019-12-24
## [8.1.8] - 2020-03-02
(websocket server) fix regression with disabling zlib extension on the server side. If a client does not support this extension the server will handle it fine. We still need to figure out how to disable the option.
## [8.1.7] - 2020-02-26
(websocket) traffic tracker received bytes is message size while it should be wire size
## [8.1.6] - 2020-02-26
(ws_connect) display sent/received bytes statistics on exit
## [8.1.5] - 2020-02-23
(server) give thread name to some usual worker threads / unittest is broken !!
## [8.1.4] - 2020-02-22
(websocket server) fix regression from 8.1.2, where per-deflate message compression was always disabled
## [8.1.3] - 2020-02-21
(client + server) Fix #155 / http header parser should treat the space(s) after the : delimiter as optional. Fixing this bug made us discover that websocket sub-protocols are not properly serialiazed, but start with a ,
## [8.1.2] - 2020-02-18
(WebSocketServer) add option to disable deflate compression, exposed with the -x option to ws echo_server
## [8.1.1] - 2020-02-18
(ws cobra to statsd and sentry sender) exit if no messages are received for one minute, which is a sign that something goes wrong on the server side. That should be changed to be configurable in the future
## [8.1.0] - 2020-02-13
(http client + sentry minidump upload) Multipart stream closing boundary is invalid + mark some options as mandatory in the command line tools
## [8.0.7] - 2020-02-12
(build) remove the unused subtree which was causing some way of installing to break
## [8.0.6] - 2020-01-31
(snake) add an option to disable answering pongs as response to pings, to test cobra client behavior with hanged connections
## [8.0.5] - 2020-01-31
(IXCobraConnection) set a ping timeout of 90 seconds. If no pong messages are received as responses to ping for a while, give up and close the connection
## [8.0.4] - 2020-01-31
(cobra to sentry) remove noisy logging
## [8.0.3] - 2020-01-30
(ixcobra) check if we are authenticated in publishNext before trying to publish a message
## [8.0.2] - 2020-01-28
Extract severity level when emitting messages to sentry
## [8.0.1] - 2020-01-28
Fix bug #151 - If a socket connection is interrupted, calling stop() on the IXWebSocket object blocks until the next retry
## [8.0.0] - 2020-01-26
(SocketServer) add ability to bind on an ipv6 address
## [7.9.6] - 2020-01-22
(ws) add a dnslookup sub-command, to get the ip address of a remote host
## [7.9.5] - 2020-01-14
(windows) fix #144, get rid of stubbed/un-implemented windows schannel ssl backend
## [7.9.4] - 2020-01-12
(openssl + mbedssl) fix #140, can send large files with ws send over ssl / still broken with apple ssl
## [7.9.3] - 2020-01-10
(apple ssl) model write method after the OpenSSL one for consistency
## [7.9.2] - 2020-01-06
(apple ssl) unify read and write ssl utility code
## [7.9.1] - 2020-01-06
(websocket client) better error propagation when errors are detected while sending data
(ws send) detect failures to send big files, terminate in those cases and report error
## [7.9.0] - 2020-01-04
(ws send) add option (-x) to disable per message deflate compression
## [7.8.9] - 2020-01-04
(ws send + receive) handle all message types (ping + pong + fragment) / investigate #140
## [7.8.8] - 2019-12-28
(mbedtls) fix related to private key file parsing and initialization
## [7.8.6] - 2019-12-28
(ws cobra to sentry/statsd) fix for handling null events properly for empty queues + use queue to send data to statsd
## [7.8.5] - 2019-12-28
(ws cobra to sentry) handle null events for empty queues
## [7.8.4] - 2019-12-27
(ws cobra to sentry) game is picked in a fair manner, so that all games get the same share of sent events
## [7.8.3] - 2019-12-27
(ws cobra to sentry) refactor queue related code into a class
## [7.8.2] - 2019-12-25
(ws cobra to sentry) bound the queue size used to hold up cobra messages before they are sent to sentry. Default queue size is a 100 messages. Without such limit the program runs out of memory when a subscriber receive a lot of messages that cannot make it to sentry
## [7.8.1] - 2019-12-25
(ws client) use correct compilation defines so that spdlog is not used as a header only library (reduce binary size and increase compilation speed)
## [7.8.0] - 2019-12-24
(ws client) all commands use spdlog instead of std::cerr or std::cout for logging

View File

@ -23,6 +23,16 @@ Options for building:
If you are on Windows, look at the [appveyor](https://github.com/machinezone/IXWebSocket/blob/master/appveyor.yml) file that has instructions for building dependencies.
It is also possible to externally include the project, so that everything is fetched over the wire when you build like so:
```
ExternalProject_Add(
IXWebSocket
GIT_REPOSITORY https://github.com/machinezone/IXWebSocket.git
...
)
```
### vcpkg
It is possible to get IXWebSocket through Microsoft [vcpkg](https://github.com/microsoft/vcpkg).
@ -33,11 +43,16 @@ vcpkg install ixwebsocket
### Conan
Support for building with conan was contributed by Olivia Zoe (thanks!). The package name to reference is `IXWebSocket/5.0.0@LunarWatcher/stable`, and a list of the uploaded versions is available on [Bintray](https://bintray.com/oliviazoe0/conan-packages/IXWebSocket%3ALunarWatcher). The package is in the process to be published to the official conan package repo, but in the meantime, it can be accessed by adding a new remote
[ ![Download](https://api.bintray.com/packages/conan/conan-center/ixwebsocket%3A_/images/download.svg) ](https://bintray.com/conan/conan-center/ixwebsocket%3A_/_latestVersion)
```
conan remote add remote_name_here https://api.bintray.com/conan/oliviazoe0/conan-packages
```
Conan is currently supported through a recipe in [Conan Center](https://github.com/conan-io/conan-center-index/tree/master/recipes/ixwebsocket) ([Bintray entry](https://bintray.com/conan/conan-center/ixwebsocket%3A_)).
Package reference
* Conan 1.21.0 and up: `ixwebsocket/7.9.2`
* Earlier versions: `ixwebsocket/7.9.2@_/_`
Note that the version listed here might not be the latest one. See Bintray or the recipe itself for the latest version. If you're migrating from the previous, custom Bintray remote, note that the package reference _has_ to be lower-case.
### Docker

View File

@ -265,7 +265,15 @@ namespace ix
_webSocket->setUrl(url);
_webSocket->setPerMessageDeflateOptions(webSocketPerMessageDeflateOptions);
_webSocket->setTLSOptions(socketTLSOptions);
// Send a websocket ping every N seconds (N = 30) now
// This should keep the connection open and prevent some load balancers such as
// the Amazon one from shutting it down
_webSocket->setPingInterval(kPingIntervalSecs);
// If we don't receive a pong back, declare loss after 3 * N seconds
// (will be 90s now), and close and restart the connection
_webSocket->setPingTimeout(3 * kPingIntervalSecs);
}
//
@ -506,7 +514,7 @@ namespace ix
if (_messageQueue.empty()) return true;
auto&& msg = _messageQueue.back();
if (!publishMessage(msg))
if (!_authenticated || !publishMessage(msg))
{
return false;
}

View File

@ -166,6 +166,17 @@ namespace ix
tags.append(tag);
}
}
if (msg["data"]["info"].isMember("level_str"))
{
// https://docs.sentry.io/enriching-error-data/context/?platform=python#setting-the-level
std::string level = msg["data"]["info"]["level_str"].asString();
if (level == "critical")
{
level = "fatal";
}
payload["level"] = level;
}
}
else
{

View File

@ -32,6 +32,7 @@ namespace snake
// Misc
bool verbose;
bool disablePong;
};
bool isAppKeyValid(const AppConfig& appConfig, std::string appkey);

View File

@ -17,8 +17,8 @@
namespace ix
{
RedisServer::RedisServer(int port, const std::string& host, int backlog, size_t maxConnections)
: SocketServer(port, host, backlog, maxConnections)
RedisServer::RedisServer(int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily)
: SocketServer(port, host, backlog, maxConnections, addressFamily)
, _connectedClientsCount(0)
, _stopHandlingConnections(false)
{

View File

@ -25,7 +25,8 @@ namespace ix
RedisServer(int port = SocketServer::kDefaultPort,
const std::string& host = SocketServer::kDefaultHost,
int backlog = SocketServer::kDefaultTcpBacklog,
size_t maxConnections = SocketServer::kDefaultMaxConnections);
size_t maxConnections = SocketServer::kDefaultMaxConnections,
int addressFamily = SocketServer::kDefaultAddressFamily);
virtual ~RedisServer();
virtual void stop() final;

View File

@ -21,6 +21,15 @@ namespace snake
, _server(appConfig.port, appConfig.hostname)
{
_server.setTLSOptions(appConfig.socketTLSOptions);
if (appConfig.disablePong)
{
_server.disablePong();
}
std::stringstream ss;
ss << "Listening on " << appConfig.hostname << ":" << appConfig.port;
ix::IXCoreLogger::Log(ss.str().c_str());
}
//

View File

@ -648,7 +648,7 @@ namespace ix
<< it.second << "\r\n";
}
ss << "--" << multipartBoundary << "\r\n";
ss << "--" << multipartBoundary << "--\r\n";
return ss.str();
}

View File

@ -42,8 +42,9 @@ namespace
namespace ix
{
HttpServer::HttpServer(int port, const std::string& host, int backlog, size_t maxConnections)
: SocketServer(port, host, backlog, maxConnections)
HttpServer::HttpServer(
int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily)
: SocketServer(port, host, backlog, maxConnections, addressFamily)
, _connectedClientsCount(0)
{
setDefaultConnectionCallback();

View File

@ -28,7 +28,8 @@ namespace ix
HttpServer(int port = SocketServer::kDefaultPort,
const std::string& host = SocketServer::kDefaultHost,
int backlog = SocketServer::kDefaultTcpBacklog,
size_t maxConnections = SocketServer::kDefaultMaxConnections);
size_t maxConnections = SocketServer::kDefaultMaxConnections,
int addressFamily = SocketServer::kDefaultAddressFamily);
virtual ~HttpServer();
virtual void stop() final;

View File

@ -7,9 +7,9 @@
#include "IXSelectInterruptFactory.h"
#if defined(__linux__) || defined(__APPLE__)
#include <ixwebsocket/IXSelectInterruptPipe.h>
#include "IXSelectInterruptPipe.h"
#else
#include <ixwebsocket/IXSelectInterrupt.h>
#include "IXSelectInterrupt.h"
#endif
namespace ix

View File

@ -54,14 +54,17 @@ namespace ix
// to ::poll does fix that.
//
// However poll isn't as portable as select and has bugs on Windows, so we
// should write a shim to fallback to select on those platforms. See
// have a shim to fallback to select on those platforms. See
// https://github.com/mpv-player/mpv/pull/5203/files for such a select wrapper.
//
nfds_t nfds = 1;
struct pollfd fds[2];
memset(fds, 0, sizeof(fds));
fds[0].fd = sockfd;
fds[0].events = (readyToRead) ? POLLIN : POLLOUT;
// this is ignored by poll, but our select based poll wrapper on Windows needs it
fds[0].events |= POLLERR;
// File descriptor used to interrupt select when needed
@ -132,6 +135,11 @@ namespace ix
}
#endif
}
else if (sockfd != -1 && (fds[0].revents & POLLERR || fds[0].revents & POLLHUP ||
fds[0].revents & POLLNVAL))
{
pollResult = PollResultType::Error;
}
return pollResult;
}

View File

@ -73,7 +73,7 @@ namespace ix
virtual void close();
virtual ssize_t send(char* buffer, size_t length);
virtual ssize_t send(const std::string& buffer);
ssize_t send(const std::string& buffer);
virtual ssize_t recv(void* buffer, size_t length);
// Blocking and cancellable versions, working with socket that can be set

View File

@ -80,11 +80,15 @@ namespace ix
{
*len = (size_t) status;
if (requested_sz > *len)
{
return errSSLWouldBlock;
}
else
{
return noErr;
}
}
else if (0 == status)
else if (status == 0)
{
*len = 0;
return errSSLClosedGraceful;
@ -96,7 +100,8 @@ namespace ix
{
case ENOENT: return errSSLClosedGraceful;
case EAGAIN: return errSSLWouldBlock;
case EAGAIN: return errSSLWouldBlock; // EWOULDBLOCK is a define for EAGAIN on osx
case EINPROGRESS: return errSSLWouldBlock;
case ECONNRESET: return errSSLClosedAbort;
@ -105,7 +110,9 @@ namespace ix
}
}
OSStatus SocketAppleSSL::writeToSocket(SSLConnectionRef connection, const void* data, size_t* len)
OSStatus SocketAppleSSL::writeToSocket(SSLConnectionRef connection,
const void* data,
size_t* len)
{
int fd = (int) (long) connection;
if (fd < 0) return errSSLInternal;
@ -120,11 +127,15 @@ namespace ix
{
*len = (size_t) status;
if (to_write_sz > *len)
{
return errSSLWouldBlock;
}
else
{
return noErr;
}
}
else if (0 == status)
else if (status == 0)
{
*len = 0;
return errSSLClosedGraceful;
@ -132,13 +143,16 @@ namespace ix
else
{
*len = 0;
if (EAGAIN == errno)
switch (errno)
{
return errSSLWouldBlock;
}
else
{
return errSecIO;
case ENOENT: return errSSLClosedGraceful;
case EAGAIN: return errSSLWouldBlock; // EWOULDBLOCK is a define for EAGAIN on osx
case EINPROGRESS: return errSSLWouldBlock;
case ECONNRESET: return errSSLClosedAbort;
default: return errSecIO;
}
}
}
@ -165,7 +179,8 @@ namespace ix
_sslContext = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType);
SSLSetIOFuncs(_sslContext, SocketAppleSSL::readFromSocket, SocketAppleSSL::writeToSocket);
SSLSetIOFuncs(
_sslContext, SocketAppleSSL::readFromSocket, SocketAppleSSL::writeToSocket);
SSLSetConnection(_sslContext, (SSLConnectionRef)(long) _sockfd);
SSLSetProtocolVersionMin(_sslContext, kTLSProtocol12);
SSLSetPeerDomainName(_sslContext, host.c_str(), host.size());
@ -178,7 +193,7 @@ namespace ix
do
{
status = SSLHandshake(_sslContext);
} while (errSSLWouldBlock == status || errSSLServerAuthCompleted == status);
} while (status == errSSLWouldBlock || status == errSSLServerAuthCompleted);
if (status == errSSLServerAuthCompleted)
{
@ -186,7 +201,7 @@ namespace ix
do
{
status = SSLHandshake(_sslContext);
} while (errSSLWouldBlock == status || errSSLServerAuthCompleted == status);
} while (status == errSSLWouldBlock || status == errSSLServerAuthCompleted);
}
}
else
@ -194,11 +209,11 @@ namespace ix
do
{
status = SSLHandshake(_sslContext);
} while (errSSLWouldBlock == status || errSSLServerAuthCompleted == status);
} while (status == errSSLWouldBlock || status == errSSLServerAuthCompleted);
}
}
if (noErr != status)
if (status != noErr)
{
errMsg = getSSLErrorDescription(status);
close();
@ -223,32 +238,38 @@ namespace ix
ssize_t SocketAppleSSL::send(char* buf, size_t nbyte)
{
ssize_t ret = 0;
OSStatus status;
do
OSStatus status = errSSLWouldBlock;
while (status == errSSLWouldBlock)
{
size_t processed = 0;
std::lock_guard<std::mutex> lock(_mutex);
status = SSLWrite(_sslContext, buf, nbyte, &processed);
ret += processed;
buf += processed;
nbyte -= processed;
} while (nbyte > 0 && errSSLWouldBlock == status);
if (ret == 0 && errSSLClosedAbort != status) ret = -1;
return ret;
}
if (processed > 0) return (ssize_t) processed;
ssize_t SocketAppleSSL::send(const std::string& buffer)
{
return send((char*) &buffer[0], buffer.size());
// The connection was reset, inform the caller that this
// Socket should close
if (status == errSSLClosedGraceful || status == errSSLClosedNoNotify ||
status == errSSLClosedAbort)
{
errno = ECONNRESET;
return -1;
}
if (status == errSSLWouldBlock)
{
errno = EWOULDBLOCK;
return -1;
}
}
return -1;
}
// No wait support
ssize_t SocketAppleSSL::recv(void* buf, size_t nbyte)
{
OSStatus status = errSSLWouldBlock;
while (errSSLWouldBlock == status)
while (status == errSSLWouldBlock)
{
size_t processed = 0;
std::lock_guard<std::mutex> lock(_mutex);

View File

@ -30,7 +30,6 @@ namespace ix
virtual void close() final;
virtual ssize_t send(char* buffer, size_t length) final;
virtual ssize_t send(const std::string& buffer) final;
virtual ssize_t recv(void* buffer, size_t length) final;
private:

View File

@ -9,18 +9,16 @@
#ifdef IXWEBSOCKET_USE_TLS
#ifdef IXWEBSOCKET_USE_MBED_TLS
#include <ixwebsocket/IXSocketMbedTLS.h>
#elif defined(_WIN32)
#include <ixwebsocket/IXSocketSChannel.h>
#include "IXSocketMbedTLS.h"
#elif defined(IXWEBSOCKET_USE_OPEN_SSL)
#include <ixwebsocket/IXSocketOpenSSL.h>
#include "IXSocketOpenSSL.h"
#elif __APPLE__
#include <ixwebsocket/IXSocketAppleSSL.h>
#include "IXSocketAppleSSL.h"
#endif
#else
#include <ixwebsocket/IXSocket.h>
#include "IXSocket.h"
#endif
@ -46,8 +44,6 @@ namespace ix
socket = std::make_shared<SocketMbedTLS>(tlsOptions, fd);
#elif defined(IXWEBSOCKET_USE_OPEN_SSL)
socket = std::make_shared<SocketOpenSSL>(tlsOptions, fd);
#elif defined(_WIN32)
socket = std::make_shared<SocketSChannel>(tlsOptions, fd);
#elif defined(__APPLE__)
socket = std::make_shared<SocketAppleSSL>(tlsOptions, fd);
#endif

View File

@ -39,6 +39,7 @@ namespace ix
mbedtls_entropy_init(&_entropy);
mbedtls_x509_crt_init(&_cacert);
mbedtls_x509_crt_init(&_cert);
mbedtls_pk_init(&_pkey);
}
bool SocketMbedTLS::init(const std::string& host, bool isClient, std::string& errMsg)
@ -81,6 +82,11 @@ namespace ix
errMsg = "Cannot parse key file '" + _tlsOptions.keyFile + "'";
return false;
}
if (mbedtls_ssl_conf_own_cert(&_conf, &_cert, &_pkey) < 0)
{
errMsg = "Problem configuring cert '" + _tlsOptions.certFile + "'";
return false;
}
}
if (_tlsOptions.isPeerVerifyDisabled())
@ -104,11 +110,6 @@ namespace ix
}
mbedtls_ssl_conf_ca_chain(&_conf, &_cacert, NULL);
if (_tlsOptions.hasCertAndKey())
{
mbedtls_ssl_conf_own_cert(&_conf, &_cert, &_pkey);
}
}
if (mbedtls_ssl_setup(&_ssl, &_conf) != 0)
@ -229,35 +230,23 @@ namespace ix
ssize_t SocketMbedTLS::send(char* buf, size_t nbyte)
{
ssize_t sent = 0;
std::lock_guard<std::mutex> lock(_mutex);
while (nbyte > 0)
ssize_t res = mbedtls_ssl_write(&_ssl, (unsigned char*) buf, nbyte);
if (res > 0)
{
std::lock_guard<std::mutex> lock(_mutex);
ssize_t res = mbedtls_ssl_write(&_ssl, (unsigned char*) buf, nbyte);
if (res > 0)
{
nbyte -= res;
sent += res;
}
else if (res == MBEDTLS_ERR_SSL_WANT_READ || res == MBEDTLS_ERR_SSL_WANT_WRITE)
{
errno = EWOULDBLOCK;
return -1;
}
else
{
return -1;
}
return res;
}
else if (res == MBEDTLS_ERR_SSL_WANT_READ || res == MBEDTLS_ERR_SSL_WANT_WRITE)
{
errno = EWOULDBLOCK;
return -1;
}
else
{
return -1;
}
return sent;
}
ssize_t SocketMbedTLS::send(const std::string& buffer)
{
return send((char*) &buffer[0], buffer.size());
}
ssize_t SocketMbedTLS::recv(void* buf, size_t nbyte)

View File

@ -35,7 +35,6 @@ namespace ix
virtual void close() final;
virtual ssize_t send(char* buffer, size_t length) final;
virtual ssize_t send(const std::string& buffer) final;
virtual ssize_t recv(void* buffer, size_t length) final;
private:

View File

@ -11,8 +11,14 @@
#include "IXSocketConnect.h"
#include <cassert>
#include <errno.h>
#ifdef _WIN32
#include <Shlwapi.h>
#else
#include <fnmatch.h>
#endif
#if OPENSSL_VERSION_NUMBER < 0x10100000L
#include <openssl/x509v3.h>
#endif
#define socketerrno errno
namespace ix
@ -136,7 +142,11 @@ namespace ix
*/
bool SocketOpenSSL::checkHost(const std::string& host, const char* pattern)
{
#ifdef _WIN32
return PathMatchSpecA(host.c_str(), pattern);
#else
return fnmatch(pattern, host.c_str(), 0) != FNM_NOMATCH;
#endif
}
bool SocketOpenSSL::openSSLCheckServerCert(SSL* ssl,
@ -593,42 +603,30 @@ namespace ix
ssize_t SocketOpenSSL::send(char* buf, size_t nbyte)
{
ssize_t sent = 0;
std::lock_guard<std::mutex> lock(_mutex);
while (nbyte > 0)
if (_ssl_connection == nullptr || _ssl_context == nullptr)
{
std::lock_guard<std::mutex> lock(_mutex);
if (_ssl_connection == nullptr || _ssl_context == nullptr)
{
return 0;
}
ERR_clear_error();
ssize_t write_result = SSL_write(_ssl_connection, buf + sent, (int) nbyte);
int reason = SSL_get_error(_ssl_connection, (int) write_result);
if (reason == SSL_ERROR_NONE)
{
nbyte -= write_result;
sent += write_result;
}
else if (reason == SSL_ERROR_WANT_READ || reason == SSL_ERROR_WANT_WRITE)
{
errno = EWOULDBLOCK;
return -1;
}
else
{
return -1;
}
return 0;
}
return sent;
}
ssize_t SocketOpenSSL::send(const std::string& buffer)
{
return send((char*) &buffer[0], buffer.size());
ERR_clear_error();
ssize_t write_result = SSL_write(_ssl_connection, buf, (int) nbyte);
int reason = SSL_get_error(_ssl_connection, (int) write_result);
if (reason == SSL_ERROR_NONE)
{
return write_result;
}
else if (reason == SSL_ERROR_WANT_READ || reason == SSL_ERROR_WANT_WRITE)
{
errno = EWOULDBLOCK;
return -1;
}
else
{
return -1;
}
}
ssize_t SocketOpenSSL::recv(void* buf, size_t nbyte)

View File

@ -33,7 +33,6 @@ namespace ix
virtual void close() final;
virtual ssize_t send(char* buffer, size_t length) final;
virtual ssize_t send(const std::string& buffer) final;
virtual ssize_t recv(void* buffer, size_t length) final;
private:

View File

@ -1,103 +0,0 @@
/*
* IXSocketSChannel.cpp
* Author: Benjamin Sergeant
* Copyright (c) 2018 Machine Zone, Inc. All rights reserved.
*
* See https://docs.microsoft.com/en-us/windows/desktop/WinSock/using-secure-socket-extensions
*
* https://github.com/pauldotknopf/WindowsSDK7-Samples/blob/master/netds/winsock/securesocket/stcpclient/tcpclient.c
*
* This is the right example to look at:
* https://www.codeproject.com/Articles/1000189/A-Working-TCP-Client-and-Server-With-SSL
*
* Similar code is available from this git repo
* https://github.com/david-maw/StreamSSL
*/
#include "IXSocketSChannel.h"
#ifdef _WIN32
#include <WS2tcpip.h>
#include <WinSock2.h>
#include <basetsd.h>
#include <io.h>
#include <schannel.h>
#include <ws2def.h>
#define WIN32_LEAN_AND_MEAN
#ifndef UNICODE
#define UNICODE
#endif
#include <mstcpip.h>
#include <ntdsapi.h>
#include <rpc.h>
#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#define RECV_DATA_BUF_SIZE 256
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
// link with fwpuclnt.lib for Winsock secure socket extensions
#pragma comment(lib, "fwpuclnt.lib")
// link with ntdsapi.lib for DsMakeSpn function
#pragma comment(lib, "ntdsapi.lib")
// The following function assumes that Winsock
// has already been initialized
#else
#error("This file should only be built on Windows")
#endif
namespace ix
{
SocketSChannel::SocketSChannel()
{
;
}
SocketSChannel::~SocketSChannel()
{
}
bool SocketSChannel::connect(const std::string& host, int port, std::string& errMsg)
{
return Socket::connect(host, port, errMsg, nullptr);
}
void SocketSChannel::secureSocket()
{
// there will be a lot to do here ...
}
void SocketSChannel::close()
{
Socket::close();
}
ssize_t SocketSChannel::send(char* buf, size_t nbyte)
{
return Socket::send(buf, nbyte);
}
ssize_t SocketSChannel::send(const std::string& buffer)
{
return Socket::send(buffer);
}
ssize_t SocketSChannel::recv(void* buf, size_t nbyte)
{
return Socket::recv(buf, nbyte);
}
} // namespace ix

View File

@ -1,32 +0,0 @@
/*
* IXSocketSChannel.h
* Author: Benjamin Sergeant
* Copyright (c) 2017-2018 Machine Zone, Inc. All rights reserved.
*/
#pragma once
#include "IXSocket.h"
namespace ix
{
class SocketSChannel final : public Socket
{
public:
SocketSChannel();
~SocketSChannel();
virtual bool connect(const std::string& host, int port, std::string& errMsg) final;
virtual void close() final;
// The important override
virtual void secureSocket() final;
virtual ssize_t send(char* buffer, size_t length) final;
virtual ssize_t send(const std::string& buffer) final;
virtual ssize_t recv(void* buffer, size_t length) final;
private:
};
} // namespace ix

View File

@ -7,12 +7,13 @@
#include "IXSocketServer.h"
#include "IXNetSystem.h"
#include "IXSetThreadName.h"
#include "IXSocket.h"
#include "IXSocketConnect.h"
#include "IXSocketFactory.h"
#include <assert.h>
#include <stdio.h>
#include <sstream>
#include <stdio.h>
#include <string.h>
namespace ix
@ -21,15 +22,15 @@ namespace ix
const std::string SocketServer::kDefaultHost("127.0.0.1");
const int SocketServer::kDefaultTcpBacklog(5);
const size_t SocketServer::kDefaultMaxConnections(32);
const int SocketServer::kDefaultAddressFamily(AF_INET);
SocketServer::SocketServer(int port,
const std::string& host,
int backlog,
size_t maxConnections)
SocketServer::SocketServer(
int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily)
: _port(port)
, _host(host)
, _backlog(backlog)
, _maxConnections(maxConnections)
, _addressFamily(addressFamily)
, _serverFd(-1)
, _stop(false)
, _stopGc(false)
@ -56,10 +57,15 @@ namespace ix
std::pair<bool, std::string> SocketServer::listen()
{
struct sockaddr_in server; // server address information
if (_addressFamily != AF_INET && _addressFamily != AF_INET6)
{
std::string errMsg("SocketServer::listen() AF_INET and AF_INET6 are currently "
"the only supported address families");
return std::make_pair(false, errMsg);
}
// Get a socket for accepting connections.
if ((_serverFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
if ((_serverFd = socket(_addressFamily, SOCK_STREAM, 0)) < 0)
{
std::stringstream ss;
ss << "SocketServer::listen() error creating socket): " << strerror(Socket::getErrno());
@ -79,27 +85,63 @@ namespace ix
return std::make_pair(false, ss.str());
}
// Bind the socket to the server address.
server.sin_family = AF_INET;
server.sin_port = htons(_port);
// Using INADDR_ANY trigger a pop-up box as binding to any address is detected
// by the osx firewall. We need to codesign the binary with a self-signed cert
// to allow that, but this is a bit of a pain. (this is what node or python would do).
//
// Using INADDR_LOOPBACK also does not work ... while it should.
// We default to 127.0.0.1 (localhost)
//
server.sin_addr.s_addr = inet_addr(_host.c_str());
if (bind(_serverFd, (struct sockaddr*) &server, sizeof(server)) < 0)
if (_addressFamily == AF_INET)
{
std::stringstream ss;
ss << "SocketServer::listen() error calling bind "
<< "at address " << _host << ":" << _port << " : " << strerror(Socket::getErrno());
struct sockaddr_in server;
server.sin_family = _addressFamily;
server.sin_port = htons(_port);
Socket::closeSocket(_serverFd);
return std::make_pair(false, ss.str());
if (inet_pton(_addressFamily, _host.c_str(), &server.sin_addr.s_addr) <= 0)
{
std::stringstream ss;
ss << "SocketServer::listen() error calling inet_pton "
<< "at address " << _host << ":" << _port << " : "
<< strerror(Socket::getErrno());
Socket::closeSocket(_serverFd);
return std::make_pair(false, ss.str());
}
// Bind the socket to the server address.
if (bind(_serverFd, (struct sockaddr*) &server, sizeof(server)) < 0)
{
std::stringstream ss;
ss << "SocketServer::listen() error calling bind "
<< "at address " << _host << ":" << _port << " : "
<< strerror(Socket::getErrno());
Socket::closeSocket(_serverFd);
return std::make_pair(false, ss.str());
}
}
else // AF_INET6
{
struct sockaddr_in6 server;
server.sin6_family = _addressFamily;
server.sin6_port = htons(_port);
if (inet_pton(_addressFamily, _host.c_str(), &server.sin6_addr) <= 0)
{
std::stringstream ss;
ss << "SocketServer::listen() error calling inet_pton "
<< "at address " << _host << ":" << _port << " : "
<< strerror(Socket::getErrno());
Socket::closeSocket(_serverFd);
return std::make_pair(false, ss.str());
}
// Bind the socket to the server address.
if (bind(_serverFd, (struct sockaddr*) &server, sizeof(server)) < 0)
{
std::stringstream ss;
ss << "SocketServer::listen() error calling bind "
<< "at address " << _host << ":" << _port << " : "
<< strerror(Socket::getErrno());
Socket::closeSocket(_serverFd);
return std::make_pair(false, ss.str());
}
}
//
@ -206,6 +248,8 @@ namespace ix
// Set the socket to non blocking mode, so that accept calls are not blocking
SocketConnect::configure(_serverFd);
setThreadName("SocketServer::listen");
for (;;)
{
if (_stop) return;
@ -306,6 +350,8 @@ namespace ix
void SocketServer::runGC()
{
setThreadName("SocketServer::GC");
for (;;)
{
// Garbage collection to shutdown/join threads for closed connections.

View File

@ -36,7 +36,8 @@ namespace ix
SocketServer(int port = SocketServer::kDefaultPort,
const std::string& host = SocketServer::kDefaultHost,
int backlog = SocketServer::kDefaultTcpBacklog,
size_t maxConnections = SocketServer::kDefaultMaxConnections);
size_t maxConnections = SocketServer::kDefaultMaxConnections,
int addressFamily = SocketServer::kDefaultAddressFamily);
virtual ~SocketServer();
virtual void stop();
@ -49,6 +50,7 @@ namespace ix
const static std::string kDefaultHost;
const static int kDefaultTcpBacklog;
const static size_t kDefaultMaxConnections;
const static int kDefaultAddressFamily;
void start();
std::pair<bool, std::string> listen();
@ -69,6 +71,7 @@ namespace ix
std::string _host;
int _backlog;
size_t _maxConnections;
int _addressFamily;
// socket for accepting connections
int _serverFd;

View File

@ -134,6 +134,13 @@ namespace ix
_enablePong = false;
}
void WebSocket::enablePerMessageDeflate()
{
std::lock_guard<std::mutex> lock(_configMutex);
WebSocketPerMessageDeflateOptions perMessageDeflateOptions(true);
_perMessageDeflateOptions = perMessageDeflateOptions;
}
void WebSocket::disablePerMessageDeflate()
{
std::lock_guard<std::mutex> lock(_configMutex);
@ -169,6 +176,7 @@ namespace ix
// wait until working thread will exit
// it will exit after close operation is finished
_stop = true;
_sleepCondition.notify_one();
_thread.join();
_stop = false;
}
@ -190,9 +198,19 @@ namespace ix
auto subProtocols = getSubProtocols();
if (!subProtocols.empty())
{
//
// Sub Protocol strings are comma separated.
// Python code to do that is:
// >>> ','.join(['json', 'msgpack'])
// 'json,msgpack'
//
int i = 0;
for (auto subProtocol : subProtocols)
{
subProtocolsHeader += ",";
if (i++ != 0)
{
subProtocolsHeader += ",";
}
subProtocolsHeader += subProtocol;
}
headers["Sec-WebSocket-Protocol"] = subProtocolsHeader;
@ -282,8 +300,13 @@ namespace ix
// Only sleep if we are retrying
if (duration.count() > 0)
{
// to do: make sleeping conditional
std::this_thread::sleep_for(duration);
std::unique_lock<std::mutex> lock(_sleepMutex);
_sleepCondition.wait_for(lock, duration);
}
if (_stop)
{
break;
}
// Try to connect synchronously
@ -389,7 +412,7 @@ namespace ix
WebSocketCloseInfo(),
binary));
WebSocket::invokeTrafficTrackerCallback(msg.size(), true);
WebSocket::invokeTrafficTrackerCallback(wireSize, true);
});
}
}

View File

@ -19,6 +19,7 @@
#include "IXWebSocketSendInfo.h"
#include "IXWebSocketTransport.h"
#include <atomic>
#include <condition_variable>
#include <mutex>
#include <string>
#include <thread>
@ -56,6 +57,7 @@ namespace ix
void setPingTimeout(int pingTimeoutSecs);
void enablePong();
void disablePong();
void enablePerMessageDeflate();
void disablePerMessageDeflate();
void addSubProtocol(const std::string& subProtocol);
@ -70,7 +72,7 @@ namespace ix
WebSocketInitResult connect(int timeoutSecs);
void run();
// send is in binary mode by default
// send is in text mode by default
WebSocketSendInfo send(const std::string& data,
bool binary = false,
const OnProgressCallback& onProgressCallback = nullptr);
@ -140,6 +142,10 @@ namespace ix
static const uint32_t kDefaultMaxWaitBetweenReconnectionRetries;
uint32_t _maxWaitBetweenReconnectionRetries;
// Make the sleeping in the automatic reconnection cancellable
std::mutex _sleepMutex;
std::condition_variable _sleepCondition;
std::atomic<int> _handshakeTimeoutSecs;
static const int kDefaultHandShakeTimeoutSecs;

View File

@ -12,6 +12,7 @@
#include "IXUserAgent.h"
#include "libwshandshake.hpp"
#include <algorithm>
#include <iostream>
#include <random>
#include <sstream>
@ -335,7 +336,7 @@ namespace ix
std::string header = headers["sec-websocket-extensions"];
WebSocketPerMessageDeflateOptions webSocketPerMessageDeflateOptions(header);
// If the client has requested that extension, enable it.
// If the client has requested that extension,
if (webSocketPerMessageDeflateOptions.enabled())
{
_enablePerMessageDeflate = true;

View File

@ -66,12 +66,23 @@ namespace ix
{
line[i] = '\0';
std::string lineStr(line);
// colon is ':', colon+1 is ' ', colon+2 is the start of the value.
// colon is ':', usually colon+1 is ' ', and colon+2 is the start of the value.
// some webservers do not put a space after the colon character, so
// the start of the value might be farther than colon+2.
// The spec says that space after the : should be discarded.
// i is end of string (\0), i-colon is length of string minus key;
// subtract 1 for '\0', 1 for '\n', 1 for '\r',
// 1 for the ' ' after the ':', and total is -4
// since we use an std::string later on and don't account for '\0',
// plus the optional first space, total is -2
int start = colon + 1;
while (lineStr[start] == ' ')
{
start++;
}
std::string name(lineStr.substr(0, colon));
std::string value(lineStr.substr(colon + 2, i - colon - 4));
std::string value(lineStr.substr(start, lineStr.size() - start - 2));
headers[name] = value;
}

View File

@ -7,6 +7,7 @@
#include "IXWebSocketServer.h"
#include "IXNetSystem.h"
#include "IXSetThreadName.h"
#include "IXSocketConnect.h"
#include "IXWebSocket.h"
#include "IXWebSocketTransport.h"
@ -23,10 +24,12 @@ namespace ix
const std::string& host,
int backlog,
size_t maxConnections,
int handshakeTimeoutSecs)
: SocketServer(port, host, backlog, maxConnections)
int handshakeTimeoutSecs,
int addressFamily)
: SocketServer(port, host, backlog, maxConnections, addressFamily)
, _handshakeTimeoutSecs(handshakeTimeoutSecs)
, _enablePong(kDefaultEnablePong)
, _enablePerMessageDeflate(true)
{
}
@ -58,6 +61,11 @@ namespace ix
_enablePong = false;
}
void WebSocketServer::disablePerMessageDeflate()
{
_enablePerMessageDeflate = false;
}
void WebSocketServer::setOnConnectionCallback(const OnConnectionCallback& callback)
{
_onConnectionCallback = callback;
@ -66,15 +74,21 @@ namespace ix
void WebSocketServer::handleConnection(std::shared_ptr<Socket> socket,
std::shared_ptr<ConnectionState> connectionState)
{
setThreadName("WebSocketServer::" + connectionState->getId());
auto webSocket = std::make_shared<WebSocket>();
_onConnectionCallback(webSocket, connectionState);
webSocket->disableAutomaticReconnection();
if (_enablePong)
{
webSocket->enablePong();
}
else
{
webSocket->disablePong();
}
// Add this client to our client set
{
@ -106,7 +120,6 @@ namespace ix
}
}
logInfo("WebSocketServer::handleConnection() done");
connectionState->setTerminated();
}

View File

@ -29,29 +29,33 @@ namespace ix
const std::string& host = SocketServer::kDefaultHost,
int backlog = SocketServer::kDefaultTcpBacklog,
size_t maxConnections = SocketServer::kDefaultMaxConnections,
int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs);
int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs,
int addressFamily = SocketServer::kDefaultAddressFamily);
virtual ~WebSocketServer();
virtual void stop() final;
void enablePong();
void disablePong();
void disablePerMessageDeflate();
void setOnConnectionCallback(const OnConnectionCallback& callback);
// Get all the connected clients
std::set<std::shared_ptr<WebSocket>> getClients();
const static int kDefaultHandShakeTimeoutSecs;
private:
// Member variables
int _handshakeTimeoutSecs;
bool _enablePong;
bool _enablePerMessageDeflate;
OnConnectionCallback _onConnectionCallback;
std::mutex _clientsMutex;
std::set<std::shared_ptr<WebSocket>> _clients;
const static int kDefaultHandShakeTimeoutSecs;
const static bool kDefaultEnablePong;
// Methods

View File

@ -350,28 +350,9 @@ namespace ix
}
else if (pollResult == PollResultType::ReadyForRead)
{
while (true)
if (!receiveFromSocket())
{
ssize_t ret = _socket->recv((char*) &_readbuf[0], _readbuf.size());
if (ret < 0 && Socket::isWaitNeeded())
{
break;
}
else if (ret <= 0)
{
// if there are received data pending to be processed, then delay the abnormal
// closure to after dispatch (other close code/reason could be read from the
// buffer)
closeSocket();
return PollResult::AbnormalClose;
}
else
{
_rxbuf.insert(_rxbuf.end(), _readbuf.begin(), _readbuf.begin() + ret);
}
return PollResult::AbnormalClose;
}
}
else if (pollResult == PollResultType::Error)
@ -739,7 +720,7 @@ namespace ix
// if an abnormal closure was raised in poll, and nothing else triggered a CLOSED state in
// the received and processed data then close the connection
if (pollResult == PollResult::AbnormalClose)
if (pollResult != PollResult::Succeeded)
{
_rxbuf.clear();
@ -865,10 +846,12 @@ namespace ix
_txbuf.reserve(wireSize);
}
bool success = true;
// Common case for most message. No fragmentation required.
if (wireSize < kChunkSize)
{
sendFragment(type, true, message_begin, message_end, compress);
success = sendFragment(type, true, message_begin, message_end, compress);
}
else
{
@ -904,7 +887,10 @@ namespace ix
}
// Send message
sendFragment(opcodeType, fin, begin, end, compress);
if (!sendFragment(opcodeType, fin, begin, end, compress))
{
return WebSocketSendInfo(false);
}
if (onProgressCallback && !onProgressCallback((int) i, (int) steps))
{
@ -915,8 +901,6 @@ namespace ix
}
}
bool success = true;
// Request to flush the send buffer on the background thread if it isn't empty
if (!isSendBufferEmpty())
{
@ -932,7 +916,7 @@ namespace ix
return WebSocketSendInfo(success, compressionError, payloadSize, wireSize);
}
void WebSocketTransport::sendFragment(wsheader_type::opcode_type type,
bool WebSocketTransport::sendFragment(wsheader_type::opcode_type type,
bool fin,
std::string::const_iterator message_begin,
std::string::const_iterator message_end,
@ -1017,7 +1001,7 @@ namespace ix
appendToSendBuffer(header, message_begin, message_end, message_size, masking_key);
// Now actually send this data
sendOnSocket();
return sendOnSocket();
}
WebSocketSendInfo WebSocketTransport::sendPing(const std::string& message)
@ -1050,19 +1034,17 @@ namespace ix
wsheader_type::TEXT_FRAME, message, _enablePerMessageDeflate, onProgressCallback);
}
ssize_t WebSocketTransport::send()
{
std::lock_guard<std::mutex> lock(_socketMutex);
return _socket->send((char*) &_txbuf[0], _txbuf.size());
}
void WebSocketTransport::sendOnSocket()
bool WebSocketTransport::sendOnSocket()
{
std::lock_guard<std::mutex> lock(_txbufMutex);
while (_txbuf.size())
{
ssize_t ret = send();
ssize_t ret = 0;
{
std::lock_guard<std::mutex> lock(_socketMutex);
ret = _socket->send((char*) &_txbuf[0], _txbuf.size());
}
if (ret < 0 && Socket::isWaitNeeded())
{
@ -1072,13 +1054,43 @@ namespace ix
{
closeSocket();
setReadyState(ReadyState::CLOSED);
break;
return false;
}
else
{
_txbuf.erase(_txbuf.begin(), _txbuf.begin() + ret);
}
}
return true;
}
bool WebSocketTransport::receiveFromSocket()
{
while (true)
{
ssize_t ret = _socket->recv((char*) &_readbuf[0], _readbuf.size());
if (ret < 0 && Socket::isWaitNeeded())
{
break;
}
else if (ret <= 0)
{
// if there are received data pending to be processed, then delay the abnormal
// closure to after dispatch (other close code/reason could be read from the
// buffer)
closeSocket();
return false;
}
else
{
_rxbuf.insert(_rxbuf.end(), _readbuf.begin(), _readbuf.begin() + ret);
}
}
return true;
}
void WebSocketTransport::sendCloseFrame(uint16_t code, const std::string& reason)
@ -1183,7 +1195,10 @@ namespace ix
}
else if (result == PollResultType::ReadyForWrite)
{
sendOnSocket();
if (!sendOnSocket())
{
return false;
}
}
}

View File

@ -99,7 +99,6 @@ namespace ix
bool remote = false);
void closeSocket();
ssize_t send();
ReadyState getReadyState() const;
void setReadyState(ReadyState readyState);
@ -244,13 +243,15 @@ namespace ix
bool remote);
bool flushSendBuffer();
void sendOnSocket();
bool sendOnSocket();
bool receiveFromSocket();
WebSocketSendInfo sendData(wsheader_type::opcode_type type,
const std::string& message,
bool compress,
const OnProgressCallback& onProgressCallback = nullptr);
void sendFragment(wsheader_type::opcode_type type,
bool sendFragment(wsheader_type::opcode_type type,
bool fin,
std::string::const_iterator begin,
std::string::const_iterator end,

View File

@ -6,4 +6,4 @@
#pragma once
#define IX_WEBSOCKET_VERSION "7.8.0"
#define IX_WEBSOCKET_VERSION "8.1.7"

View File

@ -49,6 +49,9 @@ BUILD := ${NAME}:build
print_version:
@echo 'IXWebSocket version =>' ${TAG}
set_version:
sh tools/update_version.sh ${VERSION}
docker_test:
docker build -f docker/Dockerfile.debian -t bsergean/ixwebsocket_test:build .

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ALL_BUILD
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD:
echo ""
echo Build\ all\ projects

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ALL_BUILD
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD:
echo ""
echo Build\ all\ projects

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ALL_BUILD
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD:
echo ""
echo Build\ all\ projects

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ALL_BUILD
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ALL_BUILD:
echo ""
echo Build\ all\ projects

View File

@ -0,0 +1,18 @@
# Generated by CMake, DO NOT EDIT
TARGETS:=
empty:=
space:= $(empty) $(empty)
spaceplus:= $(empty)\ $(empty)
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Applications/CMake.app/Contents/share/cmake-3.12/Modules/CMakeASMInformation.cmake))
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Applications/CMake.app/Contents/share/cmake-3.12/Modules/Compiler/AppleClang-ASM.cmake))
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Applications/CMake.app/Contents/share/cmake-3.12/Modules/Compiler/Clang-ASM.cmake))
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Applications/CMake.app/Contents/share/cmake-3.12/Modules/Compiler/Clang.cmake))
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Applications/CMake.app/Contents/share/cmake-3.12/Modules/Platform/Apple-clang.cmake))
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Users/bsergeant/src/foss/IXWebSocket/CMakeFiles/3.12.3/CMakeASMCompiler.cmake))
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Users/bsergeant/src/foss/IXWebSocket/third_party/sentry-native/CMakeLists.txt))
TARGETS += $(subst $(space),$(spaceplus),$(wildcard /Users/bsergeant/src/foss/IXWebSocket/third_party/sentry-native/src/CMakeLists.txt))
/Users/bsergeant/src/foss/IXWebSocket/CMakeFiles/cmake.check_cache: $(TARGETS)
/Applications/CMake.app/Contents/bin/cmake -H/Users/bsergeant/src/foss/IXWebSocket -B/Users/bsergeant/src/foss/IXWebSocket

View File

@ -0,0 +1,139 @@
# DO NOT EDIT
# This makefile makes sure all linkable targets are
# up-to-date with anything they link to
default:
echo "Do not invoke directly"
# Rules to remove targets that are older than anything to which they
# link. This forces Xcode to relink the targets from scratch. It
# does not seem to check these dependencies itself.
PostBuild.example.Debug:
PostBuild.sentry.Debug: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/example:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example
PostBuild.example_crashpad.Debug:
PostBuild.sentry.Debug: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example_crashpad
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/example_crashpad:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example_crashpad
PostBuild.sentry.Debug:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
PostBuild.sentry_test_integration.Debug:
PostBuild.sentry.Debug: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_integration
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_integration:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_integration
PostBuild.sentry_test_unit.Debug:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_unit:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_unit
PostBuild.example.Release:
PostBuild.sentry.Release: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/example:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example
PostBuild.example_crashpad.Release:
PostBuild.sentry.Release: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example_crashpad
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/example_crashpad:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/example_crashpad
PostBuild.sentry.Release:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
PostBuild.sentry_test_integration.Release:
PostBuild.sentry.Release: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_integration
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_integration:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_integration
PostBuild.sentry_test_unit.Release:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_unit:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/sentry_test_unit
PostBuild.example.MinSizeRel:
PostBuild.sentry.MinSizeRel: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/example
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/example:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/example
PostBuild.example_crashpad.MinSizeRel:
PostBuild.sentry.MinSizeRel: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/example_crashpad
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/example_crashpad:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/example_crashpad
PostBuild.sentry.MinSizeRel:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a
PostBuild.sentry_test_integration.MinSizeRel:
PostBuild.sentry.MinSizeRel: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/sentry_test_integration
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/sentry_test_integration:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/sentry_test_integration
PostBuild.sentry_test_unit.MinSizeRel:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/sentry_test_unit:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/sentry_test_unit
PostBuild.example.RelWithDebInfo:
PostBuild.sentry.RelWithDebInfo: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/example
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/example:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/example
PostBuild.example_crashpad.RelWithDebInfo:
PostBuild.sentry.RelWithDebInfo: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/example_crashpad
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/example_crashpad:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/example_crashpad
PostBuild.sentry.RelWithDebInfo:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a
PostBuild.sentry_test_integration.RelWithDebInfo:
PostBuild.sentry.RelWithDebInfo: /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/sentry_test_integration
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/sentry_test_integration:\
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/sentry_test_integration
PostBuild.sentry_test_unit.RelWithDebInfo:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/sentry_test_unit:
/bin/rm -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/sentry_test_unit
# For each target create a dummy ruleso the target does not have to exist
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a:
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a:

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ZERO_CHECK
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK:
echo ""
make -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeScripts/ReRunCMake.make

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ZERO_CHECK
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK:
echo ""
make -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeScripts/ReRunCMake.make

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ZERO_CHECK
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK:
echo ""
make -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeScripts/ReRunCMake.make

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for ZERO_CHECK
.SUFFIXES:
all: \
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK
/Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeFiles/ZERO_CHECK:
echo ""
make -f /Users/bsergeant/src/foss/IXWebSocket/sentry-native/CMakeScripts/ReRunCMake.make

View File

@ -0,0 +1,9 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for install
.SUFFIXES:
all: \
install_buildpart_0
install_buildpart_0:
/Applications/CMake.app/Contents/bin/cmake -DBUILD_TYPE=$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -P cmake_install.cmake

View File

@ -0,0 +1,9 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for install
.SUFFIXES:
all: \
install_buildpart_0
install_buildpart_0:
/Applications/CMake.app/Contents/bin/cmake -DBUILD_TYPE=$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -P cmake_install.cmake

View File

@ -0,0 +1,9 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for install
.SUFFIXES:
all: \
install_buildpart_0
install_buildpart_0:
/Applications/CMake.app/Contents/bin/cmake -DBUILD_TYPE=$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -P cmake_install.cmake

View File

@ -0,0 +1,9 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for install
.SUFFIXES:
all: \
install_buildpart_0
install_buildpart_0:
/Applications/CMake.app/Contents/bin/cmake -DBUILD_TYPE=$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -P cmake_install.cmake

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for sentry
.SUFFIXES:
all: \
sentry_buildpart_0
sentry_buildpart_0:
echo "Creating symlinks"
/Applications/CMake.app/Contents/bin/cmake -E cmake_symlink_library /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.dylib

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for sentry
.SUFFIXES:
all: \
sentry_buildpart_0
sentry_buildpart_0:
echo "Creating symlinks"
/Applications/CMake.app/Contents/bin/cmake -E cmake_symlink_library /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.dylib

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for sentry
.SUFFIXES:
all: \
sentry_buildpart_0
sentry_buildpart_0:
echo "Creating symlinks"
/Applications/CMake.app/Contents/bin/cmake -E cmake_symlink_library /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.dylib

View File

@ -0,0 +1,10 @@
# Generated by CMake, DO NOT EDIT
# Custom rules for sentry
.SUFFIXES:
all: \
sentry_buildpart_0
sentry_buildpart_0:
echo "Creating symlinks"
/Applications/CMake.app/Contents/bin/cmake -E cmake_symlink_library /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.dylib /Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.dylib

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildSystemType</key>
<string>Original</string>
</dict>
</plist>

View File

@ -0,0 +1,84 @@
# Install script for directory: /Users/bsergeant/src/foss/IXWebSocket/third_party/sentry-native
# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# Set the install configuration name.
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
if(BUILD_TYPE)
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
else()
set(CMAKE_INSTALL_CONFIG_NAME "Release")
endif()
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
endif()
# Set the component getting installed.
if(NOT CMAKE_INSTALL_COMPONENT)
if(COMPONENT)
message(STATUS "Install component: \"${COMPONENT}\"")
set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
else()
set(CMAKE_INSTALL_COMPONENT)
endif()
endif()
# Is this installation the result of a crosscompile?
if(NOT DEFINED CMAKE_CROSSCOMPILING)
set(CMAKE_CROSSCOMPILING "FALSE")
endif()
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a")
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a" AND
NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
execute_process(COMMAND "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
endif()
elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a")
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a" AND
NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
execute_process(COMMAND "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
endif()
elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Mm][Ii][Nn][Ss][Ii][Zz][Ee][Rr][Ee][Ll])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a")
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a" AND
NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
execute_process(COMMAND "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
endif()
elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a")
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a" AND
NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
execute_process(COMMAND "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsentry.a")
endif()
endif()
endif()
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE FILE FILES "/Users/bsergeant/src/foss/IXWebSocket/third_party/sentry-native/include/sentry.h")
endif()
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE FILE FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a.dSYM")
elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE FILE FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/libsentry.a.dSYM")
elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Mm][Ii][Nn][Ss][Ii][Zz][Ee][Rr][Ee][Ll])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE FILE FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/MinSizeRel/libsentry.a.dSYM")
elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE FILE FILES "/Users/bsergeant/src/foss/IXWebSocket/sentry-native/RelWithDebInfo/libsentry.a.dSYM")
endif()
endif()
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
# Include the install script for each subdirectory.
include("/Users/bsergeant/src/foss/IXWebSocket/sentry-native/src/cmake_install.cmake")
endif()

View File

@ -0,0 +1,34 @@
# Install script for directory: /Users/bsergeant/src/foss/IXWebSocket/third_party/sentry-native/src
# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# Set the install configuration name.
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
if(BUILD_TYPE)
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
else()
set(CMAKE_INSTALL_CONFIG_NAME "Release")
endif()
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
endif()
# Set the component getting installed.
if(NOT CMAKE_INSTALL_COMPONENT)
if(COMPONENT)
message(STATUS "Install component: \"${COMPONENT}\"")
set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
else()
set(CMAKE_INSTALL_COMPONENT)
endif()
endif()
# Is this installation the result of a crosscompile?
if(NOT DEFINED CMAKE_CROSSCOMPILING)
set(CMAKE_CROSSCOMPILING "FALSE")
endif()

View File

@ -23,6 +23,8 @@ include_directories(
../ws
)
add_definitions(-DSPDLOG_COMPILED_LIB=1)
find_package(JsonCpp)
if (NOT JSONCPP_FOUND)
include_directories(../third_party/jsoncpp)
@ -53,12 +55,12 @@ set (SOURCES
IXDNSLookupTest.cpp
IXWebSocketSubProtocolTest.cpp
IXSentryClientTest.cpp
IXWebSocketChatTest.cpp
)
# Some unittest don't work on windows yet
if (UNIX)
list(APPEND SOURCES
IXWebSocketChatTest.cpp
IXWebSocketCloseTest.cpp
)
endif()
@ -98,4 +100,6 @@ target_link_libraries(ixwebsocket_unittest ixcrypto)
target_link_libraries(ixwebsocket_unittest ixcore)
target_link_libraries(ixwebsocket_unittest ixsentry)
target_link_libraries(ixwebsocket_unittest spdlog)
install(TARGETS ixwebsocket_unittest DESTINATION bin)

View File

@ -37,9 +37,7 @@ namespace
class CobraChat
{
public:
CobraChat(const std::string& user,
const std::string& session,
const std::string& endpoint);
CobraChat(const std::string& user, const std::string& session, const std::string& endpoint);
void subscribe(const std::string& channel);
void start();

View File

@ -59,10 +59,14 @@ TEST_CASE("http server", "[httpd]")
REQUIRE(response->errorCode == HttpErrorCode::Ok);
REQUIRE(response->statusCode == 200);
REQUIRE(response->headers["Accept-Encoding"] == "gzip");
server.stop();
}
}
TEST_CASE("http server redirection", "[httpd_redirect]")
{
SECTION("Connect to a local HTTP server, with redirection enabled")
{
int port = getFreePort();

View File

@ -0,0 +1,11 @@
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});

View File

@ -0,0 +1,11 @@
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080, perMessageDeflate: true });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,36 @@
from websocket import *
import random
import string
import ssl
def randomString(stringLength=10):
"""Generate a random string of fixed length """
letters = string.ascii_lowercase
return ''.join(random.choice(letters) for i in range(stringLength))
st = randomString(32768)
with open('generated_file', 'w') as f:
f.write(st)
ws = create_connection("wss://echo.websocket.org/",
sslopt={"cert_reqs": ssl.CERT_NONE})
print("Sending")
frame = ABNF.create_frame(st, ABNF.OPCODE_TEXT, 0)
ws.send_frame(frame)
cont_frame = ABNF.create_frame(st, ABNF.OPCODE_CONT, 0)
ws.send_frame(cont_frame)
cont_frame = ABNF.create_frame(st, ABNF.OPCODE_CONT, 1)
ws.send_frame(cont_frame)
print("Sent")
print("Receiving...")
result = ws.recv()
if st+st+st == result:
print("Received ")
else:
print("Error")
ws.close()

View File

@ -1,8 +1,17 @@
FROM python:3.8.0-alpine3.10
RUN pip install websockets
COPY ws_proxy.py /usr/bin
RUN chmod +x /usr/bin/ws_proxy.py
EXPOSE 8765
CMD ["python", "/usr/bin/ws_proxy.py"]
COPY vendor/protocol.py /usr/local/lib/python3.8/site-packages/websockets/protocol.py
COPY *.py /usr/bin/
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/*.py
RUN mkdir /certs
COPY *.pem /certs/
WORKDIR /certs
EXPOSE 8765 8766
CMD ["sh", "/usr/bin/entrypoint.sh"]

View File

@ -0,0 +1,3 @@
nginx: nginx -p . -c nginx.conf
websocket_server: python echo_server.py
send: sleep 1 ; ws send -x --verify_none wss://localhost:8765 /usr/local/bin/ws

View File

@ -28,3 +28,819 @@ connected (press CTRL+C to quit)
< > Welcome !
disconnected (code: 1006)
```
# Server
```
$ honcho start
15:29:52 system | nginx.1 started (pid=75372)
15:29:52 system | send.1 started (pid=75373)
15:29:52 system | websocket_server.1 started (pid=75374)
15:29:53 send.1 | [2020-01-05 15:29:53.414] [info] ws_send: Connecting to url: wss://localhost:8765
15:29:53 send.1 | [2020-01-05 15:29:53.415] [info] ws_send: Connecting...
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] ws_send: connected
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] ws_send: Sending...
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] Uri: /
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] Headers:
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] Connection: upgrade
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] Date: Sun, 05 Jan 2020 23:29:53 GMT
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] Sec-WebSocket-Accept: 2+7DV7Q0Ib3fxynZwaNTtsAepIk=
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] Server: nginx/1.15.9
15:29:53 send.1 | [2020-01-05 15:29:53.436] [info] Upgrade: websocket
15:29:53 send.1 | [2020-01-05 15:29:53.633] [info] load file from disk completed in 197
15:29:54 send.1 | [2020-01-05 15:29:54.267] [info] ws_send: Step 0 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.269] [info] ws_send: Step 1 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.271] [info] ws_send: Step 2 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.273] [info] ws_send: Step 3 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.275] [info] ws_send: Step 4 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.277] [info] ws_send: Step 5 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.278] [info] ws_send: Step 6 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.280] [info] ws_send: Step 7 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.282] [info] ws_send: Step 8 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.284] [info] ws_send: Step 9 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.286] [info] ws_send: Step 10 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.288] [info] ws_send: Step 11 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.289] [info] ws_send: Step 12 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.291] [info] ws_send: Step 13 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.293] [info] ws_send: Step 14 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.295] [info] ws_send: Step 15 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.297] [info] ws_send: Step 16 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.298] [info] ws_send: Step 17 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.300] [info] ws_send: Step 18 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.302] [info] ws_send: Step 19 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.304] [info] ws_send: Step 20 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.306] [info] ws_send: Step 21 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.308] [info] ws_send: Step 22 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.309] [info] ws_send: Step 23 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.311] [info] ws_send: Step 24 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.313] [info] ws_send: Step 25 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.315] [info] ws_send: Step 26 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.317] [info] ws_send: Step 27 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.319] [info] ws_send: Step 28 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.320] [info] ws_send: Step 29 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.322] [info] ws_send: Step 30 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.324] [info] ws_send: Step 31 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.326] [info] ws_send: Step 32 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.328] [info] ws_send: Step 33 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.329] [info] ws_send: Step 34 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.331] [info] ws_send: Step 35 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.333] [info] ws_send: Step 36 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.335] [info] ws_send: Step 37 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.337] [info] ws_send: Step 38 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.339] [info] ws_send: Step 39 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.340] [info] ws_send: Step 40 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.342] [info] ws_send: Step 41 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.344] [info] ws_send: Step 42 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.346] [info] ws_send: Step 43 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.348] [info] ws_send: Step 44 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.350] [info] ws_send: Step 45 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.351] [info] ws_send: Step 46 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.353] [info] ws_send: Step 47 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.355] [info] ws_send: Step 48 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.357] [info] ws_send: Step 49 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.359] [info] ws_send: Step 50 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.361] [info] ws_send: Step 51 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.362] [info] ws_send: Step 52 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.364] [info] ws_send: Step 53 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.366] [info] ws_send: Step 54 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.368] [info] ws_send: Step 55 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.370] [info] ws_send: Step 56 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.372] [info] ws_send: Step 57 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.373] [info] ws_send: Step 58 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.375] [info] ws_send: Step 59 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.377] [info] ws_send: Step 60 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.379] [info] ws_send: Step 61 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.381] [info] ws_send: Step 62 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.383] [info] ws_send: Step 63 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.384] [info] ws_send: Step 64 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.386] [info] ws_send: Step 65 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.388] [info] ws_send: Step 66 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.390] [info] ws_send: Step 67 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.392] [info] ws_send: Step 68 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.394] [info] ws_send: Step 69 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.395] [info] ws_send: Step 70 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.397] [info] ws_send: Step 71 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.399] [info] ws_send: Step 72 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.401] [info] ws_send: Step 73 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.403] [info] ws_send: Step 74 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.405] [info] ws_send: Step 75 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.407] [info] ws_send: Step 76 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.409] [info] ws_send: Step 77 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.411] [info] ws_send: Step 78 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.412] [info] ws_send: Step 79 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.414] [info] ws_send: Step 80 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.416] [info] ws_send: Step 81 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.418] [info] ws_send: Step 82 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.420] [info] ws_send: Step 83 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.421] [info] ws_send: Step 84 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.423] [info] ws_send: Step 85 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.425] [info] ws_send: Step 86 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.427] [info] ws_send: Step 87 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.429] [info] ws_send: Step 88 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.431] [info] ws_send: Step 89 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.432] [info] ws_send: Step 90 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.434] [info] ws_send: Step 91 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.436] [info] ws_send: Step 92 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.438] [info] ws_send: Step 93 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.440] [info] ws_send: Step 94 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.442] [info] ws_send: Step 95 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.444] [info] ws_send: Step 96 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.445] [info] ws_send: Step 97 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.447] [info] ws_send: Step 98 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.449] [info] ws_send: Step 99 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.451] [info] ws_send: Step 100 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.453] [info] ws_send: Step 101 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.454] [info] ws_send: Step 102 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.456] [info] ws_send: Step 103 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.458] [info] ws_send: Step 104 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.460] [info] ws_send: Step 105 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.462] [info] ws_send: Step 106 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.464] [info] ws_send: Step 107 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.465] [info] ws_send: Step 108 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.467] [info] ws_send: Step 109 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.469] [info] ws_send: Step 110 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.471] [info] ws_send: Step 111 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.473] [info] ws_send: Step 112 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.475] [info] ws_send: Step 113 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.476] [info] ws_send: Step 114 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.478] [info] ws_send: Step 115 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.480] [info] ws_send: Step 116 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.482] [info] ws_send: Step 117 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.484] [info] ws_send: Step 118 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.486] [info] ws_send: Step 119 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.488] [info] ws_send: Step 120 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.489] [info] ws_send: Step 121 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.491] [info] ws_send: Step 122 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.493] [info] ws_send: Step 123 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.495] [info] ws_send: Step 124 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.497] [info] ws_send: Step 125 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.499] [info] ws_send: Step 126 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.500] [info] ws_send: Step 127 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.502] [info] ws_send: Step 128 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.504] [info] ws_send: Step 129 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.506] [info] ws_send: Step 130 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.508] [info] ws_send: Step 131 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.509] [info] ws_send: Step 132 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.511] [info] ws_send: Step 133 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.513] [info] ws_send: Step 134 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.515] [info] ws_send: Step 135 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.517] [info] ws_send: Step 136 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.519] [info] ws_send: Step 137 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.520] [info] ws_send: Step 138 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.522] [info] ws_send: Step 139 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.524] [info] ws_send: Step 140 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.526] [info] ws_send: Step 141 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.528] [info] ws_send: Step 142 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.530] [info] ws_send: Step 143 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.531] [info] ws_send: Step 144 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.533] [info] ws_send: Step 145 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.535] [info] ws_send: Step 146 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.537] [info] ws_send: Step 147 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.539] [info] ws_send: Step 148 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.541] [info] ws_send: Step 149 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.542] [info] ws_send: Step 150 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.544] [info] ws_send: Step 151 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.546] [info] ws_send: Step 152 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.548] [info] ws_send: Step 153 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.550] [info] ws_send: Step 154 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.551] [info] ws_send: Step 155 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.553] [info] ws_send: Step 156 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.555] [info] ws_send: Step 157 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.557] [info] ws_send: Step 158 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.559] [info] ws_send: Step 159 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.561] [info] ws_send: Step 160 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.562] [info] ws_send: Step 161 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.564] [info] ws_send: Step 162 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.566] [info] ws_send: Step 163 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.568] [info] ws_send: Step 164 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.570] [info] ws_send: Step 165 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.571] [info] ws_send: Step 166 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.573] [info] ws_send: Step 167 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.575] [info] ws_send: Step 168 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.577] [info] ws_send: Step 169 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.579] [info] ws_send: Step 170 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.581] [info] ws_send: Step 171 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.582] [info] ws_send: Step 172 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.584] [info] ws_send: Step 173 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.586] [info] ws_send: Step 174 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.588] [info] ws_send: Step 175 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.590] [info] ws_send: Step 176 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.592] [info] ws_send: Step 177 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.593] [info] ws_send: Step 178 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.595] [info] ws_send: Step 179 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.597] [info] ws_send: Step 180 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.599] [info] ws_send: Step 181 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.601] [info] ws_send: Step 182 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.602] [info] ws_send: Step 183 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.604] [info] ws_send: Step 184 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.606] [info] ws_send: Step 185 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.608] [info] ws_send: Step 186 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.610] [info] ws_send: Step 187 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.612] [info] ws_send: Step 188 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.613] [info] ws_send: Step 189 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.615] [info] ws_send: Step 190 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.617] [info] ws_send: Step 191 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.619] [info] ws_send: Step 192 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.621] [info] ws_send: Step 193 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.622] [info] ws_send: Step 194 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.624] [info] ws_send: Step 195 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.626] [info] ws_send: Step 196 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.628] [info] ws_send: Step 197 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.630] [info] ws_send: Step 198 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.632] [info] ws_send: Step 199 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.633] [info] ws_send: Step 200 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.635] [info] ws_send: Step 201 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.637] [info] ws_send: Step 202 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.639] [info] ws_send: Step 203 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.641] [info] ws_send: Step 204 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.642] [info] ws_send: Step 205 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.644] [info] ws_send: Step 206 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.646] [info] ws_send: Step 207 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.648] [info] ws_send: Step 208 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.650] [info] ws_send: Step 209 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.652] [info] ws_send: Step 210 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.653] [info] ws_send: Step 211 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.655] [info] ws_send: Step 212 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.657] [info] ws_send: Step 213 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.659] [info] ws_send: Step 214 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.661] [info] ws_send: Step 215 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.663] [info] ws_send: Step 216 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.664] [info] ws_send: Step 217 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.666] [info] ws_send: Step 218 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.668] [info] ws_send: Step 219 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.670] [info] ws_send: Step 220 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.672] [info] ws_send: Step 221 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.674] [info] ws_send: Step 222 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.675] [info] ws_send: Step 223 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.677] [info] ws_send: Step 224 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.679] [info] ws_send: Step 225 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.681] [info] ws_send: Step 226 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.683] [info] ws_send: Step 227 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.685] [info] ws_send: Step 228 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.686] [info] ws_send: Step 229 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.688] [info] ws_send: Step 230 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.690] [info] ws_send: Step 231 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.692] [info] ws_send: Step 232 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.694] [info] ws_send: Step 233 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.695] [info] ws_send: Step 234 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.697] [info] ws_send: Step 235 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.699] [info] ws_send: Step 236 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.701] [info] ws_send: Step 237 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.703] [info] ws_send: Step 238 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.705] [info] ws_send: Step 239 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.707] [info] ws_send: Step 240 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.708] [info] ws_send: Step 241 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.710] [info] ws_send: Step 242 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.712] [info] ws_send: Step 243 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.714] [info] ws_send: Step 244 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.716] [info] ws_send: Step 245 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.718] [info] ws_send: Step 246 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.719] [info] ws_send: Step 247 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.721] [info] ws_send: Step 248 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.723] [info] ws_send: Step 249 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.725] [info] ws_send: Step 250 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.727] [info] ws_send: Step 251 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.729] [info] ws_send: Step 252 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.730] [info] ws_send: Step 253 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.732] [info] ws_send: Step 254 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.734] [info] ws_send: Step 255 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.736] [info] ws_send: Step 256 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.738] [info] ws_send: Step 257 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.740] [info] ws_send: Step 258 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.742] [info] ws_send: Step 259 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.743] [info] ws_send: Step 260 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.745] [info] ws_send: Step 261 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.747] [info] ws_send: Step 262 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.749] [info] ws_send: Step 263 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.751] [info] ws_send: Step 264 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.752] [info] ws_send: Step 265 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.754] [info] ws_send: Step 266 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.756] [info] ws_send: Step 267 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.758] [info] ws_send: Step 268 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.760] [info] ws_send: Step 269 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.762] [info] ws_send: Step 270 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.763] [info] ws_send: Step 271 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.765] [info] ws_send: Step 272 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.767] [info] ws_send: Step 273 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.769] [info] ws_send: Step 274 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.771] [info] ws_send: Step 275 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.772] [info] ws_send: Step 276 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.774] [info] ws_send: Step 277 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.776] [info] ws_send: Step 278 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.778] [info] ws_send: Step 279 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.780] [info] ws_send: Step 280 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.782] [info] ws_send: Step 281 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.783] [info] ws_send: Step 282 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.785] [info] ws_send: Step 283 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.787] [info] ws_send: Step 284 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.789] [info] ws_send: Step 285 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.791] [info] ws_send: Step 286 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.793] [info] ws_send: Step 287 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.794] [info] ws_send: Step 288 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.796] [info] ws_send: Step 289 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.798] [info] ws_send: Step 290 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.800] [info] ws_send: Step 291 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.802] [info] ws_send: Step 292 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.804] [info] ws_send: Step 293 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.805] [info] ws_send: Step 294 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.807] [info] ws_send: Step 295 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.809] [info] ws_send: Step 296 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.811] [info] ws_send: Step 297 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.813] [info] ws_send: Step 298 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.814] [info] ws_send: Step 299 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.816] [info] ws_send: Step 300 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.818] [info] ws_send: Step 301 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.820] [info] ws_send: Step 302 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.822] [info] ws_send: Step 303 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.824] [info] ws_send: Step 304 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.825] [info] ws_send: Step 305 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.827] [info] ws_send: Step 306 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.829] [info] ws_send: Step 307 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.831] [info] ws_send: Step 308 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.833] [info] ws_send: Step 309 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.835] [info] ws_send: Step 310 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.836] [info] ws_send: Step 311 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.838] [info] ws_send: Step 312 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.840] [info] ws_send: Step 313 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.842] [info] ws_send: Step 314 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.844] [info] ws_send: Step 315 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.845] [info] ws_send: Step 316 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.847] [info] ws_send: Step 317 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.849] [info] ws_send: Step 318 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.851] [info] ws_send: Step 319 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.853] [info] ws_send: Step 320 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.855] [info] ws_send: Step 321 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.856] [info] ws_send: Step 322 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.858] [info] ws_send: Step 323 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.860] [info] ws_send: Step 324 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.862] [info] ws_send: Step 325 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.864] [info] ws_send: Step 326 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.866] [info] ws_send: Step 327 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.867] [info] ws_send: Step 328 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.869] [info] ws_send: Step 329 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.871] [info] ws_send: Step 330 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.873] [info] ws_send: Step 331 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.875] [info] ws_send: Step 332 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.876] [info] ws_send: Step 333 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.878] [info] ws_send: Step 334 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.880] [info] ws_send: Step 335 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.882] [info] ws_send: Step 336 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.884] [info] ws_send: Step 337 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.886] [info] ws_send: Step 338 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.888] [info] ws_send: Step 339 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.889] [info] ws_send: Step 340 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.891] [info] ws_send: Step 341 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.893] [info] ws_send: Step 342 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.895] [info] ws_send: Step 343 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.897] [info] ws_send: Step 344 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.899] [info] ws_send: Step 345 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.900] [info] ws_send: Step 346 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.902] [info] ws_send: Step 347 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.904] [info] ws_send: Step 348 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.906] [info] ws_send: Step 349 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.908] [info] ws_send: Step 350 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.910] [info] ws_send: Step 351 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.911] [info] ws_send: Step 352 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.913] [info] ws_send: Step 353 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.915] [info] ws_send: Step 354 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.917] [info] ws_send: Step 355 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.919] [info] ws_send: Step 356 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.920] [info] ws_send: Step 357 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.922] [info] ws_send: Step 358 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.924] [info] ws_send: Step 359 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.926] [info] ws_send: Step 360 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.928] [info] ws_send: Step 361 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.930] [info] ws_send: Step 362 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.932] [info] ws_send: Step 363 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.933] [info] ws_send: Step 364 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.935] [info] ws_send: Step 365 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.937] [info] ws_send: Step 366 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.939] [info] ws_send: Step 367 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.941] [info] ws_send: Step 368 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.943] [info] ws_send: Step 369 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.944] [info] ws_send: Step 370 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.946] [info] ws_send: Step 371 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.948] [info] ws_send: Step 372 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.950] [info] ws_send: Step 373 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.952] [info] ws_send: Step 374 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.954] [info] ws_send: Step 375 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.955] [info] ws_send: Step 376 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.957] [info] ws_send: Step 377 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.959] [info] ws_send: Step 378 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.961] [info] ws_send: Step 379 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.963] [info] ws_send: Step 380 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.965] [info] ws_send: Step 381 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.966] [info] ws_send: Step 382 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.968] [info] ws_send: Step 383 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.970] [info] ws_send: Step 384 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.972] [info] ws_send: Step 385 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.974] [info] ws_send: Step 386 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.976] [info] ws_send: Step 387 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.977] [info] ws_send: Step 388 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.979] [info] ws_send: Step 389 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.981] [info] ws_send: Step 390 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.983] [info] ws_send: Step 391 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.985] [info] ws_send: Step 392 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.986] [info] ws_send: Step 393 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.988] [info] ws_send: Step 394 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.990] [info] ws_send: Step 395 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.992] [info] ws_send: Step 396 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.994] [info] ws_send: Step 397 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.996] [info] ws_send: Step 398 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.997] [info] ws_send: Step 399 out of 768
15:29:54 send.1 | [2020-01-05 15:29:54.999] [info] ws_send: Step 400 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.001] [info] ws_send: Step 401 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.003] [info] ws_send: Step 402 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.005] [info] ws_send: Step 403 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.007] [info] ws_send: Step 404 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.009] [info] ws_send: Step 405 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.010] [info] ws_send: Step 406 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.012] [info] ws_send: Step 407 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.014] [info] ws_send: Step 408 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.016] [info] ws_send: Step 409 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.018] [info] ws_send: Step 410 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.020] [info] ws_send: Step 411 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.021] [info] ws_send: Step 412 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.023] [info] ws_send: Step 413 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.025] [info] ws_send: Step 414 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.027] [info] ws_send: Step 415 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.029] [info] ws_send: Step 416 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.030] [info] ws_send: Step 417 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.032] [info] ws_send: Step 418 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.034] [info] ws_send: Step 419 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.036] [info] ws_send: Step 420 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.038] [info] ws_send: Step 421 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.040] [info] ws_send: Step 422 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.041] [info] ws_send: Step 423 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.043] [info] ws_send: Step 424 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.045] [info] ws_send: Step 425 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.047] [info] ws_send: Step 426 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.049] [info] ws_send: Step 427 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.051] [info] ws_send: Step 428 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.052] [info] ws_send: Step 429 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.054] [info] ws_send: Step 430 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.056] [info] ws_send: Step 431 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.058] [info] ws_send: Step 432 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.060] [info] ws_send: Step 433 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.062] [info] ws_send: Step 434 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.063] [info] ws_send: Step 435 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.065] [info] ws_send: Step 436 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.067] [info] ws_send: Step 437 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.069] [info] ws_send: Step 438 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.071] [info] ws_send: Step 439 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.073] [info] ws_send: Step 440 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.075] [info] ws_send: Step 441 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.077] [info] ws_send: Step 442 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.078] [info] ws_send: Step 443 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.080] [info] ws_send: Step 444 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.082] [info] ws_send: Step 445 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.084] [info] ws_send: Step 446 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.086] [info] ws_send: Step 447 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.088] [info] ws_send: Step 448 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.090] [info] ws_send: Step 449 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.091] [info] ws_send: Step 450 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.093] [info] ws_send: Step 451 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.095] [info] ws_send: Step 452 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.097] [info] ws_send: Step 453 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.099] [info] ws_send: Step 454 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.101] [info] ws_send: Step 455 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.102] [info] ws_send: Step 456 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.104] [info] ws_send: Step 457 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.106] [info] ws_send: Step 458 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.108] [info] ws_send: Step 459 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.110] [info] ws_send: Step 460 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.112] [info] ws_send: Step 461 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.113] [info] ws_send: Step 462 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.115] [info] ws_send: Step 463 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.117] [info] ws_send: Step 464 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.119] [info] ws_send: Step 465 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.121] [info] ws_send: Step 466 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.123] [info] ws_send: Step 467 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.124] [info] ws_send: Step 468 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.126] [info] ws_send: Step 469 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.128] [info] ws_send: Step 470 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.130] [info] ws_send: Step 471 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.132] [info] ws_send: Step 472 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.134] [info] ws_send: Step 473 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.135] [info] ws_send: Step 474 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.137] [info] ws_send: Step 475 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.139] [info] ws_send: Step 476 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.141] [info] ws_send: Step 477 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.143] [info] ws_send: Step 478 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.145] [info] ws_send: Step 479 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.146] [info] ws_send: Step 480 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.148] [info] ws_send: Step 481 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.150] [info] ws_send: Step 482 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.152] [info] ws_send: Step 483 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.154] [info] ws_send: Step 484 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.155] [info] ws_send: Step 485 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.157] [info] ws_send: Step 486 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.159] [info] ws_send: Step 487 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.161] [info] ws_send: Step 488 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.163] [info] ws_send: Step 489 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.165] [info] ws_send: Step 490 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.166] [info] ws_send: Step 491 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.168] [info] ws_send: Step 492 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.170] [info] ws_send: Step 493 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.172] [info] ws_send: Step 494 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.174] [info] ws_send: Step 495 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.176] [info] ws_send: Step 496 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.177] [info] ws_send: Step 497 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.179] [info] ws_send: Step 498 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.181] [info] ws_send: Step 499 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.183] [info] ws_send: Step 500 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.185] [info] ws_send: Step 501 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.186] [info] ws_send: Step 502 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.188] [info] ws_send: Step 503 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.190] [info] ws_send: Step 504 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.192] [info] ws_send: Step 505 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.194] [info] ws_send: Step 506 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.196] [info] ws_send: Step 507 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.198] [info] ws_send: Step 508 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.199] [info] ws_send: Step 509 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.201] [info] ws_send: Step 510 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.203] [info] ws_send: Step 511 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.205] [info] ws_send: Step 512 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.207] [info] ws_send: Step 513 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.209] [info] ws_send: Step 514 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.210] [info] ws_send: Step 515 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.212] [info] ws_send: Step 516 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.214] [info] ws_send: Step 517 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.216] [info] ws_send: Step 518 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.218] [info] ws_send: Step 519 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.220] [info] ws_send: Step 520 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.221] [info] ws_send: Step 521 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.223] [info] ws_send: Step 522 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.225] [info] ws_send: Step 523 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.227] [info] ws_send: Step 524 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.229] [info] ws_send: Step 525 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.230] [info] ws_send: Step 526 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.232] [info] ws_send: Step 527 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.234] [info] ws_send: Step 528 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.236] [info] ws_send: Step 529 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.238] [info] ws_send: Step 530 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.240] [info] ws_send: Step 531 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.241] [info] ws_send: Step 532 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.243] [info] ws_send: Step 533 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.245] [info] ws_send: Step 534 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.247] [info] ws_send: Step 535 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.249] [info] ws_send: Step 536 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.250] [info] ws_send: Step 537 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.252] [info] ws_send: Step 538 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.254] [info] ws_send: Step 539 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.256] [info] ws_send: Step 540 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.258] [info] ws_send: Step 541 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.260] [info] ws_send: Step 542 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.261] [info] ws_send: Step 543 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.263] [info] ws_send: Step 544 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.265] [info] ws_send: Step 545 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.267] [info] ws_send: Step 546 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.269] [info] ws_send: Step 547 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.271] [info] ws_send: Step 548 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.272] [info] ws_send: Step 549 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.274] [info] ws_send: Step 550 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.276] [info] ws_send: Step 551 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.278] [info] ws_send: Step 552 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.280] [info] ws_send: Step 553 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.282] [info] ws_send: Step 554 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.283] [info] ws_send: Step 555 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.285] [info] ws_send: Step 556 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.287] [info] ws_send: Step 557 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.289] [info] ws_send: Step 558 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.291] [info] ws_send: Step 559 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.293] [info] ws_send: Step 560 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.294] [info] ws_send: Step 561 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.296] [info] ws_send: Step 562 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.298] [info] ws_send: Step 563 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.300] [info] ws_send: Step 564 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.302] [info] ws_send: Step 565 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.304] [info] ws_send: Step 566 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.305] [info] ws_send: Step 567 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.307] [info] ws_send: Step 568 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.309] [info] ws_send: Step 569 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.311] [info] ws_send: Step 570 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.313] [info] ws_send: Step 571 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.315] [info] ws_send: Step 572 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.316] [info] ws_send: Step 573 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.318] [info] ws_send: Step 574 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.320] [info] ws_send: Step 575 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.322] [info] ws_send: Step 576 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.324] [info] ws_send: Step 577 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.326] [info] ws_send: Step 578 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.327] [info] ws_send: Step 579 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.329] [info] ws_send: Step 580 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.331] [info] ws_send: Step 581 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.333] [info] ws_send: Step 582 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.335] [info] ws_send: Step 583 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.337] [info] ws_send: Step 584 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.338] [info] ws_send: Step 585 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.340] [info] ws_send: Step 586 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.342] [info] ws_send: Step 587 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.344] [info] ws_send: Step 588 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.346] [info] ws_send: Step 589 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.347] [info] ws_send: Step 590 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.349] [info] ws_send: Step 591 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.351] [info] ws_send: Step 592 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.353] [info] ws_send: Step 593 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.355] [info] ws_send: Step 594 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.357] [info] ws_send: Step 595 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.359] [info] ws_send: Step 596 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.360] [info] ws_send: Step 597 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.362] [info] ws_send: Step 598 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.364] [info] ws_send: Step 599 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.366] [info] ws_send: Step 600 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.368] [info] ws_send: Step 601 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.370] [info] ws_send: Step 602 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.371] [info] ws_send: Step 603 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.373] [info] ws_send: Step 604 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.375] [info] ws_send: Step 605 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.377] [info] ws_send: Step 606 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.379] [info] ws_send: Step 607 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.381] [info] ws_send: Step 608 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.382] [info] ws_send: Step 609 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.384] [info] ws_send: Step 610 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.386] [info] ws_send: Step 611 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.388] [info] ws_send: Step 612 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.390] [info] ws_send: Step 613 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.392] [info] ws_send: Step 614 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.393] [info] ws_send: Step 615 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.395] [info] ws_send: Step 616 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.397] [info] ws_send: Step 617 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.399] [info] ws_send: Step 618 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.401] [info] ws_send: Step 619 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.403] [info] ws_send: Step 620 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.404] [info] ws_send: Step 621 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.406] [info] ws_send: Step 622 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.408] [info] ws_send: Step 623 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.410] [info] ws_send: Step 624 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.412] [info] ws_send: Step 625 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.414] [info] ws_send: Step 626 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.415] [info] ws_send: Step 627 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.417] [info] ws_send: Step 628 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.419] [info] ws_send: Step 629 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.421] [info] ws_send: Step 630 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.423] [info] ws_send: Step 631 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.425] [info] ws_send: Step 632 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.427] [info] ws_send: Step 633 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.428] [info] ws_send: Step 634 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.430] [info] ws_send: Step 635 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.432] [info] ws_send: Step 636 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.434] [info] ws_send: Step 637 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.436] [info] ws_send: Step 638 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.438] [info] ws_send: Step 639 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.439] [info] ws_send: Step 640 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.441] [info] ws_send: Step 641 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.443] [info] ws_send: Step 642 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.445] [info] ws_send: Step 643 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.447] [info] ws_send: Step 644 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.449] [info] ws_send: Step 645 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.450] [info] ws_send: Step 646 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.452] [info] ws_send: Step 647 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.454] [info] ws_send: Step 648 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.456] [info] ws_send: Step 649 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.458] [info] ws_send: Step 650 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.460] [info] ws_send: Step 651 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.461] [info] ws_send: Step 652 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.463] [info] ws_send: Step 653 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.465] [info] ws_send: Step 654 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.467] [info] ws_send: Step 655 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.469] [info] ws_send: Step 656 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.471] [info] ws_send: Step 657 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.472] [info] ws_send: Step 658 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.474] [info] ws_send: Step 659 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.476] [info] ws_send: Step 660 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.478] [info] ws_send: Step 661 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.480] [info] ws_send: Step 662 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.482] [info] ws_send: Step 663 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.483] [info] ws_send: Step 664 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.485] [info] ws_send: Step 665 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.487] [info] ws_send: Step 666 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.489] [info] ws_send: Step 667 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.491] [info] ws_send: Step 668 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.493] [info] ws_send: Step 669 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.494] [info] ws_send: Step 670 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.496] [info] ws_send: Step 671 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.498] [info] ws_send: Step 672 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.500] [info] ws_send: Step 673 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.502] [info] ws_send: Step 674 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.503] [info] ws_send: Step 675 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.505] [info] ws_send: Step 676 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.507] [info] ws_send: Step 677 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.509] [info] ws_send: Step 678 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.511] [info] ws_send: Step 679 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.513] [info] ws_send: Step 680 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.514] [info] ws_send: Step 681 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.516] [info] ws_send: Step 682 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.518] [info] ws_send: Step 683 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.520] [info] ws_send: Step 684 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.522] [info] ws_send: Step 685 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.524] [info] ws_send: Step 686 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.525] [info] ws_send: Step 687 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.527] [info] ws_send: Step 688 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.529] [info] ws_send: Step 689 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.531] [info] ws_send: Step 690 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.533] [info] ws_send: Step 691 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.535] [info] ws_send: Step 692 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.536] [info] ws_send: Step 693 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.538] [info] ws_send: Step 694 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.540] [info] ws_send: Step 695 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.542] [info] ws_send: Step 696 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.544] [info] ws_send: Step 697 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.545] [info] ws_send: Step 698 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.547] [info] ws_send: Step 699 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.549] [info] ws_send: Step 700 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.551] [info] ws_send: Step 701 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.553] [info] ws_send: Step 702 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.555] [info] ws_send: Step 703 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.556] [info] ws_send: Step 704 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.558] [info] ws_send: Step 705 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.560] [info] ws_send: Step 706 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.562] [info] ws_send: Step 707 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.564] [info] ws_send: Step 708 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.566] [info] ws_send: Step 709 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.567] [info] ws_send: Step 710 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.569] [info] ws_send: Step 711 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.571] [info] ws_send: Step 712 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.573] [info] ws_send: Step 713 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.575] [info] ws_send: Step 714 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.576] [info] ws_send: Step 715 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.578] [info] ws_send: Step 716 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.580] [info] ws_send: Step 717 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.582] [info] ws_send: Step 718 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.584] [info] ws_send: Step 719 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.586] [info] ws_send: Step 720 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.587] [info] ws_send: Step 721 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.589] [info] ws_send: Step 722 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.591] [info] ws_send: Step 723 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.593] [info] ws_send: Step 724 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.595] [info] ws_send: Step 725 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.597] [info] ws_send: Step 726 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.598] [info] ws_send: Step 727 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.600] [info] ws_send: Step 728 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.602] [info] ws_send: Step 729 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.604] [info] ws_send: Step 730 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.606] [info] ws_send: Step 731 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.607] [info] ws_send: Step 732 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.609] [info] ws_send: Step 733 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.611] [info] ws_send: Step 734 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.613] [info] ws_send: Step 735 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.615] [info] ws_send: Step 736 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.617] [info] ws_send: Step 737 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.618] [info] ws_send: Step 738 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.620] [info] ws_send: Step 739 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.622] [info] ws_send: Step 740 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.624] [info] ws_send: Step 741 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.626] [info] ws_send: Step 742 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.628] [info] ws_send: Step 743 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.630] [info] ws_send: Step 744 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.632] [info] ws_send: Step 745 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.633] [info] ws_send: Step 746 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.635] [info] ws_send: Step 747 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.637] [info] ws_send: Step 748 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.639] [info] ws_send: Step 749 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.641] [info] ws_send: Step 750 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.642] [info] ws_send: Step 751 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.644] [info] ws_send: Step 752 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.646] [info] ws_send: Step 753 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.648] [info] ws_send: Step 754 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.650] [info] ws_send: Step 755 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.652] [info] ws_send: Step 756 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.653] [info] ws_send: Step 757 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.655] [info] ws_send: Step 758 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.657] [info] ws_send: Step 759 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.659] [info] ws_send: Step 760 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.661] [info] ws_send: Step 761 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.662] [info] ws_send: Step 762 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.664] [info] ws_send: Step 763 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.666] [info] ws_send: Step 764 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.668] [info] ws_send: Step 765 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.670] [info] ws_send: Step 766 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.673] [info] ws_send: Step 767 out of 768
15:29:55 send.1 | [2020-01-05 15:29:55.676] [info] ws_send: 0 bytes left to be sent
15:29:55 send.1 | [2020-01-05 15:29:55.689] [info] Sending file through websocket completed in 1801
15:29:55 send.1 | [2020-01-05 15:29:55.689] [info] ws_send: Send transfer rate: 13 MB/s
15:29:56 send.1 | [2020-01-05 15:29:56.142] [info] ws_send: Waiting for ack...
15:29:57 send.1 | [2020-01-05 15:29:57.399] [info] ws_send: received message (25183026 bytes)
15:29:57 send.1 | [2020-01-05 15:29:57.399] [info] ws_send: Done !
15:29:59 send.1 | [2020-01-05 15:29:59.233] [info] ws_send: connection closed: code 1000 reason Normal closure
15:29:59 send.1 |
15:29:59 system | send.1 stopped (rc=0)
15:29:59 system | sending SIGTERM to nginx.1 (pid 75372)
15:29:59 system | sending SIGTERM to websocket_server.1 (pid 75374)
15:29:59 system | nginx.1 stopped (rc=0)
15:29:59 system | websocket_server.1 stopped (rc=-15)
```
## Sending large files over SSL
Running inside docker
```
$ make docker && make server_ssl
```
On the client
```
$ make ws_mbedtls && cp build/ws/ws /usr/local/bin/ws && ws send --verify_none wss://localhost:8766 /tmp/big_file
```

View File

@ -0,0 +1,36 @@
#!/usr/bin/env python
# WS server example
import asyncio
import os
import websockets
clients = set()
async def echo(websocket, path):
clients.add(websocket)
try:
while True:
msg = await websocket.recv()
for ws in clients:
if ws != websocket:
print(f'Sending {len(msg)} bytes to {ws}')
await ws.send(msg)
except websockets.exceptions.ConnectionClosedOK:
print('Client terminating')
clients.remove(websocket)
host = os.getenv('BIND_HOST', 'localhost')
print(f'Serving on {host}:8766')
start_server = websockets.serve(echo, host, 8766, max_size=2 ** 30)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

View File

@ -0,0 +1,43 @@
#!/usr/bin/env python
# WS server example
import asyncio
import os
import pathlib
import ssl
import websockets
clients = set()
async def echo(websocket, path):
clients.add(websocket)
try:
while True:
msg = await websocket.recv()
for ws in clients:
if ws != websocket:
print(f'Sending {len(msg)} bytes to {ws}')
await ws.send(msg)
except websockets.exceptions.ConnectionClosedOK:
print('Client terminating')
clients.remove(websocket)
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain('trusted-server-crt.pem',
'trusted-server-key.pem')
host = os.getenv('BIND_HOST', 'localhost')
print(f'Serving on {host}:8766')
start_server = websockets.serve(echo, host, 8766, max_size=2 ** 30, ssl=ssl_context)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

View File

@ -0,0 +1,25 @@
#!/usr/bin/env python3
# websocket send client
import argparse
import asyncio
import websockets
async def send(url):
async with websockets.connect(url) as ws:
while True:
message = input('> ')
print('Sending message...')
await ws.send(message)
print('Message sent.')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='websocket proxy.')
parser.add_argument('--url', help='Remote websocket url',
default='wss://echo.websocket.org')
args = parser.parse_args()
asyncio.get_event_loop().run_until_complete(send(args.url))

View File

@ -3,20 +3,20 @@
# WS server example
import asyncio
import os
import websockets
async def hello(websocket, path):
await websocket.send(f"> Welcome !")
name = await websocket.recv()
print(f"< {name}")
async def echo(websocket, path):
while True:
msg = await websocket.recv()
print(f'Received {len(msg)} bytes')
await websocket.send(msg)
greeting = f"Hello {name}!"
host = os.getenv('BIND_HOST', 'localhost')
print(f'Serving on {host}:8766')
await websocket.send(greeting)
print(f"> {greeting}")
start_server = websockets.serve(hello, 'localhost', 8765)
start_server = websockets.serve(echo, host, 8766, max_size=2 ** 30)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

View File

@ -0,0 +1,28 @@
#!/usr/bin/env python
# WS server example
import asyncio
import websockets
async def hello(websocket, path):
await websocket.send(f"> Welcome !")
name = await websocket.recv()
print(f"< {name}")
greeting = f"Hello {name}!"
await websocket.send(greeting)
print(f"> {greeting}")
async def echo(websocket, path):
msg = await websocket.recv()
print(f'Received {len(msg)} bytes')
await websocket.send(msg)
print('Serving on localhost:8766')
start_server = websockets.serve(echo, 'localhost', 8766)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

View File

@ -0,0 +1,22 @@
#!/usr/bin/env python
# WS server example
import asyncio
import os
import websockets
async def echo(websocket, path):
while True:
msg = await websocket.recv()
print(f'Received {len(msg)} bytes')
await websocket.send(msg)
host = os.getenv('BIND_HOST', 'localhost')
print(f'Serving on {host}:8766')
start_server = websockets.serve(echo, host, 8766, max_size=2 ** 30)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

View File

@ -0,0 +1,27 @@
#!/usr/bin/env python
# WS server example
import asyncio
import os
import pathlib
import ssl
import websockets
async def echo(websocket, path):
msg = await websocket.recv()
print(f'Received {len(msg)} bytes')
await websocket.send(msg)
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain('trusted-server-crt.pem',
'trusted-server-key.pem')
host = os.getenv('BIND_HOST', 'localhost')
print(f'Serving on {host}:8766')
start_server = websockets.serve(echo, host, 8766, max_size=2 ** 30, ssl=ssl_context)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

View File

@ -0,0 +1,16 @@
#!/bin/sh
case $MODE in
echo_server)
python /usr/bin/echo_server.py
;;
echo_server_ssl)
python /usr/bin/echo_server_ssl.py
;;
broadcast_server)
python /usr/bin/broadcast_server.py
;;
broadcast_server_ssl)
python /usr/bin/broadcast_server_ssl.py
;;
esac

View File

@ -0,0 +1 @@
trusted-client-crt.pem

View File

@ -1,6 +1,9 @@
all:
honcho start # install honcho (pip install honcho) or procman (the original ruby script)
.PHONY: docker
NAME := bsergean/ws_proxy
NAME := bsergean/echo_server
TAG := $(shell cat DOCKER_VERSION)
IMG := ${NAME}:${TAG}
LATEST := ${NAME}:latest
@ -18,3 +21,15 @@ docker_push:
docker tag ${IMG} ${LATEST}
docker push ${LATEST}
docker push ${IMG}
echo_server:
docker run -p 8766:8766 -e BIND_HOST=0.0.0.0 -e MODE=echo_server -it --rm bsergean/echo_server:build
echo_server_ssl:
docker run -p 8766:8766 -e BIND_HOST=0.0.0.0 -e MODE=echo_server_ssl -it --rm bsergean/echo_server:build
broadcast_server:
docker run -p 8766:8766 -e BIND_HOST=0.0.0.0 -e MODE=broadcast_server -it --rm bsergean/echo_server:build
broadcast_server_ssl:
docker run -p 8766:8766 -e BIND_HOST=0.0.0.0 -e MODE=broadcast_server_ssl -it --rm bsergean/echo_server:build

View File

@ -0,0 +1,36 @@
error_log stderr warn;
daemon off;
events {
worker_connections 32;
}
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server localhost:8766;
}
server {
listen 8765 ssl;
ssl_certificate trusted-client-crt.pem;
ssl_certificate_key trusted-client-key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}

View File

@ -0,0 +1 @@
not much in here

View File

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDLDCCAhSgAwIBAgIJALyEpMxNH62gMA0GCSqGSIb3DQEBCwUAMEExFDASBgNV
BAoMC21hY2hpbmV6b25lMRQwEgYDVQQKDAtJWFdlYlNvY2tldDETMBEGA1UEAwwK
dHJ1c3RlZC1jYTAeFw0xOTEyMjQwMDM3MzVaFw0yMDEyMjMwMDM3MzVaMEUxFDAS
BgNVBAoMC21hY2hpbmV6b25lMRQwEgYDVQQKDAtJWFdlYlNvY2tldDEXMBUGA1UE
AwwOdHJ1c3RlZC1jbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDFCipQ6OIJX15n2okHxuSkviuzcHzoYEzPhF6QXzKFbKhuzp4g0mMOXPvDKQE+
+dycGm6l1yg1pUuNKNxYjDWcSqOIqvDaOv9DkJCCNXpAGbh1CUmGdmp4HvwrzSIn
+3s/enC+zatcnwhrOyJk8k/9VqKlt+vB1++UAQV1eSX7adb/BemoyMguAQ8edAls
IiVSRrHRRyHy98j97jxX5lIdoC1FMv7Tj4suJA7wvTHlq3clpLL8t6dw1DAmBybK
ShUg9SC/T07WJ2cOo8wka+p7S/blh8qZwIy7kTgCI+SYgRfEOA94u9A9mDqp295h
DCghN2UdU3hh1k7SChI/owLpAgMBAAGjIzAhMB8GA1UdEQQYMBaCCWxvY2FsaG9z
dIIJMTI3LjAuMC4xMA0GCSqGSIb3DQEBCwUAA4IBAQAtsbBGLUxABNH5yoRbk0o3
sGFMVkNDKkCE24BVkUfNyKUxLQWMknw3B4bmhrC8ZQPRk069ERV0ZR6eB2/9EG9s
Pzy4JbMwWrP5c0UIMJRk3w8ev9FXrsKwG6VhIPnvAdbJEis+7eDmYgpvmsbsYRmG
cqJcWvDKffki52Gbr9WgxLpqCGc2XMGr1Y1jU73Y4zmOeNLiU6HRKimNtGjqx/Tx
QoGVTNwki4TQTwQIyJ+HOj0c49IDJ93GbW5aymOT/e1IXDe07e9yg1r80bdFn23X
9bmRagT1/qu8lXfOpQA0foYeSJRSN7gITPmo7G2ogGVr6dZwhAHDYYy2pwW32j7o
-----END CERTIFICATE-----

View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAxQoqUOjiCV9eZ9qJB8bkpL4rs3B86GBMz4RekF8yhWyobs6e
INJjDlz7wykBPvncnBpupdcoNaVLjSjcWIw1nEqjiKrw2jr/Q5CQgjV6QBm4dQlJ
hnZqeB78K80iJ/t7P3pwvs2rXJ8IazsiZPJP/VaipbfrwdfvlAEFdXkl+2nW/wXp
qMjILgEPHnQJbCIlUkax0Uch8vfI/e48V+ZSHaAtRTL+04+LLiQO8L0x5at3JaSy
/LencNQwJgcmykoVIPUgv09O1idnDqPMJGvqe0v25YfKmcCMu5E4AiPkmIEXxDgP
eLvQPZg6qdveYQwoITdlHVN4YdZO0goSP6MC6QIDAQABAoIBAGMCJ58+Vg5FmKdw
vThmLY/GaykgVfNiKFaB+g5rd3Rp0/zR3804SkP2Xx+CpDijzsG12nGEupSyOVN1
+7qWwX2GV8QduSa/THMD2klDW+mHwxM0Fnj1WayATVApJIeYqyaLfMmziO7ijpVr
Qm4dACqZdOL2lwVxXtYs6TRNKtO4SIzmeVS39hmV2zeGmhUzI4hbirLOWBtbsPpl
qi5wyVkHoEVLnY376TOFc8u5+636yh6G2yqa/zsv9BBXG77DKWl659Fsd4DaUcRG
sk6CTH+I99aE0wrzSUuQmDR/IflxT+DP2ceNrCIc1h1oFzrBKh3fpFR3+D6SSGMn
r9Nk7LECgYEA/8CHrh2LLjqsLbqBoMUXthPwPrVGlK+KGb14+S8Pbfa2hDFWhoif
/FBWAD7GSXedjL3kxFSfmFxsDGPSyqqLRuZNaNs8Ar7vage6FYT6Vfh/8TYOToNr
8AHmhgQCg4luC8VGedCeEDVmUgkdJd/baoY8r3LKXaqsLxyBQN1Hzi0CgYEAxTsQ
jMFwACIdZHJKgUAdEA6PJM0HCS45F4116yqum99S4H10O1VdWK/vKeb13PK//25X
liXhjNHqcVLX08meqs561nKBWhbA72UU3oBAF4RNLHkbZMh1HtZGfBCfJ/Kmq12/
ZmGCwggUHhwnKD02hIGdffc+0eLTeCQL8HKi+S0CgYEA59+MpAXRHDbByCviPvqy
hrgJBzGfLksAsFmihnluScp2q993jT3tnvrPHiXL7OvwAZxg/seicqbIp2sRwAFj
iQJgiILMI8kskzsyMTSBKtTEWtMhoXlxsQZoFHUqOkutZCqVvPexdwyTGil9LcuJ
yUivWHqAku+ccJItdbup0HkCgYEAswkZzdvucoCFU+AX19o+R4wfzpU7FM9bzhCA
gTgehqojzlqzfwTPlqkmHlBk0Oue9BzS7x5172HCQpqkBsGYAY8rnK0W1JOhEe8d
EZk0FOTpNTy+bC83egWiuA5Sm22+dALGswZDLyUsNeTyeqmOapxKPcWJxfb0ZbO7
DsrRPAUCgYAzJm79VvEeRtwKhm0AcDSikJgNKojm6T6BIi/9QJyMTYlvGpBEwPBt
iqmqCqXGmUYafFApTUPyzmyDUsLfeHRwylvPn4UtYXPJ1UKGCVY3SWiJQi2CHSvC
gGSIifjzyeSjhw1cqzS2jHfu4lu6p2GBv/fyXLRVS7x6xY7OBinmvg==
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDLDCCAhSgAwIBAgIJALyEpMxNH62fMA0GCSqGSIb3DQEBCwUAMEExFDASBgNV
BAoMC21hY2hpbmV6b25lMRQwEgYDVQQKDAtJWFdlYlNvY2tldDETMBEGA1UEAwwK
dHJ1c3RlZC1jYTAeFw0xOTEyMjQwMDM3MzVaFw0yMDEyMjMwMDM3MzVaMEUxFDAS
BgNVBAoMC21hY2hpbmV6b25lMRQwEgYDVQQKDAtJWFdlYlNvY2tldDEXMBUGA1UE
AwwOdHJ1c3RlZC1zZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQCv0T68TZZ7nab+UWPhssGLrInE0egzWn1AF20RkJv1ePIyU0rQbDxuuP+HQbXD
FzF6vo2j+5p+VxxvUOfko9V6xad3cB4T3AoFrT5sYI8gQX1uby6pjqVX16TK5t+c
i56aNhUXdmcWhuUzlIMIauvueohd+pNj6E6weWqCf8QFD6KYPgK3wWCR4VfWA5QY
RJUhv2aI9HrC9P4Mg0mut8LYURRQvGxOhtbAw76FJ6IgBujpgI5GLHgVK5Q1GlXK
8W7RlNKNmxX+mzK2D6nHixCUGvrFk9nZgZiaHI/h5x0IGXu0sbwlTPjqQ4Axpofw
G1FDi/er4FaGCzU4CKmc7rxRAgMBAAGjIzAhMB8GA1UdEQQYMBaCCWxvY2FsaG9z
dIIJMTI3LjAuMC4xMA0GCSqGSIb3DQEBCwUAA4IBAQBkUB6smmApnBfr2eDwKJew
GQUMUAa7TlyANYlwQ6EjbAH7H6oNf7Sm63Go2Y72JjZPw3OvZl3QcvvS14QxYJ71
kRdvJ1mhEbIaA2QkdZCuDmcQGLfVEyo0j5q03amQKt9QtSv9MsX1Ok2HqGL17Tf1
QiUqlkzGCqMIsU20X8QzqwYCGzYZeTFtwLYi75za15Uo/6tE2KwzU7oUhuIebOaS
Sa+s2Y1TjpbWyw9usnuQWQ0k1FJR78F1mKJGghmPBoySBHJdLkLYOMhE1u2shgk5
N0muMcDRTeHLxm1aBPLHtkRbW3QscEQB6GkT2Dt4U66qNV2CY7Gk0F5xxOrGBC/9
-----END CERTIFICATE-----

View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAr9E+vE2We52m/lFj4bLBi6yJxNHoM1p9QBdtEZCb9XjyMlNK
0Gw8brj/h0G1wxcxer6No/uaflccb1Dn5KPVesWnd3AeE9wKBa0+bGCPIEF9bm8u
qY6lV9ekyubfnIuemjYVF3ZnFoblM5SDCGrr7nqIXfqTY+hOsHlqgn/EBQ+imD4C
t8FgkeFX1gOUGESVIb9miPR6wvT+DINJrrfC2FEUULxsTobWwMO+hSeiIAbo6YCO
Rix4FSuUNRpVyvFu0ZTSjZsV/psytg+px4sQlBr6xZPZ2YGYmhyP4ecdCBl7tLG8
JUz46kOAMaaH8BtRQ4v3q+BWhgs1OAipnO68UQIDAQABAoIBAG/bIR2uAyJMT7UX
VQN/tbFGKTRmE2Owm2UOQl7dcMvAkd5AraViZyROYIvN23TuKZWc7AI7DbR5eWa8
w3vsW+JLI9tSImCiKmIoMUHEQOrVn5aF99r6HOmBEZ/hOLyg+1vDMrIFq1pioimp
v5+4XrgPjvizddgnMQEHjiLOZIiOtin+alixN/W41Ij0jOtRycM5wq3Xr/0RAs5A
ziNeQvWdvDwqa6L9upHZpFfYqP/+KflJPlHLfEkBHZtZQF3uy5tQ1VusfVMO3Xvb
Ljk6RBnD9dKayreD9NVzotr36zYEy/V1oGJcP/8AD1xmDA0/2Kb+bfm+WQHG5wp6
o09zsZECgYEA5Y3d79Nrfi6InVaZ0r5Y+XXqSZFTsgFnxRseVEbuK4jvrh7eC9jW
pWoaXDh8W6RoT59BPSCKtbQ9mjdECh+aJ6MOeCzCiGSppJboOhC1iVFqFuQLDRO7
w+2NgkhOvNnJJJYmdTwfokTLmaRUiNqwWAtBm+h7py9e5eXujzqt4+UCgYEAxBKL
OO8CWRb0yGlwKoCwYgGCsVauvbZHaELOAKJUB6H+YhZ+SJqd915u8aYs5nbcMyne
5kuewzd+32WpkykI0Fz4SrGvDETKB5/Yynblp9m69LNdgYoVWgQqQocXVw0nD/nA
KQdFSBZZRExXC/aUAa55txFJitMC4FjgTENgR/0CgYAS/OonxVg15sl8Ika1DPO1
JtDLZw8CQWWBA1494GQhC8GvqHP7jOMsaZtml3GJ7w6Fz4mI8eEnaJJT6FBjefu5
XZ57yFALEjCKIcVx0CIECsz4ucJEQaadbU/wP+TrcCRYN2dU+TUwqfohaltnupct
oTi7Gb7otF1oLN3P0S3DFQKBgEnVjdXPszunOGBrzBBFS6ZsWTG8qarJBFTPq1Fz
z17ccrWvMLjYeJnZVr/qyseyhLNDlit02IE82ar4VoYTEr2b9Ofzxy5AjS+X0wRT
B6JQjGVvUcvhGq8+GEfbJT/jtQ0ACIuqsD04JT9h2/mmTg/gCveUK/R6B4BCF5zA
VnZlAoGBANOG5T7KsOH+Hbb//dEmfZYMQmkO/+1Pac9eP4uDFNAVF00M6XHf5LrR
gRp5t46drDtLgxdufN0oUItp8y74EuMa9FHlBQVZRaSqYF4bCgf2PieGApbKWG2n
QhnxYfZqf9S2oVK95EHiJxmtumOFBL7YI9NdzNEeoJExS5Bw6kUn
-----END RSA PRIVATE KEY-----

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,28 @@
#!/usr/bin/env python3
# websocket send client
import argparse
import asyncio
import websockets
async def send(url, path):
async with websockets.connect(url, ping_timeout=None, ping_interval=None) as ws:
with open(path, 'rb') as f:
message = f.read()
print('Sending message...')
await ws.send(message)
print('Message sent.')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='websocket proxy.')
parser.add_argument('--path', help='Path to the file to send.',
default='small_file')
parser.add_argument('--url', help='Remote websocket url',
default='wss://echo.websocket.org')
args = parser.parse_args()
asyncio.get_event_loop().run_until_complete(send(args.url, args.path))

45
tools/update_version.sh Executable file
View File

@ -0,0 +1,45 @@
#/bin/sh
ver_gt() {
[ "$1" != "$2" ] && [ "$2" == "$(echo "$1\n$2" | sort -V | head -n1)" ]
}
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PROJECT_ROOT="$(dirname ${SCRIPT_DIR})"
CUR_VSN=$(bash $SCRIPT_DIR/extract_version.sh)
NEW_VSN="$1"
check_ver() {
if [[ $NEW_VSN =~ ^[0-9.]+$ ]]; then
:
else
echo "Invalid version '$NEW_VSN'"
exit 1
fi
}
check_ver_increase() {
if ! ver_gt $NEW_VSN $CUR_VSN; then
echo "Invalid version '$NEW_VSN'. Must be greater than current version $CUR_VSN"
exit 1
fi
}
check_changelog() {
if ! egrep "\b$NEW_VSN\b" $PROJECT_ROOT/docs/CHANGELOG.md >/dev/null; then
echo "Invalid version '$NEW_VSN'. Missing entry in CHANGELOG.md"
exit 1
fi
}
set_version() {
sed -i '' "s/$CUR_VSN/$NEW_VSN/g" $PROJECT_ROOT/ixwebsocket/IXWebSocketVersion.h
echo "Set version to '$NEW_VSN'"
exit 0
}
check_ver
check_ver_increase
check_changelog
set_version

View File

@ -24,6 +24,9 @@ include_directories(ws ../third_party)
include_directories(ws ../third_party/statsd-client-cpp/src)
include_directories(ws ../third_party/spdlog/include)
include_directories(ws ../third_party/cpp-linenoise)
include_directories(ws ../third_party/sentry-native/include)
add_definitions(-DSPDLOG_COMPILED_LIB=1)
if (UNIX)
set( STATSD_CLIENT_SOURCES ../third_party/statsd-client-cpp/src/statsd_client.cpp)
@ -63,6 +66,7 @@ add_executable(ws
ws_autobahn.cpp
ws_proxy_server.cpp
ws_sentry_minidump_upload.cpp
ws_dns_lookup.cpp
ws.cpp)
target_link_libraries(ws ixsnake)
@ -72,6 +76,9 @@ target_link_libraries(ws ixcrypto)
target_link_libraries(ws ixcore)
target_link_libraries(ws ixsentry)
target_link_libraries(ws spdlog)
target_link_libraries(ws sentry)
if(NOT APPLE AND NOT USE_MBED_TLS)
find_package(OpenSSL REQUIRED)
add_definitions(${OPENSSL_DEFINITIONS})

View File

@ -9,6 +9,7 @@
//
#include "ws.h"
#include <sentry.h>
#include <cli11/CLI11.hpp>
#include <fstream>
#include <ixcore/utils/IXCoreLogger.h>
@ -21,11 +22,26 @@
#ifndef _WIN32
#include <signal.h>
#else
#include <process.h>
#define getpid _getpid
#endif
void initSentry()
{
sentry_options_t *options = sentry_options_new();
sentry_options_set_environment(options, "Production");
sentry_options_set_release(options, "5fd7a6cd");
// sentry_options_set_debug(options, 1);
sentry_init(options);
}
int main(int argc, char** argv)
{
initSentry();
ix::initNetSystem();
ix::IXCoreLogger::LogFunc logFunc = [](const char* msg) { spdlog::info(msg); };
@ -91,10 +107,12 @@ int main(int argc, char** argv)
bool disableAutomaticReconnection = false;
bool disablePerMessageDeflate = false;
bool greetings = false;
bool ipv6 = false;
bool binaryMode = false;
bool redirect = false;
bool version = false;
bool verifyNone = false;
bool disablePong = false;
int port = 8008;
int redisPort = 6379;
int statsdPort = 8125;
@ -105,6 +123,7 @@ int main(int argc, char** argv)
int count = 1;
int jobs = 4;
uint32_t maxWaitBetweenReconnectionRetries;
size_t maxQueueSize = 100;
auto addTLSOptions = [&tlsOptions, &verifyNone](CLI::App* app) {
app->add_option(
@ -121,7 +140,7 @@ int main(int argc, char** argv)
app->add_flag("--verify_none", verifyNone, "Disable peer cert verification");
};
app.add_flag("--version", version, "Connection url");
app.add_flag("--version", version, "Print ws version");
CLI::App* sendApp = app.add_subcommand("send", "Send a file");
sendApp->add_option("url", url, "Connection url")->required();
@ -129,6 +148,7 @@ int main(int argc, char** argv)
->required()
->check(CLI::ExistingPath);
sendApp->add_option("--pidfile", pidfile, "Pid file");
sendApp->add_flag("-x", disablePerMessageDeflate, "Disable per message deflate");
addTLSOptions(sendApp);
CLI::App* receiveApp = app.add_subcommand("receive", "Receive a file");
@ -166,6 +186,8 @@ int main(int argc, char** argv)
echoServerApp->add_option("--port", port, "Port");
echoServerApp->add_option("--host", hostname, "Hostname");
echoServerApp->add_flag("-g", greetings, "Verbose");
echoServerApp->add_flag("-6", ipv6, "IpV6");
echoServerApp->add_flag("-x", disablePerMessageDeflate, "Disable per message deflate");
addTLSOptions(echoServerApp);
CLI::App* broadcastServerApp = app.add_subcommand("broadcast_server", "Broadcasting server");
@ -268,6 +290,9 @@ int main(int argc, char** argv)
cobra2sentry->add_option("--rolesecret", rolesecret, "Role secret")->required();
cobra2sentry->add_option("--dsn", dsn, "Sentry DSN");
cobra2sentry->add_option("--jobs", jobs, "Number of thread sending events to Sentry");
cobra2sentry->add_option("--queue_size",
maxQueueSize,
"Size of the queue to hold messages before they are sent to Sentry");
cobra2sentry->add_option("channel", channel, "Channel")->required();
cobra2sentry->add_flag("-v", verbose, "Verbose");
cobra2sentry->add_flag("-s", strict, "Strict mode. Error out when sending to sentry fails");
@ -299,6 +324,7 @@ int main(int argc, char** argv)
snakeApp->add_option("--apps_config_path", appsConfigPath, "Path to auth data")
->check(CLI::ExistingPath);
snakeApp->add_flag("-v", verbose, "Verbose");
snakeApp->add_flag("-d", disablePong, "Disable Pongs");
addTLSOptions(snakeApp);
CLI::App* httpServerApp = app.add_subcommand("httpd", "HTTP server");
@ -324,12 +350,19 @@ int main(int argc, char** argv)
addTLSOptions(proxyServerApp);
CLI::App* minidumpApp = app.add_subcommand("upload_minidump", "Upload a minidump to sentry");
minidumpApp->add_option("--minidump", minidump, "Minidump path")->check(CLI::ExistingPath);
minidumpApp->add_option("--metadata", metadata, "Hostname")->check(CLI::ExistingPath);
minidumpApp->add_option("--minidump", minidump, "Minidump path")
->required()
->check(CLI::ExistingPath);
minidumpApp->add_option("--metadata", metadata, "Metadata path")
->required()
->check(CLI::ExistingPath);
minidumpApp->add_option("--project", project, "Sentry Project")->required();
minidumpApp->add_option("--key", key, "Sentry Key")->required();
minidumpApp->add_flag("-v", verbose, "Verbose");
CLI::App* dnsLookupApp = app.add_subcommand("dnslookup", "DNS lookup");
dnsLookupApp->add_option("host", hostname, "Hostname")->required();
CLI11_PARSE(app, argc, argv);
// pid file handling
@ -348,6 +381,8 @@ int main(int argc, char** argv)
tlsOptions.caFile = "NONE";
}
// memset((char *)0x0, 1, 100);
int ret = 1;
if (app.got_subcommand("transfer"))
{
@ -355,7 +390,7 @@ int main(int argc, char** argv)
}
else if (app.got_subcommand("send"))
{
ret = ix::ws_send_main(url, path, tlsOptions);
ret = ix::ws_send_main(url, path, disablePerMessageDeflate, tlsOptions);
}
else if (app.got_subcommand("receive"))
{
@ -379,7 +414,8 @@ int main(int argc, char** argv)
}
else if (app.got_subcommand("echo_server"))
{
ret = ix::ws_echo_server_main(port, greetings, hostname, tlsOptions);
ret = ix::ws_echo_server_main(
port, greetings, hostname, tlsOptions, ipv6, disablePerMessageDeflate);
}
else if (app.got_subcommand("broadcast_server"))
{
@ -455,6 +491,7 @@ int main(int argc, char** argv)
verbose,
strict,
jobs,
maxQueueSize,
tlsOptions);
}
else if (app.got_subcommand("cobra_metrics_to_redis"))
@ -471,8 +508,15 @@ int main(int argc, char** argv)
}
else if (app.got_subcommand("snake"))
{
ret = ix::ws_snake_main(
port, hostname, redisHosts, redisPort, redisPassword, verbose, appsConfigPath, tlsOptions);
ret = ix::ws_snake_main(port,
hostname,
redisHosts,
redisPort,
redisPassword,
verbose,
appsConfigPath,
tlsOptions,
disablePong);
}
else if (app.got_subcommand("httpd"))
{
@ -494,6 +538,10 @@ int main(int argc, char** argv)
{
ret = ix::ws_sentry_minidump_upload(metadata, minidump, project, key, verbose);
}
else if (app.got_subcommand("dnslookup"))
{
ret = ix::ws_dns_lookup(hostname);
}
else if (version)
{
spdlog::info("ws {}", ix::userAgent());

12
ws/ws.h
View File

@ -29,7 +29,10 @@ namespace ix
int ws_echo_server_main(int port,
bool greetings,
const std::string& hostname,
const ix::SocketTLSOptions& tlsOptions);
const ix::SocketTLSOptions& tlsOptions,
bool ipv6,
bool disablePerMessageDeflate);
int ws_broadcast_server_main(int port,
const std::string& hostname,
const ix::SocketTLSOptions& tlsOptions);
@ -55,6 +58,7 @@ namespace ix
int ws_send_main(const std::string& url,
const std::string& path,
bool disablePerMessageDeflate,
const ix::SocketTLSOptions& tlsOptions);
int ws_redis_publish_main(const std::string& hostname,
@ -119,6 +123,7 @@ namespace ix
bool verbose,
bool strict,
int jobs,
size_t maxQueueSize,
const ix::SocketTLSOptions& tlsOptions);
int ws_cobra_metrics_to_redis(const std::string& appkey,
@ -138,7 +143,8 @@ namespace ix
const std::string& redisPassword,
bool verbose,
const std::string& appsConfigPath,
const ix::SocketTLSOptions& tlsOptions);
const ix::SocketTLSOptions& tlsOptions,
bool disablePong);
int ws_httpd_main(int port,
const std::string& hostname,
@ -161,4 +167,6 @@ namespace ix
const std::string& project,
const std::string& key,
bool verbose);
int ws_dns_lookup(const std::string& hostname);
} // namespace ix

View File

@ -5,8 +5,8 @@
*/
#include <ixwebsocket/IXWebSocketServer.h>
#include <sstream>
#include <spdlog/spdlog.h>
#include <sstream>
namespace ix
@ -38,7 +38,8 @@ namespace ix
else if (msg->type == ix::WebSocketMessageType::Close)
{
spdlog::info("Closed connection: code {} reason {}",
msg->closeInfo.code, msg->closeInfo.reason);
msg->closeInfo.code,
msg->closeInfo.reason);
}
else if (msg->type == ix::WebSocketMessageType::Error)
{
@ -71,7 +72,7 @@ namespace ix
size_t bufferedAmount = client->bufferedAmount();
spdlog::info("{} bytes left to be sent", bufferedAmount);
std::chrono::duration<double, std::milli> duration(10);
std::chrono::duration<double, std::milli> duration(500);
std::this_thread::sleep_for(duration);
} while (client->bufferedAmount() != 0);
}

View File

@ -9,13 +9,13 @@
// Broadcast server can be ran with `ws broadcast_server`
//
#include "linenoise.hpp"
#include "nlohmann/json.hpp"
#include <iostream>
#include <ixwebsocket/IXSocket.h>
#include <ixwebsocket/IXWebSocket.h>
#include <queue>
#include <sstream>
#include <spdlog/spdlog.h>
#include <sstream>
// for convenience
using json = nlohmann::json;
@ -172,9 +172,10 @@ namespace ix
{
// Read line
std::string line;
auto quit = linenoise::Readline("> ", line);
std::cout << user << " > " << std::flush;
std::getline(std::cin, line);
if (quit)
if (!std::cin)
{
break;
}

View File

@ -9,6 +9,7 @@
#include <condition_variable>
#include <ixcobra/IXCobraConnection.h>
#include <ixsentry/IXSentryClient.h>
#include <map>
#include <mutex>
#include <queue>
#include <spdlog/spdlog.h>
@ -18,6 +19,79 @@
namespace ix
{
class QueueManager
{
public:
QueueManager(size_t maxQueueSize, std::atomic<bool>& stop)
: _maxQueueSize(maxQueueSize)
, _stop(stop)
{
}
Json::Value pop();
void add(Json::Value msg);
private:
std::map<std::string, std::queue<Json::Value>> _queues;
std::mutex _mutex;
std::condition_variable _condition;
size_t _maxQueueSize;
std::atomic<bool>& _stop;
};
Json::Value QueueManager::pop()
{
std::unique_lock<std::mutex> lock(_mutex);
if (_queues.empty())
{
Json::Value val;
return val;
}
std::vector<std::string> games;
for (auto it : _queues)
{
games.push_back(it.first);
}
std::random_shuffle(games.begin(), games.end());
std::string game = games[0];
_condition.wait(lock, [this] { return !_stop; });
if (_queues[game].empty())
{
Json::Value val;
return val;
}
auto msg = _queues[game].front();
_queues[game].pop();
return msg;
}
void QueueManager::add(Json::Value msg)
{
std::unique_lock<std::mutex> lock(_mutex);
std::string game;
if (msg.isMember("device") && msg["device"].isMember("game"))
{
game = msg["device"]["game"].asString();
}
if (game.empty()) return;
// if the sending is not fast enough there is no point
// in queuing too many events.
if (_queues[game].size() < _maxQueueSize)
{
_queues[game].push(msg);
_condition.notify_one();
}
}
int ws_cobra_to_sentry_main(const std::string& appkey,
const std::string& endpoint,
const std::string& rolename,
@ -28,6 +102,7 @@ namespace ix
bool verbose,
bool strict,
int jobs,
size_t maxQueueSize,
const ix::SocketTLSOptions& tlsOptions)
{
ix::CobraConnection conn;
@ -46,9 +121,7 @@ namespace ix
std::atomic<bool> stop(false);
std::atomic<bool> throttled(false);
std::condition_variable condition;
std::mutex conditionVariableMutex;
std::queue<Json::Value> queue;
QueueManager queueManager(maxQueueSize, stop);
auto timer = [&sentCount, &receivedCount] {
while (true)
@ -62,103 +135,116 @@ namespace ix
std::thread t1(timer);
auto sentrySender = [&condition,
&conditionVariableMutex,
&queue,
verbose,
&errorSending,
&sentCount,
&stop,
&throttled,
&dsn] {
SentryClient sentryClient(dsn);
auto heartbeat = [&sentCount, &receivedCount] {
std::string state("na");
while (true)
{
Json::Value msg;
std::stringstream ss;
ss << "messages received " << receivedCount;
ss << "messages sent " << sentCount;
std::string currentState = ss.str();
if (currentState == state)
{
std::unique_lock<std::mutex> lock(conditionVariableMutex);
condition.wait(lock, [&queue, &stop] { return !queue.empty() && !stop; });
msg = queue.front();
queue.pop();
spdlog::error("no messages received or sent for 1 minute, exiting");
exit(1);
}
state = currentState;
auto ret = sentryClient.send(msg, verbose);
HttpResponsePtr response = ret.first;
if (!response)
{
spdlog::warn("Null HTTP Response");
continue;
}
if (verbose)
{
for (auto it : response->headers)
{
spdlog::info("{}: {}", it.first, it.second);
}
spdlog::info("Upload size: {}", response->uploadSize);
spdlog::info("Download size: {}", response->downloadSize);
spdlog::info("Status: {}", response->statusCode);
if (response->errorCode != HttpErrorCode::Ok)
{
spdlog::info("error message: {}", response->errorMsg);
}
if (response->headers["Content-Type"] != "application/octet-stream")
{
spdlog::info("payload: {}", response->payload);
}
}
if (response->statusCode != 200)
{
spdlog::error("Error sending data to sentry: {}", response->statusCode);
spdlog::error("Body: {}", ret.second);
spdlog::error("Response: {}", response->payload);
errorSending = true;
// Error 429 Too Many Requests
if (response->statusCode == 429)
{
auto retryAfter = response->headers["Retry-After"];
std::stringstream ss;
ss << retryAfter;
int seconds;
ss >> seconds;
if (!ss.eof() || ss.fail())
{
seconds = 30;
spdlog::warn("Error parsing Retry-After header. "
"Using {} for the sleep duration",
seconds);
}
spdlog::warn("Error 429 - Too Many Requests. ws will sleep "
"and retry after {} seconds",
retryAfter);
throttled = true;
auto duration = std::chrono::seconds(seconds);
std::this_thread::sleep_for(duration);
throttled = false;
}
}
else
{
++sentCount;
}
if (stop) return;
auto duration = std::chrono::minutes(1);
std::this_thread::sleep_for(duration);
}
};
std::thread t2(heartbeat);
auto sentrySender =
[&queueManager, verbose, &errorSending, &sentCount, &stop, &throttled, &dsn] {
SentryClient sentryClient(dsn);
while (true)
{
Json::Value msg = queueManager.pop();
if (msg.isNull()) continue;
if (stop) return;
auto ret = sentryClient.send(msg, verbose);
HttpResponsePtr response = ret.first;
if (!response)
{
spdlog::warn("Null HTTP Response");
continue;
}
if (verbose)
{
for (auto it : response->headers)
{
spdlog::info("{}: {}", it.first, it.second);
}
spdlog::info("Upload size: {}", response->uploadSize);
spdlog::info("Download size: {}", response->downloadSize);
spdlog::info("Status: {}", response->statusCode);
if (response->errorCode != HttpErrorCode::Ok)
{
spdlog::info("error message: {}", response->errorMsg);
}
if (response->headers["Content-Type"] != "application/octet-stream")
{
spdlog::info("payload: {}", response->payload);
}
}
if (response->statusCode != 200)
{
spdlog::error("Error sending data to sentry: {}", response->statusCode);
spdlog::error("Body: {}", ret.second);
spdlog::error("Response: {}", response->payload);
errorSending = true;
// Error 429 Too Many Requests
if (response->statusCode == 429)
{
auto retryAfter = response->headers["Retry-After"];
std::stringstream ss;
ss << retryAfter;
int seconds;
ss >> seconds;
if (!ss.eof() || ss.fail())
{
seconds = 30;
spdlog::warn("Error parsing Retry-After header. "
"Using {} for the sleep duration",
seconds);
}
spdlog::warn("Error 429 - Too Many Requests. ws will sleep "
"and retry after {} seconds",
retryAfter);
throttled = true;
auto duration = std::chrono::seconds(seconds);
std::this_thread::sleep_for(duration);
throttled = false;
}
}
else
{
++sentCount;
}
if (stop) return;
}
};
// Create a thread pool
spdlog::info("Starting {} sentry sender jobs", jobs);
std::vector<std::thread> pool;
@ -174,13 +260,11 @@ namespace ix
verbose,
&throttled,
&receivedCount,
&condition,
&conditionVariableMutex,
&queue](ix::CobraConnectionEventType eventType,
const std::string& errMsg,
const ix::WebSocketHttpHeaders& headers,
const std::string& subscriptionId,
CobraConnection::MsgId msgId) {
&queueManager](ix::CobraConnectionEventType eventType,
const std::string& errMsg,
const ix::WebSocketHttpHeaders& headers,
const std::string& subscriptionId,
CobraConnection::MsgId msgId) {
if (eventType == ix::CobraConnection_EventType_Open)
{
spdlog::info("Subscriber connected");
@ -199,13 +283,8 @@ namespace ix
spdlog::info("Subscriber authenticated");
conn.subscribe(channel,
filter,
[&jsonWriter,
verbose,
&throttled,
&receivedCount,
&condition,
&conditionVariableMutex,
&queue](const Json::Value& msg) {
[&jsonWriter, verbose, &throttled, &receivedCount, &queueManager](
const Json::Value& msg) {
if (verbose)
{
spdlog::info(jsonWriter.write(msg));
@ -214,18 +293,11 @@ namespace ix
// If we cannot send to sentry fast enough, drop the message
if (throttled)
{
condition.notify_one();
return;
}
++receivedCount;
{
std::unique_lock<std::mutex> lock(conditionVariableMutex);
queue.push(msg);
}
condition.notify_one();
queueManager.add(msg);
});
}
else if (eventType == ix::CobraConnection_EventType_Subscribed)

Some files were not shown because too many files have changed in this diff Show More