{"id":13440289,"url":"https://github.com/vi/websocat","last_synced_at":"2025-12-27T07:46:51.967Z","repository":{"id":37789249,"uuid":"74579985","full_name":"vi/websocat","owner":"vi","description":"Command-line client for WebSockets, like netcat (or curl) for ws:// with advanced socat-like functions","archived":false,"fork":false,"pushed_at":"2025-04-30T10:04:41.000Z","size":2719,"stargazers_count":7621,"open_issues_count":149,"forks_count":291,"subscribers_count":66,"default_branch":"master","last_synced_at":"2025-05-06T16:11:54.788Z","etag":null,"topics":["cli","command-line","command-line-tool","curl","netcat","proxy","rfc-6455","socat","websocket-client","websocket-server","websockets"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-11-23T13:36:22.000Z","updated_at":"2025-05-06T10:19:56.000Z","dependencies_parsed_at":"2023-10-16T12:59:06.468Z","dependency_job_id":"ff13d94b-7670-47a7-9862-7e00e4991f9c","html_url":"https://github.com/vi/websocat","commit_stats":{"total_commits":694,"total_committers":18,"mean_commits":38.55555555555556,"dds":0.03458213256484155,"last_synced_commit":"b6918d4c67ea36a562bce946be74f00dee14cbda"},"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vi%2Fwebsocat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vi%2Fwebsocat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vi%2Fwebsocat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vi%2Fwebsocat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vi","download_url":"https://codeload.github.com/vi/websocat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253990452,"owners_count":21995773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","command-line","command-line-tool","curl","netcat","proxy","rfc-6455","socat","websocket-client","websocket-server","websockets"],"created_at":"2024-07-31T03:01:21.374Z","updated_at":"2025-12-27T07:46:51.961Z","avatar_url":"https://github.com/vi.png","language":"Rust","funding_links":[],"categories":["Libraries","Networking Tools \u0026 Concepts","Rust","库 Libraries","\u003ca id=\"b35965810463fb97b1ca26d94a8b62f0\"\u003e\u003c/a\u003eNetcat","库","Tools","Awesome Tools","cli","Command-Line Interface (CLI) Tools","\u003ca name=\"networking\"\u003e\u003c/a\u003eNetworking","\u003ca name=\"websocket_security_tools\"\u003e\u003c/a\u003eWebSocket Security Tools"],"sub_categories":["Web programming","Configure WDT service","网络编程 Web programming","Enable Proton in Steam","网页编程","Terminal Tools","viii. Linear Regression","JavaScript Libraries for Machine Learning","Protocols and APIs","General Utilities \u0026 Tools","web编程 Web programming"],"readme":"# websocat\nNetcat, curl and socat for [WebSockets](https://en.wikipedia.org/wiki/WebSocket).\n\n[![Gitter](https://badges.gitter.im/websocat.svg)](https://gitter.im/websocat/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=body_badge)\n[![image-build](https://github.com/vi/websocat/actions/workflows/container-image-buildah.yml/badge.svg)](https://github.com/vi/websocat/pkgs/container/websocat)\n\n## Examples\n\n### Connect to public echo server (Ctrl+d to quit)\n\n```\n$ websocat ws://ws.vi-server.org/mirror\n123\n123\nABC\nABC\n\n$ docker run --rm -ti ghcr.io/vi/websocat:nightly wss://ws.vi-server.org/mirror\n123\n123\nABC\nABC\n```\n\n### Serve and connect\n\n```\nA$ websocat -s 1234\nListening on ws://127.0.0.1:1234/\nABC\n123\n\nB$ websocat ws://127.0.0.1:1234/\nABC\n123\n```\n\n### Open a tab in Chromium using remote debugging.\n\n```\n$ chromium --remote-debugging-port=9222\u0026\n$ curl -sg http://127.0.0.1:9222/json/new | grep webSocketDebuggerUrl | cut -d'\"' -f4 | head -1\nws://127.0.0.1:9222/devtools/page/A331E56CCB8615EB4FCB720425A82259\n$ echo 'Page.navigate {\"url\":\"https://example.com\"}' | websocat -n1 --jsonrpc --jsonrpc-omit-jsonrpc ws://127.0.0.1:9222/devtools/page/A331E56CCB8615EB4FCB720425A82259\n{\"id\":2,\"result\":{\"frameId\":\"A331E56CCB8615EB4FCB720425A82259\",\"loaderId\":\"EF5AAD19F2F8BB27FAF55F94FFB27DF9\"}}\n```\n\n\n### Proxy TCP connections to WebSocket connections and back.\n\n```\n$ websocat --oneshot -b ws-l:127.0.0.1:1234 tcp:127.0.0.1:22\u0026\n$ websocat --oneshot -b tcp-l:127.0.0.1:1236 ws://127.0.0.1:1234/\u0026\n$ nc 127.0.0.1 1236\nSSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u3\nqwertyu\nProtocol mismatch.\n```\n\n\n### Broadcast all messages between connected WebSocket clients\n\n```\nA$ websocat -t ws-l:127.0.0.1:1234 broadcast:mirror:\nB$ websocat ws://127.0.0.1:1234\nC$ websocat ws://127.0.0.1:1234\n```\n\n(if you like this one, you may actually want https://github.com/vi/wsbroad/ instead)\n\nSee [moreexamples.md](./moreexamples.md) for further examples.\n\n## Features\n\n* Connecting to and serving WebSockets from command line.\n* Executing external program and making it communicate to WebSocket using stdin/stdout.\n* Text and binary modes, converting between lines (or null-terminated records) and messages.\n* Inetd mode, UNIX sockets (including abstract namespaced on Linux).\n* Integration with Nginx using TCP or UNIX sockets.\n* Directly using unauthenticated SOCKS5 servers for connecting to WebSockets and listening WebSocket connection.\n* Auto-reconnect and connection-reuse modes.\n* Linux, Windows and Mac support, with [pre-built executables][releases].\n* Low-level WebSocket clients and servers with overridable underlying transport connection, e.g. calling external program to serve as a transport for websocat (for SSL, proxying, etc.).\n\n[releases]:https://github.com/vi/websocat/releases\n\n# Installation\n\nThere are multiple options for installing WebSocat. From easy to hard:\n\n## FreeBSD\n\n`pkg install websocat`\n\n## Debian / Ubuntu\n* Download a pre-build executable from [GitHub releases][releases].\n* Websocat is not yet officially packaged for Debian. Some older versions of Websocat may also have Debian package files available on Github releases.\n\n## macOS\n\n[Homebrew](https://brew.sh): `brew install websocat`\n\n[MacPorts](https://www.macports.org): `sudo port install websocat`\n\n## From source\n* Install the [Rust toolchain](https://rustup.rs/) and do `cargo install websocat`. If something fails with a `-sys` crate, try with `--no-default-features`;\n* Build Websocat from source code (see below), then move `target/release/websocat` somewhere to the PATH.\n\n## Pre-built binaries\nPre-built binaries for Linux (usual and musl), Windows, OS X and Android are available on the [releases page](https://github.com/vi/websocat/releases).\n\n\nBuilding from source code\n---\n\n1. Install the [Rust toolchain](https://rustup.rs/). Note that Websocat v1 (i.e. the current stable version) may fail to support too new Rust due to its old dependencies which can be broken by e.g. [this](https://github.com/rust-lang/rust/pull/78802).\n2. `cargo build --release`.\n3. Find the executable somewhere under `target/`, e.g. in `target/release/websocat`.\n\n### Rust versions\n\n\n|Websocat versions|Minimal Rust version|Maximal Rust version|\n|----|----|----|\n| 4.0.0-alpha1 | 1.84 | ?   |\n| 1.12+     | ?    | ?          |\n| 1.9 - 1.11| 1.46 | maybe 1.63 |\n| 1.6 - 1.8 | 1.34 | maybe 1.63  |\n| 1.3 - 1.5 | 1.31 | 1.47? |\n| 1.2       | 1.28 | 1.47? |\n| 1.0-1.1   | 1.23 | 1.47? |\n| 1.2       | ?    | ?     |\n\nNote that building with legacy Rust version (e.g. 1.46) may require manually copying `Cargo.lock.legacy` to `Cargo.lock` prior to the building.\n\nEarly non-async versions of Websocat should be buildable by even older rustc.  \n\nNote that old versions of Websocat may misbehave if built by Rust 1.48 or later due to https://github.com/rust-lang/rust/pull/71274/.\n\nIt may be not a good idea to build v1.x line of Websocat with Rust 1.64 due to [IP address representation refactor]. It may expose previously hidden undefined behaviour in legacy dependencies. (In practice, it seems to just work though - but a lot of time passed since I checked Websocat properly and in detail).\n\n[ipaddr]:https://github.com/rust-lang/rust/pull/78802\n\n\nSSL on Android\n---\n\nwebsocat's `wss://` may fail on Android. As a workaround, download certificate bundle, for example, from https://curl.haxx.se/ca/cacert.pem and specify it explicitly:\n\n    SSL_CERT_FILE=cacert.pem /data/local/tmp/websocat wss://echo.websocket.org\n\nOr just use `--insecure` option.\n\nDocumentation\n---\n\nBasic usage examples are provided at the top of this README and in `--help` message. More tricks are described in [moreexamples.md](./moreexamples.md).\n\nThere is a [list of all address types and overlays](doc.md).\n\n\u003cdetails\u003e\u003csummary\u003e`websocat --help=long` output\u003c/summary\u003e\n\n```\nwebsocat 1.13.0\nVitaly \"_Vi\" Shukela \u003cvi0oss@gmail.com\u003e\nCommand-line client for web sockets, like netcat/curl/socat for ws://.\n\nUSAGE:\n    websocat ws://URL | wss://URL               (simple client)\n    websocat -s port                            (simple server)\n    websocat [FLAGS] [OPTIONS] \u003caddr1\u003e \u003caddr2\u003e  (advanced mode)\n\nFLAGS:\n        --stdout-announce-listening-ports        [A] Print a line to stdout for each port being listened\n        --async-stdio\n            [A] On UNIX, set stdin and stdout to nonblocking mode instead of spawning a thread. This should improve\n            performance, but may break other programs running on the same console.\n        --compress-deflate\n            [A] Compress data coming to a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n        --compress-gzip\n            [A] Compress data coming to a WebSocket using gzip method. Affects only binary WebSocket messages.\n\n        --compress-zlib\n            [A] Compress data coming to a WebSocket using zlib method. Affects only binary WebSocket messages.\n\n        --crypto-reverse\n            [A] Swap encryption and decryption operations in `crypto:` specifier - encrypt on read, decrypto on write.\n\n        --dump-spec                              [A] Instead of running, dump the specifiers representation to stdout\n    -e, --set-environment\n            Set WEBSOCAT_* environment variables when doing exec:/cmd:/sh-c:\n            Currently it's WEBSOCAT_URI and WEBSOCAT_CLIENT for\n            request URI and client address (if TCP)\n            Beware of ShellShock or similar security problems.\n    -E, --exit-on-eof                            Close a data transfer direction if the other one reached EOF\n        --foreachmsg-wait-read                   [A] Wait for reading to finish before closing foreachmsg:'s peer\n        --jsonrpc\n            Format messages you type as JSON RPC 2.0 method calls. First word becomes method name, the rest becomes\n            parameters, possibly automatically wrapped in [].\n        --jsonrpc-omit-jsonrpc                   [A] Omit `jsonrpc` field when using `--jsonrpc`, e.g. for Chromium\n        --just-generate-key                      [A] Just a Sec-WebSocket-Key value without running main Websocat\n        --lengthprefixed-little-endian\n            [A] Use little-endian framing headers instead of big-endian for `lengthprefixed:` overlay.\n\n        --lengthprefixed-skip-read-direction\n            [A] Only affect one direction of the `lengthprefixed:` overlay, bypass tranformation for the other one.\n\n        --lengthprefixed-skip-write-direction\n            [A] Only affect one direction of the `lengthprefixed:` overlay, bypass tranformation for the other one.\n\n        --linemode-strip-newlines\n            [A] Don't include trailing \\n or \\r\\n coming from streams in WebSocket messages\n\n    -0, --null-terminated                        Use \\0 instead of \\n for linemode\n        --no-line                                [A] Don't automatically insert line-to-message transformation\n        --no-exit-on-zeromsg\n            [A] Don't exit when encountered a zero message. Zero messages are used internally in Websocat, so it may\n            fail to close connection at all.\n        --no-fixups\n            [A] Don't perform automatic command-line fixups. May destabilize websocat operation. Use --dump-spec without\n            --no-fixups to discover what is being inserted automatically and read the full manual about Websocat\n            internal workings.\n        --no-async-stdio                         [A] Inhibit using stdin/stdout in a nonblocking way if it is not a tty\n    -1, --one-message                            Send and/or receive only one message. Use with --no-close and/or -u/-U.\n        --oneshot                                Serve only once. Not to be confused with -1 (--one-message)\n        --print-ping-rtts\n            Print measured round-trip-time to stderr after each received WebSocket pong.\n\n        --exec-exit-on-disconnect\n            [A] Make exec: or sh-c: or cmd: immediately exit when connection is closed, don't wait for termination.\n\n        --exec-sighup-on-stdin-close\n            [A] Make exec: or sh-c: or cmd: send SIGHUP on UNIX when input is closed.\n\n        --exec-sighup-on-zero-msg\n            [A] Make exec: or sh-c: or cmd: send SIGHUP on UNIX when facing incoming zero-length message.\n\n    -q                                           Suppress all diagnostic messages, except of startup errors\n        --reuser-send-zero-msg-on-disconnect\n            [A] Make reuse-raw: send a zero-length message to the peer when some clients disconnects.\n\n    -s, --server-mode                            Simple server mode: specify TCP port or addr:port as single argument\n    -S, --strict\n            strict line/message mode: drop too long messages instead of splitting them, drop incomplete lines.\n\n        --timestamp-monotonic                    [A] Use monotonic clock for `timestamp:` overlay\n    -k, --insecure                               Accept invalid certificates and hostnames while connecting to TLS\n        --udp-broadcast                          [A] Set SO_BROADCAST\n        --udp-multicast-loop                     [A] Set IP[V6]_MULTICAST_LOOP\n        --udp-oneshot                            [A] udp-listen: replies only one packet per client\n        --udp-reuseaddr\n            [A] Set SO_REUSEADDR for UDP socket. Listening TCP sockets are always reuseaddr.\n\n        --uncompress-deflate\n            [A] Uncompress data coming from a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n        --uncompress-gzip\n            [A] Uncompress data coming from a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n        --uncompress-zlib\n            [A] Uncompress data coming from a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n    -u, --unidirectional                         Inhibit copying data in one direction\n    -U, --unidirectional-reverse\n            Inhibit copying data in the other direction (or maybe in both directions if combined with -u)\n\n        --accept-from-fd\n            [A] Do not call `socket(2)` in UNIX socket listener peer, start with `accept(2)` using specified file\n            descriptor number as argument instead of filename\n        --unlink                                 [A] Unlink listening UNIX socket before binding to it\n    -V, --version                                Prints version information\n    -v                                           Increase verbosity level to info or further\n    -b, --binary                                 Send message to WebSockets as binary messages\n    -n, --no-close                               Don't send Close message to websocket on EOF\n        --websocket-ignore-zeromsg\n            [A] Silently drop incoming zero-length WebSocket messages. They may cause connection close due to usage of\n            zero-len message as EOF flag inside Websocat.\n    -t, --text                                   Send message to WebSockets as text messages\n        --base64\n            Encode incoming binary WebSocket messages in one-line Base64 If `--binary-prefix` (see `--help=full`) is\n            set, outgoing WebSocket messages that start with the prefix are decoded from base64 prior to sending.\n        --base64-text\n            [A] Encode incoming text WebSocket messages in one-line Base64. I don't know whether it can be ever useful,\n            but it's for symmetry with `--base64`.\n\nOPTIONS:\n        --socks5 \u003cauto_socks5\u003e\n            Use specified address:port as a SOCKS5 proxy. Note that proxy authentication is not supported yet. Example:\n            --socks5 127.0.0.1:9050\n        --autoreconnect-delay-millis \u003cautoreconnect_delay_millis\u003e\n            [A] Delay before reconnect attempt for `autoreconnect:` overlay. [default: 20]\n\n        --basic-auth \u003cbasic_auth\u003e\n            Add `Authorization: Basic` HTTP request header with this base64-encoded parameter\n\n        --queue-len \u003cbroadcast_queue_len\u003e\n            [A] Number of pending queued messages for broadcast reuser [default: 16]\n\n    -B, --buffer-size \u003cbuffer_size\u003e                                  Maximum message size, in bytes [default: 65536]\n        --byte-to-exit-on \u003cbyte_to_exit_on\u003e\n            [A] Override the byte which byte_to_exit_on: overlay looks for [default: 28]\n\n        --client-pkcs12-der \u003cclient_pkcs12_der\u003e                      [A] Client identity TLS certificate\n        --client-pkcs12-passwd \u003cclient_pkcs12_passwd\u003e\n            [A] Password for --client-pkcs12-der pkcs12 archive. Required on Mac.\n\n        --close-reason \u003cclose_reason\u003e\n            Close connection with a reason message. This option only takes effect if --close-status-code option is\n            provided as well.\n        --close-status-code \u003cclose_status_code\u003e                      Close connection with a status code.\n        --crypto-key \u003ccrypto_key\u003e\n            [A] Specify encryption/decryption key for `crypto:` specifier. Requires `base64:`, `file:` or `pwd:` prefix.\n\n    -H, --header \u003ccustom_headers\u003e...\n            Add custom HTTP header to websocket client request. Separate header name and value with a colon and\n            optionally a single space. Can be used multiple times. Note that single -H may eat multiple further\n            arguments, leading to confusing errors. Specify headers at the end or with equal sign like -H='X: y'.\n        --server-header \u003ccustom_reply_headers\u003e...\n            Add custom HTTP header to websocket upgrade reply. Separate header name and value with a colon and\n            optionally a single space. Can be used multiple times. Note that single -H may eat multiple further\n            arguments, leading to confusing errors.\n        --exec-args \u003cexec_args\u003e...\n            [A] Arguments for the `exec:` specifier. Must be the last option, everything after it gets into the exec\n            args list.\n        --header-to-env \u003cheaders_to_env\u003e...\n            Forward specified incoming request header to H_* environment variable for `exec:`-like specifiers.\n\n    -h, --help \u003chelp\u003e\n            See the help.\n            --help=short is the list of easy options and address types\n            --help=long lists all options and types (see [A] markers)\n            --help=doc also shows longer description and examples.\n        --inhibit-pongs \u003cinhibit_pongs\u003e\n            [A] Stop replying to incoming WebSocket pings after specified number of replies\n\n        --just-generate-accept \u003cjust_generate_accept\u003e\n            [A] Just a Sec-WebSocket-Accept value based on supplied Sec-WebSocket-Key value without running main\n            Websocat\n        --lengthprefixed-nbytes \u003clengthprefixed_header_bytes\u003e\n            [A] Use this number of length header bytes for `lengthprefixed:` overlay. [default: 4]\n\n        --max-messages \u003cmax_messages\u003e\n            Maximum number of messages to copy in one direction.\n\n        --max-messages-rev \u003cmax_messages_rev\u003e\n            Maximum number of messages to copy in the other direction.\n\n        --conncap \u003cmax_parallel_conns\u003e\n            Maximum number of simultaneous connections for listening mode\n\n        --max-sent-pings \u003cmax_sent_pings\u003e\n            [A] Stop sending pings after this number of sent pings\n\n        --max-ws-frame-length \u003cmax_ws_frame_length\u003e\n            [A] Maximum size of incoming WebSocket frames, to prevent memory overflow [default: 104857600]\n\n        --max-ws-message-length \u003cmax_ws_message_length\u003e\n            [A] Maximum size of incoming WebSocket messages (sans of one data frame), to prevent memory overflow\n            [default: 209715200]\n        --origin \u003corigin\u003e                                            Add Origin HTTP header to websocket client request\n        --pkcs12-der \u003cpkcs12_der\u003e\n            Pkcs12 archive needed to accept SSL connections, certificate and key.\n            A command to output it: openssl pkcs12 -export -out output.pkcs12 -inkey key.pem -in cert.pem\n            Use with -s (--server-mode) option or with manually specified TLS overlays.\n            See moreexamples.md for more info.\n        --pkcs12-passwd \u003cpkcs12_passwd\u003e\n            Password for --pkcs12-der pkcs12 archive. Required on Mac.\n\n    -p, --preamble \u003cpreamble\u003e...\n            Prepend copied data with a specified string. Can be specified multiple times.\n\n    -P, --preamble-reverse \u003cpreamble_reverse\u003e...\n            Prepend copied data with a specified string (reverse direction). Can be specified multiple times.\n\n        --prometheus \u003cprometheus\u003e\n            Expose Prometheus metrics on specified IP address and port in addition to running usual Websocat session\n\n        --request-header \u003crequest_headers\u003e...\n            [A] Specify HTTP request headers for `http-request:` specifier.\n\n    -X, --request-method \u003crequest_method\u003e                            [A] Method to use for `http-request:` specifier\n        --request-uri \u003crequest_uri\u003e                                  [A] URI to use for `http-request:` specifier\n        --restrict-uri \u003crestrict_uri\u003e\n            When serving a websocket, only accept the given URI, like `/ws`\n            This liberates other URIs for things like serving static files or proxying.\n    -F, --static-file \u003cserve_static_files\u003e...\n            Serve a named static file for non-websocket connections.\n            Argument syntax: \u003cURI\u003e:\u003cContent-Type\u003e:\u003cfile-path\u003e\n            Argument example: /index.html:text/html:index.html\n            Directories are not and will not be supported for security reasons.\n            Can be specified multiple times. Recommended to specify them at the end or with equal sign like `-F=...`,\n            otherwise this option may eat positional arguments\n        --socks5-bind-script \u003csocks5_bind_script\u003e\n            [A] Execute specified script in `socks5-bind:` mode when remote port number becomes known.\n\n        --socks5-destination \u003csocks_destination\u003e\n            [A] Examples: 1.2.3.4:5678  2600:::80  hostname:5678\n\n        --tls-domain \u003ctls_domain\u003e\n            [A] Specify domain for SNI or certificate verification when using tls-connect: overlay\n\n        --udp-multicast \u003cudp_join_multicast_addr\u003e...\n            [A] Issue IP[V6]_ADD_MEMBERSHIP for specified multicast address. Can be specified multiple times.\n\n        --udp-multicast-iface-v4 \u003cudp_join_multicast_iface_v4\u003e...\n            [A] IPv4 address of multicast network interface. Has to be either not specified or specified the same number\n            of times as multicast IPv4 addresses. Order matters.\n        --udp-multicast-iface-v6 \u003cudp_join_multicast_iface_v6\u003e...\n            [A] Index of network interface for IPv6 multicast. Has to be either not specified or specified the same\n            number of times as multicast IPv6 addresses. Order matters.\n        --udp-ttl \u003cudp_ttl\u003e                                          [A] Set IP_TTL, also IP_MULTICAST_TTL if applicable\n        --protocol \u003cwebsocket_protocol\u003e\n            Specify this Sec-WebSocket-Protocol: header when connecting\n\n        --server-protocol \u003cwebsocket_reply_protocol\u003e\n            Force this Sec-WebSocket-Protocol: header when accepting a connection\n\n        --websocket-version \u003cwebsocket_version\u003e                      Override the Sec-WebSocket-Version value\n        --binary-prefix \u003cws_binary_prefix\u003e\n            [A] Prepend specified text to each received WebSocket binary message. Also strip this prefix from outgoing\n            messages, explicitly marking them as binary even if `--text` is specified\n        --ws-c-uri \u003cws_c_uri\u003e\n            [A] URI to use for ws-c: overlay [default: ws://0.0.0.0/]\n\n        --ping-interval \u003cws_ping_interval\u003e                           Send WebSocket pings each this number of seconds\n        --ping-timeout \u003cws_ping_timeout\u003e\n            Drop WebSocket connection if Pong message not received for this number of seconds\n\n        --text-prefix \u003cws_text_prefix\u003e\n            [A] Prepend specified text to each received WebSocket text message. Also strip this prefix from outgoing\n            messages, explicitly marking them as text even if `--binary` is specified\n\nARGS:\n    \u003caddr1\u003e    In simple mode, WebSocket URL to connect. In advanced mode first address (there are many kinds of\n               addresses) to use. See --help=types for info about address types. If this is an address for\n               listening, it will try serving multiple connections.\n    \u003caddr2\u003e    In advanced mode, second address to connect. If this is an address for listening, it will accept only\n               one connection.\n\n\nBasic examples:\n  Command-line websocket client:\n    websocat ws://ws.vi-server.org/mirror/\n    \n  WebSocket server\n    websocat -s 8080\n    \n  WebSocket-to-TCP proxy:\n    websocat --binary ws-l:127.0.0.1:8080 tcp:127.0.0.1:5678\n    \n\nFull list of address types:\n\tws://           \tInsecure (ws://) WebSocket client. Argument is host and URL.\n\twss://          \tSecure (wss://) WebSocket client. Argument is host and URL.\n\tws-listen:      \tWebSocket server. Argument is host and port to listen.\n\tinetd-ws:       \tWebSocket inetd server. [A]\n\tl-ws-unix:      \tWebSocket UNIX socket-based server. [A]\n\tl-ws-abstract:  \tWebSocket abstract-namespaced UNIX socket server. [A]\n\tws-lowlevel-client:\t[A] Low-level HTTP-independent WebSocket client connection without associated HTTP upgrade.\n\tws-lowlevel-server:\t[A] Low-level HTTP-independent WebSocket server connection without associated HTTP upgrade.\n\twss-listen:     \tListen for secure WebSocket connections on a TCP port\n\thttp:           \t[A] Issue HTTP request, receive a 1xx or 2xx reply, then pass\n\tasyncstdio:     \t[A] Set stdin and stdout to nonblocking mode, then use it as a communication counterpart. UNIX-only.\n\tinetd:          \tLike `asyncstdio:`, but intended for inetd(8) usage. [A]\n\ttcp:            \tConnect to specified TCP host and port. Argument is a socket address.\n\ttcp-listen:     \tListen TCP port on specified address.\n\tssl-listen:     \tListen for SSL connections on a TCP port\n\tsh-c:           \tStart specified command line using `sh -c` (even on Windows)\n\tcmd:            \tStart specified command line using `sh -c` or `cmd /C` (depending on platform)\n\texec:           \tExecute a program directly (without a subshell), providing array of arguments on Unix [A]\n\treadfile:       \tSynchronously read a file. Argument is a file path.\n\twritefile:      \tSynchronously truncate and write a file.\n\tappendfile:     \tSynchronously append a file.\n\tudp:            \tSend and receive packets to specified UDP socket, from random UDP port  \n\tudp-listen:     \tBind an UDP socket to specified host:port, receive packet\n\topen-async:     \tOpen file for read and write and use it like a socket. [A]\n\topen-fd:        \tUse specified file descriptor like a socket. [A]\n\tthreadedstdio:  \t[A] Stdin/stdout, spawning a thread (threaded version).\n\t-               \tRead input from console, print to console. Uses threaded implementation even on UNIX unless requested by `--async-stdio` CLI option.\n\tunix:           \tConnect to UNIX socket. Argument is filesystem path. [A]\n\tunix-listen:    \tListen for connections on a specified UNIX socket [A]\n\tunix-dgram:     \tSend packets to one path, receive from the other. [A]\n\tabstract:       \tConnect to UNIX abstract-namespaced socket. Argument is some string used as address. [A]\n\tabstract-listen:\tListen for connections on a specified abstract UNIX socket [A]\n\tabstract-dgram: \tSend packets to one address, receive from the other. [A]\n\tmirror:         \tSimply copy output to input. No arguments needed.\n\tliteralreply:   \tReply with a specified string for each input packet.\n\tclogged:        \tDo nothing. Don't read or write any bytes. Keep connections in \"hung\" state. [A]\n\tliteral:        \tOutput a string, discard input.\n\tassert:         \tCheck the input.  [A]\n\tassert2:        \tCheck the input. [A]\n\tseqpacket:      \tConnect to AF_UNIX SOCK_SEQPACKET socket. Argument is a filesystem path. [A]\n\tseqpacket-listen:\tListen for connections on a specified AF_UNIX SOCK_SEQPACKET socket [A]\n\trandom:         \tGenerate random bytes when being read from, discard written bytes.\nFull list of overlays:\n\tws-upgrade:     \tWebSocket upgrader / raw server. Specify your own protocol instead of usual TCP. [A]\n\thttp-request:   \t[A] Issue HTTP request, receive a 1xx or 2xx reply, then pass\n\thttp-post-sse:  \t[A] Accept HTTP/1 request. Then, if it is GET,\n\tssl-connect:    \tOverlay to add TLS encryption atop of existing connection [A]\n\tssl-accept:     \tAccept an TLS connection using arbitrary backing stream. [A]\n\treuse-raw:      \tReuse subspecifier for serving multiple clients: unpredictable mode. [A]\n\tbroadcast:      \tReuse this connection for serving multiple clients, sending replies to all clients.\n\tautoreconnect:  \tRe-establish underlying connection on any error or EOF\n\tws-c:           \tLow-level WebSocket connector. Argument is a some another address. [A]\n\tmsg2line:       \tLine filter: Turns messages from packet stream into lines of byte stream. [A]\n\tline2msg:       \tLine filter: turn lines from byte stream into messages as delimited by '\\\\n' or '\\\\0' [A]\n\tlengthprefixed: \tTurn stream of bytes to/from data packets with length-prefixed framing.  [A]\n\tforeachmsg:     \tExecute something for each incoming message.\n\tlog:            \tLog each buffer as it pass though the underlying connector.\n\tjsonrpc:        \t[A] Turns messages like `abc 1,2` into `{\"jsonrpc\":\"2.0\",\"id\":412, \"method\":\"abc\", \"params\":[1,2]}`.\n\ttimestamp:      \t[A] Prepend timestamp to each incoming message.\n\tsocks5-connect: \tSOCKS5 proxy client (raw) [A]\n\tsocks5-bind:    \tSOCKS5 proxy client (raw, bind command) [A]\n\tcrypto:         \t[A] Encrypts written messages and decrypts (and verifies) read messages with a static key, using ChaCha20-Poly1305 algorithm.\n\tprometheus:     \t[A] Account connections, messages, bytes and other data and expose Prometheus metrics on a separate port.\n\texit_on_specific_byte:\t[A] Turn specific byte into a EOF, allowing user to escape interactive Websocat session\n\twaitfordata:    \tWait for some data to pending being written before starting connecting. [A]\n```\n\u003c/details\u003e\n\n\nSome notes\n---\n\n* IPv6 is supported, surround your IP in square brackets or use it as is, depending on context.\n* Web socket usage is not obligatory, you can use any specs on both sides.\n* Typically one line in binary stream correspond to one WebSocket text message. This is adjustable with options.\n\nLimitations\n---\n\n* It only connects (or serves) HTTP/1. [RFC 8441](https://www.rfc-editor.org/rfc/rfc8441) or [RFC 9220](https://www.rfc-editor.org/rfc/rfc9220.html) are not currently supported.\n* It is not convenient when text and binary WebSocket messages are mixed. This affects `mirror:` specifier, making it a bit different from ws://echo.websocket.org. There are `--binary-prefix`, `--text-prefix` and `--base64` options to handle mixture of binary and text.\n* Current version of Websocat don't receive notification about closed sockets. This makes serving without `-E` or `-u` options or in backpressure scenarios prone to socket leak.\n* Readline is not integrated. Users are advices to wrap websocat using [`rlwrap`](https://linux.die.net/man/1/rlwrap) tool for more convenient CLI.\n* Build process of current version of Websocat is not properly automated and is fragile.\n* Main version (v1) is based on obsolete dependency versions that trigger security warnings and may become tricky to build. There is [new version (v4)](https://github.com/vi/websocat/tree/websocat4), but is not yet considered stable and [has many missing features](https://github.com/vi/websocat/issues/276).\n\nBindings\n---\n\n* Node.js: [`seamapi/node-websocat`](https://github.com/seamapi/node-websocat)\n\nSee also\n---\n\n* [wstunnel](https://github.com/erebe/wstunnel)\n* [wscat](https://github.com/websockets/wscat)\n* [websocketd](https://github.com/joewalnes/websocketd)\n* [wsd](https://github.com/alexanderGugel/wsd)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvi%2Fwebsocat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvi%2Fwebsocat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvi%2Fwebsocat/lists"}