{"id":28479033,"url":"https://github.com/openresty/stream-echo-nginx-module","last_synced_at":"2025-07-14T04:04:39.597Z","repository":{"id":44376709,"uuid":"44162837","full_name":"openresty/stream-echo-nginx-module","owner":"openresty","description":"TCP/stream echo module for NGINX (a port of ngx_http_echo_module)","archived":false,"fork":false,"pushed_at":"2020-08-26T20:30:09.000Z","size":88,"stargazers_count":69,"open_issues_count":3,"forks_count":27,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-07-03T09:41:44.724Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openresty.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-10-13T08:30:56.000Z","updated_at":"2024-12-15T11:37:38.000Z","dependencies_parsed_at":"2022-07-16T19:46:06.199Z","dependency_job_id":null,"html_url":"https://github.com/openresty/stream-echo-nginx-module","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/openresty/stream-echo-nginx-module","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openresty%2Fstream-echo-nginx-module","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openresty%2Fstream-echo-nginx-module/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openresty%2Fstream-echo-nginx-module/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openresty%2Fstream-echo-nginx-module/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openresty","download_url":"https://codeload.github.com/openresty/stream-echo-nginx-module/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openresty%2Fstream-echo-nginx-module/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265238212,"owners_count":23732585,"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":[],"created_at":"2025-06-07T18:07:55.848Z","updated_at":"2025-07-14T04:04:39.563Z","avatar_url":"https://github.com/openresty.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"NAME\n====\n\nngx_stream_echo - TCP/stream echo module for NGINX (a port of the ngx_http_echo module)\n\nTable of Contents\n=================\n\n* [NAME](#name)\n* [Version](#version)\n* [Synopsis](#synopsis)\n    * [Example 1](#example-1)\n    * [Example 2](#example-2)\n    * [Example 3](#example-3)\n    * [Example 4](#example-4)\n* [Description](#description)\n* [Directives](#directives)\n    * [echo](#echo)\n    * [echo_duplicate](#echo_duplicate)\n    * [echo_flush_wait](#echo_flush_wait)\n    * [echo_sleep](#echo_sleep)\n    * [echo_send_timeout](#echo_send_timeout)\n    * [echo_read_bytes](#echo_read_bytes)\n    * [echo_read_line](#echo_read_line)\n    * [echo_request_data](#echo_request_data)\n    * [echo_discard_request](#echo_discard_request)\n    * [echo_read_buffer_size](#echo_read_buffer_size)\n    * [echo_read_timeout](#echo_read_timeout)\n    * [echo_client_error_log_level](#echo_client_error_log_level)\n    * [echo_lingering_close](#echo_lingering_close)\n    * [echo_lingering_time](#echo_lingering_time)\n    * [echo_lingering_timeout](#echo_lingering_timeout)\n* [Caveats](#caveats)\n* [TODO](#todo)\n* [Installation](#installation)\n* [Compatibility](#compatibility)\n* [Community](#community)\n    * [English Mailing List](#english-mailing-list)\n    * [Chinese Mailing List](#chinese-mailing-list)\n* [Report Bugs](#report-bugs)\n* [Source Repository](#source-repository)\n* [Author](#author)\n* [Copyright \u0026 License](#copyright--license)\n* [See Also](#see-also)\n\nVersion\n=======\n\nThis module is still under early development.\n\nSynopsis\n========\n\nExample 1\n---------\n\n```nginx\n# nginx.conf\n\nstream {\n    server {\n        listen 1234;\n\n        echo_send_timeout   10s;    # default to 60s\n\n        echo \"Hello, world!\";\n        echo I really like doing downstream TCP;\n    }\n}\n```\n\n```console\n# on the terminal\n\n$ telnet 127.0.0.1 1234\nTrying 127.0.0.1...\nConnected to 127.0.0.1.\nEscape character is '^]'.\nHello, world!\nI really like doing downstream TCP\nConnection closed by foreign host.\n```\n\n[Back to TOC](#table-of-contents)\n\nExample 2\n---------\n\n```nginx\nstream {\n    server {\n        listen 1234;\n\n        echo \"before sleep...\";\n        echo_flush_wait;    # ensure that any pending output is flushed\n\n        echo_sleep 3.1;     # sleep for 3.1 sec\n\n        echo \"after sleep...\";\n        echo_duplicate 3 \" hello\";  # repeat \" hello\" for 3 times\n        echo;   # just to ouput a new line\n    }\n}\n```\n\n```console\n$ time telnet 127.0.0.1 1234\nTrying 127.0.0.1...\nConnected to 127.0.0.1.\nEscape character is '^]'.\nbefore sleep...\nafter sleep...\n hello hello hello\n Connection closed by foreign host.\n\n real   0m3.106s\n user   0m0.000s\n sys    0m0.002s\n```\n\n[Back to TOC](#table-of-contents)\n\nExample 3\n---------\n\n```nginx\nstream {\n    server {\n        listen 1234;\n\n        echo_read_buffer_size 2k;\n        echo_read_timeout 60s;\n\n        echo_read_bytes 2;\n        echo -n 'Got prompt: ';\n        echo_request_data;\n        echo;\n\n        echo_read_line;\n        echo -n \"Got command: \";\n        echo_request_data;\n    }\n}\n```\n\n```console\n# we type the line \"\u003e\u003eprint(\"hello, world\")\" in the telnet session below.\n\n$ telnet 127.0.0.1 1234\nTrying 127.0.0.1...\nConnected to 127.0.0.1.\nEscape character is '^]'.\n\u003e\u003eprint(\"hello, world!\")\nGot prompt: \u003e\u003e\nGot command: print(\"hello, world!\")\nConnection closed by foreign host.\n```\n\n[Back to TOC](#table-of-contents)\n\nExample 4\n---------\n\n```nginx\nstream {\n    server {\n        listen 1999;\n\n        # emulate a blackhole that swallows any incoming TCP\n        # messages greedily like a logging service.\n        # this can be used to mock up a logging service like\n        # syslog-ng (TCP), which is much more efficient than\n        # a typical netcat (nc) server.\n\n        echo_discard_request;\n        echo_sleep 3600;    # in sec\n    }\n}\n```\n\n[Back to TOC](#table-of-contents)\n\nDescription\n===========\n\nThis module is a port of the handy [ngx_http_echo](https://github.com/openresty/echo-nginx-module)\nmodule over the shiny new \"stream\" subsystem of NGINX. With this module,\nyou can do simple custom output from constant strings directly from memory in your\ngeneric TCP (or stream-typed unix domain socket) server.\n\nThis module is particularly handy for mocking silly TCP endpoints during unit testing (like\nmocking a buggy and evil memcached server).\n\nAlso, this module can serve as a useful simple demo for writing NGINX stream-typed 3rd-party modules.\nWell, it is just a little bit more complex than a \"hello world\" module anyway.\n\n[Back to TOC](#table-of-contents)\n\nDirectives\n==========\n\necho\n----\n**syntax:** *echo \\[options\\] \u0026lt;string\u0026gt;...*\n\n**default:** *no*\n\n**context:** *server*\n\n**phase:** *content*\n\nSends string arguments joined by spaces, along with a trailing newline, out to the client.\n\nFor example,\n\n```nginx\nstream {\n    server {\n        listen 1234;\n\n        echo \"Hello, world!\";\n        echo foo bar baz;\n    }\n}\n```\n\nThen connecting to the server port 1234 will immediately receive the response data\n\n```\nHello, world!\nfoo bar baz\n```\n\nand then the server closes the connection right away.\n\nWhen no argument is specified, *echo* emits the trailing newline alone, just like the *echo* command in shell.\n\none can suppress the trailing newline character in the output by using the `-n` option, as in\n\n```nginx\necho -n \"hello, \";\necho \"world\";\n```\n\nConnecting to the server will receive the response data\n\n```\nhello, world\n```\n\nwhere the first `echo` command generates no trailing new-line due to the use of the `-n` option.\n\nTo output string values prefixed with a dash (`-`), you can specify the special `--` option\nto disambiguate such arguments from options. For instance,\n\n```nginx\necho -n -- -32+5;\n```\n\nThe response is\n\n```\n-32+5\n```\n\nThis command sends the data *asynchronously* to the main execution flow, that is, this command\nwill return immediately without waiting for the output to be actually flushed into the\nsystem socket send buffers.\n\nFor slow connections the sending timeout protection is subject to the configuration of\nthe [echo_send_timeout](#echo_send_timeout) configuration directive.\n\nThis command can be mixed with other `echo_*` commands (like [echo_duplicate](#echo_duplicate))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_duplicate\n--------------\n**syntax:** *echo_duplicate \u0026lt;count\u0026gt; \u0026lt;string\u0026gt;*\n\n**default:** *no*\n\n**context:** *server*\n\n**phase:** *content*\n\nOutputs duplication of a string indicated by the second argument, using the count specified in the first argument.\n\nFor instance,\n\n```nginx\necho_duplicate 3 \"abc\";\n```\n\nwill lead to the output of `\"abcabcabc\"`.\n\nUnderscores are allowed in the count number, just like in Perl. For example, to emit 1000,000,000 instances of `\"hello, world\"`:\n\n```nginx\necho_duplicate 1000_000_000 \"hello, world\";\n```\n\nThe `count` argument could be zero, but not negative. The second `string` argument could be an empty string (\"\") likewise.\n\nUnlike the [echo](#echo) directive, no trailing newline is appended to the result.\n\nLike the [echo](#echo) command, this command sends the data *asynchronously* to the main\nexecution flow, that is, this command\nwill return immediately without waiting for the output to be actually flushed into the\nsystem socket send buffers.\n\nFor slow connections the sending timeout protection is subject to the configuration of\nthe [echo_send_timeout](#echo_send_timeout) configuration directive.\n\nThis command can be mixed with other `echo*` commands (like [echo](#echo) and [echo_sleep](#echo_sleep))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_flush_wait\n---------------\n**syntax:** *echo_flush_wait;*\n\n**default:** *no*\n\n**context:** *server*\n\n**phase:** *content*\n\nSynchronously waits for all the pending output to be flushed out into the system socket\nsend buffers. When the downstream connection is fast enough and there is no pending\ndata, then this directive completes immediately without waiting.\n\nThe wait is a nonblocking operation. That is, it never blocks the NGINX event loop or\nany operating system threads.\n\nThe maximum waiting time is subject to the [echo_send_timeout](#echo_send_timeout) setting.\n\nThis command can be mixed with other `echo*` commands (like [echo](#echo) and [echo_sleep](#echo_sleep))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_sleep\n----------\n**syntax:** *echo_sleep \u0026lt;seconds\u0026gt;*\n\n**default:** *no*\n\n**context:** *server*\n\n**phase:** *content*\n\nSleeps for the time period specified by the argument, which is in seconds.\n\nThis operation is nonblocking, that is, it never blocks the NGINX event loop or\nany operating system threads.\n\nThe period might takes three digits after the decimal point and must be greater than 0.001 (i.e., 1ms).\n\nAn example is\n\n```nginx\necho_sleep 1.234;   # sleep for 1.234 sec\necho \"resumed!\";\n```\n\nBehind the scene, it sets up a per-request \"sleep\" event object, and adds a timer using that\ncustom event to the Nginx event model and just waits for a period of time on that event.\n\nThis command can be mixed with other `echo*` commands (like [echo](#echo) and [echo_duplicate](#echo_duplicate))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_send_timeout\n-----------------\n**syntax:** *echo_send_timeout \u0026lt;time\u0026gt;*\n\n**default:** *echo_send_timeout 60s*\n\n**context:** *stream, server*\n\nSets the sending timeout for the downstream socket, in seconds by default.\n\nIt is wise to always explicitly specify the time unit to avoid confusion. Time units supported are \"s\"(seconds), \"ms\"(milliseconds), \"y\"(years), \"M\"(months), \"w\"(weeks), \"d\"(days), \"h\"(hours), and \"m\"(minutes).\n\nThis time must be less than 597 hours.\n\nIf this directive is not specified, this module will use `60s` as the default.\n\n[Back to TOC](#table-of-contents)\n\necho_read_bytes\n---------------\n**syntax:** *echo_read_bytes \u0026lt;size\u0026gt;*\n\n**default:** *no*\n\n**context:** *server*\n\nReads the request data of the specified size and append it into the \"reading buffer\".\nThe size of the buffer is controlled by the [echo_read_buffer_size](#echo_read_buffer_size)\ndirective. The length of data dictated in this command cannot exceed the\n[echo_read_buffer_size](#echo_read_buffer_size) setting.\n\nFor example,\n\n```nginx\necho_read_bytes 5;\n```\n\nreads 5 bytes of request data from the downstream connection.\n\nOn the other hand,\n\n```nginx\necho_read_bytes 4k;\n```\n\nreads 4KB of data.\n\nThis command would not return (until timeout) until exactly the acount of data has been\nread as specified.\n\nThe timeout threshold is subject to the [echo_read_timeout](#echo_read_timeout) directive.\n\nThe data read (in the \"reading buffer\") can later be output by the [echo_request_data](#echo_request_data)\ndirective.\n\nThis command can be mixed with other `echo*` commands (like [echo](#echo) and [echo_duplicate](#echo_duplicate))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_read_line\n---------------\n**syntax:** *echo_read_line;*\n\n**default:** *no*\n\n**context:** *server*\n\nReads the request data of the specified size and append it into the \"reading buffer\".\nThe size of the buffer is controlled by the [echo_read_buffer_size](#echo_read_buffer_size)\ndirective. The length of data read by this command cannot exceed the\n[echo_read_buffer_size](#echo_read_buffer_size) setting.\n\nThe timeout threshold is subject to the [echo_read_timeout](#echo_read_timeout) directive.\n\nThe data read (in the \"reading buffer\") can later be output by the [echo_request_data](#echo_request_data)\ndirective.\n\nThis command can be mixed with other `echo*` commands (like [echo](#echo) and [echo_duplicate](#echo_duplicate))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_request_data\n-----------------\n**syntax:** *echo_request_data \u0026lt;size\u0026gt;*\n\n**default:** *no*\n\n**context:** *server*\n\nSends all the data accumulated in the \"reading buffer\" to the downstream connection and\nclears all the data in the \"reading buffer\".\n\nUnlike [echo](#echo) or [echo_duplicate](#echo_duplicate), this command does not return\nuntil all the data is actually flushed into the system socket send buffer. Or in other words, this command is a synchronous operation (but still doing nonblocking I/O, of course).\n\nThis command can be mixed with other `echo*` commands (like [echo](#echo) and [echo_duplicate](#echo_duplicate))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_discard_request\n--------------------\n**syntax:** *echo_discard_request*\n\n**default:** *no*\n\n**context:** *server*\n\nDiscards any request data already pre-read in the \"reading buffer\" or any future\nincoming request data.\n\nThis command is an asynchronous operation which returns immediately without waiting for\nall the incoming request.\n\nOnce this command is executed, any subsequent request reading commands like [echo_read_line](#echo_read_line)\nare disallowed.\n\nThis command can be mixed with other `echo*` commands (like [echo](#echo) and [echo_duplicate](#echo_duplicate))\nfreely in the same server. The module\nhandler will run them sequentially in the same order of their appearance in the NGINX configuration file.\n\n[Back to TOC](#table-of-contents)\n\necho_read_buffer_size\n---------------------\n**syntax:** *echo_read_buffer_size \u0026lt;size\u0026gt;*\n\n**default:** *echo_read_buffer_size 1k*\n\n**context:** *stream, server*\n\nControls the size of the \"reading buffer\" used to receive downstream data via commands\nlike [echo_read_bytes](#echo_read_bytes).\n\n[Back to TOC](#table-of-contents)\n\necho_read_timeout\n-----------------\n**syntax:** *echo_read_timeout \u0026lt;time\u0026gt;*\n\n**default:** *echo_read_timeout 60s*\n\n**context:** *stream, server*\n\nSets the reading timeout for the downstream socket, in seconds by default. Affecting\nreading directives like [echo_read_bytes](#echo_read_bytes).\n\nIt is wise to always explicitly specify the time unit to avoid confusion. Time units supported are \"s\"(seconds), \"ms\"(milliseconds), \"y\"(years), \"M\"(months), \"w\"(weeks), \"d\"(days), \"h\"(hours), and \"m\"(minutes).\n\nThis time must be less than 597 hours.\n\nIf this directive is not specified, this module will use `60s` as the default.\n\n[Back to TOC](#table-of-contents)\n\necho_client_error_log_level\n---------------------------\n**syntax:** *echo_client_error_log_level info | notice | warn | error*\n\n**default:** *echo_client_error_log_level info*\n\n**context:** *stream, server*\n\nSpecifies the error log level for client side errors (like the error that the client\ncloses the connection prematurely). Default to `info` to avoid real-world clients from\nflooding the server error log files (which can be quite expensive).\n\n[Back to TOC](#table-of-contents)\n\necho_lingering_close\n--------------------\n**syntax:** *echo_lingering_close off | on | always*\n\n**default:** *echo_lingering_close on*\n\n**context:** *stream, server*\n\nControls how nginx closes client connections.\n\nThe default value `on` instructs nginx to wait for and process (read and discard) additional\ndata from a client before fully closing a connection, but only if\nheuristics suggests that a client may be sending more data (like there is\nunprocessed pre-read data in the \"reading buffer\" or the socket is still\nready for reading).\n\nThe value `always` will cause nginx to unconditionally wait for and process\nadditional client data.\n\nThe value `off` tells nginx to never wait for more data and close\nthe connection immediately. This behavior breaks the protocol and may result in\ninterrupting RST packets sent. Thus this configuration value should\nnot be used under normal circumstances.\n\nHow long nginx should wait is controlled by both the [echo_lingering_time](#echo_lingering_time)\nand [echo_lingering_timeout](#echo_lingering_timeout) directives.\n\n[Back to TOC](#table-of-contents)\n\necho_lingering_time\n-------------------\n**syntax:** *echo_lingering_time \u0026lt;time\u0026gt;*\n\n**default:** *echo_lingering_time 30s*\n\n**context:** *stream, server*\n\nWhen [lingering_close](#lingering_close) is in effect, this directive specifies\nthe maximum time during which nginx will process (read and ignore) additional data\ncoming from a client. After that, the connection will be closed, even if there will\nbe more data.\n\n[Back to TOC](#table-of-contents)\n\necho_lingering_timeout\n----------------------\n**syntax:** *echo_lingering_timeout \u0026lt;time\u0026gt;*\n\n**default:** *echo_lingering_timeout 5s*\n\n**context:** *stream, server*\n\nWhen lingering_close is in effect, this directive specifies the maximum waiting time between\nsuccessive arrivals of client data. If data is not received during this time,\nthe connection is closed. Otherwise, the data are read and ignored, and nginx\nstarts waiting for more data again. The “wait-read-ignore” cycle is repeated,\nbut no longer than specified by the [lingering_time](#lingering_time) directive.\n\n[Back to TOC](#table-of-contents)\n\nCaveats\n=======\n\n* Unlike the [ngx_http_echo module](https://github.com/openresty/echo-nginx-module), this module has no NGINX variable\nsupport since NGINX variables are not supported in the \"stream\" subsystem of NGINX (yet).\n* The commands of this module cannot be mixed with other response-generating modules like the standard\n[ngx_stream_proxy module](http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html) in the same\n`server {}` block, for obvious reasons.\n\n[Back to TOC](#table-of-contents)\n\nTODO\n====\n\n* Implement the `echo_test_request_data` directive to test existing data read in the \"reading buffer\"\nwith a literal string specified as the directive argument. This is very useful for mock-up testing.\n* Implement the `echo_read_literal` directive for the combination of the command sequence\n`echo_read_bytes n; echo_test_request_data str;` where `n` is the length of the `str` literal string.\nThis could be very useful for mock-up testing.\n* Implement the `echo_read_until` directive to allow reading request data until seeing a terminator\nstring literal specified as the directive argument.\n* Implement the `echo_read_regex` directive to allow reading request data according to a user-supplied\nPerl-compatible regular expression (maybe we could use libsregex to ensure efficient streaming reading).\n* Port over the \"postpone_output\" feature of the \"http\" subsystem. This could improve performance\nby reducing syscalls (and potentially underlying data packets too).\n\n[Back to TOC](#table-of-contents)\n\nInstallation\n============\n\nGrab the nginx source code from [nginx.org](http://nginx.org/), for example,\nthe version 1.9.3 (see [nginx compatibility](#compatibility)), and then build the source with this module:\n\n```bash\nwget 'http://nginx.org/download/nginx-1.9.3.tar.gz'\ntar -xzvf nginx-1.9.3.tar.gz\ncd nginx-1.9.3/\n\n# Here we assume you would install you nginx under /opt/nginx/.\n./configure --prefix=/opt/nginx \\\n    --with-stream \\\n    --add-module=/path/to/stream-echo-nginx-module\n\nmake -j2\nsudo make install\n```\n\n[Back to TOC](#table-of-contents)\n\nCompatibility\n=============\n\nThe following versions of Nginx should work with this module:\n\n* **1.9.x**                       (last tested: 1.9.7)\n\nNGINX versions older than 1.9.0 will *not* work due to the lack of the \"stream\" subsystem.\n\n[Back to TOC](#table-of-contents)\n\nCommunity\n=========\n\n[Back to TOC](#table-of-contents)\n\nEnglish Mailing List\n--------------------\n\nThe [openresty-en](https://groups.google.com/group/openresty-en) mailing list is for English speakers.\n\n[Back to TOC](#table-of-contents)\n\nChinese Mailing List\n--------------------\n\nThe [openresty](https://groups.google.com/group/openresty) mailing list is for Chinese speakers.\n\n[Back to TOC](#table-of-contents)\n\nReport Bugs\n===========\n\nAlthough a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to\n\n1. create a ticket on the [issue tracking interface](https://github.com/openresty/stream-echo-nginx-module/issues) provided by GitHub,\n1. or send a bug report, questions, or even patches to the [OpenResty Community](#community).\n\n[Back to TOC](#table-of-contents)\n\nSource Repository\n=================\n\nAvailable on github at [openresty/stream-echo-nginx-module](https://github.com/openresty/stream-echo-nginx-module).\n\n[Back to TOC](#table-of-contents)\n\nAuthor\n======\n\nYichun \"agentzh\" Zhang (章亦春) *\u0026lt;agentzh@gmail.com\u0026gt;*, OpenResty Inc.\n\nThis wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.\n\n[Back to TOC](#table-of-contents)\n\nCopyright \u0026 License\n===================\n\nCopyright (c) 2015-2017, Yichun \"agentzh\" Zhang (章亦春) \u003cagentzh@gmail.com\u003e, OpenResty Inc.\n\nThis module is licensed under the terms of the BSD license.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n[Back to TOC](#table-of-contents)\n\nSee Also\n========\n\n* [ngx_stream_lua_module](https://github.com/openresty/stream-lua-nginx-module/#readme)\n* [ngx_http_echo_module](https://github.com/openresty/echo-nginx-module/#readme)\n* NGINX's [stream subsystem](http://nginx.org/en/docs/stream/ngx_stream_core_module.html)\n* [OpenResty](https://openresty.org)\n\n[Back to TOC](#table-of-contents)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenresty%2Fstream-echo-nginx-module","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenresty%2Fstream-echo-nginx-module","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenresty%2Fstream-echo-nginx-module/lists"}