| 274 /*
275 * the transport finished: a server starts on the request, an h1 client
276 * on sending one, an mqtt client on its CONNECT, the rest are up
277 */
278 R("h1", "C", LRS_UNCONNECTED, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2), /* inherited from an idle leader */
279 /* mqtt over tls, or through a socks5 (LWS_WITH_SOCKS5) or http CONNECT proxy */
280 R("mqtt", "C", LRS_WAITING_CONNECT, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
281 R("mqtt", "C", LRS_WAITING_SSL, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
282 R("mqtt", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
283 R("mqtt", "C", LRS_WAITING_PROXY_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
284 R("raw-skt", "C", LRS_WAITING_CONNECT, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
285 R("raw-skt", "C", LRS_WAITING_SSL, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
286 R("raw-skt", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
287 R("raw-skt", "C", LRS_WAITING_PROXY_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
288 /*
289 * the raw proxy's onward connections are raw clients too
290 * (LWS_ROLE_RAW_PROXY, protocol_lws_raw_proxy; the plugin never asks
291 * for tls, an app's own raw-proxy client may)
292 */
293 R("raw-proxy", "C", LRS_WAITING_CONNECT, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
294 R("raw-proxy", "C", LRS_WAITING_SSL, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
295 R("raw-proxy", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
296 R("raw-proxy", "C", LRS_WAITING_PROXY_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
297 R("quic", "C", LRS_WAITING_SSL, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
298 R("quic", "C", LRS_WAITING_CONNECT, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
299 R("quic", "S", LRS_SSL_INIT, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
300 R("h1", "S", LRS_SSL_ACK_PENDING, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_HEADERS),
301 /* the accept on a worker: LWS_WITH_ASYNC_QUEUE with LWS_MAX_SMP > 1 */
302 R("h1", "S", LRS_AWAITING_SSL_ACCEPT, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_HEADERS),
303 R("*", "S", LRS_SSL_ACK_PENDING, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
304 R("*", "S", LRS_AWAITING_SSL_ACCEPT, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
305 /* the non-tls fallback already established the wsi before the accept path reports the transport up */
306 R("*", "S", LRS_ESTABLISHED, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
307 /* 0-RTT: the ALPN migration ran inside the handshake, so handshake-done finds the new nwsi established */
308 R("quic", "*", LRS_ESTABLISHED, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
309
310 /* an h1 client's tcp is up before its tls */
311 R("h1", "C", LRS_WAITING_CONNECT, LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE),
312 /* a socks or http CONNECT tunnel coming up is the socket connecting, for the protocol */
313 R("h1", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE),
314 R("h1", "C", LRS_WAITING_PROXY_REPLY, LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE),
315 R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE2, LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
316
317 /* a client request queued on, or issued by, a connection */
318 /* any client role may queue behind a leader: raw-skt and mqtt do too */
319 R("*", "C", LRS_UNCONNECTED, LWS_WSIEV_QUEUED, NULL, NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
320 R("h1", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
321 R("quic", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2), /* h3 queue pickup */
322 R("h1", "C", LRS_ESTABLISHED, LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
323 R("h1", "C", LRS_WAITING_SERVER_REPLY, LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
324
325 /* the request goes out, then its response is pending */
326 R("h1", "C", LRS_WAITING_SSL, LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
327 R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE, LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
328 R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE2, LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
329 R("h2", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
330 R("h3", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
331 R("h1", "C", LRS_WAITING_SSL, LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
332 R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE, LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
333 R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE2, LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
334 R("h2", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
335 R("h3", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
336 R("*", "C", LRS_ISSUE_HTTP_BODY, LWS_WSIEV_REQ_BODY_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
337 R("h1", "C", LRS_ESTABLISHED, LWS_WSIEV_RESP_INTERIM, NULL, NULL, LRS_WAITING_SERVER_REPLY),
338 /* a ws client takes no response headers but the 101's: it is still waiting */
339 R("h1", "C", LRS_WAITING_SERVER_REPLY, LWS_WSIEV_RESP_INTERIM, NULL, NULL, LRS_WAITING_SERVER_REPLY),
340
341 /* the response is done: idle, or an idle connection is picked up */
342 R("h1", "C", LRS_ESTABLISHED, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_IDLING),
343 R("*", "C", LRS_IDLING, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_IDLING), /* only an app reading on past the end of an unframed body */
344 R("h2", "C", LRS_ESTABLISHED, LWS_WSIEV_LAST_STREAM_CLOSED, NULL, NULL, LRS_IDLING),
345 R("quic", "C", LRS_ESTABLISHED, LWS_WSIEV_LAST_STREAM_CLOSED, NULL, NULL, LRS_IDLING),
346 R("h2", "C", LRS_IDLING, LWS_WSIEV_CONN_REUSED, NULL, NULL, LRS_ESTABLISHED),
347 R("quic", "C", LRS_IDLING, LWS_WSIEV_CONN_REUSED, NULL, NULL, LRS_ESTABLISHED),
348
349 /* mqtt client handshake */
350 R("mqtt", "C", LRS_MQTTC_IDLE, LWS_WSIEV_MQTT_CONNECT_SENT, NULL, NULL, LRS_MQTTC_AWAIT_CONNACK),
351 R("mqtt", "C", LRS_MQTTC_AWAIT_CONNACK, LWS_WSIEV_MQTT_CONNACK, NULL, NULL, LRS_ESTABLISHED),
352
353 /* h2 connection preface */
354 R("h2", "S", LRS_H2_AWAIT_PREFACE, LWS_WSIEV_H2_PREFACE_RX, NULL, NULL, LRS_H2_AWAIT_SETTINGS),
355 R("h2", "S", LRS_H2_AWAIT_SETTINGS, LWS_WSIEV_H2_SETTINGS_ACKED, NULL, NULL, LRS_ESTABLISHED),
356
357 /* request headers: h1 decides on the upgrade, mux streams defer the action */
358 R("h1", "S", LRS_HEADERS, LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_H1_UPGRADE),
359 R("h1", "S", LRS_ESTABLISHED, LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_H1_UPGRADE), /* the next request, after a file completion the app did not complete */
360 R("h2", "S", LRS_HEADERS, LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_DEFERRING_ACTION),
361 R("h3", "S", LRS_HEADERS, LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_DEFERRING_ACTION),
362 R("h1", "S", LRS_H1_UPGRADE, LWS_WSIEV_REQ_PLAIN_HTTP, NULL, NULL, LRS_ESTABLISHED),
363 R("h2", "S", LRS_DEFERRING_ACTION, LWS_WSIEV_ACTION_DEFERRED_RUN, NULL, NULL, LRS_ESTABLISHED),
364 R("h3", "S", LRS_DEFERRING_ACTION, LWS_WSIEV_ACTION_DEFERRED_RUN, NULL, NULL, LRS_ESTABLISHED),
365
366 /* acting on the request */
367 R("h1", "S", LRS_ESTABLISHED, LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
368 R("h2", "S", LRS_HEADERS, LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
369 R("h2", "S", LRS_ESTABLISHED, LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
370 R("h3", "S", LRS_ESTABLISHED, LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
371
372 /* request body */
373 R("h1", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY),
374 R("h2", "*", LRS_ESTABLISHED, LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY),
375 R("h3", "*", LRS_ESTABLISHED, LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY),
376 R("h3", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY), /* action ran, body follows: as h1 */
377 R("h2", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY), /* same on h2 */
378 /*
379 * an h1 body is complete before its answer is: the connection's next
380 * request, pipelined behind it, waits parked for the transaction
381 */
382 R("h1", "S", LRS_BODY, LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_DOING_TRANSACTION),
383 R("h2", "S", LRS_BODY, LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ESTABLISHED),
384 R("h3", "S", LRS_BODY, LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ESTABLISHED),
385 /* the body completion callback may itself have started serving a file (C-522) */
386 R("h2", "S", LRS_ISSUING_FILE, LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ISSUING_FILE),
387 R("h3", "S", LRS_ISSUING_FILE, LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ISSUING_FILE),
388 R("h1", "S", LRS_BODY, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
389 /* the user may complete the transaction before the body was ever delivered */
390 R("h1", "S", LRS_ESTABLISHED, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
391 R("h1", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
392 R("h1", "S", LRS_H1_UPGRADE, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
393 /* the completion runs for mux streams too: there DISCARD_BODY drops the stash and closes the stream */
394 R("h2", "S", LRS_ESTABLISHED, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
395 R("h2", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
396 R("h3", "S", LRS_ESTABLISHED, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
397 R("h3", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
398 R("h2", "S", LRS_BODY, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
399 R("h3", "S", LRS_BODY, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
400 R("h2", "S", LRS_ISSUING_FILE, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
401 R("h3", "S", LRS_ISSUING_FILE, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
402 /* ...or abandoned with a read of the file out on a worker, reaped by the completion */
403 R("h2", "S", LRS_AWAITING_FILE_READ, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
404 R("h3", "S", LRS_AWAITING_FILE_READ, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
405
406 /* the h1 transaction ends and the connection is reused */
407 /*
408 * the user completed it with its response still queued: completion
409 * waits for that to go, from wherever the transaction had got to
410 */
411 R("h1", "S", LRS_ESTABLISHED, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
412 R("h1", "S", LRS_BODY, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
413 R("h1", "S", LRS_DISCARD_BODY, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app writing after it completed */
414 R("h1", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
415 R("h1", "S", LRS_H1_UPGRADE, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
416 R("h1", "S", LRS_TXN_COMPLETED, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app answering again after it completed */
417 R("h1", "S", LRS_TXN_COMPLETING, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app completing twice */
418 R("h2", "S", LRS_HEADERS, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
419 R("h2", "S", LRS_ESTABLISHED, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
420 R("h2", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
421 R("h2", "S", LRS_BODY, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
422 R("h2", "S", LRS_DISCARD_BODY, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
423 R("h2", "S", LRS_ISSUING_FILE, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
424 R("h2", "S", LRS_TXN_COMPLETING, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app completing twice */
425 R("h3", "S", LRS_ESTABLISHED, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
426 R("h3", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
427 R("h3", "S", LRS_BODY, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
428 R("h3", "S", LRS_DISCARD_BODY, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
429 R("h3", "S", LRS_ISSUING_FILE, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
430 R("h3", "S", LRS_TXN_COMPLETING, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
431 /*
432 * a file being served, a read of it out on a worker, that the app
433 * completed from under (an h2 / h3 body completion, its own timer):
434 * the completion waits for the answer queued so far as any other
435 */
436 R("h2", "S", LRS_AWAITING_FILE_READ, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
437 R("h3", "S", LRS_AWAITING_FILE_READ, LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
438 /* ...and once it has, it completes, or first discards an unread body */
439 R("h1", "S", LRS_TXN_COMPLETING, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
440 R("h1", "S", LRS_TXN_COMPLETING, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
441 R("h2", "S", LRS_TXN_COMPLETING, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
442 R("h3", "S", LRS_TXN_COMPLETING, LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
443
444 R("h1", "S", LRS_ESTABLISHED, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
445 R("h1", "S", LRS_BODY, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
446 R("h1", "S", LRS_DISCARD_BODY, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
447 R("h1", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
448 R("h1", "S", LRS_H1_UPGRADE, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED), /* upgrade refused */
449 R("h1", "S", LRS_TXN_COMPLETED, LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED), /* only an app completing twice */
450 R("h1", "S", LRS_TXN_COMPLETED, LWS_WSIEV_TXN_DRAINED, NULL, NULL, LRS_HEADERS),
451
452 /* serving a file */
453 R("*", "S", LRS_ESTABLISHED, LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE),
454 R("h2", "S", LRS_HEADERS, LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE), /* h2c upgrade stream 1 */
455 R("*", "S", LRS_DOING_TRANSACTION, LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE),
456 R("*", "S", LRS_BODY, LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE), /* served from HTTP_BODY_COMPLETION */
457 R("h1", "S", LRS_H1_UPGRADE, LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE), /* served from HTTP_CONFIRM_UPGRADE */
458 /* a file read on a worker: LWS_WITH_ASYNC_QUEUE */
459 R("*", "S", LRS_ISSUING_FILE, LWS_WSIEV_FILE_READ_QUEUED, NULL, NULL, LRS_AWAITING_FILE_READ),
460 R("*", "S", LRS_AWAITING_FILE_READ, LWS_WSIEV_FILE_READ_DONE, NULL, NULL, LRS_ISSUING_FILE),
461 R("*", "S", LRS_ISSUING_FILE, LWS_WSIEV_FILE_COMPLETE, NULL, NULL, LRS_ESTABLISHED),
462
463 /* ---- role changes ---- */
464
465 /* birth on a server, adoption, the client bind, a restart */
466 R("(none)", "-", LRS_UNCONNECTED, LWS_WSIEV_SERVER_SIDE, NULL, "S", LRS_UNCONNECTED),
467 R("*", "*", LRS_UNCONNECTED, LWS_WSIEV_ADOPTED_TLS, "?", NULL, LRS_SSL_INIT),
468 R("*", "*", LRS_UNCONNECTED, LWS_WSIEV_ADOPTED, "h1", NULL, LRS_HEADERS),
469 R("*", "*", LRS_UNCONNECTED, LWS_WSIEV_ADOPTED, "?", NULL, LRS_ESTABLISHED),
470 R("*", "*", LRS_UNCONNECTED, LWS_WSIEV_CLIENT_BIND, "?", "C", LRS_UNCONNECTED),
471 R("*", "C", ANY, LWS_WSIEV_RESTART, "?", "C", LRS_UNCONNECTED),
472
473 /* mux children: a fresh child is its parent's; a server's opened stream reads its request */
474 R("(none)", "*", LRS_UNCONNECTED, LWS_WSIEV_MUX_INSERTED, "P", "P", LRS_UNCONNECTED),
475 R("h2", "S", LRS_UNCONNECTED, LWS_WSIEV_STREAM_OPENED, NULL, NULL, LRS_HEADERS),
476 R("h2", "C", LRS_UNCONNECTED, LWS_WSIEV_STREAM_OPENED, NULL, NULL, LRS_UNCONNECTED),
477 R("quic", "S", LRS_UNCONNECTED, LWS_WSIEV_STREAM_OPENED, "h3", NULL, LRS_HEADERS),
478 R("quic", "C", LRS_UNCONNECTED, LWS_WSIEV_STREAM_OPENED, "h3", NULL, LRS_ESTABLISHED),
479 R("quic", "*", LRS_UNCONNECTED, LWS_WSIEV_STREAM_OPENED, "quic", NULL, LRS_ESTABLISHED),
480
481 /* a client stream is let onto its connection: h2 / h3 send a request, mqtt is up */
482 R("*", "*", LRS_UNCONNECTED, LWS_WSIEV_MUX_STREAM_ADOPTED, "h2", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
483 R("*", "*", LRS_H1C_ISSUE_HANDSHAKE2, LWS_WSIEV_MUX_STREAM_ADOPTED, "h2", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
484 R("*", "*", LRS_UNCONNECTED, LWS_WSIEV_MUX_STREAM_ADOPTED, "h3", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
485 R("*", "*", LRS_H1C_ISSUE_HANDSHAKE2, LWS_WSIEV_MUX_STREAM_ADOPTED, "h3", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
486 R("*", "*", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_MUX_STREAM_ADOPTED, "h3", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
487 R("*", "*", LRS_UNCONNECTED, LWS_WSIEV_MUX_STREAM_ADOPTED, "mqtt", "P", LRS_ESTABLISHED),
488 R("*", "*", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_MUX_STREAM_ADOPTED, "mqtt", "P", LRS_ESTABLISHED),
489
490 /* our own h3 unidirectional streams, and a wsi taking over a quic connection */
491 R("(none)", "*", LRS_UNCONNECTED, LWS_WSIEV_CONTROL_STREAM_OPENED, "h3", "L", LRS_ESTABLISHED),
492 R("(none)", "*", LRS_UNCONNECTED, LWS_WSIEV_CONN_TAKEOVER, "?", "L", LRS_ESTABLISHED),
493
494 /* the quic handshake chose h3 (a client stream sends, a server stream reads) or not */
495 /*
496 * the h3 alpn walk moves children it finds unconnected or connecting;
497 * no path is known to leave one so, but the walk asks
498 */
499 R("*", "C", LRS_UNCONNECTED, LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
500 R("*", "C", LRS_WAITING_CONNECT, LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
501 R("quic", "C", ANY, LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
502 R("quic", "S", ANY, LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_HEADERS),
503 R("quic", "*", ANY, LWS_WSIEV_ALPN_DONE, "quic", NULL, LRS_ESTABLISHED),
504
505 /*
506 * the h2 client nwsi hands its own request to the sid-1 child and is
507 * from then on the carrier of streams only: established
508 */
509 R("h2", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_MUX_MIGRATED, NULL, NULL, LRS_ESTABLISHED),
510
511 /* h2: chosen by alpn, h2c upgrade or prior knowledge; the client preface */
512 R("h1", "S", LRS_HEADERS, LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
513 R("h1", "S", LRS_H1_UPGRADE, LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
514 R("(none)", "S", LRS_UNCONNECTED, LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
515 R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE, LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
516 R("h1", "C", LRS_WAITING_SSL, LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
517 R("h2", "C", LRS_H2_AWAIT_PREFACE, LWS_WSIEV_H2_PREFACE_SENT, NULL, NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
518
519 /* ws upgrade, on a server from the upgrade decision, on a client from the 101 */
520 R("h1", "S", LRS_H1_UPGRADE, LWS_WSIEV_WS_UPGRADED, "ws", NULL, LRS_ESTABLISHED),
521 R("h2", "S", LRS_ESTABLISHED, LWS_WSIEV_WS_UPGRADED, "ws", "Se", LRS_ESTABLISHED),
522 R("h3", "S", LRS_ESTABLISHED, LWS_WSIEV_WS_UPGRADED, "ws", "Se", LRS_ESTABLISHED), /* RFC 9220 */
523 R("h1", "C", LRS_WAITING_SERVER_REPLY, LWS_WSIEV_WS_UPGRADED, "ws", NULL, LRS_ESTABLISHED),
524 R("h2", "C", LRS_WAITING_SERVER_REPLY, LWS_WSIEV_WS_UPGRADED, "ws", "Ce", LRS_ESTABLISHED),
525 R("h3", "C", LRS_WAITING_SERVER_REPLY, LWS_WSIEV_WS_UPGRADED, "ws", "Ce", LRS_ESTABLISHED), /* RFC 9220 */
526
527 /* the client's response headers; webtransport; raw */
528 R("*", "C", LRS_WAITING_SERVER_REPLY, LWS_WSIEV_RESP_HDRS, NULL, NULL, LRS_ESTABLISHED),
529 /* a server may answer before the request body is finished (401, 413...) */
530 R("*", "C", LRS_ISSUE_HTTP_BODY, LWS_WSIEV_RESP_HDRS, NULL, NULL, LRS_ESTABLISHED),
531 R("h3", "C", LRS_WAITING_SERVER_REPLY, LWS_WSIEV_WT_SESSION, "wt", NULL, LRS_ESTABLISHED),
532 R("h3", "S", ANY, LWS_WSIEV_WT_SESSION, "wt", NULL, LRS_ESTABLISHED),
533 R("h3", "*", ANY, LWS_WSIEV_WT_STREAM, "wt", NULL, LRS_ESTABLISHED),
534 R("(none)", "*", LRS_UNCONNECTED, LWS_WSIEV_WT_STREAM, "wt", "L", LRS_ESTABLISHED),
535 R("*", "S", LRS_HEADERS, LWS_WSIEV_RAW_UPGRADED, "?", NULL, LRS_ESTABLISHED),
536 /* the non-tls fallback on a tls listener, from the first byte peek in the accept */
537 R("*", "S", LRS_SSL_ACK_PENDING, LWS_WSIEV_RAW_UPGRADED, "?", NULL, LRS_ESTABLISHED),
538 /* a later request on a kept-alive connection, and a listener already in the raw role */
539 R("*", "S", LRS_ESTABLISHED, LWS_WSIEV_RAW_UPGRADED, "?", NULL, LRS_ESTABLISHED),
540 /* ---- transport machine ---- */
541
542 R("*", "C", LRS_UNCONNECTED, LWS_WSIEV_DNS_START, NULL, NULL, XT(LTS_WAITING_DNS)),
543 R("*", "C", LRS_WAITING_DNS, LWS_WSIEV_DNS_RETRY, NULL, NULL, XT(LTS_NONE)),
544 R("*", "C", LRS_UNCONNECTED, LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)),
545 R("*", "C", LRS_WAITING_DNS, LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)),
546 R("*", "C", LRS_WAITING_CONNECT, LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)), /* next address */
547 R("*", "C", LRS_WAITING_SSL, LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)), /* quic to tcp */
548 R("*", "C", LRS_WAITING_CONNECT, LWS_WSIEV_PROXY_CONNECT_SENT, NULL, NULL, XT(LTS_WAITING_PROXY_REPLY)),
549 R("*", "C", LRS_WAITING_CONNECT, LWS_WSIEV_SOCKS_GREETING_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_GREETING_REPLY)),
550 R("*", "C", LRS_WAITING_SOCKS_GREETING_REPLY, LWS_WSIEV_SOCKS_AUTH_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_AUTH_REPLY)),
551 R("*", "C", LRS_WAITING_SOCKS_GREETING_REPLY, LWS_WSIEV_SOCKS_CONNECT_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_CONNECT_REPLY)),
552 R("*", "C", LRS_WAITING_SOCKS_AUTH_REPLY, LWS_WSIEV_SOCKS_CONNECT_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_CONNECT_REPLY)),
553 R("*", "C", LRS_WAITING_CONNECT, LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
554 R("*", "C", LRS_WAITING_PROXY_REPLY, LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
555 R("*", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
556 R("*", "C", LRS_H1C_ISSUE_HANDSHAKE, LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
557 R("*", "C", LRS_WAITING_SSL, LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)), /* more service */
558 /*
559 * STARTTLS: an established raw client starts tls inside its protocol
560 * (the smtp client, LWS_WITH_EMAIL)
561 */
562 R("raw-skt", "C", LRS_ESTABLISHED, LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
563 R("*", "S", LRS_SSL_INIT, LWS_WSIEV_TLS_ACCEPT_PENDING, NULL, NULL, XT(LTS_SSL_ACK_PENDING)),
564 R("*", "S", LRS_SSL_ACK_PENDING, LWS_WSIEV_TLS_ACCEPT_PENDING, NULL, NULL, XT(LTS_SSL_ACK_PENDING)),
565 /* each step of the accept on a worker: LWS_WITH_ASYNC_QUEUE with LWS_MAX_SMP > 1 */
566 R("*", "S", LRS_AWAITING_SSL_ACCEPT, LWS_WSIEV_TLS_ACCEPT_PENDING, NULL, NULL, XT(LTS_SSL_ACK_PENDING)),
567 R("*", "S", LRS_SSL_ACK_PENDING, LWS_WSIEV_TLS_ACCEPT_QUEUED, NULL, NULL, XT(LTS_AWAITING_SSL_ACCEPT)),
568 R("*", "C", ANY, LWS_WSIEV_CONN_FAILED, NULL, NULL, XT(LTS_FAILED)),
569 R("*", "C", ANY, LWS_WSIEV_RETARGET, NULL, NULL, XT(LTS_RESTARTING)),
570
571 /* ---- close machine: the polite ws close is specific, the rest can come from anywhere ---- */
572
573 R("ws", "*", LRS_ESTABLISHED, LWS_WSIEV_WS_CLOSE_INITIATED, NULL, NULL, XC(LCS_WAITING_TO_SEND_CLOSE)),
574 R("ws", "*", LRS_WAITING_TO_SEND_CLOSE, LWS_WSIEV_WS_CLOSE_SENT, NULL, NULL, XC(LCS_AWAITING_CLOSE_ACK)),
575 R("ws", "*", LRS_ESTABLISHED, LWS_WSIEV_WS_PEER_CLOSE, NULL, NULL, XC(LCS_RETURNED_CLOSE)),
576 /*
577 * his CLOSE beat the one we were about to send: answer his and drop
578 * ours. Only ws over a mux stream gets here: its network connection
579 * goes on reading for its other streams, where a ws connection of its
580 * own reads nothing more until its close has gone
581 */
582 R("ws", "*", LRS_WAITING_TO_SEND_CLOSE, LWS_WSIEV_WS_PEER_CLOSE, NULL, NULL, XC(LCS_RETURNED_CLOSE)),
583 /*
584 * the close is entered: a flush the live connection had begun is now
585 * the close's own, else the close has begun with nothing to wait for
586 */
587 R("*", "*", LRS_FLUSHING_BEFORE_CLOSE, LWS_WSIEV_CLOSE_ENTERED, NULL, NULL, XC(LCS_FLUSHING_BEFORE_CLOSE)),
588 R("*", "*", ANY, LWS_WSIEV_CLOSE_ENTERED, NULL, NULL, XC(LCS_CLOSING)),
589 R("*", "*", ANY, LWS_WSIEV_CLOSE_FLUSH, NULL, NULL, XC(LCS_FLUSHING_BEFORE_CLOSE)),
590 R("*", "*", ANY, LWS_WSIEV_CLOSE_WHEN_FLUSHED, NULL, NULL, XC(LCS_CLOSE_WHEN_FLUSHED)),
591 R("*", "S", ANY, LWS_WSIEV_CLOSE_STAGED, NULL, NULL, XC(LCS_SHUTDOWN)),
592 R("*", "*", ANY, LWS_WSIEV_SOCKET_GONE, NULL, NULL, XC(LCS_DEAD_SOCKET)),
593 R("*", "*", LRS_DEAD_SOCKET, LWS_WSIEV_USER_TOLD, NULL, NULL, XC(LCS_USER_TOLD)),
594
|