Pipy is a tiny, high performance, highly stable, programmable proxy written in C++



Pipy is a tiny, high performance, highly stable, programmable proxy. Written in C++, built on top of Asio asynchronous I/O library, Pipy is extremely lightweight and fast, making it one of the best choices for service mesh sidecars.

With builtin JavaScript support, thanks to PipyJS, Pipy is highly customizable and also predictable in performance with no garbage collection overhead found in other scriptable counterparts.

At its core, Pipy has a modular design with a set of fundamental filters that can be chained together to make a pipeline, through which network data can flow and get processed along the way. The way Pipy is designed makes it versatile enough for not only service mesh sidecars but also other use cases involving intermediate message processing between network nodes.


Pipy is designed for high compatibility across different operating systems and CPU architectures. Pipy has been fully tested on these platforms:

  • CentOS 7
  • Ubuntu 18/20
  • FreeBSD 12/13
  • macOS Big Sur

CentOS7/REHL7 or FreeBSD are recommended in production environments.

How to Build

Build from Scratch

Before building, the following tools are required to be installed first:

  • Clang 5.0+
  • CMake 3.0+
  • Node.js v12+ (only required if the builtin web UI is turned on)

With the above tools installed, just run the build script to start building:


The executable is located under bin/. Type bin/pipy -h for more information.

Build the Docker Image

To build the Docker image, run the following commands:

cd pipy
sudo docker build --squash --rm -t pipy .

Note: For a smaller image, you might want to use --squash option. It is an experimental feature, so you have to add { "experimental": true } to /etc/docker/daemon.json and restart Docker daemon to enable it.

For more information about Docker's --squash option, please refer to Docker Documentation

Quick Start

Install with RPM

yum -y install http://repo.flomesh.cn/pipy/pipy-latest.el7_pl.x86_64.rpm

Show Command Line Options

$ pipy --help

List Builtin Filters and Their Parameters

$ pipy --list-filters
$ pipy --help-filters

Run on CLI

Let's take the echo server in test/001-echo/ as an example. To start a Pipy instance that echos whatever the request has in its body, say

$ pipy test/001-echo/pipy.js

Or, while developing and debugging, one can start Pipy in web UI mode by using:

$ pipy test/ --gui-port=6060

Run with Docker

Pipy Docker image can be configured with a few environment variables:

  • PIPY_CONFIG_FILE= for the location of Pipy configuration file

  • PIPY_SPAWN=n for the number of Pipy instances you want to start, where n is the number of instantces subtracted by 1. For example, you use PIPY_SPAWN=3 for 4 instances.

docker run -it --rm -e PIPY_CONFIG_FILE=/etc/pipy/test/001-echo/pipy.cfg flomesh/pipy:latest
docker run -it --rm -e PIPY_CONFIG_FILE=/etc/pipy/test/011-serve-static/pipy.cfg -e PIPY_SPAWN=1 -p 8000:6000 flomesh/pipy:latest

Pipy also supports transparent proxy in Docker environment where NET_ADMIN capability is enabled by adding --cap-add NET_ADMIN option to the startup command:

docker run -it --rm -e PIPY_CONFIG_FILE=/etc/pipy/test/001-echo/pipy.cfg --cap-add NET_ADMIN flomesh/pipy:latest

Run on Kubernetes

You can run Pipy on Kubernetes by using pipy-operator:

git clone https://github.com/flomesh-io/pipy-operator
cd pipy-operator
kubectl apply -f etc/cert-manager-v1.1.0.yaml
kubectl apply -f artifact/pipy-operator.yaml
kubectl apply -f config/samples/standalone/001-echo.yaml
kubectl apply -f config/samples/ingress/001-routing.yaml
kubectl apply -f config/samples/sidecar/007-deployment-pipy.yaml


You can find Pipy documentation under docs/.

Copyright & License





  • HTTP response code based failovers with caching

    HTTP response code based failovers with caching

    Could I achieve HTTP response code based failovers with caching using pipy?

    What I mean is

    • Pipy receives a request and forwards it to the primary backend
    • If the request fails with e.g. 404, pipy retries the request with a secondary backend
    • Failed primary backend request urls are cached e.g. on disc
    • For performance, request urls present in the list of cached urls are forwarded to the secondary backend skipping the primary

    Is this something I could do with pipy?

    opened by kickthemooon 4
  • pipy容器启动时,可能会出现OOMKilled


    此现象是按照https://github.com/flomesh-io/service-mesh-demo 搭建demo时出现的。




    image 查看pipy容器日志时,发现日志停在这里,如果是正常启动的pipy,后续会打印更多日志



    opened by cngdkxw 4
  • gui build fail

    gui build fail

    environment variable

    os : deepin 20.2.1

    uname info:

    Linux sxyy-PC 5.10.29-amd64-desktop #2 SMP Mon Apr 26 09:48:13 CST 2021 x86_64 GNU/Linux

    node: version v14.17.0 npm: version 7.16.0

    Generating JavaScript bundles failed
    Converting circular structure to JSON
        --> starting at object with constructor 'SymbolDef'
        |     property 'orig' -> object with constructor 'Array'
        |     index 0 -> object with constructor 'AST_SymbolFunarg'
        --- property 'thedef' closes the circle
    File: node_modules/monaco-editor/esm/vs/editor/standalone/browser/standalone-tokens.css
     ERROR #98123  WEBPACK
    Generating JavaScript bundles failed
    Converting circular structure to JSON
        --> starting at object with constructor 'SymbolDef'
        |     property 'orig' -> object with constructor 'Array'
        |     index 0 -> object with constructor 'AST_SymbolFunarg'
        --- property 'thedef' closes the circle
    File: node_modules/monaco-editor/esm/vs/platform/actions/browser/menuEntryActionViewItem.css
     ERROR #98123  WEBPACK
    Generating JavaScript bundles failed
    Converting circular structure to JSON
        --> starting at object with constructor 'SymbolDef'
        |     property 'orig' -> object with constructor 'Array'
        |     index 0 -> object with constructor 'AST_SymbolFunarg'
        --- property 'thedef' closes the circle
    File: node_modules/monaco-editor/esm/vs/platform/contextview/browser/contextMenuHandler.css
    opened by sixinyiyu 4
  • on kylin system build error:error:   variable length array of non-POD element type 'pjs::Value'      Value layouts[n]

    on kylin system build error:error: variable length array of non-POD element type 'pjs::Value' Value layouts[n]

    Bug Report

    Make sure to review these points before submitting issues - thank you!

    • Make sure a similar issue does not exist yet: use the search box.
    • Include reproducible code: we should be able to paste it into an editor, run it and get the same error as you. Otherwise it's impossible for us to reproduce the bug.
    • Write code in the issue itself.
    • Reduce code, if possible, to the minimum size that reproduces the bug.
    • If all of the above is impossible due to a large project, create a branch that reproduces the bug and point us to it.
    • Provide details about the environment like how you are running Pipy, upstream services, client software etc. The more the details, the better it will help us understand and diagnose the problem.
    • Include pipy version (pipy -v) and OS. If possible, try to see if the bug still reproduces on master.
    kind:bug status:invalid 
    opened by WuDaWeiCTO 3
  • the execution cycle of  the main pipeline and fork pipeline  ?

    the execution cycle of the main pipeline and fork pipeline ?

    Version : 0.0.0 Commit : d54c0aaae262756f35ebf8256bd4dae7617b8444 Commit Date : Wed, 9 Jun 2021 13:56:10 +0800 Host : Linux-5.10.18-amd64-desktop x86_64 OpenSSL : OpenSSL 1.1.1g 21 Apr 2020

        () => new Message({ status: 200 }, '成功!\n')
        msg => (
          console.log('main service response')
        () => (
          console.log('main service session end')
          () => console.log('invoke B service ...')
          () => new Message(
              method: 'POST',
              path: '/A',
              headers: {
                host: '',
                'Content-Type': 'application/json',
              cmd: 'add',
              module: 'keyworld',
          msg => (
            console.log('Get B service response' + msg.body)
          () => console.log('invoke A service ...')
          () => new Message({
            method: 'GET',
            path: '/hello',
            headers: {
              host: '',
          msg => (
            console.log('Get A service response' + msg.body)
    2021-06-30 10:26:22 [info] [pjs] invoke A service ...
    2021-06-30 10:26:22 [info] [pjs] invoke B service ...
    2021-06-30 10:26:22 [info] [pjs] main service response
    HTTP/1.1 200 
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 5
    Date: Wed, 30 Jun 2021 02:26:22 GMT
    2021-06-30 10:26:22 [info] [pjs] Get A service responseHello
    2021-06-30 10:26:22 [info] [pjs] main service session end
    the /A endpoint sleep for 5 seconds until retrun  response.
    does the main  session end when the B pipeline got the response ? 
    I want to know when it will print B resposne ? 
    use wait block the code until B got resposne?
    opened by sixinyiyu 3
  • after connect invoke onData twice

    after connect invoke onData twice

    I want to know the life cycle of pipy ,

        () => (
          console.log('6081session start')
        () => (
          _queue.push(Date.now() + 6081),
          console.log('0681 onData', JSON.stringify(_queue))

    out put

    2021-06-22 11:09:59 [info] [pjs] 6080 session end [1624331405455]
    2021-06-22 11:09:59 [info] [pjs] 0681 onData [1624331405455,1624331405456]
    2021-06-22 11:09:59 [info] [pjs] 0681 onData [1624331405455,1624331405456,1624331405456]
    opened by sixinyiyu 3
  • Segfaults when context vars are duplicated

    Segfaults when context vars are duplicated

    Bug Report

    Duplicating context variables is causing Pipy to Segv on *nix based systems. Behavior is inconsistent on different Oses as on CentOS it crashes at startup, while on Ubuntu (focal) 20.04 LTS , it crashes at exit.

    Mac M1 machine doesn't show this behavior

    Pipy Version

    Version     : nightly-202210120857
    Commit      : 78b04769a3c9144aa42edb3b893bbce203c32e1f
    Commit Date : Wed, 12 Oct 2022 16:57:28 +0800
    Host        : Linux-5.15.0-1020-azure x86_64
    OpenSSL     : OpenSSL 1.1.1q  5 Jul 2022
    Builtin GUI : No

    Steps to reproduce

    $ pipy -e "pipy({_g: {}, _g: {}}).listen(8000)"


    $ ./pipy -e "pipy({_g: {}, _g: ''}).listen(8000)"
    2022-10-14 14:13:09.638 [INF] [config]
    2022-10-14 14:13:09.638 [INF] [config] Module
    2022-10-14 14:13:09.638 [INF] [config] =======
    2022-10-14 14:13:09.638 [INF] [config]
    2022-10-14 14:13:09.638 [INF] [config]  [Listen on 8000 at]
    2022-10-14 14:13:09.638 [INF] [config]  ----->|
    2022-10-14 14:13:09.638 [INF] [config]        |
    2022-10-14 14:13:09.638 [INF] [config]
    2022-10-14 14:13:09.638 [INF] [config]  <---|
    2022-10-14 14:13:09.638 [INF] [config]
    2022-10-14 14:13:09.638 [INF] [listener] Listening on TCP port 8000 at
    ^C2022-10-14 14:13:12.648 [INF] [shutdown] Shutting down...
    Segmentation fault (core dumped)
    opened by naqvis 2
  • duplicated builtin metric in pipy repo aggregated result

    duplicated builtin metric in pipy repo aggregated result

    What happened

    builtin metric pipy_outbound_count is duplicated in the pipy repo aggregated result.

    Reproduce the issue

    1. Start pipy repo, create a codebase with this simple script
      router = new algo.URLRouter({
        '/*': new algo.RoundRobinLoadBalancer(['', '']),
    ) => pipy({
        _target: undefined,
        _requestCounter: new stats.Counter('http_requests_count', ['method', 'status', 'host', 'path']),
        _reqHead: null,
        _resHead: null,
        _path: null,
        _method: null,
        _host: null,
        _reqTime: 0,
          msg => (
            _target = router.find(
            _reqHead = msg.head,
            _path = (new URL(msg.head.path)).pathname,
            _method = msg.head.method,
            _host = msg.head.headers.host,
            _reqTime = Date.now()
            () => Boolean(_target), (
              $=>$.muxHTTP(() => _target).to(
                $=>$.connect(() => _target.id)
            ), (
                new Message({ status: 404 }, 'No route')
            msg => (
              _resHead = msg.head,
              _resHead && _requestCounter.withLabels(_method, _resHead.status, _host, _path).increase()
    2. Start multiple pipy instance and subscribe to the codebase, maybe one instance could reproduce the issue too.
    ulimit -SHn 655360
    export REPO=
    for i in `seq 1 4`
            export PIPY_NAME=01-$i
            if [ ! -f uuid.$i ]
                    uuidgen > uuid.$i
            nohup pipy --reuse-port --instance-uuid=$(cat uuid.$i) --instance-name=$PIPY_NAME $REPO 2>&1 > /dev/null &
    3. Start load generator and make some requests to proxy, 3-5 seconds may be long enough for the pipy instance to create multiple connections to the upstream. Stop the loads and wait until the connections to the upstreams closed (check with `ss -tn`), then starting a new round of requests.

    hmm... I use k6 with the test script, but I thinks it's not important:

    $ ./k6 run metric.js -u 10 -d 5s
    import http from 'k6/http';
    import { check } from 'k6';
    import {
    } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
    export const options = {
      summaryTrendStats: ['avg', 'min', 'med', 'max', 'p(95)', 'p(99)', 'p(99.9)', 'p(99.99)', 'count'],
      noConnectionReuse: false,
      insecureSkipTLSVerify: true,
    const first_name = [
    const last_name = [
    const ids = [
    const targets = [
        name: 'hello',
        url: '',
        headers: {},
        checker: {
          'hello check': (r) => r.body.includes('Hi, there'),
    export default function() {
      let target = targets[0];
      let resp = http.get(target.url + randomItem(first_name) + '-' + randomItem(last_name) + randomItem(ids), {
        headers: target.headers,
      check(resp, target.checker);
    4. you could see there are duplicated `pipy_outbound_count` entries on the repo/metrics page, after each round of test.
    $ curl -s | grep -E 'outbound_count{'
    pipy_outbound_count{instance="01-1"} 6
    pipy_outbound_count{instance="01-1",peer="[]:6060"} 2
    pipy_outbound_count{instance="01-1",peer="[]:80"} 2
    pipy_outbound_count{instance="01-1",peer="[]:80"} 1
    pipy_outbound_count{instance="01-1",peer="[]:80"} 2
    pipy_outbound_count{instance="01-1",peer="[]:80"} 2
    pipy_outbound_count{instance="01-1",peer="[]:80"} 2
    pipy_outbound_count{instance="01-1",peer="[]:80"} 2
    pipy_outbound_count{instance="01-3"} 2
    pipy_outbound_count{instance="01-3",peer="[]:6060"} 1
    pipy_outbound_count{instance="01-3",peer="[]:80"} 2
    pipy_outbound_count{instance="01-3",peer="[]:80"} 1
    pipy_outbound_count{instance="01-3",peer="[]:80"} 1
    pipy_outbound_count{instance="01-3",peer="[]:80"} 1
    pipy_outbound_count{instance="01-2"} 4
    pipy_outbound_count{instance="01-2",peer="[]:6060"} 1
    pipy_outbound_count{instance="01-2",peer="[]:80"} 1
    pipy_outbound_count{instance="01-2",peer="[]:80"} 2
    pipy_outbound_count{instance="01-2",peer="[]:80"} 1
    pipy_outbound_count{instance="01-2",peer="[]:80"} 2
    pipy_outbound_count{instance="01-2",peer="[]:80"} 1
    pipy_outbound_count{instance="01-4"} 3
    pipy_outbound_count{instance="01-4",peer="[]:6060"} 1
    pipy_outbound_count{instance="01-4",peer="[]:80"} 2
    pipy_outbound_count{instance="01-4",peer="[]:80"} 1
    pipy_outbound_count{instance="01-4",peer="[]:80"} 1
    pipy_outbound_count{instance="01-4",peer="[]:80"} 1
    pipy_outbound_count{instance="01-4",peer="[]:80"} 1
    pipy_outbound_count{instance="01-4",peer="[]:80"} 1


    Large set of pipy instances and upstream connections, may cause the metric explosion over time.

    Expect behavior

    There should not be any duplcated metric.

    Version info

    pipy repo: 0.50.0-88

    opened by ethinx 2
  • Accessing Existing/Non-Existing variables in onEnd not working

    Accessing Existing/Non-Existing variables in onEnd not working

    Pipy version

    Using the latest commit

    Version     : 0.50.0-18
    Commit      : b80b1bc464f95b3ad6c2f2b38c2e7c0acc065877
    Commit Date : Thu, 25 Aug 2022 11:47:51 +0800
    Host        : Darwin-21.6.0 arm64
    OpenSSL     : OpenSSL 1.1.1q  5 Jul 2022
    Builtin GUI : Yes
    Samples     : Yes

    Bug Report

    • Accessing Global/Context variables in onEnd is not working.
    • Accessing any invalid or non-existing variable in onEnd doesn't generate any error/warning

    Problem 1

    For example trying to access any valid variable doesn't yield any outcome.

      () => console.log('print some global variable', __inbound.remoteAddress)

    Won't print anything, but logging any string literal works.

    Problem 2

    For example trying to access any invalid or non-existing variable doesn't yield any error/warning.

      () => console.log('print some non existing variable', _not_existing_variable)

    No error/warning is generated.

    opened by naqvis 2
  • Pipy process crashes when printing

    Pipy process crashes when printing "__inbound.remoteAddress" in onEnd()

    Pipy process crashes when printing "__inbound.remoteAddress" in onEnd().

    Version : nightly-202208231036 Commit : 8436d3bcd9c1b05f4fd6bea5111cedf3db098ec4 Commit Date : Mon, 22 Aug 2022 23:05:38 +0800 Host : Linux-5.15.0-43-generic x86_64 OpenSSL : OpenSSL 1.1.1q 5 Jul 2022 Builtin GUI : Yes Samples : Yes

    test pjs: ///////////////

    (( ) => pipy({ }) .listen(8081) .onEnd( () => console.log('bug ......', __inbound.remoteAddress) ) .serveHTTP( () => new Message('Hi, there!\n') ) )()

    opened by wanpf 2
  • HTTPS透传代理如何实现?


    下文中描述的HTTPS透传代理,用Pipy如何实现? https://blog.xmgspace.me/archives/nginx-sni-dispatcher.html






    opened by cfgxy 2
  • [ci] add missing BuildRequires

    [ci] add missing BuildRequires

    there are couple missing BuildRequires not specified by the .spec recipe. without them, mock is not able to build the rpm package in a clean room environment.

    tested on rockylinux-9 using:

    $ VERSION=0.70.0 REVISION=1 rpmbuild -bs *.spec
    $ mock --verbose --rebuild $HOME/rpmbuild/SRPMS/pipy-0.70.0-1.src.rpm

    Signed-off-by: Kefu Chai [email protected]

    We thank you for helping improve Pipy. In order to ease the reviewing process, we invite you to read the guidelines and ask you to consider the following points before submitting a PR:

    1. We prefer to discuss the underlying issue prior to discussing the code. Therefore, we kindly ask you to refer to an existing issue, or an existing discussion in a public space with members of the Core Team. In few cases, we acknowledge that this might not be necessary, for instance when refactoring code or small bug fixes. In this case, the PR must include the same information an issue would have: a clear explanation of the issue, reproducible code, etc.

    2. Focus the PR to the referred issue, and restraint from adding unrelated changes/additions. We do welcome another PR if you fixed another issue.

    3. If your change is big, consider breaking it into several smaller PRs. In general, the smaller the change, the quicker we can review it.

    opened by tchaikov 6
  • Pjs object property integer number key will be converted to float string

    Pjs object property integer number key will be converted to float string

    Bug Report

    Pjs object property integer number key will be converted to float string

    Pipy Version

    Version     : nightly-202211132335
    Commit      : 08f33aae4a5d2a943af8b574f0d27e4d4fb3a13e
    Commit Date : Mon, 14 Nov 2022 11:04:23 +0800
    Host        : Linux-3.10.0-1160.76.1.el7.x86_64 x86_64
    OpenSSL     : OpenSSL 1.1.1q  5 Jul 2022
    Builtin GUI : Yes
    Samples     : Yes

    Steps to reproduce

      cfg: { 1: "a", 2: "b" }
      .onStart(() => new Message)
      .handleMessage(() => console.log(cfg))
    $ pipy test.js


    2022-11-14 22:53:07.327 [INF] [config]
    2022-11-14 22:53:07.327 [INF] [config] Module /test.js
    2022-11-14 22:53:07.327 [INF] [config] ===============
    2022-11-14 22:53:07.327 [INF] [config]
    2022-11-14 22:53:07.327 [INF] [config]  [Task #1 (3s)]
    2022-11-14 22:53:07.327 [INF] [config]  ----->|
    2022-11-14 22:53:07.327 [INF] [config]        |
    2022-11-14 22:53:07.327 [INF] [config]       handleMessage -->|
    2022-11-14 22:53:07.327 [INF] [config]                        |
    2022-11-14 22:53:07.327 [INF] [config]  <---------------------|
    2022-11-14 22:53:07.327 [INF] [config]  
    2022-11-14 22:53:07.327 [INF] [object Literal] {"1.000000":"a","2.000000":"b"}
    opened by leoatpolaris 2
  • pipy crash when repo addr point to domain name which is configured in /etc/hosts

    pipy crash when repo addr point to domain name which is configured in /etc/hosts

    What happened

    As subject

    Reproduce the issue

    1. Download the latest version(x86) from https://flomesh.io/nightly/
    2. Start a pipy repo
    2022-09-20 18:27:06.088 [INF] [admin] Starting admin service...
    2022-09-20 18:27:06.088 [INF] [listener] Listening on TCP port 6060 at ::
      You can now view Pipy GUI in the browser:
    1. Set a host entry in /etc/hosts, e.g. pipy-repo.com on the worker node
    2. Start pipy and point to the repo, use domain name instread of IP addr.
    pipy http://pipy-repo.com:6060/repo/tutorial/01-hello/

    That's all. However if we compile pipy locally and run it on the same node, there is no problem.

    May the issue relate to the compiled environment? Only x86 version meets this problem now.

    I tried to get the backtrace via gdb as follows

    Reading symbols from pipy...
    (gdb) set args http://pipy-repo.com:6060/repo/tutorial/01-hello/
    (gdb) start
    Temporary breakpoint 1 at 0x5b5bf0
    Starting program: /usr/local/bin/pipy http://pipy-repo.com:6060/repo/tutorial/01-hello/
    Temporary breakpoint 1, 0x00000000005b5bf0 in main ()
    (gdb) s
    Single stepping until exit from function main,
    which has no line number information.
    [New LWP 57759]
    [New LWP 57760]
    [New LWP 57761]
    [New LWP 57762]
    [New LWP 57763]
    warning: File "/usr/lib/x86_64-linux-gnu/libthread_db.so.1" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
    To enable execution of this file add
            add-auto-load-safe-path /usr/lib/x86_64-linux-gnu/libthread_db.so.1
    line to your configuration file "/home/ubuntu/.config/gdb/gdbinit".
    To completely disable this security protection add
            set auto-load safe-path /
    line to your configuration file "/home/ubuntu/.config/gdb/gdbinit".
    For more information about this security protection see the
    "Auto-loading safe path" section in the GDB manual.  E.g., run from the shell:
            info "(gdb)Auto-loading safe path"
    warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
    Thread 6 "pipy" received signal SIGSEGV, Segmentation fault.
    [Switching to LWP 57763]
    0x00007ffff5650a7f in __GI___pthread_enable_asynccancel () at ./nptl/cancellation.c:34
    34      ./nptl/cancellation.c: No such file or directory.
    (gdb) bt
    #0  0x00007ffff5650a7f in __GI___pthread_enable_asynccancel () at ./nptl/cancellation.c:34
    #1  0x00007ffff5606ca7 in __GI___getrandom (flags=1, length=8, buffer=0x7ffff57e04d8 <tcache_key>) at ../sysdeps/unix/sysv/linux/getrandom.c:29
    #2  __GI___getrandom ([email protected]=0x7ffff57e04d8 <tcache_key>, [email protected]=8, [email protected]=1) at ../sysdeps/unix/sysv/linux/getrandom.c:27
    #3  0x00007ffff5661a66 in tcache_key_initialize () at ./malloc/malloc.c:3162
    #4  ptmalloc_init () at ./malloc/arena.c:321
    #5  0x00007ffff5665355 in ptmalloc_init () at ./malloc/arena.c:315
    #6  __GI___libc_malloc (bytes=472) at ./malloc/malloc.c:3295
    #7  0x00007ffff563f6ce in __fopen_internal (is32=1, mode=0x7ffff5798074 "rce", filename=0x7ffff579c262 "/etc/hosts") at ./libio/iofopen.c:65
    #8  _IO_new_fopen (filename=0x7ffff579c262 "/etc/hosts", mode=0x7ffff5798074 "rce") at ./libio/iofopen.c:86
    #9  0x00007ffff5714e32 in __GI___nss_files_fopen ([email protected]=0x7ffff579c262 "/etc/hosts") at ./nss/nss_files_fopen.c:27
    #10 0x00007ffff5719746 in internal_setent (stream=<synthetic pointer>) at nss_files/files-XXX.c:76
    #11 __GI__nss_files_gethostbyname4_r (name=0x7ffff5ff3a80 "pipy-repo.com", pat=0x7ffff5ff3278, buffer=0x7ffff5ff3580 "", buflen=1024, errnop=0x7ffff5ff46b0,
        herrnop=0x7ffff5ff46e8, ttlp=0x0) at nss_files/files-hosts.c:389
    #12 0x0000000000a1688f in gaih_inet.constprop ()
    #13 0x0000000000a183d9 in getaddrinfo ()
    #14 0x00000000005c9431 in asio::detail::resolve_query_op<asio::ip::tcp, pipy::OutboundTCP::resolve()::$_1>::do_complete(void*, asio::detail::scheduler_operation*, std::error_code const&, unsigned long) ()
    #15 0x0000000000535d81 in asio::detail::scheduler::do_run_one(asio::detail::conditionally_enabled_mutex::scoped_lock&, asio::detail::scheduler_thread_info&, std::error_code const&) ()
    #16 0x00000000005357e1 in asio::detail::scheduler::run(std::error_code&) ()
    #17 0x00000000005c84c6 in asio::detail::posix_thread::func<asio::detail::resolver_service_base::work_io_context_runner>::run() ()
    #18 0x000000000053565d in asio_detail_posix_thread_function ()
    #19 0x00000000008c00f9 in start_thread (arg=<optimized out>) at pthread_create.c:477
    #20 0x0000000000a1dd53 in clone ()

    Expect behavior

    pipy start normally with any valid url.

    Version info


    Distributor ID: Ubuntu
    Description:    Ubuntu 22.04 LTS
    Release:        22.04
    Codename:       jammy


    Version     : nightly-202209191340
    Commit      : 15bd2ef63098d73bcca2dccf4ff8a294ba19dd39
    Commit Date : Mon, 19 Sep 2022 21:40:15 +0800
    Host        : Linux-5.15.0-1019-azure x86_64
    OpenSSL     : OpenSSL 1.1.1q  5 Jul 2022
    Builtin GUI : No
    Samples     : No
    opened by ethinx 1
  • Suspicious memory usage

    Suspicious memory usage

    What happened

    Run pipy proxy with script in sample/http, client send requests to route /, /api, /api/private, /hi, /home in http/https randomly. Run several rounds of the test, and I notice that the memory usage of pipy may ramp up at the time of new run starts.

    Reproduce the issue

    1. Start pipy with script in sample/http, two upstreams, and one http server for responding the pipy logging request
    2. Run test by k6 and the attached test.js.gz script several times
    while true; do ./k6 run -d 2m -u 1000 test.js; sleep 180; done

    Expect behavior

    Should some of the memory be recycled after testing, or should the mem usage be stable?


    CleanShot 2022-08-04 at 10 10 26@2x

    Version info

    Version     : 0.50.0-37
    Commit      : 5c115a842c4e98559fd83a6271be2d3ba79ef914
    Commit Date : Tue, 26 Jul 2022 19:08:51 +0800
    Host        : Linux-5.15.0-1014-azure x86_64
    OpenSSL     : OpenSSL 1.1.1q  5 Jul 2022
    Builtin GUI : No
    Tutorial    : No
    opened by ethinx 3
  • 0.70.0-2(Oct 21, 2022)



    • NMI (Native Module Interface) for dynamically loaded modules written in C
    • New module/plugin system by using chain() filters
    • Support loop logic in pipelines by using the new replay() filter
    • Builtin GUI frontend greatly reduced in size by using Brotli compression


    • Support Thrift protocol
    • Support the Proxy protocol proposed by HAProxy
    • Support outbound UDP with ephemeral local ports
    • Support TPROXY on UDP


    • Implementation of the standard ECMAScript builtin objects Map and Set
    • Encode and decode DNS messages
    • Logging API now supports HTTPS receivers and Syslog
    • Expose subject alternative names of a certificate
    • Mux filters to support limit of maximum messages per session
    • Netmask API now supports IPv6

    Documentation & Samples

    • Renovation of the documentation system by using TypeScript
    • All new tutorials with complete API reference
    • New samples for HTTP proxy common use cases
    Source code(tar.gz)
    Source code(zip)
    pipy-0.70.0-2-alpine-aarch64.tar.gz(11.70 MB)
    pipy-0.70.0-2-alpine-x86_64.tar.gz(12.20 MB)
    pipy-0.70.0-2-el7-x86_64.rpm(2.49 MB)
    pipy-0.70.0-2-generic_linux-aarch64.tar.gz(4.01 MB)
    pipy-0.70.0-2-generic_linux-loongarch64.tar.gz(2.83 MB)
    pipy-0.70.0-2-generic_linux-x86_64.tar.gz(4.84 MB)
    pipy-repo-0.70.0-2-alpine-aarch64.tar.gz(35.46 MB)
    pipy-repo-0.70.0-2-alpine-x86_64.tar.gz(35.78 MB)
  • 0.50.0-25(Jul 18, 2022)




    • New pipeline type for reading from files (or stdin)
    • Added onStart()/onEnd() pipeline lifecycle callbacks
    • Support idle timeout for inbound and outbound connections
    • Transparent mode port listening
    • Socket reading performance optimization


    • Collect metrics on a repo node from all workers connected to it
    • Record metric history on a repo node for up to 5 minutes for charts showing on the Admin UI
    • Expose metrics from a repo node to Prometheus with gzip compression
    • Added new metrics for inbound/outbound data and connection times


    • Send real-time log streams from workers to the repo


    • Send codebase update notifications to workers via WebSocket to reload script with no delay
    • Support deletion of a codebase


    • New nesting syntax for in-place anonymous sub-pipelines
    • Added pipy.solve() to evaluate script from external files
    • Added -e option for evaluating PipyJS script from the command line
    • Support function argument default values
    • String size upper limit raised to 256MB
    • Performance optimization of object literal construction


    HTTP/2 & gRPC

    • Support full HTTP/2 specification except for server push
    • Extended demuxHTTP()/muxHTTP() to support HTTP/2 protocol negotiation


    • Support HTTP message trailers
    • Proper handling of responses with status code 100
    • Detect plain HTTP/1 traffic by detectProtocol() filter
    • HTTP/1.x decoder performance optimization


    • Added a new pipeline communication model for MQTT-like protocols using input()/output() filters
    • Standard-conformance bug fixes


    • Added WebSocket codecs
    • Added a communication channel between the worker and the repo via WebSocket


    • Added UDP listeners


    • Support ALPN in acceptTLS() and connectTLS() filters
    • OpenSSL version bumped to 1.1.1o


    • New API for general purpose logging
    • Added algo.Quota as a replacement of the old "accounts" used by throttling filters
    • Added Data.shiftWhile() and shiftTo() for simple data format parsing in PipyJS
    • Added LoadBalancer.next() with builtin connection pools
    • Added algo.uuid() for UUIDv4 generation
    • JSON.encode() performance optimization


    • New filter branch() that supports conditional embedded anonymous sub-pipelines
    • New filter depositMessage() for buffering large messages in a temp file
    • New filter deframe() for general purpose protocol deframing using PipyJS
    • New filter compressMessage() for deflate/gzip compression
    • New filter decodeMultipart() for decoding a MIME multipart message into multiple messages
    • Support caps on the maximum queue size per session for all muxer filters
    • Support Brotli algorithm in decompressMessage() filter
    • Support writing to stdout using tee()
    • Support timeout in filter wait()

    Change Log:

    • [fix] package binary only, without the dictionaries 7f390375dd22c1cb79c63c61fcd2b3ea97cfe6bd (York Wong)
    • [doc] Add explanation for connection pools inside a load balancer 72c099264ad430fc44046b799585951e1501b69c (pajama-coder)
    • [fix] Silence a variable-not-used warning f1d33cee69adedd29863f9d70eedd0272bfa52c8 (pajama-coder)
    • [doc] Put away the old tutorial articles after step 7 into /docs/guides a78ead01707e5b3dc28653d32f2b10f99a811d43 (pajama-coder)
    • [doc] Update tutorial step 6: Configuration b5641834e66c0ed6a86d0bee478a0b8a127e96ee (pajama-coder)
    • Tiny fix in 02-echo 805697f1d4414db2b2a7fc05fc4a455549a1bd46 (shader13)
    • [fix] Crash when calling to a literal function defined in a function argument default value aaec71f7b844a3139d02a40ce2fd3f95b769eee4 (pajama-coder)
    • [doc] Reorder the old tutorial step 5 plugins to step 7 637d2398e9fd56ef5acfdfee6e629d9edcf365d6 (pajama-coder)
    • [core] When evaluation result is an object other than Configuration, show its content by converting to JSON 44558ff365a62644583b7a424797c064f672d340 (pajama-coder)
    • [doc] Upgrade tutorial step 5 5db6531cd280a5ec24ef813b659720a5f2c618a2 (pajama-coder)
    • [doc] Upgrade tutorial step 4 3f00fa156746e2f9ef0b71f6264248e16626bfc4 (pajama-coder)
    • [doc] Fix an incorrect sample output in the tutorial 1fa9db073c817d2ceddbc095037f049d9aebc4b4 (pajama-coder)
    • Modify tutorial 02-echo 79bb6eba3fc9f02ba7470ab96bd41bc6a2ff154a (shader13)
    • Avoid multiple set_pending on Endpoint::StreamBase. (#93) 3d043b55a2142c05c2fb10ccd908521d4fe82783 (pfans)
    • Modify concepts and tutorial hello fb54845054ff334e9f37d9c8ee1e53f01dd068ef (shader13)
    • [fix] Fix a crash when receiving an empty WebSocket command from the AdminLink 1d835d44c571634e8e99bfda1890e56e16f0968e (pajama-coder)
    • [fix] HTTP codec should notify about turning into a tunnel as early as possible but only change its own mode after MessageEnd 50ebe47591112447c1713a3476491e54450d0cce (pajama-coder)
    • [fix] Filter acceptHTTPTunnel failed to handle WebSocket due to the wrong timing of connection upgrade 3ba38bdf3365bff1813585227530f208d0150804 (pajama-coder)
    • [fix] Missing header file compiling on Ubuntu 53da4555a12dc4960c29d7b47baf2c998d498282 (pajama-coder)
    • [doc] Update Tutorial 3: Proxy 0639fed3feb27c4b6fbea4e44a68c8939ad0fa5f (pajama-coder)
    • [doc] Update tutorial step 1 and 2 to reflect the latest changes f6604319b21725768a898be718219eb4d064ef8e (pajama-coder)
    • [doc] Update introduction materials in the docs and README 490b4067dd81df8ab2739d5db8237de7bcaff712 (pajama-coder)
    • [doc] Revise document Concepts as per the latest changes 58daca5d7f739f6bbb2a5f8a47e03afcd9acbba1 (pajama-coder)
    • [filter] New filter decodeMultipart() 9f595aa8c139e9cf3b4b7bf2f05347254195ea8b (pajama-coder)
    • [chore] Git ignore openssl-1.1.1q/build/ 6c20f250c28bdd8e5f74aa4945ba3b8f6957ddd2 (pajama-coder)
    • [core] Flowchart generation takes into account to() using pipeline names as its parameter 9a327f8c06bce990e20fcc4b6435ff49181afc51 (pajama-coder)
    • [gui] Improve the flowchart by running filter output lines out of the right-side of the boxes 206247dc9bf70ebd44f07ab1eba443feb86d1f1f (pajama-coder)
    • [pjs] Undefined elements should be put to the last when sorting arrays e6937aba011934b22fb911d225dbaa60a263bce4 (pajama-coder)
    • [pjs] No need to destruct values again when recycling array data back to the pool 464aaa249076e1daff728cf1d645e00e1dd05e95 (pajama-coder)
    • [api] Seed the random generator with high resolution clock 7cca3835ab6936e99786dfba44fc170d8fa90828 (pajama-coder)
    • [fix] A typo that caused the pjs::Data of pjs::Array never getting recycled back to the pool dad0f4a92da06ab9cbc49118763c5d18cd2b704d (pajama-coder)
    • [fix] A crash in the destruction of the system logger at quit time 49e6a8b9006fcfe81f4e428b8605a8d9bb4397d5 (pajama-coder)
    • [api] Make RoundRobinLoadBalancer output deterministic results 2806446ec2aa3590f9adc3134bf96be1cde13917 (pajama-coder)
    • [gui] Delete old log data shown in the browser when it's over 256KB ef592b881e96781149409d12621aae013d1d143c (pajama-coder)
    • [gui] Better starting code template after creating a new codebase 323e3189d9792231a378fc63c805d4de77f6002a (pajama-coder)
    • [fix] Math.random() wasn't randomly seeded 67d49c419b72de0342878bdfd5ba6d549fd1184a (pajama-coder)
    • [gui] Real-time log view had an unwanted gap on the bottom, now it's removed 00890cbcedbe4f556e3eb206139d2e77187a6276 (pajama-coder)
    • [filter] Do not alter a sub-pipeline's context directly in fork(), instead, pass initial arguments to its onStart() callback ded80371919b1394365b4fd84bc16826b5295af1 (pajama-coder)
    • [fix] LoadBalancers shouldn't have called the pure virtual function deselect() while destructing ae95c8c2e023da2c1ced37c1f9ef770b77dc695f (pajama-coder)
    • [fix] Anonymous pipeline layouts were not showing their source locations in the debug log while creating/destroying 49a4d229f12627c73c43e13cfa305541d5fddf65 (pajama-coder)
    • [filter] Changed split() filter to be used to split a message into multiple ones based on a given separator string 3ae0df456d51f141b8076d2f1144d14aaf72d751 (pajama-coder)
    • [core] Output only clean result to stdout when running as a general expression evaluator 156fe0f2b5011e225dc421e69f27f4f3dbd71397 (pajama-coder)
    • [core] Do not start pipeline with a default emtpy message. Instead, rely on onStart() for that matter. e1e90100bfe1f6e417fb680d9a78f73326036e53 (pajama-coder)
    • [chore] npm audit fix 0afab818c3b213d0f8167746cb2c7fbc11b48920 (pajama-coder)
    • Update openssl dep (#89) 8359401a541db40c55f550783f0f7d5818a1131d (Ali Naqvi)
    • [fix] Resolved files should be cleared when worker stops a91d1a065e433564ead3d2ac90a5be4d282db93b (pajama-coder)
    • [fix] MuxBase::SessionManager was deleted while SessionCluster is still needed by a weak ref in LoadBalancer, which led to a crash d367c5c91d2884438a8879e4b8ffda9f69d324d4 (pajama-coder)
    • [fix] Function arguments destructure failed for arguments other than the first one edadf2511ce41618f3c7c9b90bad5d0143a39d78 (pajama-coder)
    • [fix] Scripts in onStart() was triggered before the pipeline is fully connected, which led to some weird behaviours 9cdae793a878a23a14890b28076163024b76e67d (pajama-coder)
    • [pjs] Graph pipeline networks from scripts using comma separated expressions 3a5ca84579f144ad4891ae72fde581b714f23532 (pajama-coder)
    • [core] Repo to clean up instance status/metrics for inactive instances 298010834728bacca1449e1592861afb044bef4f (pajama-coder)
    • [core] Extend the default maxIdle from 10sec to 1min since we can now close up idle sessions in muxers immediately at shutdowns 9bf3fc17657df27a0615e0bdeecfb2eb88e92d77 (pajama-coder)
    • [fix] Events from onStart() missed an InputContext, which led to a crash in some cases 4cfc013b151f1bcd5202266d471778e230315f66 (pajama-coder)
    • [core] Do not send empty Data at the start of an Inbound, instead, user script can do that with onStart() 0892a2cb23d1031fe04d8d786aefee113e9501dd (pajama-coder)
    • [core] Remove the closeEOF option to Inbounds now that HTTP codecs can handle client StreamEnds properly c181e2b3875e990896ac44cfa18dddc719844f5c (pajama-coder)
    • [filter] Correctly handle StreamEnds from HTTP clients: do not close the connection until all requests are done f854c271e429e0ea71a82a54c47e59bc1b176bb5 (pajama-coder)
    • [filter] Remove the redudant blank lines between event dumps f14e3296a781427903c24e40bbccf5d85789101f (pajama-coder)
    • [filter] branch() now supports default fallback branch with the condition left out in the last pair of arguments a3ebb9f55144ffa88a9734b3c53f07b4c93e74df (pajama-coder)
    • [core] Support deletion of a codebase from the repo 141060002d4cedb5cffa33ca104bdd671dd52c5d (pajama-coder)
    • [fix] Configuration.handleStreamStarted was binded to the wrong function e9e136e8d9d1994be9c4c76dd335f815bf061c43 (pajama-coder)
    • [doc] Update JSDoc for the new interfaces added lately 3dbae54d731f26fc340fd741adebb1ebe0c5b51a (pajama-coder)
    • [core] Add onStart()/onEnd() callbacks to the beginning and end of a pipeline's lifecycle 00581ea91af34f483bd2ca1de75d55d6193800b4 (pajama-coder)
    • [fix] Trying to push a nullptr to the session list in a SessionCluster 54c9d4ed243798d8dfcfe03e0b27285d729a0d9a (pajama-coder)
    • [fix] Muxers did not start idle session recycling so led to a dangling pointer to a SessionCluster after the SessionManager is dead due to a script reload 98e45f2d73e0b9bf671da846efd04e33763b7c4a (pajama-coder)
    • [filter] Muxers to support maxQueue option to set a limit over the number of alive requests on a session f55ebbf9fc32083d765a91ec07d8c612f782f6a7 (pajama-coder)
    • [core] Send log tail to repo when requested from the admin gui in a browser 7e1f7afc7c54ef84921a1bbb271a258b70c83374 (pajama-coder)
    • [filter] Rewrite throttle filters to make use of algo.Quota objects instead of internal Account objects 885a889168b448c370400f052a65655b6798b5fe (pajama-coder)
    • [api] Add algo.Quota that is going to be used by throttle filters 92d177298e1c5ce8686993ff6dbf6ae568c66311 (pajama-coder)
    • [fix] Show the correct source filename and content of an error when loading a module or solving a script from another file 088df7f9c0fca52e4c385365bcb2cb77e5f022be (pajama-coder)
    • [fix] Crash when logging an erronous code position that is out of range 9c06c05871c48fb515790a6046cbe08d04b6f993 (pajama-coder)
    • [fix] Binary data dump() was screwed up because of handling in signed char mode ba54272b0e4c5dad91bcf124be94783d26fdcb02 (pajama-coder)
    • [fix] Reading mode FileStreams were affecting system logging to stderr 717cdb09767aaf53abb9cd815d8f83ecbc359f3d (pajama-coder)
    • [api] Report error when a joint-filter is missing a sub-pipeline ad84a2eee2f21854e31c4bf8b962543e4e9e32e5 (pajama-coder)
    • [fix] Graph with complex anonymous sub-pipelines was screwed up eaeb66ea040242d7abdc8a9d9178f4b86eacf05a (pajama-coder)
    • [core] Support IPv6 addresses including a percentage sign e8fbba7ca048ca78c7ab1f3a19633a5532847563 (pajama-coder)
    • [filter] Correctly handle 100 Continue responses in the HTTP muxer/demuxer c0ad0571635c041839e22dc3c232d15c43698b1e (pajama-coder)
    • [core] Logging to HTTP endpoints with complete options for batching and packing 887169019f5aa81eb3d26568695bd4f545a5b071 (pajama-coder)
    • [pjs] Support function default argument unpacking a8cd5a45030ad951e16da9eda46eaa214b26f96e (pajama-coder)
    • [core] Added pipy.solve() for evaluating expressions from external files 06b9417441a0b892a2ff79e0f1e0ee3c36eb4267 (pajama-coder)
    • [fix] Output of debug-level log interrupted the logging stream by reentrance 0118c024555afa91b53e72d9d31a63778a8414bb (pajama-coder)
    • [core] Broadcast codebase updates to all active instances via AdminLink 23c40040373f98b58ebef10c236a70d049d13645 (pajama-coder)
    • [core] Download and update source files before reload as triggered by SIGHUP 252b521dd4dcc5d39fc5e37fc126a46cf3e299dd (pajama-coder)
    • [core] Shutdown pipelines being used in Fetch as soon as SIGINT happens so that worker can quit timely 64d3fa01e12f79a07068f9460e03a56cd9a937f2 (pajama-coder)
    • [core] Replace the old pipy console log with the new logging API 67ae7f16fb5e0ba9e7a805530766d0295fd718c0 (pajama-coder)
    • [core] Receive log streams on the admin service and broadcast them to browsers 2f4c0683d0dd1833ea5a1d3791ce8306c04cf6e0 (pajama-coder)
    • [gui] Show log list on the admin UI e53dda35b63eb733ecc10ab81fa5b3a14cc5714c (pajama-coder)
    • Bump got from 12.0.0 to 12.1.0 2cc2a6cfd86866fde4dae7dae2a5035192d42fb9 (dependabot[bot])
    • [core] Support gzip for metrics data to Prometheus b1d8fdac59f5487f1d5bc22e422c608c544d44b2 (pajama-coder)
    • [fix] Show correct pipeline names/labels in the stats 1de859a24453db83ea30c345e657b8ed10b51584 (pajama-coder)
    • [fix] A connection-level window size larger than the default was not updated as expected at initialization b802185752faf9e78934969d5e1f98729ec552ef (pajama-coder)
    • [fix] Fix a crash when trying to send GOAWAY frame during the deletion of an Inbound 99d867dc6203f4b2fab00999db28068eec739112 (pajama-coder)
    • [filter] Optimize the logic of sending HTTP/2 window updates d560b4c063788a59829ed72b1f955a9be5f1b1f5 (pajama-coder)
    • [filter] Pack data before sending out from the HTTP/2 codec to boost up network I/O performance bd93c004fcd1fca2b3092022b1c4e41675db2be5 (pajama-coder)
    • [filter] Add connectionWindowSize and streamWindowSize options to muxHTTP() and demuxHTTP() 25bb60c7611adc6e849360388ab4f1b5f17200fc (pajama-coder)
    • [test] Show RPS in testcases 3d0b6a3cd9514a410b9137d4843fc8ab51176336 (pajama-coder)
    • [core] Retreive instance UUID from the WebSocket request path on the admin service df497ebd474ae0529b33434d01ba3ffe889056a9 (pajama-coder)
    • [core] Expose context creation interface via PipelineLayout 34df46dac588f0605414616e679e6c7be68c90f6 (pajama-coder)
    • [core] Remove the unnecessary type() property of PipelineLayout 6d9518782f2486542cbe52849e655d68a0784fd2 (pajama-coder)
    • [filter] Derive HTTP codec filters from the codec classes instead of wrapping around them 28081efe579284ea88d6e9db39f3c596cfce14d9 (pajama-coder)
    • [fix] encodeHTTPResponse()'s options.bodiless wasn't given an initial/default value a34035229dc90c3307e16c9346080dd4afed658a (pajama-coder)
    • [core] Extract ModuleBase out of Module so that C++ code using pipeline/filters can have a desired context shape as well 0c9aacbf83e833425137cb942d4e91b12e830d95 (pajama-coder)
    • [core] Report logs to the admin service 9c6faba1ef67f9d1b7a97fc046397bb31d1d7780 (pajama-coder)
    • [filter] Mux filters send StreamEnd to a session pipeline in all various cases when session is closed 52bc403a19ce006d10edf62f0e22456e3f50da2d (pajama-coder)
    • [core] Add JSON logger and HTTP logger target 2882ce227c634c3aa53495fcd46f4bfcbae0d571 (pajama-coder)
    • [core] Builtin logging API definition 61874cc4156842d35372e7f6ef4c719f5cc32df2 (pajama-coder)
    • [api] Added algo.uuid() for UUIDv4 generation e729cd2586b08b3a738c47cf0ddffee1d615c566 (pajama-coder)
    • [pjs] Support default function argument values 917b35736638cf298e4119103271c523dc2a10a0 (pajama-coder)
    • [core] Draw various types of joint filters in svg 501e4b77c348f18ca041b22828d1a42e7ff8b7c5 (pajama-coder)
    • [fix] JSON parser crashed to an empty input string 1555c4cef3a767474b6c8a52da2491761270e4a8 (pajama-coder)
    • [core] Generate graph from script that uses embedded anonymous pipelines 7f43bab5a58dbd2af0c25f841868899e6a8a0ebc (pajama-coder)
    • [docker] accept abs path dd86e67de3857256f3b6992aa91a3886eeb23937 (York Wong)
    • fix missing $ 40e2d7d3a3a33b765e1cb764f41dbd209b853fb3 (York Wong)
    • [docker] start multiple pipy instances based on docker cpu quota baa75a0b80060c7ae5e53378b59827349df868f6 (York Wong)
    • [fix] MQTT PUBREL packets should have their flags fixed as 0010b b36baa28af2bbfe7c336b7ce60633f8f08fe3afb (pajama-coder)
    • [core] Support anonymous pipelines when generating svg pipeline graph f8a6b7d298d3de69ae5429cda97ddd7736d4a985 (pajama-coder)
    • [core] Rewrite text graph generation logic ca4dac9f5825538c7b70e0a0a5f679f9973f3384 (pajama-coder)
    • [core] Change to the new way of getting filter linkage info for all filters 6cca857fbb702e7e1ad31e37f1648cf6fa730f08 (pajama-coder)
    • [core] Better way to dump filter linking info for graphs a23f1b3eef2d81c78274d477e3aa13237c8db02b (pajama-coder)
    • [filter] Add new filter branch that supports embedded sub-pipelines 511b1018c70eb552c93fb03050722103f544e8c4 (pajama-coder)
    • [fix] Infinity numbers in histograms were not deserialized correctly 433a89ac9e8a0f5790dffac083eb33dc57e625de (pajama-coder)
    • [core] Support usage of anonymous pipeline layout in Configuration.to() 9de1aa78c8334314a932a7a2023334c5f43a10e0 (pajama-coder)
    • [fix] HPACK decoder took the wrong prefix when checking if it's ending with a table size change fc8fca1d3606cd9764cdfebff26ceaa2b4d5c3cc (pajama-coder)
    • [core] All joint-filters now support designating sub-pipelines by using an extra call to Configuration.to() edad909aee0b657122e6268c206412c5fbabc7ef (pajama-coder)
    • [core] Separate a base class FilterConfigurator out of Configuration and add to it to() methods for adding sub-pipelines 9cd152a3c7ffcdf0ec27043ab27331aaf54d4761 (pajama-coder)
    • [filter] MQTT codec filters to let StreamEnds pass through ddf1fcaac7e2746a15b0eff30ef374332bdea26e (pajama-coder)
    • [filter] Extract the MQTT codec out of the filters as EventFunctions bf43fac6d1608ca452f3fd8c12e945be9205b772 (pajama-coder)
    • [filter] Sub-pipelines inherit Outputs from their parents 66341b2cd5194513414e4e28df5625b74bb0a47d (pajama-coder)
    • [filter] Filter output() now passes down everything before sending clones out to the Output c82286e4bbf2cc7d45ca85d6e9fc447dcccd533a (pajama-coder)
    • [filter] Give encodeMQTT()'s protocolLevel a default value of 4 02e2d2b0f014be6246519a9a442c8dc27df484ff (pajama-coder)
    • [filter] Muxers do not free weak-referenced pipeline sessions on account of maxIdle 29f5fb8c25413dd81ffec81e360d3587e5fe3dfe (pajama-coder)
    • [filter] Behaviour change of demux(), no longer waiting for an output from its sub-pipelines c1646a07447cdb4b9d982b8b87bfb1e5141bc255 (pajama-coder)
    • [filter] merge() to accept undefined group key as using the current __inbound 7f082bf7ce7ff666de10d6f6cb279de9ee0b4b05 (pajama-coder)
    • [fix] Report an error when encoding a MQTT packet without a head 4d5a9add9cb5efbb9096dc2c2cd2a7571005728b (pajama-coder)
    • [api] Remove the old tenant argument to algo.ResourcePool 090b93b50739f26179cbe6ddeec39b8a0dcadf81 (pajama-coder)
    • [api] Call LoadBalancer.deselect() when returning a connection back to the connection pool 4e7ffd7a53d93ead6dda4388c52b1d7247f60415 (pajama-coder)
    • [api] Extracted a common base class LoadBalancer out of 3 types of load balancers and added a builtin connection pool to it e5e5dcfe7ac81b2ed671aa6c0aa53901746aee63 (pajama-coder)
    • [ci] handle errors in non git dir 878f24000be6b77a9585e0439ae0a1bfe41b7c90 (York Wong)
    • [ci] support setting CMAKE_BUILD_TYPE in build.sh 8509173cfeec49fb3089af6dc0e425171fa02790 (York Wong)
    • [filter] Add new filter: input(), to work with output() filter 9a03d33631c8aa8eee2f5acf9aa4d19fcc682b9a (pajama-coder)
    • [chore] npm audit fix 2207a4e8e383f42a437daa628bf46977de50db52 (pajama-coder)
    • [filter] Add new filter: output() 72791fcc752956f6d95d24474004def882a88d60 (pajama-coder)
    • [core] Add Output class and interface 45f9de1732a183732e7cfb54a0e89fd58eb60c9a (pajama-coder)
    • [core] Distinguish TCP/UDP listeners on the same port number e3a954e906f1658bb1b34246f4d3dbee23b68bef (pajama-coder)
    • [core] Add listener for UDP 6493bdfab8ab597f869941fd96f20c3283e9d578 (pajama-coder)
    • [filter] replaceBody() should not trigger when no MessageStarts 787598c7001db3f8b93f4f1a8cbd6dc53cb9fcd8 (pajama-coder)
    • [core] Separate Listener into a wrapper class and an internal class AcceptorTCP d8a4b8203ddf4843b8df69ce1f08890fe9844aa1 (pajama-coder)
    • [core] Separate Inbound into a base class and InboundTCP 08b97996648180356a49a4349834180670b11591 (pajama-coder)
    • [ci] move pipy-repo build to subsequent steps 95500bbcb1f5217850e4df7714153a65f59d2a9d (York Wong)
    • [core] Use pipy::List instead of std::list in EventBuffer to avoid slow memory allocations 5eb0c17aa12ac979a5d978cfde6053d465451910 (pajama-coder)
    • [fix] Should clear the 'scheduled' flag after the timer fires in pack() e098b508350133d2467920f02d2ccafc1c5fa813 (pajama-coder)
    • [fix] Fix a crash caused by the lack of an InputContext when pack() tries to flush its buffer 01d6d8f7b26c2e8a48ad2cf7b92df90357dd9d2b (pajama-coder)
    • [core] Rename symbols according to the terminology change from 'pipeline definition' to 'pipeline layout' 38041fe06132fe0cbb7cd187f61d1723719a66f5 (pajama-coder)
    • [filter] Simplify how filters extract their options by using the pipy::Options utility class c00689b157659cd38738b3a4753e4165ad8ad2e1 (pajama-coder)
    • [core] Add --eval option for evaluating ad-hoc scripts right from the command line fba837be74b1099038cf497627eccb9efa0873e6 (pajama-coder)
    • [filter] Removed fetchHTTP() since its functionality has been merged into muxHTTP() c58243445ec2f6b1d4fffd3e88ed3f8c6e607259 (pajama-coder)
    • [pjs] Add callback mechnism for gone weak references so that muxers can recycle weak referenced sessions more timely 7d781d712a49941262072a980f4eed6eb59cd729 (pajama-coder)
    • [filter] muxQueue() and muxHTTP() now accepts undefined for the group parameter as using the current inbound connection 1e4bfe23a1b75013ded41fd6eab5916d41c8c952 (pajama-coder)
    • [chore] Improve demux.cpp and mux.cpp code readability 583f62ebdbc064058632b90d73b63033543db820 (pajama-coder)
    • [fix] A bug from the last commit where muxHTTP() gets stuck after a dynamic selection of HTTP protocols b948bff6e4b22053394eddfb0b4a447e573b6d32 (pajama-coder)
    • [filter] muxHTTP() to support dynamic selection between HTTP/1 and HTTP/2, such as by a TLS handshake 67130ae604e86a4f5967ac4fa212c0335130df92 (pajama-coder)
    • [fix] Fix a SEGV when forcing a shutdown 0212df8e97a1efd5d70f71de85ef87e04d512997 (pajama-coder)
    • [filter] Add handshake callback to TLS codec to tell the chosen protocol 322363c1c97d48b21b312d185f665b2866fe994b (pajama-coder)
    • [core] Add a base class Options for better handling of filter options 2119dde0842b0dc51eeb6dfb1885e1608b32b236 (pajama-coder)
    • [core] Rename Options to MainOptions dc3518440365ea6fad47995a230366887d1e9d0f (pajama-coder)
    • [filter] serveHTTP() to support HTTP/2 a793152eae2a34b165d47dd2d6f493f3fca1d6b0 (pajama-coder)
    • [core] Auto-flush after handling an input event so zero-length-data is no longer regarded as a flush signal 24ed0ba937ec79f1c2aefee0033d43b3d44cec04 (pajama-coder)
    • [filter] Better flushing logic in HTTP/2 codec 88926f5d6235b1d7cf2fdb556ebcf4b770e33096 (pajama-coder)
    • [build] make cmake compatiable with loongnix-server d310c92f37cfc0fb72166ac9d154d79263c8c264 (York Wong)
    • [build] Add Dockerfile for building image on Loongarch. c1c047c2690ed795d255ab99e2f7197188aa10cc (Kevein Liu)
    • [ci] change pipy repo build flow (#82) e7a0495d8ca5c65fdcbff0f69d41e2f24de6ea1e (York Wong)
    • [filter] Refactor the way HTTP requests with HEAD method, CONNECTION header and UPGRADE header are handled 8e958c30a9cc2d0529aecea65337cb35565f8414 (pajama-coder)
    • Changed CMake minimum required version to 3.13 df68d82e7cf93be29ec1266f1f233d40fe3b3e88 (Ali Naqvi)
    • Updated CMakeLists to toggle LTO support 8840e6ff0a07e32517859c1e590534f173d8de27 (Ali Naqvi)
    • [filter] Rewrite http::Demux/Mux by using the new http::RequestQueue class 67b474667eb217b50f22378fabd19c8710b65d1a (pajama-coder)
    • [filter] HTTP/2 codec to process messages with trailers 571929e81f4b84143a20b13ba09ff482da84c47f (pajama-coder)
    • [core] Added tail property to MessageEnd a79dd5d455ccd55dab9650ef89bb3fe1738d9c56 (pajama-coder)
    • [ci] add pipy-repo for x86 e37c138d849d69939857fe82ae6954529aa0efe0 (York Wong)
    • [fix] HTTP/2 encoder to produce CONTINUATION frames correctly for large header blocks 5502c84efa3ae8e51d34d8e72e65ead44b7affc3 (pajama-coder)
    • [filter] HPACK encoder to handle zero-length string values fcf91a3e538aefc644c1eac56e210b223cd1c16a (pajama-coder)
    • [filter] HTTP2 decoder to ignore RST_STREAM/WINDOW_UPDATE/PRIORITY after closing a stream while still account illegal sized RST_STREAM/PRIORITY as an error 99570aaabe17ec66600a36cdb892d3146f23393f (pajama-coder)
    • [filter] Print the content of MessageStart.head in dump() 01269c60b0b9f18a943f990b490c5e09abc68f7f (pajama-coder)
    • [filter] acceptTLS() now also accepts an array of strings for ALPN protocol names allowed 3424892e0167435dce91c7ae26bbc318c68cd17e (pajama-coder)
    • [filter] Support ALPN from the client side of a TLS session a7a41f63aa8506490e78268ac84de518d42792ce (pajama-coder)
    • [fix] Recurrent curve computation on the same fetched stats data caused an exception on the GUI 955f469c0088e9733cf2aa2d58e8d72e63e7b40f (pajama-coder)
    • [core] Use string representations for NaN and infinity numbers in the JSON-formatted stats data f00bb0fa272f9fd08c56b00d22cf75c5e80ef8b3 (pajama-coder)
    • [filter] Add interval option to pack() dec51a97c2f84b26fa9c18e78f857d67d35a1d6f (pajama-coder)
    • [filter] Add alpn option to acceptTLS() 4ebc202d8e73b3f9e2df31a11862bf258e6d0afb (pajama-coder)
    • [pjs] Add builtin global variables Infinity and NaN 020021204b81aeb9d6b7e6138be16aa8e3cf694e (pajama-coder)
    • [core] Add +Inf to the end of the buckets of builtin histogram metrics c887f7ce6378e763d55eff15a2487d64fc0fcbeb (pajama-coder)
    • [filter] Handle header table size changes in HPACK and treat such a change at the end as an error 973bc30f917ab8ec74209455ee6ac0c9e8bd1aea (pajama-coder)
    • [filter] Rewrite dynamic table used by HPACK to add entry eviction logic e9847b1459ab522edfcd478210e50c58ec8557d7 (pajama-coder)
    • [fix] Fix a crash caused by nullptr base in new URL(url, base) 711ddc249f03a93f2cac916bd7575e15a3eb4153 (pajama-coder)
    • [filter] Treat invalid trailing paddings and full EOS in Huffman encoded string as COMPRESSION_ERROR c2a1ad60e4a516a706fa90a1e4b8fa818a724efb (pajama-coder)
    • [filter] demuxHTTP() closes downstream on receiving an invalid HTTP/2 preface 22774ca7a060b9708689976b2131679346ab7d41 (pajama-coder)
    • [filter] Check if an HTTP/2 stream's content-length (if any) matches its payload d55668706814b5dbf94cf04f3720b5f649f462bf (pajama-coder)
    • [filter] Allow and ignore trailer headers in HTTP/2 decoder 1d9b7d9b23cbd9dcd03193972040fdafca8cf7cb (pajama-coder)
    • [filter] HTTP/2 decoder to respond with PROTOCOL_ERROR for requests with missing or duplicated :method, :scheme or :path headers 08fbc76d0e388c79afa7815daf3d3e680a1666b1 (pajama-coder)
    • [filter] HTTP/2 decoder error for connection-specific header filters 650e9f8f266d3d38ad0af2f7d7379aaadf60f008 (pajama-coder)
    • [filter] HTTP/2 responses with PROTOCOL_ERROR for malformed pseudo-headers 5d5e842f0346d6f4511034f00a7734772e3a6d1c (pajama-coder)
    • [filter] Respond with PROTOCOL_ERROR when receiving an HTTP/2 header name including uppercase letters 3f18a0f8758e50fbd758c839f475384ccad149f2 (pajama-coder)
    • [filter] HTTP/2 header decoder responds with COMPRESSION_ERROR as receiving a dynamic table size larger than the maximum 0a7aed2a4c2fbbb461b6849e80cd135629ae9b62 (pajama-coder)
    • [filter] Respond with error to PUSH_PROMISE from a client, CONTINUATION with id == 0, and redundant HEADERS frames 76f3e004bc6665f1a0b024f1acbf81004b363ae5 (pajama-coder)
    • [filter] Correctly handle erronous HTTP/2 frames: zero-sized WINDOW_UPDATE, non-CONTINUATION frames in the middle of a header block 9622b61804cbbcd32c8d0efae8d1b8a55ec18e47 (pajama-coder)
    • [filter] HTTP/2 codec to respond an error for invalid stream dependency and unknown frames in the middle of a header block f7dd4f1420d0b371e4acbe3d84353091e4487527 (pajama-coder)
    • [filter] HTTP/2 codec to respond with standard-conformant errors for illegal stream states 054b65889183924cfa1a7368fc45bd140de86d54 (pajama-coder)
    • [filter] Close an HTTP/2 session when PRIORITY frames are found between consecutive HEADERS frames 98781105a86114413b629773e0f90be3eaea240c (pajama-coder)
    • [filter] Treat an incomplete HTTP/2 header block as a COMPRESSION_ERROR 9efec702a8015e7000fbefaeac5bb81e33d65129 (pajama-coder)
    • [fix] Fix a crash in HTTP/2 muxer caused by a session destruction prior to its streams daaa070f6122cb323dcc010e0c5c3cf3dfb8b82d (pajama-coder)
    • [filter] Merge http2::Server::Stream and http2::Client::Stream into the common base http2::Endpoint::StreamBase 5ee376aa0ad4fcc3490a1c4f743d3f966511c5f8 (pajama-coder)
    • [core] Handle situations where worker metrics are reported to rpo before their statuses 266cb1d0b1eedede82541d2b2222309a65f3c216 (pajama-coder)
    • [filter] Extract the common base http2::Endpoint out of http2::Server/Client 22ae36580a2353e82ae136b58a38cd58c99c866a (pajama-coder)
    • [fix] http::TunnelClient did not pass down StreamEnds before receiving a response d4236c345d8b476b0eebd58f493ac782930494cf (pajama-coder)
    • Updated OpenSSL to 1.1.1o 0d182a8aa0ce88ddc0c017296e042a3c67ef1ed1 (Ali Naqvi)
    • [filter] Accelerate HTTP/2 client-side stream ID lookup by using ScarcePointerArray da4cd2fac174a2906a76e278e4881da03c823298 (pajama-coder)
    • [filter] Respect to server flow control from HTTP/2 client side e0d9ff48d14facb99f81b4b0e55b458f5b5f1179 (pajama-coder)
    • [filter] HTTP/2 client-side to send a SETTINGS frame right after the connection preface 7844ea271cbe2850d835fc873e6358f70ce49112 (pajama-coder)
    • [fix] QueueDemuxer::Stream should put its pipeline in the delayed releasing pool at destruction 4c2b99c4b759c922305766d08a4033609197798e (pajama-coder)
    • [test] Support HTTP/2 client-side test ea70f36116a5c08ff0f307c47b31755d4aff7f25 (pajama-coder)
    • [fix] HTTP/2 PRIORITY frame can be sent ahead of a HEADER frame 042f83c3e62315692b3bd0cc72bed69874fe20e7 (pajama-coder)
    • [fix] Fix a crash caused by double deletion of a stream as an HTTP/2 session closes 4606ff664a4398e130c6f8320cb29d02ab545b20 (pajama-coder)
    • [filter] Accelerate HTTP/2 stream ID look-up by using ScarecePointerArray f6bfda9dec1ebdf0cb719e4aa7bb52baec35da7d (pajama-coder)
    • [core] Rewrite ScarcePointerArray to better handle a few corner cases 9dd1005dc5b49031cdf8509e33022f3819be0f3e (pajama-coder)
    • [core] Core container class for rapidly access to a scarce pointer array 79d9e923b8b61108e4f9e30e09b4151f5427a396 (pajama-coder)
    • [filter] Ignore unknown HTTP/2 frame types and close when frame size is over the limit 3a30d497b785708b8c2be29512af068dee98aac8 (pajama-coder)
    • [fix] Crash in HTTP/2 header decoder when an empty value table entry is accessed dd78ed49198c448094f81ed01a31deb31063c8ea (pajama-coder)
    • [filter] Make use of Deframer to avoid byte scan in HTTP/2 frame payloads 8b2a03cf13499f9fdc050c407f8f34d004c7086e (pajama-coder)
    • [filter] HTTP/2 codec to recycle closed streams 9cae8f2befc4cd7bba9a08a84153efa198ec47b8 (pajama-coder)
    • [filter] Avoid generating zero-length non-terminating DATA frames in HTTP/2 codec 119dcb9be73de5193a0a82450004b23a9bfce6db (pajama-coder)
    • [filter] Respect HTTP/2 max frame size. Skip connection headers in responses. c90e2db84d79deec335bb00c053935f3c8de68e7 (pajama-coder)
    • [core] Dump data bytes to stderr instead of stdout a1a11a12374d963220ea296e8d7833b0ab8d7b17 (pajama-coder)
    • [test] Support testing POST messages in HTTP/2 9a0eb5ae4a269eeee10b06199a8a79e796f62cd5 (pajama-coder)
    • [test] Add testing client for HTTP/2 e50e97a486a7a71cb60891148d3ab846c3402942 (pajama-coder)
    • [filter] Minimize HTTP/2 codec flushing events 3bf31ebfc48ff1e1aab9874dcb92c33288d3aa1a (pajama-coder)
    • [filter] HTTP/2 demuxer sends out window updates to the client f603c9a5373f12f36b55d8d4ce155bf168a97df1 (pajama-coder)
    • [filter] HTTP/2 server should not send ACK for the initial settings coming with the upgrade request 8721ccc825d60a421eaaf8464d848587169bf9af (pajama-coder)
    • [filter] HTTP/2 demuxer to respect the receiver's window size when sending data frames 096c9835a41eae153d1cd108e1cad03d33a4595b (pajama-coder)
    • [filter] Decode and encode HTTP/2 settings 5a2b0abaaced1eb3c82065f02c4726c76065f9e8 (pajama-coder)
    • [filter] HTTP/2 server delays for the first response until after receving the client connection preface 9297862a6f10d4d5d317df71aab5dcdf895fcb8c (pajama-coder)
    • [core] Add metrics for inbound/outbound traffic and connection times 3d9b1a828edb7aea73949866b0fa563ba26bb0b6 (pajama-coder)
    • [fix] Fixed a crash due to a abruptly closed WebSocket session in AdminLink 408035663a1c3aeac13cd332566621c71137996f (pajama-coder)
    • [filter] connectHTTPTunnel to re-establish connection after a StreamEnd e0d7b2b7571937404a1c4b852a71b417db4ebede (pajama-coder)
    • [core] Compute average, p95, p99 for histogram metrics be24e311f325aab06cfdbb881c0ecba6f4d4db70 (pajama-coder)
    • [fix] Pipeline quantity stats didn't skip closed listeners that give null PipelineDef pointers 7ae8999baed21cd28947cd864981e1557bedab8f (pajama-coder)
    • [core] Compute P90 for histogram type of metrics on the web UI e5418d34ba6e065db772233053a69bd7aa77c83f (pajama-coder)
    • [core] Convert Counter metric values to rate curve when displaying on chart ee1a51a448b8e7dcacf7de5a432d126046d5e211 (pajama-coder)
    • [core] Draw metric summary chart 5d67e3aa57c9af626d9b7e9a90011c80d9c59975 (pajama-coder)
    • [fix] Data::Reader did not take into account non-zero offsets of chunk views 597cc088169541df4ee0a0430d55990fcb114fb8 (pajama-coder)
    • [filter] MQTT CONNECT packet password should be encoded as binary data 8a297eb3b0854602bc91c49cd10d0d4cf2ad465b (pajama-coder)
    • [core] Draw sparkline charts for sub-metrics 53f699e68850c6a7ec58b9ef88bb08dd1add0a64 (pajama-coder)
    • [core] Draw sparkline charts for metrics 7140d3698d899e5de4c1c9f3adb5fcb3716c4ce4 (pajama-coder)
    • [core] Show metric list on the Admin UI ef797c567aa4c74705b6df4c8436d0a3ffe12cc0 (pajama-coder)
    • [build] Add missing header file in stats.hpp 2dd039f7316e52f93622eb34fef1ad684a2bb1dd (pajama-coder)
    • [core] Record metrics history up to 5 minutes b6e5a568d54c0a448674c735ff310ebfb28fd9dd (pajama-coder)
    • [core] Close socket without graceful shutdown for StreamEnd with an error 7e3d42bbab5264d36fb46bc12179de9fb94015dd (pajama-coder)
    • [core] Add idleTimeout option to Inbound and Outbound 32ae1da0141f1127d86a7a52a14f1bdef3daba31 (pajama-coder)
    • [core] Add options: --instance-uuid and --instance-name 612d7a4af7582a1b08e37536e26ce27e27493734 (pajama-coder)
    • Updated CMakeLists to disable brotli tests, fixed openssl path issue f965f2eb0c1f0b3d807cb9bf858f2466c6b607b1 (Ali Naqvi)
    • [core] Deserialize worker metrics report and give a shorter serial number to each worker 186c23c20205775b980890023b964fc1dd983f27 (pajama-coder)
    • [core] Outbound now buffers up StreamEnd while it's still connecting 7b7a5884ed563b8f26fe4c8e91643d882c1239f9 (pajama-coder)
    • [core] Collect worker metrics and dump in Prometheus exposition format with instance IDs 42c664e39a5dcdff19e52d81ff09c354fac6057e (pajama-coder)
    • [core] Deserialization of metrics reporting JSON d865c8a16742d682b807e3f38ef95d6c8913c0a7 (pajama-coder)
    • [core] Adjust metric reporting JSON format for faster parsing and updating 00bed272e9cff88b357c6665cd6f45103daf0a9c (pajama-coder)
    • [core] Add closeEOF option to listen() d5dba4ddf85f4069800971723ade9831ebd4c914 (pajama-coder)
    • [fix] Fix some bad file descriptor exceptions in Inbound and Outbound 20603e70e7c0d986fe8c76864225c31d0a449f6b (pajama-coder)
    • [core] Inbound should not close when receiving EOF c5b810685e232d691f10354fa2223e536be66cac (pajama-coder)
    • [core] Fix JSON parsing bug introduced in the last commit 44af6eac1476696c84318fb44552af62f6b2a1ae (pajama-coder)
    • [core] Add JSON::Visitor class for generic JSON deserialization c8b227c296ca65210e30900b6ce31c558ee52658 (pajama-coder)
    • [core] Send metrics from workers to repo a709608ff090b2671cd22d3bbfeaa7af12057b9c (pajama-coder)
    • [core] Add internal class AdminLink 655eaff7fb38e224f59a2f563295fedbf768faef (pajama-coder)
    • [core] Metric serialization supports vector values for histograms 374640a664b511d9ef6c95d11384f3fd9b41b11e (pajama-coder)
    • [build] Add jq into image. b2ed9180cab218d6b9b2498d5e63a70e8db8faaf (Kevein Liu)
    • [fix] WebSocket codecs didn't reset some states properly 16473392a2ed14258528f30c9a5c02c3645958c1 (pajama-coder)
    • [core] MetricSet serialization to JSON 1f809ad3dded9482774f052505ba6c692917d1e9 (pajama-coder)
    • [core] Add MetricSet interface 9850f9644ebde24ded70b9a4a5ae02fb255ce1cd (pajama-coder)
    • [chore] npm audit fix 9e7c357df5118cf76eb08ccb039cfae316bdd690 (pajama-coder)
    • Add brotli decoding support (#77) 5b17284be57811562c36e82c1ddb4f918c76175e (Ali Naqvi)
    • Updated Configuration document with new filters 66c006599ff2505c657417a8f6ff59130c6c830a (Ali Naqvi)
    • [doc] Fix doc build errors c674539e98070454b2853dd584bec0bbf4962dc0 (pajama-coder)
    • Added compressHTTP & compressMessage filters (#75) b36e1e2e6f51f7d4953c1362a9c9bb1bb2e0f6df (Ali Naqvi)
    • [filter] connectHTTPTunnel() to support usage on WebSocket client side 1aed3a53de1df02de72b33190e1d2b2cf3fe5416 (pajama-coder)
    • [filter] New filter deframe() for simple protocol decoding 77c692fd680a8aee7ecccb4907b85a2b2a80bc27 (pajama-coder)
    • [filter] WebSocket codec implemented as decodeWebSocket() and encodeWebSocket() 1545e7acbc14ffb0c74180e3a294d4c407b6b9ef (pajama-coder)
    • [wip] decodeWebSocket() to unmask masked payload bc4f961d16ab729c8639afa9c741f042b3cdb644 (pajama-coder)
    • Modified zlib CMake file to mark example binaries as optional 50526bbde905b932ada55593a257657a4c5a7ce8 (Ali Naqvi)
    • [wip] WebSocket decoder b99dbb51d725921f0eaefcbedb6b5896f16569da (pajama-coder)
    • [filter] acceptHTTPTunnel() establishes the tunnel according to the response status 763a30914ee2350964f23f2a0be2cc22d76eab5c (pajama-coder)
    • [core] Add a general state machine based message decoder b7a0b6b143eab88ba3816c7eaf0db4b0b87c5da0 (pajama-coder)
    • [filter] New filter fetchHTTP() for sending HTTP requests without connection sharing 6f99f25377e71398b7369a89d15cc2a25c6d5372 (pajama-coder)
    • Updated CMake to use zlib provided CMake a5bcfe13248b79f1c246d2a7939a6cc80902964d (Ali Naqvi)
    • [filter] Filter wait() now supports timeout option 382c8f58d5dae01f4b884cc1e22d1d746c142fd8 (pajama-coder)
    • [pjs] Raise the upper limit of string size from 64KB to 256MB a4f0945b7845428c2b665f488e28a4c1927d976f (pajama-coder)
    • [core] Flush at the beginning of an accepted connection so that handleStreamStart() can always work on new connections a73f8d9755ce0bda82910c2514cfe52c98ce17e6 (pajama-coder)
    • [doc] Show property/method level doc pages in the content tree a2415a4c9d5687c34b3688f236bd4fd0a8823419 (pajama-coder)
    • [ci] check image build result before exporting, avoid proxy issues 9b7ad5d6158f872be05e49692fed738eccfd8d27 (yowang)
    • [ci] remove pjs from rpm name f57163efd10c7673a205edce5284d936a29491b8 (yowang)
    • [test] Add test duration setting to the test runner 4baacea2998971a1729b155e2b421467983eabbc (pajama-coder)
    • [api] Added Data.shiftWhile() and Data.shiftTo() d80141505f95a47057b4c875317bbb6b81789958 (pajama-coder)
    • [chore] Get rid of warnings with -Wall 68765cfd3294323b13a21fb17f4785853cb20282 (pajama-coder)
    • [ci] remove pjs from package name 653b1b1f7d1b7ee3d6c9c1aa8b06bf8dcd80309a (yowang)
    • [filter] detectProtocol() now supports detection of plain HTTP/1.x dc9a114ec75a575280d5876fee48d540baf0478e (pajama-coder)
    • [core] Optimize socket reading performance 4a84cfed72a8b98d98842f3231c3ad271e531d1a (pajama-coder)
    • [core] Support listening in transparent mode 2f76483a5cedaedc196e27f7e38c44feddbf8b8b (pajama-coder)
    • Update README.md 4e38d2ad6078532f1c389e61fb4acf2b8c1419a3 (CaiShu)
    • [doc] Add reference docs for read(), tee(), depositMessage() 544ebacaa0c1ffb36b3f91e2c8a242f1bddf9270 (pajama-coder)
    • [filter] Optimize HTTP decoder performance 23992e17b0e34dff7d80a1d1c61bb3ca27c32fe2 (pajama-coder)
    • [filter] Filter depositMessage() supports options.keep a09778bf10c62b4266c7579ca9b9921e9f69ab03 (pajama-coder)
    • [filter] New filter depositMessage() replacing the old buffer() filter 3426d9ae164ddf962a6406bea60644611ad102c8 (pajama-coder)
    • [filter] New filter for buffering data in a temp file 2097f245e470eafec2b94ed178c7bc17ed934d25 (pajama-coder)
    • More fix for link issue 74a9337b7f29bd5b03704b1df74f081452f34bbb (shader13)
    • [filter] Filter tee now supports writing to stdout 3c68fc8b5c77dfdbb8cc3263639b576d27a1e700 (pajama-coder)
    • Fix incorrect links db3590c5e2d42a2395761574edd85e6c1f8187f7 (shader13)
    • [ci] TS in version keep align to the build.sh 2be5e9a6154c5e197bd000c43d0dbf3c0d8f8526 (yowang)
    • [ci] do all build stuff in build.sh f4c1c290ce6b9ca863aedb764642adcb486c1e00 (yowang)
    • [fix] Pipeline graph should take the new read pipelines in account f9b13130b2bae9a56e8d1b4c77a91fad3062a76c (pajama-coder)
    • [core] New type of root pipeline to read from a file as input stream 375202f937b09a96873bf71ecf7bf858414ecd92 (pajama-coder)
    • [gui] Add new user guide info on admin UI homepage 356d53e692bf5bc929a905a7e34d8705ec9c948f (pajama-coder)
    • Updated quick-start with homebrew installation instructions (#67) 650f235efc4ce69d169c9660f68da573ba99a1bf (Ali Naqvi)
    • [api] Performance optimization for JSON.encode() c83eb3189f6a04cc33b61251783f160966c75bdb (pajama-coder)
    • [pjs] Optimize performance of construction of object literals ef93c396331c7f3fb8254dbc05b3d6be51261650 (pajama-coder)
    Source code(tar.gz)
    Source code(zip)
    pipy-0.50.0-25-alpine-aarch64.tar.gz(11.50 MB)
    pipy-0.50.0-25-alpine-x86_64.tar.gz(11.98 MB)
    pipy-0.50.0-25-generic_linux-aarch64.tar.gz(3.90 MB)
    pipy-0.50.0-25-generic_linux-loongarch64.tar.gz(2.71 MB)
    pipy-0.50.0-25-generic_linux-x86_64.tar.gz(4.72 MB)
    pipy-repo-0.50.0-25-alpine-aarch64.tar.gz(43.21 MB)
    pipy-repo-0.50.0-25-alpine-x86_64.tar.gz(43.72 MB)
  • 0.30.0-23(Mar 22, 2022)


    • Add flow control mechanism for throttling any types of input
    • Add asynchronous file operations
    • Support OpenSSL engines


    • New filter tee
    • New filter throttleConcurrency
    • New filter demux (legacy demux/mux filters are renamed to demuxQueue/muxQueue)
    • Filter decodeMQTT to support protocolLevel option
    • Throttle filters support weak references as the account keys


    • Support TTL option for algo.Cache
    • New method stats.Metric.valueOf() for querying current metric value
    • Data.from() rejects input types other than strings

    Major bug fixes

    • Fixed a bug where TLS requests could be stuck in the buffer
    • Fixed a dead loop when trying to read folders in codebases
    • Fixed some crashes when null is given to some cypto APIs
    • Fixed a crash when retrieving stats.Histogram sub-metrics
    • Fixed a bug where an HTTP 304 response would lead to forever waiting on the connection
    • Fixed a bug in Data::shift_while() that caused Dubbo decoding failures
    • The size of Data wasn't changed accordingly in some cases when packing


    • Support static linking to libc
    • Support linking to external zlib


    Tremendous growth in documentation coverage has been done since the last release in English, Chinese and Japanese.

    Source code(tar.gz)
    Source code(zip)
    pipy-0.30.0-23.alpine-aarch64.tar.gz(10.25 MB)
    pipy-0.30.0-23.alpine-x86_64.tar.gz(10.90 MB)
    pipy-0.30.0-23.ubuntu-aarch64.tar.gz(18.93 MB)
    pipy-0.30.0-23.ubuntu-x86_64.tar.gz(19.85 MB)
    pipy-pjs-0.30.0-23.el7.x86_64.rpm(2.16 MB)
    pipy-pjs-macos-12.2.1-arm64.tar.gz(19.34 MB)
  • 0.22.0-31(Jan 31, 2022)


    • Overhaul to the object lifecycle management to solve a few hardcore crashes
    • Supports LevelDB as a storage for codebases
    • New admin proxy mode
    • Retry failed codebase downloading during startup


    • Full implementation to standard JavaScript Array, Math, Date API without iterators and timezones
    • Standard-conformant JavaScript String API with UTF-32 semantics and UTF-8 representation internally


    • Metrics and statistics API for monitoring, with internal support for Prometheus exposition format
    • New URLSearchParams API
    • Data API supports generating arbitrary binary data
    • Handle CDATA in XML.decode() and XML.encode()
    • Support programmatically shutdown by pipy.exit()
    • Printing objects as JSON with console.log()



    • Support read/write timeouts for inbound connections
    • Support read/write/connect timeouts for outbound connections
    • Support signal driven tasks
    • Support listening address binding
    • use filter supports module(plugin) chains and round-trip filter paths
    • mux filters support objects as a weak key to the shared session
    • LoadBalancers support dynamic unhealthy target cache


    • Basic HTTP/2 support without flow control
    • HTTP codec standard conformance improvements
    • Support for HTTP tunneling and WebSocket
    • Actively shutdown long-lived connections around a reload
    • Automatically chunk HTTP/1 message bodies when they are too large


    • Support mTLS between worker nodes and the repo node
    • New handleTLSClientHello filter to extract TLS client hello information
    • New detectProtocol filter for telling apart TLS and plain-TCP connections
    • Improved TLS performance
    • OpenSSL library bumped to version 1.1.1-m
    • Option to build with external OpenSSL library


    • New filter connectSOCKS for the client side
    • Renamed proxySOCKS to acceptSOCKS


    • Simple MQTT codec filters for extracting MQTT packet information


    • Script editor supports IntelliSense
    • Generate pipeline graph from script enclosed in a function scope
    • Builtin documentation with full tutorial and localization
    Source code(tar.gz)
    Source code(zip)
    pipy-0.22.0-31.darwin21.0-arm64.tar.gz(14.16 MB)
    pipy-0.22.0-31.darwin21.0-x86_64.tar.gz(14.41 MB)
    pipy-0.22.0-31.ubuntu20.04-static.tar.gz(4.41 MB)
    pipy-0.22.0-31.ubuntu20.10-x86_64.tar.gz(14.56 MB)
    pipy-0.22.0-32.x86_64.musl-static-no-gui.tar.gz(5.24 MB)
    pipy-0.22.0-32.x86_64.musl-static-with-gui.tar.gz(17.49 MB)
    pipy-oss-0.22.0-31.el7.x86_64.rpm(10.53 MB)
    pipy-oss-0.22.0-32.armv7.musl-static-with-gui.tar.gz(18.50 MB)
    pipy-oss-alpine-0.22.0-31-x86_64.tar.gz(34.62 MB)
  • 0.10.0-1(Oct 1, 2021)

    Release Note

    New Design

    • Start a Pipy instance remotely from HTTP endpoints
    • Builtin codebase service as a basic control plane, and its GUI too
    • Data exchange between PJS modules can be done through pipy().import() and pipy().export(), which becomes the recommended approach over the old ones

    New Filters

    • merge for interweaving multiple messages into one stream
    • pack for combining multiple messages into one
    • split for byte-wise processing of messages
    • handleXXX as aliases to onXXX
    • proxySOCKS to handle both SOCKS4 and SOCKS5 traffic
    • connectTLS and acceptTLS for TLS traffic handling, extracted from listen and connect
    • decompressMessage and decompressHTTP for message body decompression by zlib
    • demuxHTTP and muxHTTP combining HTTP codec and mux/demux
    • serveHTTP combining demuxHTTP and replaceMessage for convenience

    New API

    • Function os.writeFile() for local file writing
    • Function algo.hash() for JS value hashing
    • Class Netmask for IP address range handling
    • Class algo.Percentile for percentile calculation
    • Class PublicKey, PrivateKey, Sign, Verify, Cipher, Decipher under namespace crypto


    • IPv6 support
    • Number of concurrent connections can be limited on listen
    • Added size limit option to filters involving internal data buffers
    • Track data buffer usage and concurrent inbound/outbound connections and dump on SIGTSTP
    • HTTP codec overhaul, with the old 256KB fixed buffer optimized out
    • Class algo.Cache now has a limit to the number of entries, with old entries getting erased based on LRU policy
    • Dubbo request ID becomes a string for its 64-bit range to be handled in JS
    • Standard-conforming processing of object key ordering in PJS
    Source code(tar.gz)
    Source code(zip)
    pipy-oss-0.10.0-1-macos-darwin20.tar.gz(2.15 MB)
    pipy-oss-0.10.0-1-ubuntu2010.tar.gz(2.31 MB)
    pipy-oss-0.10.0-1.el7.x86_64.rpm(1.85 MB)
    pipy-oss-alpine-0.10.0-1.tar.gz(10.33 MB)
  • 0.8.0-31(Aug 31, 2021)

    [fix] Bug fix regarding HEAD request handling in HTTP codec filters [fix] Non-shared mux sessions should be freed a while after reset to avoid recursive deletion resulted from closing of parent sessions [filter] Do not show 'data discarded' message if data buffer limit is set to zero for filters handling message bodies [filter] HTTP decoder to translate transport errors into 502 responses. Also fixed a memory leak in serveHTTP [api] Support JWT verification with a PrivateKey object besides a JWK object [core] Now that we have export/import as a better approach to variable sharing between modules, the old MessageStart.context property is now removed [filter] Added serveHTTP filter that handles HTTP requests by simply providing a handler function that returns responses. The builtin GUI service changed to use this new filter internally [core] Download codebase by using http::Mux filter to better handle the lifetime of a keep-alive connection [core] Removed __argv since it is no longer needed now that we have variable export/import Updated test scripts to match with the latest filter renaming [design] HTTP filter renaming, revamping and optimization. [api] Data.toString() returns undefined when data is not in valid UTF-8 encoding [filter] New filter: split [fix] Remotely downloaded scripts should have their base URI pathname stripped off [fix] The new HTTP header encoder generated Connection and Keep-Alive headers without the value, which in turn invalidated the message [api] Added dummy deselect method to HashingLoadBalancer and RoundRobinLoadBalancer so that the 3 load balancing algorithms are fully compatible to each other in interface [filter] Added new filters demuxHTTP and muxHTTP combining HTTP codec and the functionality from the generalized demux/mux filters [filter] Replace decompressMessageBody with decompressMessage and decompressHTTP, with the former protocol-agnostic and the latter specific for HTTP messages [fix] Bug in the dump filter where the tails of data chunks are duplicated [scripting] Remote download/update script files [filter] Revamping HTTP codecs [filter] Added sizeLimit to [handle|replace][Message|MessageBody] filters for setting a maximum body size that can be buffered internally before triggering a script callback [fix] Missing file in CMakeLists.txt [fix] Rewrite tap filter to fix a potential crash that might be caused by an invalid lambda after an asynchronous operation [fix] Outbound connections should only retry on connection failures not reading/writing errors. [fix] Listeners should not even start accepting when maxConnections == 0 [FIX] Base64Url decoding failure in some ending cases. [feature] Added a new filter 'proxySOCKS' with basic non-authenticated SOCKS5 support. The old filter 'proxySOCKS4' is to be removed in the future. [feature] Added aliases for onXXX as handleXXX to avoid misunderstanding. The old onXXX naming will be removed in the future. [feature] Support one-shot tasks that can be used for initialization script. [design] Added a 'context' property to MessageStart so that context information can be passed down connected pipeline sessions from module to module. [feature] tap filter now re-evaluates its quota expression every 5 seconds [api] Added new APIs that facilitate script hot reload, including: [feature] New filter: pack, which combines multiple input messages into one output message. [feature] New filter: merge, like a mux filter working in the way of a fork filter. [feature] connect filter now can have a limit to its internal buffer size and just discard data when the buffer overflows. [feature] algo.Cache now can have a limit to its size with only a number of LRU items kept alive. [feature] New PJS features including: [fix] Dubbo request ID requires 64-bit value range so we have to handle it in JS with a string Changed DATA_CHUNK_SIZE from 16KB to 4KB for a better balance between throughput and memory usage. [fix] Fixed an infinite loop happened in console.log when output has more than one lines. [API] Added more classes to crypto including: Optimization on Hex/Base64(Url) encoding and decoding so that no intermediate buffer is needed amid conversions between Data and string. [feature]Added Netmask.next() method for generation of IPs over an address range. [feature]Constructors of algo.RoundRobinLoadBalancer and algo.LeastWorkLoadBalancer now also receive target arrays in which case targets are weighted equally. [Test] Added test/010-jwt and test/016-socks4-proxy [Feature] Added support of bodiless HTTP responses (responses to HEAD requests). [Feature] Added a new API pipy.restart() for programatic reloading of the current running pjs program [Feature] Added a new API os.writeFile() for writing to local files. [API] Added algo.Percentile for percentile calculation of things like latencies. [API] Added a new global class Netmask CIDR network address mask operations. [API] The tap filter now takes nullish quota as quota being unlimited. [API] Added a new function algo.hash() for calculation the hash of a JS value [BUG FIX] Crash on BSD due to C++ class name demangling failure. [BUG FIX] proxySOCK4 filter wasn't drawn correctly in the graph on the web UI. [BugFix] Fix rpm spec issue and adding static web service (#18) [BugFix] Fix rpm spec issue and adding static web service

    Source code(tar.gz)
    Source code(zip)
    pipy-oss-0.8.0-31-freebsd.tar.gz(2.01 MB)
    pipy-oss-0.8.0-31-ubuntu20.tar.gz(2.27 MB)
    pipy-oss-0.8.0-31.el7.x86_64.rpm(1.83 MB)
  • 0.6.0-7(Jun 7, 2021)

Pushpin is a reverse proxy server written in C++ that makes it easy to implement WebSocket, HTTP streaming, and HTTP long-polling services.

Pushpin is a reverse proxy server written in C++ that makes it easy to implement WebSocket, HTTP streaming, and HTTP long-polling services. The project is unique among realtime push solutions in that it is designed to address the needs of API creators. Pushpin is transparent to clients and integrates easily into an API stack.

Fanout 3.2k Nov 24, 2022
BingBing 60 Nov 4, 2022
mTCP: A Highly Scalable User-level TCP Stack for Multicore Systems

README mTCP is a highly scalable user-level TCP stack for multicore systems. mTCP source code is distributed under the Modified BSD License. For more

null 1.8k Nov 18, 2022
🌱Light and powerful C++ web framework for highly scalable and resource-efficient web application. It's zero-dependency and easy-portable.

Oat++ News Hey, meet the new oatpp version 1.2.5! See the changelog for details. Check out the new oatpp ORM - read more here. Oat++ is a modern Web F

Oat++ 5.9k Dec 5, 2022
A lightweight Universal Windows proxy app based on https://github.com/eycorsican/leaf

Maple A lightweight Universal Windows proxy app based on https://github.com/eycorsican/leaf Features Configuration management Outbound network adapter

YtFlow 741 Nov 27, 2022
Phorklift is an HTTP server and proxy daemon, with clear, powerful and dynamic configuration.

Phorklift is an HTTP server and proxy daemon, with clear, powerful and dynamic configuration.

null 43 Mar 1, 2022
A Nginx module which tries to implement proxy wasm ABI in Nginx.

Status This library is under construction. Description A Nginx module which tries to implement proxy wasm ABI in Nginx. Install dependencies Download

API7 99 Nov 19, 2022
A proxy service of incremental log of OceanBase

OceanBase Migration Serivce LogProxy OceanBase增量日志代理服务,是 OMS 的一部分。基于 liboblog, 以服务的形式,提供实时增量链路接入和管理能力,方便应用接入OceanBase增量日志;能够解决网络隔离的情况下,订阅增量日志的需求;并提供多种

OceanBase 26 Nov 25, 2022
A simple SIP server (proxy) for handling VoIP calls based on SIP using C++

Sip Server A simple sip server for handling VoIP calls based on sip protocol. Features Registration Of Users The server supports registration process.

null 8 Nov 3, 2022
reverse proxy with web server and preview page

Reverse Proxy Dependencies Go Make Suport Termux (android/afsd kernel) linux (kernel) Install: Termux: 1 step: Install Go-lang, Git and Make pkg insta

AlbâniaSecurity-RT 7 Feb 19, 2022
A forward proxy module for CONNECT request handling

name This module provides support for the CONNECT method request. This method is mainly used to tunnel SSL requests through proxy servers. Table of Co

Xiaochen Wang 1.3k Dec 1, 2022
A flexible tool for redirecting a given program's TCP traffic to SOCKS5 or HTTP proxy.

graftcp English | 简体中文 Introduction graftcp can redirect the TCP connection made by the given program [application, script, shell, etc.] to SOCKS5 or

mingang.he 1.3k Nov 24, 2022
WARFOX is a software-based HTTPS beaconing Windows implant that uses a multi-layered proxy network for C2 communications.

An HTTPS beaconing Windows implant and multi-layered proxy C2 network designed for covert APT emulation focused offensive operations

null 85 Nov 25, 2022
Proxy that can be used in GTPS to crash and others. All commands are already in

Credit to ama6nen Real Repo This proxy can be used and modified by everyone. This proxy already has several command exploits for gtps Features: /proxy

Sersinals 1 Nov 12, 2022
An HTTPS beaconing Windows implant and multi-layered proxy C2 network designed for covert APT emulation focused offensive operations

WARFOX is a software-based HTTPS beaconing Windows implant that uses a multi-layered proxy network for C2 communications. This kit was designed to emulate covert APT offensive operations. This kit includes WARFOX (Windows implant), HIGHTOWER (Listening Post), and other tools to build configs and set up a proxy network.

null 85 Nov 25, 2022
We use Clash as the backend proxy, which supports Shadowsocks(R), V2Ray, and Trojan protocols.

We use Clash as the backend proxy, which supports Shadowsocks(R), V2Ray, and Trojan protocols.

Dr. Incognito 1.3k Nov 28, 2022
A modern C++ network library for developing high performance network services in TCP/UDP/HTTP protocols.

evpp Introduction 中文说明 evpp is a modern C++ network library for developing high performance network services using TCP/UDP/HTTP protocols. evpp provid

Qihoo 360 3.1k Nov 29, 2022
GNUWeebBot - High-performance bot Telegram, running on Linux environment.

High-performance bot Telegram, running on Linux environment, written in C. Core Features Event Debug Event Logger Modules Telegram debug info.

GNU/Weeb 11 May 8, 2022
High performance in-kernel WireGuard implementation for Windows

WireGuard for the NT Kernel High performance in-kernel WireGuard implementation for Windows WireGuardNT is an implementation of WireGuard, for the NT

WireGuard 59 Sep 16, 2022