]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
10 years agoBUG/MINOR: lua: Fix SSL initialisation
Thierry FOURNIER [Tue, 17 Mar 2015 15:48:53 +0000 (16:48 +0100)] 
BUG/MINOR: lua: Fix SSL initialisation

This new initialisation mode for the SSL make easiest the arguments
declaration. In other way, this patch fix a bug in the SSL
initialisation.

10 years agoMINOR: lua: add log functions
Thierry FOURNIER [Tue, 17 Mar 2015 00:09:57 +0000 (01:09 +0100)] 
MINOR: lua: add log functions

Thispatch adds global log function. Each log message is writed on
the stderr and is sent to the default syslog server. These two
actions are done according the configuration.

10 years agoDOC: lua: fix some typos
Thierry FOURNIER [Mon, 16 Mar 2015 14:13:03 +0000 (15:13 +0100)] 
DOC: lua: fix some typos

The class name before the function doesn't have the same
syntax than the declared class names.

The return code is not declared in the prototype of the function.

After the last API modification, the hello world example does not
yet run.

10 years agoMINOR: lua: create and register HTTP class
Thierry FOURNIER [Mon, 16 Mar 2015 13:17:08 +0000 (14:17 +0100)] 
MINOR: lua: create and register HTTP class

This class is accessible via the TXN object. It is created only if
the attached proxy have HTTP mode. It contain all the HTTP
manipulation functions:

 - req_get_headers
 - req_del_header
 - req_rep_header
 - req_rep_value
 - req_add_header
 - req_set_header
 - req_set_method
 - req_set_path
 - req_set_query
 - req_set_uri

 - res_get_headers
 - res_del_header
 - res_rep_header
 - res_rep_value
 - res_add_header
 - res_set_header

10 years agoMINOR: lua: txn: add function set_(loglevel|tos|mark)
Thierry FOURNIER [Mon, 16 Mar 2015 11:04:16 +0000 (12:04 +0100)] 
MINOR: lua: txn: add function set_(loglevel|tos|mark)

This patch adds the "loglevel", "tos" and "mark" manipulation related to
one transaction.

10 years agoMINOR: http: export function inet_set_tos()
Thierry FOURNIER [Mon, 16 Mar 2015 11:03:44 +0000 (12:03 +0100)] 
MINOR: http: export function inet_set_tos()

This is used by Lua.

10 years agoMINOR: http: split http_transform_header() function in two parts.
Thierry FOURNIER [Mon, 16 Mar 2015 10:15:50 +0000 (11:15 +0100)] 
MINOR: http: split http_transform_header() function in two parts.

This function is a callback for HTTP actions. This function
creates the replacement string from a build_logline() format
and transform the header.

This patch split this function in two part. With this modification,
the header transformation and the replacement string are separed.

We can now transform the header with another replacement string
source than a build_logline() format.

10 years agoMINOR: http: split the function http_action_set_req_line() in two parts
Thierry FOURNIER [Sat, 14 Mar 2015 12:55:46 +0000 (13:55 +0100)] 
MINOR: http: split the function http_action_set_req_line() in two parts

The first part is the replacement engine. It take a replacement action
number and a replacement string and process the action.

The second part is the function which is called by the 'http-request
action' to replace a request line part. This function makes the
string used as replacement.

This split permits to use the replacement engine in other parts of the
code than the request action. The Lua use it for his own http action.

10 years agoMEDIUM: http: allows 'R' and 'S' in the protocol alphabet
Thierry FOURNIER [Sat, 28 Feb 2015 18:03:56 +0000 (19:03 +0100)] 
MEDIUM: http: allows 'R' and 'S' in the protocol alphabet

This patch allow the 'R' and the 'S' in the protocol/version
alphabet. It permits to process RTSP requests like HTTP.

10 years agoBUILD: fix automatic inclusion of libdl.
Willy Tarreau [Tue, 17 Mar 2015 13:33:22 +0000 (14:33 +0100)] 
BUILD: fix automatic inclusion of libdl.

Last commit ecc9547 ("BUILD: lua: it miss the '-ldl' directive") broke
build on systems without libdl (eg: FreeBSD). Since lua requires libdl
on some systems, let's simplify this by adding a USE_DL build directive
to enable/disable use of libdl. It's set by default on all linux flavors.

10 years agoBUILD: lua: it miss the '-ldl' directive
Thierry FOURNIER [Tue, 17 Mar 2015 10:14:26 +0000 (11:14 +0100)] 
BUILD: lua: it miss the '-ldl' directive

The Lua library requires the 'dl' library.

10 years agoMEDIUM/CLEANUP: http: rewrite and lighten http_transform_header() prototype
Thierry FOURNIER [Mon, 16 Mar 2015 22:54:35 +0000 (23:54 +0100)] 
MEDIUM/CLEANUP: http: rewrite and lighten http_transform_header() prototype

The http_transform_header() function prototype uses some parameter
which can be guessed from other parameer. This patch removes
theses parameters.

10 years agoBUG/MEDIUM: http: the function "(req|res)-replace-value" doesn't respect the HTTP...
Thierry FOURNIER [Mon, 16 Mar 2015 22:23:53 +0000 (23:23 +0100)] 
BUG/MEDIUM: http: the function "(req|res)-replace-value" doesn't respect the HTTP syntax

These function used an invalid header parser.
 - The trailing white-spaces were embedded in the replacement regex,
 - The double-quote (") containing comma (,) were not respected.

This patch replace this parser by the "official" parser http_find_header2().

10 years agoBUG/MAJOR: http: don't read past buffer's end in http_replace_value
Thierry FOURNIER [Mon, 16 Mar 2015 10:14:41 +0000 (11:14 +0100)] 
BUG/MAJOR: http: don't read past buffer's end in http_replace_value

The function http_replace_value use bad variable to detect the end
of the input string.

Regression introduced by the patch "MEDIUM: regex: Remove null
terminated strings." (c9c2daf2)

We need to backport this patch int the 1.5 stable branch.

WT: there is no possibility to overwrite existing data as we only read
    past the end of the request buffer, to copy into the trash. The copy
    is bounded by buffer_replace2(), just like the replacement performed
    by exp_replace(). However if a buffer happens to contain non-zero data
    up to the next unmapped page boundary, there's a theorical risk of
    crashing the process despite this not being reproducible in tests.
    The risk is low because "http-request replace-value" did not work due
    to this bug so that probably means it's not used yet.

10 years agoBUG/MEDIUM: lua: undetected infinite loop
Thierry FOURNIER [Fri, 13 Mar 2015 13:50:06 +0000 (14:50 +0100)] 
BUG/MEDIUM: lua: undetected infinite loop

If the Lua code causes an infinite loop without yield possible, the
clock is not updated. This patch check the clock when the Lua control
code cannot yield.

10 years agoBUG/MEDIUM: http: the action set-{method|path|query|uri} doesn't run.
Thierry FOURNIER [Sat, 14 Mar 2015 13:14:47 +0000 (14:14 +0100)] 
BUG/MEDIUM: http: the action set-{method|path|query|uri} doesn't run.

This bug is introduced by the commit "MEDIUM: http/tcp: permit to
resume http and tcp custom actions" ( bc4c1ac6ad3dfd5bb ).

Before this patch, the return code of the function was ignored.
After this path, if the function returns 0, it wats a YIELD.

The function http_action_set_req_line() retunrs 0, in succes case.

This patch changes the return code of this function.

10 years agoMEDIUM: listener: store the default target per listener
Willy Tarreau [Fri, 13 Mar 2015 15:43:12 +0000 (16:43 +0100)] 
MEDIUM: listener: store the default target per listener

This will be useful later to state that some listeners have to use
certain decoders (typically an HTTP/2 decoder) regardless of the
regular processing applied to other listeners. For now it simply
defaults to the frontend's default target, and it is used by the
session.

10 years agoCLEANUP: listeners: remove unused timeout
Willy Tarreau [Fri, 13 Mar 2015 15:25:15 +0000 (16:25 +0100)] 
CLEANUP: listeners: remove unused timeout

Listerner->timeout is a vestigal thing going back to 2007 or so. It
used to only be used by stats and peers frontends to hold a pointer
to the proxy's client timeout. Now that we use regular frontends, we
don't use it anymore.

10 years agoMEDIUM: peers: use frontend_accept() instead of peer_accept()
Willy Tarreau [Fri, 13 Mar 2015 15:15:46 +0000 (16:15 +0100)] 
MEDIUM: peers: use frontend_accept() instead of peer_accept()

We don't need the dedicated function anymore, so peer_accept() was
removed.

10 years agoMEDIUM: stats: use frontend_accept() as the accept function
Willy Tarreau [Fri, 13 Mar 2015 15:14:57 +0000 (16:14 +0100)] 
MEDIUM: stats: use frontend_accept() as the accept function

We don't need to use our dedicated function anymore, so stats_accept()
was removed.

10 years agoMINOR: proxy: store the default target into the frontend's configuration
Willy Tarreau [Fri, 13 Mar 2015 14:55:16 +0000 (15:55 +0100)] 
MINOR: proxy: store the default target into the frontend's configuration

Some services such as peers and CLI pre-set the target applet immediately
during accept(), and for this reason they're forced to have a dedicated
accept() function which does not even properly follow everything the regular
one does (eg: sndbuf/rcvbuf/linger/nodelay are not set, etc).

Let's store the default target when known into the frontend's config so that
it's session_accept() which automatically sets it.

10 years agoMINOR: peers: centralize configuration of the peers frontend
Willy Tarreau [Fri, 13 Mar 2015 14:47:26 +0000 (15:47 +0100)] 
MINOR: peers: centralize configuration of the peers frontend

This is in order to stop exporting the peer_accept() function.

10 years agoBUG/MEDIUM: peers: correctly configure the client timeout
Willy Tarreau [Fri, 13 Mar 2015 15:18:25 +0000 (16:18 +0100)] 
BUG/MEDIUM: peers: correctly configure the client timeout

The peers frontend timeout was mistakenly set on timeout.connect instead
of timeout.client, resulting in no timeout being applied to the peers
connections. The impact is just that peers can establish connections and
remain connected until they speak. Once they start speaking, only one of
them will still be accepted, and old sessions will be killed, so the
problem is limited. This fix should however be backported to 1.5 since
it was introduced in 1.5-dev3 with peers.

10 years agoCLEANUP: lua: don't use si_ic/si_oc on known stream-ints
Willy Tarreau [Fri, 13 Mar 2015 13:19:06 +0000 (14:19 +0100)] 
CLEANUP: lua: don't use si_ic/si_oc on known stream-ints

When we explicitly write si[0] or si[1], we know whether we're working
with s->req or s->res, so better use that instead of si_ic/si_oc(), to
make the code simpler and more readable.

10 years agoBUG/MINOR: lua: set current proxy as default value if it is possible
Thierry FOURNIER [Fri, 13 Mar 2015 12:38:17 +0000 (13:38 +0100)] 
BUG/MINOR: lua: set current proxy as default value if it is possible

Some fetches uses a proxy name as first parameter. This is used to identify
frontend, backend or table. This first argument is declared as mandatory,
but the documentation says that is optional.

The behavior of the function smp_resolve_args() is to use the current proxy
if it match the required argument.

This patch implements the same behavior in the Lua argument checker for
sample-fetches and sample-converters.

10 years agoBUG/MINOR: lua: error in detection of mandatory arguments
Thierry FOURNIER [Fri, 13 Mar 2015 11:21:07 +0000 (12:21 +0100)] 
BUG/MINOR: lua: error in detection of mandatory arguments

The last mandatory arguments in sample fetches or converters are
ignored. This is due to a bad control.

10 years agoMEDIUM: map: uses HAProxy facilities to store default value
Thierry FOURNIER [Thu, 12 Mar 2015 23:10:16 +0000 (00:10 +0100)] 
MEDIUM: map: uses HAProxy facilities to store default value

The default value is stored in a special struct that describe the
map. This default value is parsed with special parser. This is
useless because HAProxy provides a space to store the default
value (the args) and HAProxy provides also standard parser for
the input types (args again).

This patch remove this special storage and replace it by an argument.
In other way the args of maps are declared as the expected type in
place of strings.

10 years agoBUG/MINOR: utf8: remove compilator warning
Thierry FOURNIER [Thu, 12 Mar 2015 18:32:38 +0000 (19:32 +0100)] 
BUG/MINOR: utf8: remove compilator warning

'c' is an unsigned int, obviously it is '>= 0'.
This patch remove the '>= 0' test.

this bug is repported by Dmitry Sivachenko

10 years agoMEDIUM: lua: automatically converts strings in proxy, tables, server and ip
Thierry FOURNIER [Thu, 12 Mar 2015 17:28:50 +0000 (18:28 +0100)] 
MEDIUM: lua: automatically converts strings in proxy, tables, server and ip

This patch adds automatic solve of proxy, table and server names.
If ips or masks are required, they try to convert from the input
string.

10 years agoBUG/MEDIUM: lua: bad argument number in analyser and in error message
Thierry FOURNIER [Thu, 12 Mar 2015 17:27:10 +0000 (18:27 +0100)] 
BUG/MEDIUM: lua: bad argument number in analyser and in error message

The first argument in the stack is 1 and not 0. So the analyzer
starts at bad argument number, and the error message contains
also bad argument number.

10 years agoMEDIUM: channel: don't always set CF_WAKE_WRITE on bi_put*
Willy Tarreau [Fri, 13 Mar 2015 13:00:47 +0000 (14:00 +0100)] 
MEDIUM: channel: don't always set CF_WAKE_WRITE on bi_put*

It was inappropriate to put this flag on every failed write into an
input buffer because it depends where it happens. When it's in the
context of an analyser (eg: hlua) it makes sense. When it's in the
context of an applet (eg: dumpstats), it does not make sense, and
it only happens to work because currently applets are scheduled by
the sessions. The proper solution for applets would be to add the
flag SI_FL_WAIT_ROOM on the stream interface.

Thus, we now don't set any flag anymore in bi_put* and it's up to the
caller to either set CF_WAKE_WRITE on the channel or SI_FL_WAIT_ROOM
on the stream interface. Changes were applied to hlua, peers and
dumpstats.

10 years agoCLEANUP: stream-int: remove inclusion of fd.h that is not used anymore
Willy Tarreau [Thu, 12 Mar 2015 23:46:47 +0000 (00:46 +0100)] 
CLEANUP: stream-int: remove inclusion of fd.h that is not used anymore

That's a historic achievement, stream_interface.c doesn't manipulate
any file descriptor anymore. It only relies on connections or applets.

10 years agoREORG: connection: move conn_drain() to connection.c and rename it
Willy Tarreau [Thu, 12 Mar 2015 23:40:28 +0000 (00:40 +0100)] 
REORG: connection: move conn_drain() to connection.c and rename it

It's now called conn_sock_drain() to make it clear that it only reads
at the sock layer and not at the data layer. The function was too big
to remain inlined and it's used at a few places where size counts.

10 years agoMEDIUM: connection: make conn_drain() perform more controls
Willy Tarreau [Thu, 12 Mar 2015 23:32:20 +0000 (00:32 +0100)] 
MEDIUM: connection: make conn_drain() perform more controls

Currently si_idle_conn_null_cb() has to perform some low-level checks
over the file descriptor and the connection configuration that should
only belong to conn_drain(). Let's move these controls there. The
function now automatically checks for errors and hangups on the file
descriptor for example, and disables recv polling if there's no drain
function at the control layer.

10 years agoMEDIUM: stream-int: make conn_si_send_proxy() use conn_sock_send()
Willy Tarreau [Thu, 12 Mar 2015 23:05:28 +0000 (00:05 +0100)] 
MEDIUM: stream-int: make conn_si_send_proxy() use conn_sock_send()

This substantially simplifies the code as we don't need to handle the
file descriptors anymore nor the specific error codes from send().

10 years agoMINOR: connection: implement conn_sock_send()
Willy Tarreau [Thu, 12 Mar 2015 22:56:52 +0000 (23:56 +0100)] 
MINOR: connection: implement conn_sock_send()

This function is an equivalent to send() which operates over a connection
instead of a file descriptor. It checks that the control layer is ready
and that it's allowed to send. If automatically enables polling if it
cannot send. It simplifies the return checks by returning zero in all
cases where it cannot send so that the caller only has to care about
negative values indicating errors.

10 years agoMINOR: checks: use conn_data_shutw_hard() instead of call via xprt
Willy Tarreau [Thu, 12 Mar 2015 22:11:26 +0000 (23:11 +0100)] 
MINOR: checks: use conn_data_shutw_hard() instead of call via xprt

Now we only rely on the connection to do the job. This makes the code
cleaner as we don't have any references to the transport shutdown
outside of the connection anymore.

10 years agoMEDIUM: stream-int: replace xprt->shutw calls with conn_data_shutw()
Willy Tarreau [Thu, 12 Mar 2015 22:04:07 +0000 (23:04 +0100)] 
MEDIUM: stream-int: replace xprt->shutw calls with conn_data_shutw()

Now that the connection performs the correct controls when shutting down,
use that in the few places where conn->xprt->shutw() was called. The calls
were split between conn_data_shutw() and conn_data_shutw_hard() depending
on the argument. Since the connection flags are updated, we don't need to
call conn_data_stop_send() anymore, instead we just have to call
conn_cond_update_polling().

10 years agoMINOR: connection: perform the call to xprt->shutw() in conn_data_shutw()
Willy Tarreau [Thu, 12 Mar 2015 21:51:10 +0000 (22:51 +0100)] 
MINOR: connection: perform the call to xprt->shutw() in conn_data_shutw()

This will save callers from having to care about conn->xprt and xprt->shutw.
Note that shutw() takes a second argument indicating whether it's a clean or
a hard shutw. This is used by SSL which tries to close cleanly in most cases.

Here we provide two versions, conn_data_shutw() which performs the clean
close, and conn_data_shutw_hard() which does the unclean one.

10 years agoMINOR: stream-int: use conn_sock_shutw() to shutdown a connection
Willy Tarreau [Thu, 12 Mar 2015 21:44:53 +0000 (22:44 +0100)] 
MINOR: stream-int: use conn_sock_shutw() to shutdown a connection

Stop calling shutdown() on the connection's fd. Note, this also seems
to fix a bug which was harmless, but which consisted in not marking
the connection as shutdown at the socket level until the other side
was shut as well.

10 years agoMINOR: connection: make conn_sock_shutw() actually perform the shutdown() call
Willy Tarreau [Thu, 12 Mar 2015 21:42:29 +0000 (22:42 +0100)] 
MINOR: connection: make conn_sock_shutw() actually perform the shutdown() call

This function was not used yet and was only supposed to mark the connection
as shutdown for write. Unfortunately at other places in stream_interface.c,
we're seeing a bit of layering violations with attempts to perform the shutdown
on the fd directly. Let's make this function call shutdown() itself so that
the callers only have to care about the connection.

10 years agoCLEANUP: stream-int: remove a redundant clearing of the linger_risk flag
Willy Tarreau [Thu, 12 Mar 2015 21:32:27 +0000 (22:32 +0100)] 
CLEANUP: stream-int: remove a redundant clearing of the linger_risk flag

In stream_sock_read0(), we used to clear this flag. But the only case
where stream_sock_read0() is called is in reaction with a conn_sock_read0()
event coming from the lower layers, which already clears this flag. So let's
remove this duplicate one and clear one of the few remaining layering
violations in this area.

10 years ago[RELEASE] Released version 1.6-dev1 v1.6-dev1
Willy Tarreau [Wed, 11 Mar 2015 22:57:23 +0000 (23:57 +0100)] 
[RELEASE] Released version 1.6-dev1

Released version 1.6-dev1 with the following main changes :
    - CLEANUP: extract temporary $CFG to eliminate duplication
    - CLEANUP: extract temporary $BIN to eliminate duplication
    - CLEANUP: extract temporary $PIDFILE to eliminate duplication
    - CLEANUP: extract temporary $LOCKFILE to eliminate duplication
    - CLEANUP: extract quiet_check() to avoid duplication
    - BUG/MINOR: don't start haproxy on reload
    - DOC: Address issue where documentation is excluded due to a gitignore rule.
    - BUG/MEDIUM: systemd: set KillMode to 'mixed'
    - BUILD: fix "make install" to support spaces in the install dirs
    - BUG/MINOR: config: http-request replace-header arg typo
    - BUG: config: error in http-response replace-header number of arguments
    - DOC: missing track-sc* in http-request rules
    - BUILD: lua: missing ifdef related to SSL when enabling LUA
    - BUG/MEDIUM: regex: fix pcre_study error handling
    - MEDIUM: regex: Use pcre_study always when PCRE is used, regardless of JIT
    - BUG/MINOR: Fix search for -p argument in systemd wrapper.
    - MEDIUM: Improve signal handling in systemd wrapper.
    - DOC: fix typo in Unix Socket commands
    - BUG/MEDIUM: checks: external checks can't change server status to UP
    - BUG/MEDIUM: checks: segfault with external checks in a backend section
    - BUG/MINOR: checks: external checks shouldn't wait for timeout to return the result
    - BUG/MEDIUM: auth: fix segfault with http-auth and a configuration with an unknown encryption algorithm
    - BUG/MEDIUM: config: userlists should ensure that encrypted passwords are supported
    - BUG/MINOR: config: don't propagate process binding for dynamic use_backend
    - BUG/MINOR: log: fix request flags when keep-alive is enabled
    - BUG/MEDIUM: checks: fix conflicts between agent checks and ssl healthchecks
    - MINOR: checks: allow external checks in backend sections
    - MEDIUM: checks: provide environment variables to the external checks
    - MINOR: checks: update dynamic environment variables in external checks
    - DOC: checks: environment variables used by "external-check command"
    - BUG/MEDIUM: backend: correctly detect the domain when use_domain_only is used
    - MINOR: ssl: load certificates in alphabetical order
    - BUG/MINOR: checks: prevent http keep-alive with http-check expect
    - MINOR: lua: typo in an error message
    - MINOR: report the Lua version in -vv
    - MINOR: lua: add a compilation error message when compiled with an incompatible version
    - BUG/MEDIUM: lua: segfault when calling haproxy sample fetches from lua
    - BUILD: try to automatically detect the Lua library name
    - BUILD/CLEANUP: systemd: avoid a warning due to mixed code and declaration
    - BUG/MEDIUM: backend: Update hash to use unsigned int throughout
    - BUG/MEDIUM: connection: fix memory corruption when building a proxy v2 header
    - MEDIUM: connection: add new bit in Proxy Protocol V2
    - BUG/MINOR: ssl: rejects OCSP response without nextupdate.
    - BUG/MEDIUM: ssl: Fix to not serve expired OCSP responses.
    - BUG/MINOR: ssl: Fix OCSP resp update fails with the same certificate configured twice.
    - BUG/MINOR: ssl: Fix external function in order not to return a pointer on an internal trash buffer.
    - MINOR: add fetchs 'ssl_c_der' and 'ssl_f_der' to return DER formatted certs
    - MINOR: ssl: add statement to force some ssl options in global.
    - BUG/MINOR: ssl: correctly initialize ssl ctx for invalid certificates
    - BUG/MEDIUM: ssl: fix bad ssl context init can cause segfault in case of OOM.
    - BUG/MINOR: samples: fix unnecessary memcopy converting binary to string.
    - MINOR: samples: adds the bytes converter.
    - MINOR: samples: adds the field converter.
    - MINOR: samples: add the word converter.
    - BUG/MINOR: server: move the directive #endif to the end of file
    - BUG/MAJOR: buffer: check the space left is enough or not when input data in a buffer is wrapped
    - DOC: fix a few typos
    - CLEANUP: epoll: epoll_events should be allocated according to global.tune.maxpollevents
    - BUG/MINOR: http: fix typo: "401 Unauthorized" => "407 Unauthorized"
    - BUG/MINOR: parse: refer curproxy instead of proxy
    - BUG/MINOR: parse: check the validity of size string in a more strict way
    - BUILD: add new target 'make uninstall' to support uninstalling haproxy from OS
    - DOC: expand the docs for the provided stats.
    - BUG/MEDIUM: unix: do not unlink() abstract namespace sockets upon failure.
    - MEDIUM: ssl: Certificate Transparency support
    - MEDIUM: stats: proxied stats admin forms fix
    - MEDIUM: http: Compress HTTP responses with status codes 201,202,203 in addition to 200
    - BUG/MEDIUM: connection: sanitize PPv2 header length before parsing address information
    - MAJOR: namespace: add Linux network namespace support
    - MINOR: systemd: Check configuration before start
    - BUILD: ssl: handle boringssl in openssl version detection
    - BUILD: ssl: disable OCSP when using boringssl
    - BUILD: ssl: don't call get_rfc2409_prime when using boringssl
    - MINOR: ssl: don't use boringssl's cipher_list
    - BUILD: ssl: use OPENSSL_NO_OCSP to detect OCSP support
    - MINOR: stats: fix minor typo in HTML page
    - MINOR: Also accept SIGHUP/SIGTERM in systemd-wrapper
    - MEDIUM: Add support for configurable TLS ticket keys
    - DOC: Document the new tls-ticket-keys bind keyword
    - DOC: clearly state that the "show sess" output format is not fixed
    - MINOR: stats: fix minor typo fix in stats_dump_errors_to_buffer()
    - DOC: httplog does not support 'no'
    - BUG/MEDIUM: ssl: Fix a memory leak in DHE key exchange
    - MINOR: ssl: use SSL_get_ciphers() instead of directly accessing the cipher list.
    - BUG/MEDIUM: Consistently use 'check' in process_chk
    - MEDIUM: Add external check
    - BUG/MEDIUM: Do not set agent health to zero if server is disabled in config
    - MEDIUM/BUG: Only explicitly report "DOWN (agent)" if the agent health is zero
    - MEDIUM: Remove connect_chk
    - MEDIUM: Refactor init_check and move to checks.c
    - MEDIUM: Add free_check() helper
    - MEDIUM: Move proto and addr fields struct check
    - MEDIUM: Attach tcpcheck_rules to check
    - MEDIUM: Add parsing of mailers section
    - MEDIUM: Allow configuration of email alerts
    - MEDIUM: Support sending email alerts
    - DOC: Document email alerts
    - MINOR: Remove trailing '.' from email alert messages
    - MEDIUM: Allow suppression of email alerts by log level
    - BUG/MEDIUM: Do not consider an agent check as failed on L7 error
    - MINOR: deinit: fix memory leak
    - MINOR: http: export the function 'smp_fetch_base32'
    - BUG/MEDIUM: http: tarpit timeout is reset
    - MINOR: sample: add "json" converter
    - BUG/MEDIUM: pattern: don't load more than once a pattern list.
    - MINOR: map/acl/dumpstats: remove the "Done." message
    - BUG/MAJOR: ns: HAProxy segfault if the cli_conn is not from a network connection
    - BUG/MINOR: pattern: error message missing
    - BUG/MEDIUM: pattern: some entries are not deleted with case insensitive match
    - BUG/MINOR: ARG6 and ARG7 don't fit in a 32 bits word
    - MAJOR: poll: only rely on wake_expired_tasks() to compute the wait delay
    - MEDIUM: task: call session analyzers if the task is woken by a message.
    - MEDIUM: protocol: automatically pick the proto associated to the connection.
    - MEDIUM: channel: wake up any request analyzer on response activity
    - MINOR: converters: add a "void *private" argument to converters
    - MINOR: converters: give the session pointer as converter argument
    - MINOR: sample: add private argument to the struct sample_fetch
    - MINOR: global: export function and permits to not resolve DNS names
    - MINOR: sample: add function for browsing samples.
    - MINOR: global: export many symbols.
    - MINOR: includes: fix a lot of missing or useless includes
    - MEDIUM: tcp: add register keyword system.
    - MEDIUM: buffer: make bo_putblk/bo_putstr/bo_putchk return the number of bytes copied.
    - MEDIUM: http: change the code returned by the response processing rule functions
    - MEDIUM: http/tcp: permit to resume http and tcp custom actions
    - MINOR: channel: functions to get data from a buffer without copy
    - MEDIUM: lua: lua integration in the build and init system.
    - MINOR: lua: add ease functions
    - MINOR: lua: add runtime execution context
    - MEDIUM: lua: "com" signals
    - MINOR: lua: add the configuration directive "lua-load"
    - MINOR: lua: core: create "core" class and object
    - MINOR: lua: post initialisation bindings
    - MEDIUM: lua: add coroutine as tasks.
    - MINOR: lua: add sample and args type converters
    - MINOR: lua: txn: create class TXN associated with the transaction.
    - MINOR: lua: add shared context in the lua stack
    - MINOR: lua: txn: import existing sample-fetches in the class TXN
    - MINOR: lua: txn: add lua function in TXN that returns an array of http headers
    - MINOR: lua: register and execute sample-fetches in LUA
    - MINOR: lua: register and execute converters in LUA
    - MINOR: lua: add bindings for tcp and http actions
    - MINOR: lua: core: add sleep functions
    - MEDIUM: lua: socket: add "socket" class for TCP I/O
    - MINOR: lua: core: pattern and acl manipulation
    - MINOR: lua: channel: add "channel" class
    - MINOR: lua: txn: object "txn" provides two objects "channel"
    - MINOR: lua: core: can set the nice of the current task
    - MINOR: lua: core: can yield an execution stack
    - MINOR: lua: txn: add binding for closing the client connection.
    - MEDIUM: lua: Lua initialisation "on demand"
    - BUG/MAJOR: lua: send function fails and return bad bytes
    - MINOR: remove unused declaration.
    - MINOR: lua: remove some #define
    - MINOR: lua: use bitfield and macro in place of integer and enum
    - MINOR: lua: set skeleton for Lua execution expiration
    - MEDIUM: lua: each yielding function returns a wake up time.
    - MINOR: lua: adds "forced yield" flag
    - MEDIUM: lua: interrupt the Lua execution for running other process
    - MEDIUM: lua: change the sleep function core
    - BUG/MEDIUM: lua: the execution timeout is ignored in yield case
    - DOC: lua: Lua configuration documentation
    - MINOR: lua: add the struct session in the lua channel struct
    - BUG/MINOR: lua: set buffer if it is nnot avalaible.
    - BUG/MEDIUM: lua: reset flags before resuming execution
    - BUG/MEDIUM: lua: fix infinite loop about channel
    - BUG/MEDIUM: lua: the Lua process is not waked up after sending data on requests side
    - BUG/MEDIUM: lua: many errors when we try to send data with the channel API
    - MEDIUM: lua: use the Lua-5.3 version of the library
    - BUG/MAJOR: lua: some function are not yieldable, the forced yield causes errors
    - BUG/MEDIUM: lua: can't handle the response bytes
    - BUG/MEDIUM: lua: segfault with buffer_replace2
    - BUG/MINOR: lua: check buffers before initializing socket
    - BUG/MINOR: log: segfault if there are no proxy reference
    - BUG/MEDIUM: lua: sockets don't have buffer to write data
    - BUG/MEDIUM: lua: cannot connect socket
    - BUG/MINOR: lua: sockets receive behavior doesn't follows the specs
    - BUG/BUILD: lua: The strict Lua 5.3 version check is not done.
    - BUG/MEDIUM: buffer: one byte miss in buffer free space check
    - MEDIUM: lua: make the functions hlua_gethlua() and hlua_sethlua() faster
    - MINOR: replace the Core object by a simple model.
    - MEDIUM: lua: change the objects configuration
    - MEDIUM: lua: create a namespace for the fetches
    - MINOR: converters: add function to browse converters
    - MINOR: lua: wrapper for converters
    - MINOR: lua: replace function (req|get)_channel by a variable
    - MINOR: lua: fetches and converters can return an empty string in place of nil
    - DOC: lua api
    - BUG/MEDIUM: sample: fix random number upper-bound
    - BUG/MINOR: stats:Fix incorrect printf type.
    - BUG/MAJOR: session: revert all the crappy client-side timeout changes
    - BUG/MINOR: logs: properly initialize and count log sockets
    - BUG/MEDIUM: http: fetch "base" is not compatible with set-header
    - BUG/MINOR: counters: do not untrack counters before logging
    - BUG/MAJOR: sample: correctly reinitialize sample fetch context before calling sample_process()
    - MINOR: stick-table: make stktable_fetch_key() indicate why it failed
    - BUG/MEDIUM: counters: fix track-sc* to wait on unstable contents
    - BUILD: remove TODO from the spec file and add README
    - MINOR: log: make MAX_SYSLOG_LEN overridable at build time
    - MEDIUM: log: support a user-configurable max log line length
    - DOC: provide an example of how to use ssl_c_sha1
    - BUILD: checks: external checker needs signal.h
    - BUILD: checks: kill a minor warning on Solaris in external checks
    - BUILD: http: fix isdigit & isspace warnings on Solaris
    - BUG/MINOR: listener: set the listener's fd to -1 after deletion
    - BUG/MEDIUM: unix: failed abstract socket binding is retryable
    - MEDIUM: listener: implement a per-protocol pause() function
    - MEDIUM: listener: support rebinding during resume()
    - BUG/MEDIUM: unix: completely unbind abstract sockets during a pause()
    - DOC: explicitly mention the limits of abstract namespace sockets
    - DOC: minor fix on {sc,src}_kbytes_{in,out}
    - DOC: fix alphabetical sort of converters
    - MEDIUM: stick-table: implement lookup from a sample fetch
    - MEDIUM: stick-table: add new converters to fetch table data
    - MINOR: samples: add two converters for the date format
    - BUG/MAJOR: http: correctly rewind the request body after start of forwarding
    - DOC: remove references to CPU=native in the README
    - DOC: mention that "compression offload" is ignored in defaults section
    - DOC: mention that Squid correctly responds 400 to PPv2 header
    - BUILD: fix dependencies between config and compat.h
    - MINOR: session: export the function 'smp_fetch_sc_stkctr'
    - MEDIUM: stick-table: make it easier to register extra data types
    - BUG/MINOR: http: base32+src should use the big endian version of base32
    - MINOR: sample: allow IP address to cast to binary
    - MINOR: sample: add new converters to hash input
    - MINOR: sample: allow integers to cast to binary
    - BUILD: report commit ID in git versions as well
    - CLEANUP: session: move the stick counters declarations to stick_table.h
    - MEDIUM: http: add the track-sc* actions to http-request rules
    - BUG/MEDIUM: connection: fix proxy v2 header again!
    - BUG/MAJOR: tcp: fix a possible busy spinning loop in content track-sc*
    - OPTIM/MINOR: proxy: reduce struct proxy by 48 bytes on 64-bit archs
    - MINOR: log: add a new field "%lc" to implement a per-frontend log counter
    - BUG/MEDIUM: http: fix inverted condition in pat_match_meth()
    - BUG/MEDIUM: http: fix improper parsing of HTTP methods for use with ACLs
    - BUG/MINOR: pattern: remove useless allocation of unused trash in pat_parse_reg()
    - BUG/MEDIUM: acl: correctly compute the output type when a converter is used
    - CLEANUP: acl: cleanup some of the redundancy and spaghetti after last fix
    - BUG/CRITICAL: http: don't update msg->sov once data start to leave the buffer
    - MEDIUM: http: enable header manipulation for 101 responses
    - BUG/MEDIUM: config: propagate frontend to backend process binding again.
    - MEDIUM: config: properly propagate process binding between proxies
    - MEDIUM: config: make the frontends automatically bind to the listeners' processes
    - MEDIUM: config: compute the exact bind-process before listener's maxaccept
    - MEDIUM: config: only warn if stats are attached to multi-process bind directives
    - MEDIUM: config: report it when tcp-request rules are misplaced
    - DOC: indicate in the doc that track-sc* can wait if data are missing
    - MINOR: config: detect the case where a tcp-request content rule has no inspect-delay
    - MEDIUM: systemd-wrapper: support multiple executable versions and names
    - BUG/MEDIUM: remove debugging code from systemd-wrapper
    - BUG/MEDIUM: http: adjust close mode when switching to backend
    - BUG/MINOR: config: don't propagate process binding on fatal errors.
    - BUG/MEDIUM: check: rule-less tcp-check must detect connect failures
    - BUG/MINOR: tcp-check: report the correct failed step in the status
    - DOC: indicate that weight zero is reported as DRAIN
    - BUG/MEDIUM: config: avoid skipping disabled proxies
    - BUG/MINOR: config: do not accept more track-sc than configured
    - BUG/MEDIUM: backend: fix URI hash when a query string is present
    - BUG/MEDIUM: http: don't dump debug headers on MSG_ERROR
    - BUG/MAJOR: cli: explicitly call cli_release_handler() upon error
    - BUG/MEDIUM: tcp: fix outgoing polling based on proxy protocol
    - BUILD/MINOR: ssl: de-constify "ciphers" to avoid a warning on openssl-0.9.8
    - BUG/MEDIUM: tcp: don't use SO_ORIGINAL_DST on non-AF_INET sockets
    - BUG/BUILD: revert accidental change in the makefile from latest SSL fix
    - BUG/MEDIUM: ssl: force a full GC in case of memory shortage
    - MEDIUM: ssl: add support for smaller SSL records
    - MINOR: session: release a few other pools when stopping
    - MINOR: task: release the task pool when stopping
    - BUG/MINOR: config: don't inherit the default balance algorithm in frontends
    - BUG/MAJOR: frontend: initialize capture pointers earlier
    - BUG/MINOR: stats: correctly set the request/response analysers
    - MAJOR: polling: centralize calls to I/O callbacks
    - DOC: fix typo in the body parser documentation for msg.sov
    - BUG/MINOR: peers: the buffer size is global.tune.bufsize, not trash.size
    - MINOR: sample: add a few basic internal fetches (nbproc, proc, stopping)
    - DEBUG: pools: apply poisonning on every allocated pool
    - BUG/MAJOR: sessions: unlink session from list on out of memory
    - BUG/MEDIUM: patterns: previous fix was incomplete
    - BUG/MEDIUM: payload: ensure that a request channel is available
    - BUG/MINOR: tcp-check: don't condition data polling on check type
    - BUG/MEDIUM: tcp-check: don't rely on random memory contents
    - BUG/MEDIUM: tcp-checks: disable quick-ack unless next rule is an expect
    - BUG/MINOR: config: fix typo in condition when propagating process binding
    - BUG/MEDIUM: config: do not propagate processes between stopped processes
    - BUG/MAJOR: stream-int: properly check the memory allocation return
    - BUG/MEDIUM: memory: fix freeing logic in pool_gc2()
    - BUG/MAJOR: namespaces: conn->target is not necessarily a server
    - BUG/MEDIUM: compression: correctly report zlib_mem
    - CLEANUP: lists: remove dead code
    - CLEANUP: memory: remove dead code
    - CLEANUP: memory: replace macros pool_alloc2/pool_free2 with functions
    - MINOR: memory: cut pool allocator in 3 layers
    - MEDIUM: memory: improve pool_refill_alloc() to pass a refill count
    - MINOR: stream-int: retrieve session pointer from stream-int
    - MINOR: buffer: reset a buffer in b_reset() and not channel_init()
    - MEDIUM: buffer: use b_alloc() to allocate and initialize a buffer
    - MINOR: buffer: move buffer initialization after channel initialization
    - MINOR: buffer: only use b_free to release buffers
    - MEDIUM: buffer: always assign a dummy empty buffer to channels
    - MEDIUM: buffer: add a new buf_wanted dummy buffer to report failed allocations
    - MEDIUM: channel: do not report full when buf_empty is present on a channel
    - MINOR: session: group buffer allocations together
    - MINOR: buffer: implement b_alloc_fast()
    - MEDIUM: buffer: implement b_alloc_margin()
    - MEDIUM: session: implement a basic atomic buffer allocator
    - MAJOR: session: implement a wait-queue for sessions who need a buffer
    - MAJOR: session: only allocate buffers when needed
    - MINOR: stats: report a "waiting" flags for sessions
    - MAJOR: session: only wake up as many sessions as available buffers permit
    - MINOR: config: implement global setting tune.buffers.reserve
    - MINOR: config: implement global setting tune.buffers.limit
    - MEDIUM: channel: implement a zero-copy buffer transfer
    - MEDIUM: stream-int: support splicing from applets
    - OPTIM: stream-int: try to send pending spliced data
    - CLEANUP: session: remove session_from_task()
    - DOC: add missing entry for log-format and clarify the text
    - MINOR: logs: add a new per-proxy "log-tag" directive
    - BUG/MEDIUM: http: fix header removal when previous header ends with pure LF
    - MINOR: config: extend the default max hostname length to 64 and beyond
    - BUG/MEDIUM: channel: fix possible integer overflow on reserved size computation
    - BUG/MINOR: channel: compare to_forward with buf->i, not buf->size
    - MINOR: channel: add channel_in_transit()
    - MEDIUM: channel: make buffer_reserved() use channel_in_transit()
    - MEDIUM: channel: make bi_avail() use channel_in_transit()
    - BUG/MEDIUM: channel: don't schedule data in transit for leaving until connected
    - CLEANUP: channel: rename channel_reserved -> channel_is_rewritable
    - MINOR: channel: rename channel_full() to !channel_may_recv()
    - MINOR: channel: rename buffer_reserved() to channel_reserved()
    - MINOR: channel: rename buffer_max_len() to channel_recv_limit()
    - MINOR: channel: rename bi_avail() to channel_recv_max()
    - MINOR: channel: rename bi_erase() to channel_truncate()
    - BUG/MAJOR: log: don't try to emit a log if no logger is set
    - MINOR: tools: add new round_2dig() function to round integers
    - MINOR: global: always export some SSL-specific metrics
    - MINOR: global: report information about the cost of SSL connections
    - MAJOR: init: automatically set maxconn and/or maxsslconn when possible
    - MINOR: http: add a new fetch "query" to extract the request's query string
    - MINOR: hash: add new function hash_crc32
    - MINOR: samples: provide a "crc32" converter
    - MEDIUM: backend: add the crc32 hash algorithm for load balancing
    - BUG/MINOR: args: add missing entry for ARGT_MAP in arg_type_names
    - BUG/MEDIUM: http: make http-request set-header compute the string before removal
    - MEDIUM: args: use #define to specify the number of bits used by arg types and counts
    - MEDIUM: args: increase arg type to 5 bits and limit arg count to 5
    - MINOR: args: add type-specific flags for each arg in a list
    - MINOR: args: implement a new arg type for regex : ARGT_REG
    - MEDIUM: regex: add support for passing regex flags to regex_exec_match()
    - MEDIUM: samples: add a regsub converter to perform regex-based transformations
    - BUG/MINOR: sample: fix case sensitivity for the regsub converter
    - MEDIUM: http: implement http-request set-{method,path,query,uri}
    - DOC: fix missing closing brackend on regsub
    - MEDIUM: samples: provide basic arithmetic and bitwise operators
    - MEDIUM: init: continue to enforce SYSTEM_MAXCONN with auto settings if set
    - BUG/MINOR: http: fix incorrect header value offset in replace-hdr/replace-value
    - BUG/MINOR: http: abort request processing on filter failure
    - MEDIUM: tcp: implement tcp-ut bind option to set TCP_USER_TIMEOUT
    - MINOR: ssl/server: add the "no-ssl-reuse" server option
    - BUG/MAJOR: peers: initialize s->buffer_wait when creating the session
    - MINOR: http: add a new function to iterate over each header line
    - MINOR: http: add the new sample fetches req.hdr_names and res.hdr_names
    - MEDIUM: task: always ensure that the run queue is consistent
    - BUILD: Makefile: add -Wdeclaration-after-statement
    - BUILD/CLEANUP: ssl: avoid a warning due to mixed code and declaration
    - BUILD/CLEANUP: config: silent 3 warnings about mixed declarations with code
    - MEDIUM: protocol: use a family array to index the protocol handlers
    - BUILD: lua: cleanup many mixed occurrences declarations & code
    - BUG/MEDIUM: task: fix recently introduced scheduler skew
    - BUG/MINOR: lua: report the correct function name in an error message
    - BUG/MAJOR: http: fix stats regression consecutive to HTTP_RULE_RES_YIELD
    - Revert "BUG/MEDIUM: lua: can't handle the response bytes"
    - MINOR: lua: convert IP addresses to type string
    - CLEANUP: lua: use the same function names in C and Lua
    - REORG/MAJOR: move session's req and resp channels back into the session
    - CLEANUP: remove now unused channel pool
    - REORG/MEDIUM: stream-int: introduce si_ic/si_oc to access channels
    - MEDIUM: stream-int: add a flag indicating which side the SI is on
    - MAJOR: stream-int: only rely on SI_FL_ISBACK to find the requested channel
    - MEDIUM: stream-interface: remove now unused pointers to channels
    - MEDIUM: stream-int: make si_sess() use the stream int's side
    - MEDIUM: stream-int: use si_task() to retrieve the task from the stream int
    - MEDIUM: stream-int: remove any reference to the owner
    - CLEANUP: stream-int: add si_ib/si_ob to dereference the buffers
    - CLEANUP: stream-int: add si_opposite() to find the other stream interface
    - REORG/MEDIUM: channel: only use chn_prod / chn_cons to find stream-interfaces
    - MEDIUM: channel: add a new flag "CF_ISRESP" for the response channel
    - MAJOR: channel: only rely on the new CF_ISRESP flag to find the SI
    - MEDIUM: channel: remove now unused ->prod and ->cons pointers
    - CLEANUP: session: simplify references to chn_{prod,cons}(&s->{req,res})
    - CLEANUP: session: use local variables to access channels / stream ints
    - CLEANUP: session: don't needlessly pass a pointer to the stream-int
    - CLEANUP: session: don't use si_{ic,oc} when we know the session.
    - CLEANUP: stream-int: limit usage of si_ic/si_oc
    - CLEANUP: lua: limit usage of si_ic/si_oc
    - MINOR: channel: add chn_sess() helper to retrieve session from channel
    - MEDIUM: session: simplify receive buffer allocator to only use the channel
    - MEDIUM: lua: use CF_ISRESP to detect the channel's side
    - CLEANUP: lua: remove the session pointer from hlua_channel
    - CLEANUP: lua: hlua_channel_new() doesn't need the pointer to the session anymore
    - MEDIUM: lua: remove struct hlua_channel
    - MEDIUM: lua: remove hlua_sample_fetch

10 years agoMEDIUM: stats: proxied stats admin forms fix
Jeff Buchbinder [Fri, 29 Aug 2014 20:10:08 +0000 (15:10 -0500)] 
MEDIUM: stats: proxied stats admin forms fix

Patch for not using relative URLs for admin forms. This allows proxied instances
of the stats admin interface to continue to function, as the default FORM
action is to submit to the current URL.

10 years agoMEDIUM: ssl: Certificate Transparency support
Janusz Dziemidowicz [Sat, 7 Mar 2015 22:03:59 +0000 (23:03 +0100)] 
MEDIUM: ssl: Certificate Transparency support

Adds ability to include Signed Certificate Timestamp List in TLS
extension. File containing SCTL must be present at the same path of
the certificate file, suffixed with '.sctl'. This requires OpenSSL
1.0.2 or later.

10 years agoMEDIUM: http: Compress HTTP responses with status codes 201,202,203 in addition to 200
Jesse Hathaway [Fri, 6 Mar 2015 20:16:15 +0000 (20:16 +0000)] 
MEDIUM: http: Compress HTTP responses with status codes 201,202,203 in addition to 200

It is common for rest applications to return status codes other than
200, so compress the other common 200 level responses which might
contain content.

10 years agoMEDIUM: lua: remove hlua_sample_fetch
Willy Tarreau [Tue, 10 Mar 2015 13:27:20 +0000 (14:27 +0100)] 
MEDIUM: lua: remove hlua_sample_fetch

This struct used to carry only a sample fetch function. Thanks to
lua_pushuserdata(), we don't need to have the Lua engine allocate
that struct for us and we can simply push our pointer onto the stack.
This makes the code more readable by removing several occurrences of
"f->f->". Just like the previous patch, it comes with the nice effect
of saving about 1.3% of performance when fetching samples from Lua.

10 years agoMEDIUM: lua: remove struct hlua_channel
Willy Tarreau [Tue, 10 Mar 2015 13:07:50 +0000 (14:07 +0100)] 
MEDIUM: lua: remove struct hlua_channel

Since last cleanups, this one was only used to carry a struct channel.
Removing it makes the code a bit cleaner (no more chn->chn) and easier
to follow (no more abstraction for a common type). Interestingly it
happens to also make the Lua code slightly faster (about 1.5%) when
using channels, probably thanks to less pointer dereferences and maybe
the use of lua_pushlightuserdata().

10 years agoCLEANUP: lua: hlua_channel_new() doesn't need the pointer to the session anymore
Willy Tarreau [Tue, 10 Mar 2015 12:51:50 +0000 (13:51 +0100)] 
CLEANUP: lua: hlua_channel_new() doesn't need the pointer to the session anymore

Let's remove it now.

10 years agoCLEANUP: lua: remove the session pointer from hlua_channel
Willy Tarreau [Tue, 10 Mar 2015 12:50:03 +0000 (13:50 +0100)] 
CLEANUP: lua: remove the session pointer from hlua_channel

It was only used to find what side the channel belongs to.

10 years agoMEDIUM: lua: use CF_ISRESP to detect the channel's side
Willy Tarreau [Tue, 10 Mar 2015 12:49:14 +0000 (13:49 +0100)] 
MEDIUM: lua: use CF_ISRESP to detect the channel's side

Instead of comparing with session's channels, we check the channel's
flags to find what side it belongs to.

10 years agoMEDIUM: session: simplify receive buffer allocator to only use the channel
Willy Tarreau [Sun, 28 Dec 2014 12:09:02 +0000 (13:09 +0100)] 
MEDIUM: session: simplify receive buffer allocator to only use the channel

Now that we can get the session from the channel, let's simplify the
prototype of session_alloc_recv_buffer() to only require the channel.
Both the caller and the function are now simplified.

10 years agoMINOR: channel: add chn_sess() helper to retrieve session from channel
Willy Tarreau [Sun, 28 Dec 2014 12:03:53 +0000 (13:03 +0100)] 
MINOR: channel: add chn_sess() helper to retrieve session from channel

Channels already have to know what session they below to. Add a helper
to retrieve this pointer so that we'll use it later.

10 years agoCLEANUP: lua: limit usage of si_ic/si_oc
Willy Tarreau [Tue, 10 Mar 2015 11:03:52 +0000 (12:03 +0100)] 
CLEANUP: lua: limit usage of si_ic/si_oc

As much as possible, we copy the result of this function into a local
variable to avoid having to check the flag all the time.

10 years agoCLEANUP: stream-int: limit usage of si_ic/si_oc
Willy Tarreau [Fri, 28 Nov 2014 14:46:27 +0000 (15:46 +0100)] 
CLEANUP: stream-int: limit usage of si_ic/si_oc

As much as possible, we copy the result of this function into a local
variable to avoid having to check the flag all the time.

10 years agoCLEANUP: session: don't use si_{ic,oc} when we know the session.
Willy Tarreau [Fri, 28 Nov 2014 14:26:12 +0000 (15:26 +0100)] 
CLEANUP: session: don't use si_{ic,oc} when we know the session.

During the connection establishment, we needlessly rely on pointer
dereferences.

10 years agoCLEANUP: session: don't needlessly pass a pointer to the stream-int
Willy Tarreau [Fri, 28 Nov 2014 14:15:44 +0000 (15:15 +0100)] 
CLEANUP: session: don't needlessly pass a pointer to the stream-int

All functions dealing with connection establishment currently use a
pointer to the stream interface. Now we know it cannot change and is
always s->si[1].

10 years agoCLEANUP: session: use local variables to access channels / stream ints
Willy Tarreau [Fri, 28 Nov 2014 14:07:47 +0000 (15:07 +0100)] 
CLEANUP: session: use local variables to access channels / stream ints

In process_session, we had around 300 accesses to channels and stream-ints
from the session. Not only this inflates the code due to the large offsets
from the original pointer, but readability can be improved. Let's have 4
local variables for the channels and stream-ints.

10 years agoCLEANUP: session: simplify references to chn_{prod,cons}(&s->{req,res})
Willy Tarreau [Fri, 28 Nov 2014 13:42:25 +0000 (14:42 +0100)] 
CLEANUP: session: simplify references to chn_{prod,cons}(&s->{req,res})

These 4 combinations are needlessly complicated since the session already
has direct access to the associated stream interfaces without having to
check an indirect pointer.

10 years agoMEDIUM: channel: remove now unused ->prod and ->cons pointers
Willy Tarreau [Fri, 28 Nov 2014 13:23:47 +0000 (14:23 +0100)] 
MEDIUM: channel: remove now unused ->prod and ->cons pointers

Nothing uses them anymore.

10 years agoMAJOR: channel: only rely on the new CF_ISRESP flag to find the SI
Willy Tarreau [Fri, 28 Nov 2014 13:22:12 +0000 (14:22 +0100)] 
MAJOR: channel: only rely on the new CF_ISRESP flag to find the SI

Now we exclusively use this flag to find what side a channel is and
where the stream ints are. The ->prod and ->cons are not used anymore.

10 years agoMEDIUM: channel: add a new flag "CF_ISRESP" for the response channel
Willy Tarreau [Fri, 28 Nov 2014 13:17:09 +0000 (14:17 +0100)] 
MEDIUM: channel: add a new flag "CF_ISRESP" for the response channel

This flag designates the response channel. This will be used to know
what channel we're seeing and finding our way back to the session.

10 years agoREORG/MEDIUM: channel: only use chn_prod / chn_cons to find stream-interfaces
Willy Tarreau [Fri, 28 Nov 2014 13:10:28 +0000 (14:10 +0100)] 
REORG/MEDIUM: channel: only use chn_prod / chn_cons to find stream-interfaces

The purpose of these two macros will be to pass via the session to
find the relevant stream interfaces so that we don't need to store
the ->cons nor ->prod pointers anymore. Currently they're only defined
so that all references could be removed.

Note that many places need a second pass of clean up so that we don't
have any chn_prod(&s->req) anymore and only &s->si[0] instead, and
conversely for the 3 other cases.

10 years agoCLEANUP: stream-int: add si_opposite() to find the other stream interface
Willy Tarreau [Fri, 28 Nov 2014 12:59:31 +0000 (13:59 +0100)] 
CLEANUP: stream-int: add si_opposite() to find the other stream interface

At a few places we need to find one stream interface from the other one.
Instead of passing via the channel, we simply use the session as an
intermediary, which simply results in applying an offset to the pointer.

10 years agoCLEANUP: stream-int: add si_ib/si_ob to dereference the buffers
Willy Tarreau [Fri, 28 Nov 2014 11:18:45 +0000 (12:18 +0100)] 
CLEANUP: stream-int: add si_ib/si_ob to dereference the buffers

This makes the code cleaner and is more intuitive to use.

10 years agoMEDIUM: stream-int: remove any reference to the owner
Willy Tarreau [Fri, 28 Nov 2014 11:12:34 +0000 (12:12 +0100)] 
MEDIUM: stream-int: remove any reference to the owner

si->owner is not used anymore now, so let's remove any reference to it.

10 years agoMEDIUM: stream-int: use si_task() to retrieve the task from the stream int
Willy Tarreau [Fri, 28 Nov 2014 11:08:47 +0000 (12:08 +0100)] 
MEDIUM: stream-int: use si_task() to retrieve the task from the stream int

We go back to the session to get the owner. Here again it's very easy
and is just a matter of relative offsets. Since the owner always exists
and always points to the session's task, we can remove some unneeded
tests.

10 years agoMEDIUM: stream-int: make si_sess() use the stream int's side
Willy Tarreau [Fri, 28 Nov 2014 11:03:32 +0000 (12:03 +0100)] 
MEDIUM: stream-int: make si_sess() use the stream int's side

This one relies on the SI's side to find the pointer to the session.
That the stream interface doesn't have to look at the task's context
anymore.

10 years agoMEDIUM: stream-interface: remove now unused pointers to channels
Willy Tarreau [Fri, 28 Nov 2014 10:53:35 +0000 (11:53 +0100)] 
MEDIUM: stream-interface: remove now unused pointers to channels

Everyone must now use si_ic() / si_oc() to find the relevant channels,
the points have been totally removed.

10 years agoMAJOR: stream-int: only rely on SI_FL_ISBACK to find the requested channel
Willy Tarreau [Fri, 28 Nov 2014 10:50:38 +0000 (11:50 +0100)] 
MAJOR: stream-int: only rely on SI_FL_ISBACK to find the requested channel

In order to plan removal of si->ib / si->ob, we now check the side of the
stream interface and find the session, then the requested channel. In
practice it's just an offset applied to the pointer based on the flag.

10 years agoMEDIUM: stream-int: add a flag indicating which side the SI is on
Willy Tarreau [Fri, 28 Nov 2014 10:26:07 +0000 (11:26 +0100)] 
MEDIUM: stream-int: add a flag indicating which side the SI is on

This new flag "SI_FL_ISBACK" is set only on the back SI and is cleared
on the front SI. That way it's possible only by looking at the SI to
know what side it is.

10 years agoREORG/MEDIUM: stream-int: introduce si_ic/si_oc to access channels
Willy Tarreau [Fri, 28 Nov 2014 10:11:05 +0000 (11:11 +0100)] 
REORG/MEDIUM: stream-int: introduce si_ic/si_oc to access channels

We'll soon remove direct references to the channels from the stream
interface since everything belongs to the same session, so let's
first not dereference si->ib / si->ob anymore and use macros instead.

10 years agoCLEANUP: remove now unused channel pool
Willy Tarreau [Thu, 27 Nov 2014 21:10:04 +0000 (22:10 +0100)] 
CLEANUP: remove now unused channel pool

The channels are now part of the struct session. Their pool is
not needed anymore.

10 years agoREORG/MAJOR: move session's req and resp channels back into the session
Willy Tarreau [Thu, 27 Nov 2014 19:45:39 +0000 (20:45 +0100)] 
REORG/MAJOR: move session's req and resp channels back into the session

The channels were pointers to outside structs and this is not needed
anymore since the buffers have moved, but this complicates operations.
Move them back into the session so that both channels and stream interfaces
are always allocated for a session. Some places (some early sample fetch
functions) used to validate that a channel was NULL prior to dereferencing
it. Now instead we check if chn->buf is NULL and we force it to remain NULL
until the channel is initialized.

10 years agoDOC: lua api
Thierry FOURNIER [Wed, 11 Mar 2015 19:31:00 +0000 (20:31 +0100)] 
DOC: lua api

This contains the Lua API documentation and the build environment
for Sphinx.

10 years agoMINOR: lua: fetches and converters can return an empty string in place of nil
Thierry FOURNIER [Wed, 11 Mar 2015 19:13:36 +0000 (20:13 +0100)] 
MINOR: lua: fetches and converters can return an empty string in place of nil

In some cases we don't want to known if a fetch or converter
fails. We just want a valid string. After this patch, we
have two sets of fetches and two sets of converters. There are:
txn.f, txn.sf, txn.c, txn.sc. The version prefixed by 's' always
returns strings for any type, and returns an empty string in the
error case or when the data are not available. This is particularly
useful when manipulating headers or cookies.

10 years agoMINOR: lua: replace function (req|get)_channel by a variable
Thierry FOURNIER [Wed, 11 Mar 2015 18:39:09 +0000 (19:39 +0100)] 
MINOR: lua: replace function (req|get)_channel by a variable

To add data in channel, it is necessary to process in two times.
First time, get the channel object, and after send data:

   local req = txn:req_channel()
req:send("data\n")

Now, the function is converted as a variable containing the req
and res aobject. We can process as following:

   txn.req:send("data\n")

10 years agoMINOR: lua: wrapper for converters
Thierry FOURNIER [Tue, 10 Mar 2015 22:58:30 +0000 (23:58 +0100)] 
MINOR: lua: wrapper for converters

This patch implements a wrapper to give access to the converters
in the Lua code. The converters are used with the transaction.
The automatically created function are prefixed by "conv_".

10 years agoMINOR: converters: add function to browse converters
Thierry FOURNIER [Tue, 10 Mar 2015 22:56:48 +0000 (23:56 +0100)] 
MINOR: converters: add function to browse converters

This patch adds a fucntion to browse each converter. This
is used with Lua for using the converters with a wrapper.

10 years agoMEDIUM: lua: create a namespace for the fetches
Thierry FOURNIER [Wed, 11 Mar 2015 17:28:02 +0000 (18:28 +0100)] 
MEDIUM: lua: create a namespace for the fetches

HAProxy proposes many sample fetches. It is possible that the
automatic registration of the sample fetches causes a collision
with an existing Lua function. This patch sets a namespace for
the sample fetches.

10 years agoMEDIUM: lua: change the objects configuration
Thierry FOURNIER [Wed, 11 Mar 2015 16:43:33 +0000 (17:43 +0100)] 
MEDIUM: lua: change the objects configuration

Actually an object is just a userdata value with a metatable.
This mode causes some problems like I can't add lua own data.
This new model uses an array as object base, and affect the
userdata at the index 0.

10 years agoMINOR: replace the Core object by a simple model.
Thierry FOURNIER [Wed, 11 Mar 2015 16:29:39 +0000 (17:29 +0100)] 
MINOR: replace the Core object by a simple model.

The core entry is just a collection of function, it doesn't depends on
special variable. This patch just converts an object contained in a
metatable in object contained in a normal table.

10 years agoCLEANUP: lua: use the same function names in C and Lua
Willy Tarreau [Tue, 10 Mar 2015 13:23:13 +0000 (14:23 +0100)] 
CLEANUP: lua: use the same function names in C and Lua

A few function names in Lua had underscores which did not appear in their
C counterpart. Since almost all of them already had similar names, better
uniformize the naming convention.

10 years agoMINOR: lua: convert IP addresses to type string
Willy Tarreau [Tue, 10 Mar 2015 16:28:54 +0000 (17:28 +0100)] 
MINOR: lua: convert IP addresses to type string

For now we don't perform any operation on IP addresses, so at least
we'd like to be able to pass them as strings so that we can log them
or whatever in Lua. Without this patch txn.src(txn) returns "nil" and
now it returns the correct IP address.

10 years agoMEDIUM: lua: make the functions hlua_gethlua() and hlua_sethlua() faster
Thierry FOURNIER [Tue, 10 Mar 2015 01:40:29 +0000 (02:40 +0100)] 
MEDIUM: lua: make the functions hlua_gethlua() and hlua_sethlua() faster

Lua 5.3 provides an opaque space associated with each
coroutine stack. This patch uses this lot of memory to
store the "struct hlua *" associated pointer.

This patch makes the retrieval of the "struct hlua *"
associated struct faster because it replace a lookup in
a tree by an immediate access to the data.

10 years agoRevert "BUG/MEDIUM: lua: can't handle the response bytes"
Willy Tarreau [Tue, 10 Mar 2015 16:16:10 +0000 (17:16 +0100)] 
Revert "BUG/MEDIUM: lua: can't handle the response bytes"

This reverts commit cd9084f77683106ace2fb863080e7d10e71c39fc.

This commit introduced a regression making it impossible to leave
process_session() during a forced yield because the analyser was always
set on the response even if not needed. The result was a busy loop
making haproxy spin at 100% without even polling anymore in case a
forced yield was performed.

The problem it tried to address (intercept response data from a request
analyser before forwarding) is not a trivial issue to address since
wakeups based on reads will not necessarily happen unless there's write
activity.

Anyway, if functions are attached specifically to a request or to a
response, it's for a reason. So for now let's be clear about the fact
that it's unreliable to try to process data from the opposite channel
until a better solution is found.

10 years agoBUG/MAJOR: http: fix stats regression consecutive to HTTP_RULE_RES_YIELD
Willy Tarreau [Tue, 10 Mar 2015 14:25:54 +0000 (15:25 +0100)] 
BUG/MAJOR: http: fix stats regression consecutive to HTTP_RULE_RES_YIELD

Commit bc4c1ac ("MEDIUM: http/tcp: permit to resume http and tcp custom actions")
unfortunately broke the stats applet by moving the clearing of the analyser bit
after processing the applet headers. It used to work only in HTTP/1.1 and not
in HTTP/1.0. This is 1.6-specific, no backport is needed.

10 years agoBUG/MINOR: lua: report the correct function name in an error message
Willy Tarreau [Tue, 10 Mar 2015 13:22:28 +0000 (14:22 +0100)] 
BUG/MINOR: lua: report the correct function name in an error message

"req_channel" was reported instead of "res_channel". This is harmless.

10 years agoBUG/MEDIUM: buffer: one byte miss in buffer free space check
Thierry FOURNIER [Tue, 10 Mar 2015 00:55:01 +0000 (01:55 +0100)] 
BUG/MEDIUM: buffer: one byte miss in buffer free space check

Space is not avalaible only if the end of the data inserted
is strictly greater than the end of buffer. If these two value
are equal, the space is avamaible.

10 years agoBUG/BUILD: lua: The strict Lua 5.3 version check is not done.
Thierry FOURNIER [Mon, 9 Mar 2015 23:35:36 +0000 (00:35 +0100)] 
BUG/BUILD: lua: The strict Lua 5.3 version check is not done.

This patch fix the Lua library check. Only the version
5.3 or later is allowed.

This bug is added by the patch "MEDIUM: lua: use the
Lua-5.3 version of the library" with commit id

   f90838b71a3c7f84e1d8b4ff85760a35d60c6910

10 years agoBUG/MINOR: lua: sockets receive behavior doesn't follows the specs
Thierry FOURNIER [Mon, 9 Mar 2015 17:35:06 +0000 (18:35 +0100)] 
BUG/MINOR: lua: sockets receive behavior doesn't follows the specs

Specs says that the receive() function with an argument "*l"
must return a line without the final "\n" ( or without "\r\n").
This patch removes these two final bytes.

10 years agoBUG/MEDIUM: lua: cannot connect socket
Thierry FOURNIER [Mon, 9 Mar 2015 17:12:40 +0000 (18:12 +0100)] 
BUG/MEDIUM: lua: cannot connect socket

The Lua stack is not waked up when the connect() receive a positive
or negatibe response. This patch adds a signal to wake up the Lua
stack.

10 years agoBUG/MEDIUM: lua: sockets don't have buffer to write data
Thierry FOURNIER [Mon, 9 Mar 2015 16:51:43 +0000 (17:51 +0100)] 
BUG/MEDIUM: lua: sockets don't have buffer to write data

When we try to write data in a session from another session, the "req"
buffer is not allowed. This patch try to allocate the buffer. The session
wait if the buffer is not yet avalaible.

10 years agoBUG/MINOR: log: segfault if there are no proxy reference
Thierry FOURNIER [Mon, 9 Mar 2015 16:10:29 +0000 (17:10 +0100)] 
BUG/MINOR: log: segfault if there are no proxy reference

The HAProxy API allow to send log without defined proxy (it
set to the NULL value). An incomplete test if done to choose
the log tag and an invalid pointer is dereferenced.

10 years agoBUG/MINOR: lua: check buffers before initializing socket
Thierry FOURNIER [Mon, 9 Mar 2015 16:07:10 +0000 (17:07 +0100)] 
BUG/MINOR: lua: check buffers before initializing socket

When a socket is initilized in the body context, a segfaut is generated
because the memory pools are not initilized. This atch check if these
memory pool are initialized.

10 years agoBUG/MEDIUM: lua: segfault with buffer_replace2
Thierry FOURNIER [Sat, 7 Mar 2015 13:38:50 +0000 (14:38 +0100)] 
BUG/MEDIUM: lua: segfault with buffer_replace2

The function buffer_contig_space() returns the contiguous space avalaible
to add data (at the end of the input side) while the function
hlua_channel_send_yield() needs to insert data starting at p. Here we
introduce a new function bi_space_for_replace() which returns the amount
of space that can be inserted at the head of the input side with one of
the buffer_replace* functions.

This patch proposes a function that returns the space avalaible after buf->p.

10 years agoBUG/MEDIUM: lua: can't handle the response bytes
Thierry FOURNIER [Sat, 7 Mar 2015 14:11:09 +0000 (15:11 +0100)] 
BUG/MEDIUM: lua: can't handle the response bytes

The request action can't handle the reponse trafic because its
automatically forwarded. The forard with CHN_INFINITE_FORWARD
is set because any anamizers are registered on  the response
channel.

This patch automatically register the request analyzer on the
reponse channel when its yield. This prevent the automatic
tranfer of the response bytes.

10 years agoBUG/MAJOR: lua: some function are not yieldable, the forced yield causes errors
Thierry FOURNIER [Fri, 6 Mar 2015 13:05:24 +0000 (14:05 +0100)] 
BUG/MAJOR: lua: some function are not yieldable, the forced yield causes errors

The hook function called each nth Lua instructions just
do a yield. Sometimes this yield is not allowed, because
some functions are not compatible.

The Lua-5.3 permits to known if the yield is avalaible with
the function lua_isyieldable().

If the processing is interrupted in non yieldable state,
we try to execute a yield asap. The yield will be may
available at the end of the non-yieldable currently
executed function. So, we require interrupt at the end
of the current function.

But, Lua cannot yield when its returning from a function,
so, we can fix the interrupt hook to 1 instruction,
expecting that the function is finnished.

During this time, the execution timeout is always checked.

10 years agoMEDIUM: lua: use the Lua-5.3 version of the library
Thierry FOURNIER [Fri, 6 Mar 2015 12:48:32 +0000 (13:48 +0100)] 
MEDIUM: lua: use the Lua-5.3 version of the library

The Lua-5.3 version of the library adds a required function to fix
a bug with the forced-yield system.

This patch permits to build with the Lua-5.3 library. Main changes
are:
 - "unsigned" type disappear to be replaced by signed type,
 - prototype of the yield function callback changes.

10 years agoBUG/MEDIUM: lua: many errors when we try to send data with the channel API
Thierry FOURNIER [Fri, 6 Mar 2015 00:07:45 +0000 (01:07 +0100)] 
BUG/MEDIUM: lua: many errors when we try to send data with the channel API

First we allow to use the reserved size to write the data that
will be sent. The reserved size remain guaranty because the
writed data will be sent quickly and the reserved room we be
again avalaible.

This permits to guaranty that the function send always have
avalaible space to send data (except if it cannot connect to
the server).

The function buffer_replace2 works only on contiguous buffer.
This patch also detects if the required size is contiguous.
If it not the case we realign the buffer.