1*1c60b9acSAndroid Build Coastguard WorkerOverview of lws test apps 2*1c60b9acSAndroid Build Coastguard Worker========================= 3*1c60b9acSAndroid Build Coastguard Worker 4*1c60b9acSAndroid Build Coastguard WorkerAre you building a client? You just need to look at the test client 5*1c60b9acSAndroid Build Coastguard Worker[libwebsockets-test-client](../test-apps/test-client.c). 6*1c60b9acSAndroid Build Coastguard Worker 7*1c60b9acSAndroid Build Coastguard WorkerIf you are building a standalone server, there are three choices, in order of 8*1c60b9acSAndroid Build Coastguard Workerpreferability. 9*1c60b9acSAndroid Build Coastguard Worker 10*1c60b9acSAndroid Build Coastguard Worker1) lwsws + protocol plugins 11*1c60b9acSAndroid Build Coastguard Worker 12*1c60b9acSAndroid Build Coastguard WorkerLws provides a generic web server app that can be configured with JSON 13*1c60b9acSAndroid Build Coastguard Workerconfig files. https://libwebsockets.org itself uses this method. 14*1c60b9acSAndroid Build Coastguard Worker 15*1c60b9acSAndroid Build Coastguard WorkerWith lwsws handling the serving part, you only need to write an lws protocol 16*1c60b9acSAndroid Build Coastguard Workerplugin. See [plugin-standalone](../plugin-standalone) for an example of how 17*1c60b9acSAndroid Build Coastguard Workerto do that outside lws itself, using lws public apis. 18*1c60b9acSAndroid Build Coastguard Worker 19*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DLWS_WITH_LWSWS=1 20*1c60b9acSAndroid Build Coastguard Worker 21*1c60b9acSAndroid Build Coastguard WorkerSee [README.lwsws.md](../READMEs/README.lwsws.md) for information on how to configure 22*1c60b9acSAndroid Build Coastguard Workerlwsws. 23*1c60b9acSAndroid Build Coastguard Worker 24*1c60b9acSAndroid Build Coastguard WorkerNOTE this method implies libuv is used by lws, to provide crossplatform 25*1c60b9acSAndroid Build Coastguard Workerimplementations of timers, dynamic lib loading etc for plugins and lwsws. 26*1c60b9acSAndroid Build Coastguard Worker 27*1c60b9acSAndroid Build Coastguard Worker2) Using plugins in code 28*1c60b9acSAndroid Build Coastguard Worker 29*1c60b9acSAndroid Build Coastguard WorkerThis method lets you configure web serving in code, instead of using lwsws. 30*1c60b9acSAndroid Build Coastguard Worker 31*1c60b9acSAndroid Build Coastguard WorkerPlugins are still used, but you have a choice whether to dynamically load 32*1c60b9acSAndroid Build Coastguard Workerthem or statically include them. In this example, they are dynamically 33*1c60b9acSAndroid Build Coastguard Workerloaded. 34*1c60b9acSAndroid Build Coastguard Worker 35*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DLWS_WITH_PLUGINS=1 36*1c60b9acSAndroid Build Coastguard Worker 37*1c60b9acSAndroid Build Coastguard WorkerSee, eg, the [test-server](../test-apps/test-server.c) 38*1c60b9acSAndroid Build Coastguard Worker 39*1c60b9acSAndroid Build Coastguard Worker3) protocols in the server app 40*1c60b9acSAndroid Build Coastguard Worker 41*1c60b9acSAndroid Build Coastguard WorkerThis is the original way lws implemented servers, plugins and libuv are not 42*1c60b9acSAndroid Build Coastguard Workerrequired, but without plugins separating the protocol code directly, the 43*1c60b9acSAndroid Build Coastguard Workercombined code is all squidged together and is much less maintainable. 44*1c60b9acSAndroid Build Coastguard Worker 45*1c60b9acSAndroid Build Coastguard WorkerThis method is still supported in lws but all ongoing and future work is 46*1c60b9acSAndroid Build Coastguard Workerbeing done in protocol plugins only. 47*1c60b9acSAndroid Build Coastguard Worker 48*1c60b9acSAndroid Build Coastguard WorkerYou can simply include the plugin contents and have it buit statically into 49*1c60b9acSAndroid Build Coastguard Workeryour server, just define this before including the plugin source 50*1c60b9acSAndroid Build Coastguard Worker 51*1c60b9acSAndroid Build Coastguard Worker``` 52*1c60b9acSAndroid Build Coastguard Worker#define LWS_PLUGIN_STATIC 53*1c60b9acSAndroid Build Coastguard Worker``` 54*1c60b9acSAndroid Build Coastguard Worker 55*1c60b9acSAndroid Build Coastguard WorkerThis gets you most of the advantages without needing dynamic loading + 56*1c60b9acSAndroid Build Coastguard Workerlibuv. 57*1c60b9acSAndroid Build Coastguard Worker 58*1c60b9acSAndroid Build Coastguard Worker 59*1c60b9acSAndroid Build Coastguard WorkerNotes about lws test apps 60*1c60b9acSAndroid Build Coastguard Worker========================= 61*1c60b9acSAndroid Build Coastguard Worker 62*1c60b9acSAndroid Build Coastguard Worker@section tsb Testing server with a browser 63*1c60b9acSAndroid Build Coastguard Worker 64*1c60b9acSAndroid Build Coastguard WorkerIf you run [libwebsockets-test-server](../test-apps/test-server.c) and point your browser 65*1c60b9acSAndroid Build Coastguard Worker(eg, Chrome) to 66*1c60b9acSAndroid Build Coastguard Worker 67*1c60b9acSAndroid Build Coastguard Worker http://127.0.0.1:7681 68*1c60b9acSAndroid Build Coastguard Worker 69*1c60b9acSAndroid Build Coastguard WorkerIt will fetch a script in the form of `test.html`, and then run the 70*1c60b9acSAndroid Build Coastguard Workerscript in there on the browser to open a websocket connection. 71*1c60b9acSAndroid Build Coastguard WorkerIncrementing numbers should appear in the browser display. 72*1c60b9acSAndroid Build Coastguard Worker 73*1c60b9acSAndroid Build Coastguard WorkerBy default the test server logs to both stderr and syslog, you can control 74*1c60b9acSAndroid Build Coastguard Workerwhat is logged using `-d <log level>`, see later. 75*1c60b9acSAndroid Build Coastguard Worker 76*1c60b9acSAndroid Build Coastguard Worker 77*1c60b9acSAndroid Build Coastguard Worker@section tsd Running test server as a Daemon 78*1c60b9acSAndroid Build Coastguard Worker 79*1c60b9acSAndroid Build Coastguard WorkerYou can use the -D option on the test server to have it fork into the 80*1c60b9acSAndroid Build Coastguard Workerbackground and return immediately. In this daemonized mode all stderr is 81*1c60b9acSAndroid Build Coastguard Workerdisabled and logging goes only to syslog, eg, `/var/log/messages` or similar. 82*1c60b9acSAndroid Build Coastguard Worker 83*1c60b9acSAndroid Build Coastguard WorkerThe server maintains a lockfile at `/tmp/.lwsts-lock` that contains the pid 84*1c60b9acSAndroid Build Coastguard Workerof the parent process, and deletes this file when the parent process 85*1c60b9acSAndroid Build Coastguard Workerterminates. 86*1c60b9acSAndroid Build Coastguard Worker 87*1c60b9acSAndroid Build Coastguard WorkerTo stop the daemon, do 88*1c60b9acSAndroid Build Coastguard Worker``` 89*1c60b9acSAndroid Build Coastguard Worker $ kill \`cat /tmp/.lwsts-lock\` 90*1c60b9acSAndroid Build Coastguard Worker``` 91*1c60b9acSAndroid Build Coastguard WorkerIf it finds a stale lock (the pid mentioned in the file does not exist 92*1c60b9acSAndroid Build Coastguard Workerany more) it will delete the lock and create a new one during startup. 93*1c60b9acSAndroid Build Coastguard Worker 94*1c60b9acSAndroid Build Coastguard WorkerIf the lock is valid, the daemon will exit with a note on stderr that 95*1c60b9acSAndroid Build Coastguard Workerit was already running. 96*1c60b9acSAndroid Build Coastguard Worker 97*1c60b9acSAndroid Build Coastguard Worker@section clicert Testing Client Certs 98*1c60b9acSAndroid Build Coastguard Worker 99*1c60b9acSAndroid Build Coastguard WorkerHere is a very quick way to create a CA, and a client and server cert from it, 100*1c60b9acSAndroid Build Coastguard Workerfor testing. 101*1c60b9acSAndroid Build Coastguard Worker 102*1c60b9acSAndroid Build Coastguard Worker``` 103*1c60b9acSAndroid Build Coastguard Worker$ cp -rp ./scripts/client-ca /tmp 104*1c60b9acSAndroid Build Coastguard Worker$ cd /tmp/client-ca 105*1c60b9acSAndroid Build Coastguard Worker$ ./create-ca.sh 106*1c60b9acSAndroid Build Coastguard Worker$ ./create-server-cert.sh server 107*1c60b9acSAndroid Build Coastguard Worker$ ./create-client-cert.sh client 108*1c60b9acSAndroid Build Coastguard Worker``` 109*1c60b9acSAndroid Build Coastguard Worker 110*1c60b9acSAndroid Build Coastguard WorkerThe last step wants an export password, you will need this password again to 111*1c60b9acSAndroid Build Coastguard Workerimport the p12 format certificate into your browser. 112*1c60b9acSAndroid Build Coastguard Worker 113*1c60b9acSAndroid Build Coastguard WorkerThis will get you the following 114*1c60b9acSAndroid Build Coastguard Worker 115*1c60b9acSAndroid Build Coastguard Worker|name|function| 116*1c60b9acSAndroid Build Coastguard Worker|----|--------| 117*1c60b9acSAndroid Build Coastguard Worker|ca.pem|Your Certificate Authority cert| 118*1c60b9acSAndroid Build Coastguard Worker|ca.key|Private key for the CA cert| 119*1c60b9acSAndroid Build Coastguard Worker|client.pem|Client certificate, signed by your CA| 120*1c60b9acSAndroid Build Coastguard Worker|client.key|Client private key| 121*1c60b9acSAndroid Build Coastguard Worker|client.p12|combined client.pem + client.key in p12 format for browsers| 122*1c60b9acSAndroid Build Coastguard Worker|server.pem|Server cert, signed by your CA| 123*1c60b9acSAndroid Build Coastguard Worker|server.key|Server private key| 124*1c60b9acSAndroid Build Coastguard Worker 125*1c60b9acSAndroid Build Coastguard WorkerYou can confirm yourself the client and server certs are signed by the CA. 126*1c60b9acSAndroid Build Coastguard Worker 127*1c60b9acSAndroid Build Coastguard Worker``` 128*1c60b9acSAndroid Build Coastguard Worker $ openssl verify -verbose -trusted ca.pem server.pem 129*1c60b9acSAndroid Build Coastguard Worker $ openssl verify -verbose -trusted ca.pem client.pem 130*1c60b9acSAndroid Build Coastguard Worker``` 131*1c60b9acSAndroid Build Coastguard Worker 132*1c60b9acSAndroid Build Coastguard WorkerImport the client.p12 file into your browser. In FFOX57 it's 133*1c60b9acSAndroid Build Coastguard Worker 134*1c60b9acSAndroid Build Coastguard Worker - preferences 135*1c60b9acSAndroid Build Coastguard Worker - Privacy & Security 136*1c60b9acSAndroid Build Coastguard Worker - Certificates | View Certificates 137*1c60b9acSAndroid Build Coastguard Worker - Certificate Manager | Your Certificates | Import... 138*1c60b9acSAndroid Build Coastguard Worker - Enter the password you gave when creating client1.p12 139*1c60b9acSAndroid Build Coastguard Worker - Click OK. 140*1c60b9acSAndroid Build Coastguard Worker 141*1c60b9acSAndroid Build Coastguard WorkerYou can then run the test server like this: 142*1c60b9acSAndroid Build Coastguard Worker 143*1c60b9acSAndroid Build Coastguard Worker``` 144*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-server -s -A ca.pem -K server.key -C server.pem -v 145*1c60b9acSAndroid Build Coastguard Worker``` 146*1c60b9acSAndroid Build Coastguard Worker 147*1c60b9acSAndroid Build Coastguard WorkerWhen you connect your browser to https://localhost:7681 after accepting the 148*1c60b9acSAndroid Build Coastguard Workerselfsigned server cert, your browser will pop up a prompt to send the server 149*1c60b9acSAndroid Build Coastguard Workeryour client cert (the -v switch enables this). The server will only accept 150*1c60b9acSAndroid Build Coastguard Workera client cert that has been signed by ca.pem. 151*1c60b9acSAndroid Build Coastguard Worker 152*1c60b9acSAndroid Build Coastguard Worker@section sssl Using SSL on the server side 153*1c60b9acSAndroid Build Coastguard Worker 154*1c60b9acSAndroid Build Coastguard WorkerTo test it using SSL/WSS, just run the test server with 155*1c60b9acSAndroid Build Coastguard Worker``` 156*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-server --ssl 157*1c60b9acSAndroid Build Coastguard Worker``` 158*1c60b9acSAndroid Build Coastguard Workerand use the URL 159*1c60b9acSAndroid Build Coastguard Worker``` 160*1c60b9acSAndroid Build Coastguard Worker https://127.0.0.1:7681 161*1c60b9acSAndroid Build Coastguard Worker``` 162*1c60b9acSAndroid Build Coastguard WorkerThe connection will be entirely encrypted using some generated 163*1c60b9acSAndroid Build Coastguard Workercertificates that your browser will not accept, since they are 164*1c60b9acSAndroid Build Coastguard Workernot signed by any real Certificate Authority. Just accept the 165*1c60b9acSAndroid Build Coastguard Workercertificates in the browser and the connection will proceed 166*1c60b9acSAndroid Build Coastguard Workerin first https and then websocket wss, acting exactly the 167*1c60b9acSAndroid Build Coastguard Workersame. 168*1c60b9acSAndroid Build Coastguard Worker 169*1c60b9acSAndroid Build Coastguard Worker[test-server.c](../test-apps/test-server.c) is all that is needed to use libwebsockets for 170*1c60b9acSAndroid Build Coastguard Workerserving both the script html over http and websockets. 171*1c60b9acSAndroid Build Coastguard Worker 172*1c60b9acSAndroid Build Coastguard Worker@section lwstsdynvhost Dynamic Vhosts 173*1c60b9acSAndroid Build Coastguard Worker 174*1c60b9acSAndroid Build Coastguard WorkerYou can send libwebsockets-test-server or libwebsockets-test-server-v2.0 a SIGUSR1 175*1c60b9acSAndroid Build Coastguard Workerto toggle the creation and destruction of an identical second vhost on port + 1. 176*1c60b9acSAndroid Build Coastguard Worker 177*1c60b9acSAndroid Build Coastguard WorkerThis is intended as a test and demonstration for how to bring up and remove 178*1c60b9acSAndroid Build Coastguard Workervhosts dynamically. 179*1c60b9acSAndroid Build Coastguard Worker 180*1c60b9acSAndroid Build Coastguard Worker@section unixskt Testing Unix Socket Server support 181*1c60b9acSAndroid Build Coastguard Worker 182*1c60b9acSAndroid Build Coastguard WorkerStart the test server with -U and the path to create the unix domain socket 183*1c60b9acSAndroid Build Coastguard Worker 184*1c60b9acSAndroid Build Coastguard Worker``` 185*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-server -U /tmp/uds 186*1c60b9acSAndroid Build Coastguard Worker``` 187*1c60b9acSAndroid Build Coastguard Worker 188*1c60b9acSAndroid Build Coastguard WorkerOn exit, lws will delete the socket inode. 189*1c60b9acSAndroid Build Coastguard Worker 190*1c60b9acSAndroid Build Coastguard WorkerTo test the client side, eg 191*1c60b9acSAndroid Build Coastguard Worker 192*1c60b9acSAndroid Build Coastguard Worker``` 193*1c60b9acSAndroid Build Coastguard Worker $ nc -C -U /tmp/uds -i 30 194*1c60b9acSAndroid Build Coastguard Worker``` 195*1c60b9acSAndroid Build Coastguard Worker 196*1c60b9acSAndroid Build Coastguard Workerand type 197*1c60b9acSAndroid Build Coastguard Worker 198*1c60b9acSAndroid Build Coastguard Worker`GET / HTTP/1.1` 199*1c60b9acSAndroid Build Coastguard Worker 200*1c60b9acSAndroid Build Coastguard Workerfollowed by two ENTER. The contents of test.html should be returned. 201*1c60b9acSAndroid Build Coastguard Worker 202*1c60b9acSAndroid Build Coastguard Worker@section wscl Testing websocket client support 203*1c60b9acSAndroid Build Coastguard Worker 204*1c60b9acSAndroid Build Coastguard WorkerIf you run the test server as described above, you can also 205*1c60b9acSAndroid Build Coastguard Workerconnect to it using the test client as well as a browser. 206*1c60b9acSAndroid Build Coastguard Worker 207*1c60b9acSAndroid Build Coastguard Worker``` 208*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-client localhost 209*1c60b9acSAndroid Build Coastguard Worker``` 210*1c60b9acSAndroid Build Coastguard Worker 211*1c60b9acSAndroid Build Coastguard Workerwill by default connect to the test server on localhost:7681 212*1c60b9acSAndroid Build Coastguard Workerand print the dumb increment number from the server at the 213*1c60b9acSAndroid Build Coastguard Workersame time as drawing random circles in the mirror protocol; 214*1c60b9acSAndroid Build Coastguard Workerif you connect to the test server using a browser at the 215*1c60b9acSAndroid Build Coastguard Workersame time you will be able to see the circles being drawn. 216*1c60b9acSAndroid Build Coastguard Worker 217*1c60b9acSAndroid Build Coastguard WorkerThe test client supports SSL too, use 218*1c60b9acSAndroid Build Coastguard Worker 219*1c60b9acSAndroid Build Coastguard Worker``` 220*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-client localhost --ssl -s 221*1c60b9acSAndroid Build Coastguard Worker``` 222*1c60b9acSAndroid Build Coastguard Worker 223*1c60b9acSAndroid Build Coastguard Workerthe -s tells it to accept the default self-signed cert from the server, 224*1c60b9acSAndroid Build Coastguard Workerotherwise it will strictly fail the connection if there is no CA cert to 225*1c60b9acSAndroid Build Coastguard Workervalidate the server's certificate. 226*1c60b9acSAndroid Build Coastguard Worker 227*1c60b9acSAndroid Build Coastguard Worker 228*1c60b9acSAndroid Build Coastguard Worker@section choosingts Choosing between test server variations 229*1c60b9acSAndroid Build Coastguard Worker 230*1c60b9acSAndroid Build Coastguard WorkerIf you will be doing standalone serving with lws, ideally you should avoid 231*1c60b9acSAndroid Build Coastguard Workermaking your own server at all, and use lwsws with your own protocol plugins. 232*1c60b9acSAndroid Build Coastguard Worker 233*1c60b9acSAndroid Build Coastguard WorkerThe second best option is follow test-server-v2.0.c, which uses a mount to 234*1c60b9acSAndroid Build Coastguard Workerautoserve a directory, and lws protocol plugins for ws, without needing any 235*1c60b9acSAndroid Build Coastguard Workeruser callback code (other than what's needed in the protocol plugin). 236*1c60b9acSAndroid Build Coastguard Worker 237*1c60b9acSAndroid Build Coastguard WorkerFor those two options libuv is needed to support the protocol plugins, if 238*1c60b9acSAndroid Build Coastguard Workerthat's not possible then the other variations with their own protocol code 239*1c60b9acSAndroid Build Coastguard Workershould be considered. 240*1c60b9acSAndroid Build Coastguard Worker 241*1c60b9acSAndroid Build Coastguard Worker@section tassl Testing SSL on the client side 242*1c60b9acSAndroid Build Coastguard Worker 243*1c60b9acSAndroid Build Coastguard WorkerTo test SSL/WSS client action, just run the client test with 244*1c60b9acSAndroid Build Coastguard Worker``` 245*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-client localhost --ssl 246*1c60b9acSAndroid Build Coastguard Worker``` 247*1c60b9acSAndroid Build Coastguard WorkerBy default the client test applet is set to accept self-signed 248*1c60b9acSAndroid Build Coastguard Workercertificates used by the test server, this is indicated by the 249*1c60b9acSAndroid Build Coastguard Worker`use_ssl` var being set to `2`. Set it to `1` to reject any server 250*1c60b9acSAndroid Build Coastguard Workercertificate that it doesn't have a trusted CA cert for. 251*1c60b9acSAndroid Build Coastguard Worker 252*1c60b9acSAndroid Build Coastguard Worker 253*1c60b9acSAndroid Build Coastguard Worker@section taping Using the websocket ping utility 254*1c60b9acSAndroid Build Coastguard Worker 255*1c60b9acSAndroid Build Coastguard Workerlibwebsockets-test-ping connects as a client to a remote 256*1c60b9acSAndroid Build Coastguard Workerwebsocket server and pings it like the 257*1c60b9acSAndroid Build Coastguard Workernormal unix ping utility. 258*1c60b9acSAndroid Build Coastguard Worker``` 259*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-ping localhost 260*1c60b9acSAndroid Build Coastguard Worker handshake OK for protocol lws-mirror-protocol 261*1c60b9acSAndroid Build Coastguard Worker Websocket PING localhost.localdomain (127.0.0.1) 64 bytes of data. 262*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=1 time=0.1ms 263*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=2 time=0.1ms 264*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=3 time=0.1ms 265*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=4 time=0.2ms 266*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=5 time=0.1ms 267*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=6 time=0.2ms 268*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=7 time=0.2ms 269*1c60b9acSAndroid Build Coastguard Worker 64 bytes from localhost: req=8 time=0.1ms 270*1c60b9acSAndroid Build Coastguard Worker ^C 271*1c60b9acSAndroid Build Coastguard Worker --- localhost.localdomain websocket ping statistics --- 272*1c60b9acSAndroid Build Coastguard Worker 8 packets transmitted, 8 received, 0% packet loss, time 7458ms 273*1c60b9acSAndroid Build Coastguard Worker rtt min/avg/max = 0.110/0.185/0.218 ms 274*1c60b9acSAndroid Build Coastguard Worker $ 275*1c60b9acSAndroid Build Coastguard Worker``` 276*1c60b9acSAndroid Build Coastguard WorkerBy default it sends 64 byte payload packets using the 04 277*1c60b9acSAndroid Build Coastguard WorkerPING packet opcode type. You can change the payload size 278*1c60b9acSAndroid Build Coastguard Workerusing the `-s=` flag, up to a maximum of 125 mandated by the 279*1c60b9acSAndroid Build Coastguard Worker04 standard. 280*1c60b9acSAndroid Build Coastguard Worker 281*1c60b9acSAndroid Build Coastguard WorkerUsing the lws-mirror protocol that is provided by the test 282*1c60b9acSAndroid Build Coastguard Workerserver, libwebsockets-test-ping can also use larger payload 283*1c60b9acSAndroid Build Coastguard Workersizes up to 4096 is BINARY packets; lws-mirror will copy 284*1c60b9acSAndroid Build Coastguard Workerthem back to the client and they appear as a PONG. Use the 285*1c60b9acSAndroid Build Coastguard Worker`-m` flag to select this operation. 286*1c60b9acSAndroid Build Coastguard Worker 287*1c60b9acSAndroid Build Coastguard WorkerThe default interval between pings is 1s, you can use the -i= 288*1c60b9acSAndroid Build Coastguard Workerflag to set this, including fractions like `-i=0.01` for 10ms 289*1c60b9acSAndroid Build Coastguard Workerinterval. 290*1c60b9acSAndroid Build Coastguard Worker 291*1c60b9acSAndroid Build Coastguard WorkerBefore you can even use the PING opcode that is part of the 292*1c60b9acSAndroid Build Coastguard Workerstandard, you must complete a handshake with a specified 293*1c60b9acSAndroid Build Coastguard Workerprotocol. By default lws-mirror-protocol is used which is 294*1c60b9acSAndroid Build Coastguard Workersupported by the test server. But if you are using it on 295*1c60b9acSAndroid Build Coastguard Workeranother server, you can specify the protocol to handshake with 296*1c60b9acSAndroid Build Coastguard Workerby `--protocol=protocolname` 297*1c60b9acSAndroid Build Coastguard Worker 298*1c60b9acSAndroid Build Coastguard Worker 299*1c60b9acSAndroid Build Coastguard Worker@section ta fraggle Fraggle test app 300*1c60b9acSAndroid Build Coastguard Worker 301*1c60b9acSAndroid Build Coastguard WorkerBy default it runs in server mode 302*1c60b9acSAndroid Build Coastguard Worker``` 303*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-fraggle 304*1c60b9acSAndroid Build Coastguard Worker libwebsockets test fraggle 305*1c60b9acSAndroid Build Coastguard Worker (C) Copyright 2010-2011 Andy Green <[email protected]> licensed under MIT 306*1c60b9acSAndroid Build Coastguard Worker Compiled with SSL support, not using it 307*1c60b9acSAndroid Build Coastguard Worker Listening on port 7681 308*1c60b9acSAndroid Build Coastguard Worker server sees client connect 309*1c60b9acSAndroid Build Coastguard Worker accepted v06 connection 310*1c60b9acSAndroid Build Coastguard Worker Spamming 360 random fragments 311*1c60b9acSAndroid Build Coastguard Worker Spamming session over, len = 371913. sum = 0x2D3C0AE 312*1c60b9acSAndroid Build Coastguard Worker Spamming 895 random fragments 313*1c60b9acSAndroid Build Coastguard Worker Spamming session over, len = 875970. sum = 0x6A74DA1 314*1c60b9acSAndroid Build Coastguard Worker ... 315*1c60b9acSAndroid Build Coastguard Worker``` 316*1c60b9acSAndroid Build Coastguard WorkerYou need to run a second session in client mode, you have to 317*1c60b9acSAndroid Build Coastguard Workergive the `-c` switch and the server address at least: 318*1c60b9acSAndroid Build Coastguard Worker``` 319*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-fraggle -c localhost 320*1c60b9acSAndroid Build Coastguard Worker libwebsockets test fraggle 321*1c60b9acSAndroid Build Coastguard Worker (C) Copyright 2010-2011 Andy Green <[email protected]> licensed under MIT 322*1c60b9acSAndroid Build Coastguard Worker Client mode 323*1c60b9acSAndroid Build Coastguard Worker Connecting to localhost:7681 324*1c60b9acSAndroid Build Coastguard Worker denied deflate-stream extension 325*1c60b9acSAndroid Build Coastguard Worker handshake OK for protocol fraggle-protocol 326*1c60b9acSAndroid Build Coastguard Worker client connects to server 327*1c60b9acSAndroid Build Coastguard Worker EOM received 371913 correctly from 360 fragments 328*1c60b9acSAndroid Build Coastguard Worker EOM received 875970 correctly from 895 fragments 329*1c60b9acSAndroid Build Coastguard Worker EOM received 247140 correctly from 258 fragments 330*1c60b9acSAndroid Build Coastguard Worker EOM received 695451 correctly from 692 fragments 331*1c60b9acSAndroid Build Coastguard Worker ... 332*1c60b9acSAndroid Build Coastguard Worker``` 333*1c60b9acSAndroid Build Coastguard WorkerThe fraggle test sends a random number up to 1024 fragmented websocket frames 334*1c60b9acSAndroid Build Coastguard Workereach of a random size between 1 and 2001 bytes in a single message, then sends 335*1c60b9acSAndroid Build Coastguard Workera checksum and starts sending a new randomly sized and fragmented message. 336*1c60b9acSAndroid Build Coastguard Worker 337*1c60b9acSAndroid Build Coastguard WorkerThe fraggle test client receives the same message fragments and computes the 338*1c60b9acSAndroid Build Coastguard Workersame checksum using websocket framing to see when the message has ended. It 339*1c60b9acSAndroid Build Coastguard Workerthen accepts the server checksum message and compares that to its checksum. 340*1c60b9acSAndroid Build Coastguard Worker 341*1c60b9acSAndroid Build Coastguard Worker 342*1c60b9acSAndroid Build Coastguard Worker@section taproxy proxy support 343*1c60b9acSAndroid Build Coastguard Worker 344*1c60b9acSAndroid Build Coastguard WorkerThe http_proxy environment variable is respected by the client 345*1c60b9acSAndroid Build Coastguard Workerconnection code for both `ws://` and `wss://`. It doesn't support 346*1c60b9acSAndroid Build Coastguard Workerauthentication. 347*1c60b9acSAndroid Build Coastguard Worker 348*1c60b9acSAndroid Build Coastguard WorkerYou use it like this 349*1c60b9acSAndroid Build Coastguard Worker``` 350*1c60b9acSAndroid Build Coastguard Worker $ export http_proxy=myproxy.com:3128 351*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-client someserver.com 352*1c60b9acSAndroid Build Coastguard Worker``` 353*1c60b9acSAndroid Build Coastguard Worker 354*1c60b9acSAndroid Build Coastguard Worker@section talog debug logging 355*1c60b9acSAndroid Build Coastguard Worker 356*1c60b9acSAndroid Build Coastguard WorkerBy default logging of severity "notice", "warn" or "err" is enabled to stderr. 357*1c60b9acSAndroid Build Coastguard Worker 358*1c60b9acSAndroid Build Coastguard WorkerAgain by default other logging is compiled in but disabled from printing. 359*1c60b9acSAndroid Build Coastguard Worker 360*1c60b9acSAndroid Build Coastguard WorkerBy default debug logs below "notice" in severity are not compiled in. To get 361*1c60b9acSAndroid Build Coastguard Workerthem included, add this option in CMAKE 362*1c60b9acSAndroid Build Coastguard Worker 363*1c60b9acSAndroid Build Coastguard Worker``` 364*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DCMAKE_BUILD_TYPE=DEBUG 365*1c60b9acSAndroid Build Coastguard Worker``` 366*1c60b9acSAndroid Build Coastguard Worker 367*1c60b9acSAndroid Build Coastguard WorkerIf you want to see more detailed debug logs, you can control a bitfield to 368*1c60b9acSAndroid Build Coastguard Workerselect which logs types may print using the `lws_set_log_level()` api, in the 369*1c60b9acSAndroid Build Coastguard Workertest apps you can use `-d <number>` to control this. The types of logging 370*1c60b9acSAndroid Build Coastguard Workeravailable are (OR together the numbers to select multiple) 371*1c60b9acSAndroid Build Coastguard Worker 372*1c60b9acSAndroid Build Coastguard Worker - 1 ERR 373*1c60b9acSAndroid Build Coastguard Worker - 2 WARN 374*1c60b9acSAndroid Build Coastguard Worker - 4 NOTICE 375*1c60b9acSAndroid Build Coastguard Worker - 8 INFO 376*1c60b9acSAndroid Build Coastguard Worker - 16 DEBUG 377*1c60b9acSAndroid Build Coastguard Worker - 32 PARSER 378*1c60b9acSAndroid Build Coastguard Worker - 64 HEADER 379*1c60b9acSAndroid Build Coastguard Worker - 128 EXTENSION 380*1c60b9acSAndroid Build Coastguard Worker - 256 CLIENT 381*1c60b9acSAndroid Build Coastguard Worker - 512 LATENCY 382*1c60b9acSAndroid Build Coastguard Worker 383*1c60b9acSAndroid Build Coastguard Worker 384*1c60b9acSAndroid Build Coastguard Worker@section ws13 Websocket version supported 385*1c60b9acSAndroid Build Coastguard Worker 386*1c60b9acSAndroid Build Coastguard WorkerThe final IETF standard is supported for both client and server, protocol 387*1c60b9acSAndroid Build Coastguard Workerversion 13. 388*1c60b9acSAndroid Build Coastguard Worker 389*1c60b9acSAndroid Build Coastguard Worker 390*1c60b9acSAndroid Build Coastguard Worker@section latency Latency Tracking 391*1c60b9acSAndroid Build Coastguard Worker 392*1c60b9acSAndroid Build Coastguard WorkerSince libwebsockets runs using `poll()` and a single threaded approach, any 393*1c60b9acSAndroid Build Coastguard Workerunexpected latency coming from system calls would be bad news. There's now 394*1c60b9acSAndroid Build Coastguard Workera latency tracking scheme that can be built in with `-DLWS_WITH_LATENCY=1` at 395*1c60b9acSAndroid Build Coastguard Workercmake, logging the time taken for system calls to complete and if 396*1c60b9acSAndroid Build Coastguard Workerthe whole action did complete that time or was deferred. 397*1c60b9acSAndroid Build Coastguard Worker 398*1c60b9acSAndroid Build Coastguard WorkerYou can see the detailed data by enabling logging level 512 (eg, `-d 519` on 399*1c60b9acSAndroid Build Coastguard Workerthe test server to see that and the usual logs), however even without that 400*1c60b9acSAndroid Build Coastguard Workerthe "worst" latency is kept and reported to the logs with NOTICE severity 401*1c60b9acSAndroid Build Coastguard Workerwhen the context is destroyed. 402*1c60b9acSAndroid Build Coastguard Worker 403*1c60b9acSAndroid Build Coastguard WorkerSome care is needed interpreting them, if the action completed the first figure 404*1c60b9acSAndroid Build Coastguard Worker(in us) is the time taken for the whole action, which may have retried through 405*1c60b9acSAndroid Build Coastguard Workerthe poll loop many times and will depend on network roundtrip times. High 406*1c60b9acSAndroid Build Coastguard Workerfigures here don't indicate a problem. The figure in us reported after "lat" 407*1c60b9acSAndroid Build Coastguard Workerin the logging is the time taken by this particular attempt. High figures 408*1c60b9acSAndroid Build Coastguard Workerhere may indicate a problem, or if you system is loaded with another app at 409*1c60b9acSAndroid Build Coastguard Workerthat time, such as the browser, it may simply indicate the OS gave preferential 410*1c60b9acSAndroid Build Coastguard Workertreatment to the other app during that call. 411*1c60b9acSAndroid Build Coastguard Worker 412*1c60b9acSAndroid Build Coastguard Worker 413*1c60b9acSAndroid Build Coastguard Worker@section autobahn Autobahn Test Suite 414*1c60b9acSAndroid Build Coastguard Worker 415*1c60b9acSAndroid Build Coastguard WorkerLws can be tested against the autobahn websocket fuzzer in both client and 416*1c60b9acSAndroid Build Coastguard Workerserver modes 417*1c60b9acSAndroid Build Coastguard Worker 418*1c60b9acSAndroid Build Coastguard Worker1) pip install autobahntestsuite 419*1c60b9acSAndroid Build Coastguard Worker 420*1c60b9acSAndroid Build Coastguard Worker2) From your build dir: 421*1c60b9acSAndroid Build Coastguard Worker 422*1c60b9acSAndroid Build Coastguard Worker``` 423*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DLWS_WITHOUT_EXTENSIONS=0 -DLWS_WITH_MINIMAL_EXAMPLES=1 && make 424*1c60b9acSAndroid Build Coastguard Worker``` 425*1c60b9acSAndroid Build Coastguard Worker 426*1c60b9acSAndroid Build Coastguard Worker3) ../scripts/autobahn-test.sh 427*1c60b9acSAndroid Build Coastguard Worker 428*1c60b9acSAndroid Build Coastguard Worker4) In a browser go to the directory you ran wstest in (eg, /projects/libwebsockets) 429*1c60b9acSAndroid Build Coastguard Worker 430*1c60b9acSAndroid Build Coastguard Workerfile:///projects/libwebsockets/build/reports/clients/index.html 431*1c60b9acSAndroid Build Coastguard Worker 432*1c60b9acSAndroid Build Coastguard Workerto see the results 433*1c60b9acSAndroid Build Coastguard Worker 434*1c60b9acSAndroid Build Coastguard Worker 435*1c60b9acSAndroid Build Coastguard Worker@section autobahnnotes Autobahn Test Notes 436*1c60b9acSAndroid Build Coastguard Worker 437*1c60b9acSAndroid Build Coastguard Worker1) Two of the tests make no sense for Libwebsockets to support and we fail them. 438*1c60b9acSAndroid Build Coastguard Worker 439*1c60b9acSAndroid Build Coastguard Worker - Tests 2.10 + 2.11: sends multiple pings on one connection. Lws policy is to 440*1c60b9acSAndroid Build Coastguard Workeronly allow one active ping in flight on each connection, the rest are dropped. 441*1c60b9acSAndroid Build Coastguard WorkerThe autobahn test itself admits this is not part of the standard, just someone's 442*1c60b9acSAndroid Build Coastguard Workerrandom opinion about how they think a ws server should act. So we will fail 443*1c60b9acSAndroid Build Coastguard Workerthis by design and it is no problem about RFC6455 compliance. 444*1c60b9acSAndroid Build Coastguard Worker 445*1c60b9acSAndroid Build Coastguard Worker2) Currently two parts of autobahn are broken and we skip them 446*1c60b9acSAndroid Build Coastguard Worker 447*1c60b9acSAndroid Build Coastguard Workerhttps://github.com/crossbario/autobahn-testsuite/issues/71 448*1c60b9acSAndroid Build Coastguard Worker 449