.. 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

.. default-domain:: cpp

TSHttpConnectPlugin
*************************

Allows the plugin to initiate an http connection. This will tag the
HTTP state machine with extra data that can be accessed by the
logging interface. Additional arguments provide buffer settings that
are used when constructing IOBuffers. The connection is treated as
an HTTP transaction as if it came from a client.

Synopsis
========

.. code-block:: cpp

    #include <ts/ts.h>

.. function:: TSVConn TSHttpConnectPlugin(TSHttpConnectOptions * options)

Description
===========

This call attempts to create an HTTP state machine and a virtual
connection to that state machine. This is more efficient than using
:func:`TSNetConnect` because it avoids using the operating system
stack via the loopback interface.

:arg:`options`
   A :cpp:type:`TSHttpConnectOptions` structure that contains fields
   that provide the network address of the target, a tag that can be
   passed through to the HTTP state machine, a plugin ID, a buffer
   index and buffer water mark.

The virtual connection returned as the :cpp:type:`TSVConn` is API
equivalent to a network virtual connection both to the plugin and
to internal mechanisms. Data is read and written to the connection
(and thence to the target system) by reading and writing on this
virtual connection.

.. note::

   This function only opens the connection. To drive the transaction an actual
   HTTP request must be sent and the HTTP response handled. The transaction is
   handled as a standard HTTP transaction and all of the standard configuration
   options and plugins will operate on it.

The combination of :arg:`tag` and :arg:`id` is intended to enable correlation
in log post processing. The :arg:`tag` identifies the connection as related
to the plugin and the :arg:`id` can be used in conjunction with plugin
generated logs to correlate the log records.

Notes
=====

The H2 implementation uses this to correlate client sessions
with H2 streams. Each client connection is assigned a distinct
numeric identifier. This is passed in the options structure via
the member variable `id` to the :func:`TSHttpConnectPlugin` function.
The :arg:`tag` is selected to be the ALPN (or NPN) string for the client session
protocol, e.g. "h2". Log post processing can then count the number of
connections for the various supported protocols and the number of H2
virtual streams for each real client connection to Traffic Server.

See Also
========

:manpage:`TSHttpConnectWithPluginId(3ts)`,
:manpage:`TSHttpConnect(3ts)`,
:manpage:`TSNetConnect(3ts)`,
:manpage:`TSAPI(3ts)`
