| .. Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. The ASF |
| licenses this file to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| License for the specific language governing permissions and limitations under |
| the License. |
| |
| .. include:: ../../common.defs |
| |
| .. highlight:: cpp |
| .. default-domain:: cpp |
| .. |Name| replace:: Multiplexer |
| |
| |Name| |
| ********** |
| |
| |Name| is a remap plug-in that allows requests to certain origins to be multiplexed (i.e., |
| duplicated and dispatched in parallel) to one or more other hosts. The headers are copied into the |
| new requests as well as request bodies specified via Content-Length. Chunk encoded request bodies |
| are not supported for multiplexing, but they will pass through to the non-multiplexed origin. |
| Optionally POST and PUT requests can be skipped via ``pparam=proxy.config.multiplexer.skip_post_put=1``. |
| |
| Description |
| =========== |
| |
| |Name| does the following for requests it is configured to multiplex: |
| |
| #. Add the ``X-Multiplexer: original`` header into the client's request. |
| #. For each host in ``pparam`` of the remap rule: |
| |
| #. Copies the resulting request (POST bodies are copied via the :ref:`HTTP Transform <developer-plugins-http-transformations>` mechanism). |
| #. Changes the ``Host`` header of the copy according to ``pparam`` from the remap rule. |
| #. Changes ``X-Multiplexer`` header value to ``copy`` instead of ``original``. |
| #. Asynchronously sends the copied request with :func:`TSHttpConnect`. |
| #. The copied request with the specified host is then itself processed via :file:`remap.config`. |
| |
| |Name| dispatches the requests in the background without blocking the original request. Multiplexed |
| responses are drained and discarded. Note that you will need :file:`remap.config` entries for the |
| multiplexed hosts. If no such rules exist, the plugin will internally receive the typical 404 |
| response for the multiplexed request since a matching remap entry for the multiplexed host will not |
| be found, with the result that no request will be sent to that host. When creating the |
| :file:`remap.config` entries for the multiplexed hosts, be aware that the multiplexed requests will |
| be originated with the HTTP scheme (not HTTPS), and therefore the corresponding "from" URL of the |
| remap rule should be constructed with the ``http://`` scheme prefix. See the sample |
| :file:`remap.config` rules below for example |Name| entries. |
| |
| A default ``1`` second timeout is configured when communicating with each of the hosts receiving the |
| multiplexed requests. This timeout can be overwritten via the ``multiplexer__timeout`` environment |
| variable representing how many nanoseconds to wait. |
| |
| The ``multiplexer`` debug tag can be used for debugging purposes (see |
| :ts:cv:`proxy.config.diags.debug.tags`). While debugging, multiplexed requests and responses are |
| printed into the logs. |
| |
| |Name| produces the following statistics consumed with ``traffic_ctl``: |
| |
| * failures: number of failed multiplexed requests |
| * hits: number of successful multiplexed requests |
| * requests: total number of multiplexed requests |
| * time(avg): average time taken between multiplexed requests and their responses |
| * timeouts: number of multiplexed requests which timed-out |
| * size(avg): average size of multiplexed responses |
| |
| Here are some example :file:`remap.config` configuration lines:: |
| |
| map http://www.example.com/a http://www.example.com/ @plugin=multiplexer.so @pparam=host1.example.com |
| map http://host1.example.com http://host1.example.com |
| |
| map http://www.example.com/b http://www.example.com/ @plugin=multiplexer.so @pparam=host2.example.com |
| map http://host2.example.com https://host2.example.com |
| |
| map https://www.example.com/c https://www.example.com/ @plugin=multiplexer.so @pparam=host1.example.com @pparam=host2.example.com |
| map http://www.example.com/d http://www.example.com/ @plugin=multiplexer.so @pparam=host1.example.com @pparam=host2.example.com @pparam=proxy.config.multiplexer.skip_post_put=1 |
| |
| #. The first entry will multiplex requests sent to ``http://www.example.com`` with a path of ``/a`` |
| to ``host1.example.com``. The ``host1.example.com`` remap rule specifies that the multiplexed |
| requests to ``host1`` will be sent over HTTP. |
| #. The second entry will multiplex requests sent to ``http://www.example.com`` with a path of ``/b`` |
| to ``host2.example.com``. The ``host2.example.com`` remap rule specifies that the multiplexed |
| requests to ``host2`` will be sent over HTTPS. |
| #. The third entry will multiplex HTTPS requests sent to ``https://www.example.com`` with a path of |
| ``/c`` to both ``host1.example.com`` and ``host2.example.com``. |
| #. The fourth entry will multiplex requests sent to ``http://www.example.com`` with a path of ``/d`` |
| to both ``host1.example.com`` and ``host2.example.com``, but POST and PUT requests will |
| not be multiplexed. |