]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
4 years ago[RELEASE] Released version 2.4-dev3 v2.4-dev3
Willy Tarreau [Fri, 11 Dec 2020 16:22:51 +0000 (17:22 +0100)] 
[RELEASE] Released version 2.4-dev3

Released version 2.4-dev3 with the following main changes :
    - MINOR: log: Logging HTTP path only with %HPO
    - BUG/MINOR: mux-h2/stats: make stream/connection proto errors more accurate
    - MINOR: traces: add a new level "error" below the "user" level
    - MINOR: mux-h2/trace: add traces at level ERROR for protocol errors
    - BUG/MINOR: mux-h2/stats: not all GOAWAY frames are errors
    - BUG/MINOR: lua: missing "\n" in error message
    - BUG/MINOR: lua: lua-load doesn't check its parameters
    - BUG/MINOR: lua: Post init register function are not executed beyond the first one
    - BUG/MINOR: lua: Some lua init operation are processed unsafe
    - MINOR: actions: Export actions lookup functions
    - MINOR: actions: add a function returning a service pointer from its name
    - MINOR: cli: add a function to look up a CLI service description
    - BUG/MINOR: lua: warn when registering action, conv, sf, cli or applet multiple times
    - MINOR: cache: Improve accept_encoding_normalizer
    - MINOR: cache: Add entry to the tree as soon as possible
    - BUG/MINOR: trace: Wrong displayed trace level
    - BUG/MAJOR: ring: tcp forward on ring can break the reader counter.
    - MINOR: lua: simplify hlua_alloc() to only rely on realloc()
    - MEDIUM: lua-thread: use atomics for memory accounting
    - MINOR: lua-thread: remove struct hlua from function hlua_prepend_path()
    - MEDIUM: lua-thread: make hlua_post_init() no longer use the runtime execution function
    - MINOR: lua-thread: hlua_ctx_renew() is never called with main gL lua state
    - MINOR: lua-thread: Use NULL context for main lua state
    - MINOR: lua-thread: Stop usage of struct hlua for the global lua state
    - MINOR: lua-thread: Replace embedded struct hlua_function by a pointer
    - MINOR: lua-thread: Split hlua_init() function in two parts
    - MINOR: lua-thread: make hlua_ctx_init() get L from its caller
    - MINOR: lua-thread: Split hlua_load function in two parts
    - MINOR: lua-thread: Split hlua_post_init() function in two parts
    - MINOR: lua-thread: Add the "thread" core variable
    - MEDIUM: lua-thread: No longer use locked context in initialization parts
    - MEDIUM: lua-thread: Apply lock only if the parent state is the main thread
    - MINOR: lua-thread: Replace global gL var with an array of states
    - MINOR: lua-thread: Replace "struct hlua_function" allocation by dedicated function
    - MINOR: lua-thread: Replace state_from by state_id
    - MINOR: lua-thread: Store each function reference and init reference in array
    - MEDIUM: lua-thread: Add the lua-load-per-thread directive
    - MINOR: lua-thread: Add verbosity in errors
    - REGTESTS: add a test for the threaded Lua code
    - BUILD/MINOR: haproxy DragonFlyBSD affinity build update.
    - DOC/MINOR: Fix formatting in Management Guide
    - MINOR: cache: Do not store stale entry
    - MINOR: cache: Add extra "cache-control" value checks
    - MEDIUM: cache: Remove cache entry in case of POST on the same resource
    - MINOR: cache: Consider invalid Age values as stale
    - BUG/MEDIUM: lua-thread: some parts must be initialized once
    - BUG/MINOR: lua-thread: close all states on deinit
    - BUG/MINOR: listener: use sockaddr_in6 for IPv6
    - BUG/MINOR: mux-h1: Handle keep-alive timeout for idle frontend connections
    - MINOR: session: Add the idle duration field into the session
    - MINOR: mux-h1: Update session idle duration when data are received
    - MINOR: mux-h1: Reset session dates and durations info when the CS is detached
    - MINOR: logs: Use session idle duration when no stream is provided
    - MINOR: stream: Always get idle duration from the session
    - MINOR: stream: Don't retrieve anymore timing info from the mux csinfo
    - MINOR: mux-h1: Don't provide anymore timing info using cs_info structure
    - MINOR: muxes: Remove get_cs_info callback function now useless
    - MINOR: stream: Pass an optional input buffer when a stream is created
    - MINOR: mux-h1: Add a flag to disable reads to wait opposite side
    - MEDIUM: mux-h1: Use a h1c flag to block reads when splicing is in-progress
    - MINOR: mux-h1: Introduce H1C_F_IS_BACK flag on the H1 connection
    - MINOR: mux-h1: Separate parsing and formatting errors at H1 stream level
    - MINOR: mux-h1: Split front/back h1 stream creation in 2 functions
    - MINOR: mux-h1: Add a rxbuf into the H1 stream
    - MINOR: mux-h1: Don't set CS flags in internal parsing functions
    - MINOR: mux-h1: Add embryonic and attached states on the H1 connection
    - MINOR: mux-h1: rework the h1_timeout_task() function
    - MINOR: mux-h1: Reset more H1C flags when a H1 stream is destroyed
    - MINOR: mux-h1: Disable reads if an error was reported on the H1 stream
    - MINOR: mux-h1: Rework how shutdowns are handled
    - MINOR: mux-h1: Rework h1_refresh_timeout to be easier to read
    - MINOR: mux-h1: Process next request for IDLE connection only
    - MINOR: mux-h1: Add a idle expiration date on the H1 connection
    - MINOR: stick-tables: Add functions to update some values of a tracked counter
    - MINOR: session: Add functions to increase http values of tracked counters
    - MINOR: mux: Add a ctl parameter to get the exit status of the multiplexers
    - MINOR: logs: Get the multiplexer exist status when no stream is provided
    - MINOR: mux-h1: Add functions to send HTTP errors from the mux
    - MAJOR: mux-h1: Create the client stream as later as possible
    - DOC: config: Add notes about errors emitted by H1 mux
    - CLEANUP: mux-h1: Rename H1C_F_CS_* flags and reorder H1C flags
    - MINOR: http-ana: Remove useless update of t_idle duration of the stream
    - CLEANUP: htx: Remove HTX_FL_UPGRADE unsued flag
    - MEDIUM: http-ana: Don't process partial or empty request anymore
    - CLEANUP: http-ana: Remove TX_WAIT_NEXT_RQ unsued flag
    - CLEANUP: connection: Remove CS_FL_READ_PARTIAL flag
    - REGTESTS: Fix proxy_protocol_tlv_validation
    - MINOR: http-ana: Properly set message flags from the start-line flags
    - MINOR: h1-htx/http-ana: Set BODYLESS flag on message in TUNNEL state
    - MINOR: protocol: add a ->set_port() helper to address families
    - MINOR: listener: automatically set the port when creating listeners
    - MINOR: listener: now use a generic add_listener() function
    - MEDIUM: ssl: fatal error with bundle + openssl < 1.1.1
    - BUG/MEDIUM: stream: Xfer the input buffer to a fully created stream
    - BUG/MINOR: stream: Don't use input buffer after the ownership xfer
    - MINOR: protocol: remove the redundant ->sock_domain field
    - MINOR: protocol: export protocol definitions
    - CLEANUP: protocol: group protocol struct members by usage
    - MINOR: protocol: add a set of ctrl_init/ctrl_close methods for setup/teardown
    - MINOR: connection: use the control layer's init/close
    - MINOR: udp: export udp_suspend_receiver() and udp_resume_receiver()
    - BUG/MAJOR: spoa/python: Fixing return None
    - DOC: spoa/python: Fixing typo in IP related error messages
    - DOC: spoa/python: Rephrasing memory related error messages
    - DOC: spoa/python: Fixing typos in comments
    - BUG/MINOR: spoa/python: Cleanup references for failed Module Addobject operations
    - BUG/MINOR: spoa/python: Cleanup ipaddress objects if initialization fails
    - BUG/MEDIUM: spoa/python: Fixing PyObject_Call positional arguments
    - BUG/MEDIUM: spoa/python: Fixing references to None
    - DOC: email change of the DeviceAtlas maintainer
    - MINOR: cache: Dump secondary entries in "show cache"
    - CLEANUP: connection: use fd_stop_both() instead of conn_stop_polling()
    - MINOR: stream-int: don't touch polling anymore on shutdown
    - MINOR: connection: implement cs_drain_and_close()
    - MINOR: mux-pt: take care of CS_SHR_DRAIN in shutr()
    - MINOR: checks: use cs_drain_and_close() instead of draining the connection
    - MINOR: checks: don't call conn_cond_update_polling() anymore
    - CLEANUP: connection: open-code conn_cond_update_polling() and update the comment
    - CLEANUP: connection: remove the unused conn_{stop,cond_update}_polling()
    - BUG/MINOR: http-check: Use right condition to consider HTX message as full
    - BUG/MINOR: tcpcheck: Don't rearm the check timeout on each read
    - MINOR: tcpcheck: Only wait for more payload data on HTTP expect rules
    - BUG/MINOR: tools: make parse_time_err() more strict on the timer validity
    - BUG/MINOR: tools: Reject size format not starting by a digit
    - MINOR: action: define enum for timeout type of the set-timeout rule
    - MINOR: stream: prepare the hot refresh of timeouts
    - MEDIUM: stream: support a dynamic server timeout
    - MEDIUM: stream: support a dynamic tunnel timeout
    - MEDIUM: http_act: define set-timeout server/tunnel action
    - MINOR: frontend: add client timeout sample fetch
    - MINOR: backend: add timeout sample fetches
    - MINOR: stream: add sample fetches
    - MINOR: stream: add timeout sample fetches
    - REGTESTS: add regtest for http-request set-timeout
    - CLEANUP: remove the unused fd_stop_send() in conn_xprt_shutw{,_hard}()
    - CLEANUP: connection: remove the unneeded fd_stop_{recv,send} on read0/shutw
    - MINOR: connection: remove sock-specific code from conn_sock_send()
    - REORG: connection: move the socket iocb (conn_fd_handler) to sock.c
    - MINOR: protocol: add a ->drain() function at the connection control layer
    - MINOR: connection: make conn_sock_drain() use the control layer's ->drain()
    - MINOR: protocol: add a pair of check_events/ignore_events functions at the ctrl layer
    - MEDIUM: connection: make use of the control layer check_events/ignore_events

4 years agoMEDIUM: connection: make use of the control layer check_events/ignore_events
Willy Tarreau [Fri, 11 Dec 2020 16:06:11 +0000 (17:06 +0100)] 
MEDIUM: connection: make use of the control layer check_events/ignore_events

This changes the subscribe/unsubscribe functions to rely on the control
layer's check_events/ignore_events. At the moment only the socket version
of these functions is present so the code should basically be the same.

4 years agoMINOR: protocol: add a pair of check_events/ignore_events functions at the ctrl layer
Willy Tarreau [Fri, 11 Dec 2020 16:02:50 +0000 (17:02 +0100)] 
MINOR: protocol: add a pair of check_events/ignore_events functions at the ctrl layer

Right now the connection subscribe/unsubscribe code needs to manipulate
FDs, which is not compatible with QUIC. In practice what we need there
is to be able to either subscribe or wake up depending on readiness at
the moment of subscription.

This commit introduces two new functions at the control layer, which are
provided by the socket code, to check for FD readiness or subscribe to it
at the control layer. For now it's not used.

4 years agoMINOR: connection: make conn_sock_drain() use the control layer's ->drain()
Willy Tarreau [Fri, 11 Dec 2020 15:20:34 +0000 (16:20 +0100)] 
MINOR: connection: make conn_sock_drain() use the control layer's ->drain()

Now we don't touch the fd anymore there, instead we rely on the ->drain()
provided by the control layer. As such the function was renamed to
conn_ctrl_drain().

4 years agoMINOR: protocol: add a ->drain() function at the connection control layer
Willy Tarreau [Fri, 11 Dec 2020 15:19:12 +0000 (16:19 +0100)] 
MINOR: protocol: add a ->drain() function at the connection control layer

This is what we need to drain pending incoming data from an connection.
The code was taken from conn_sock_drain() without the connection-specific
stuff. It still takes a connection for now for API simplicity.

4 years agoREORG: connection: move the socket iocb (conn_fd_handler) to sock.c
Willy Tarreau [Fri, 11 Dec 2020 14:54:36 +0000 (15:54 +0100)] 
REORG: connection: move the socket iocb (conn_fd_handler) to sock.c

conn_fd_handler() is 100% specific to socket code. It's about time
it moves to sock.c which manipulates socket FDs. With it comes
conn_fd_check() which tests for the socket's readiness. The ugly
connection status check at the end of the iocb was moved to an inlined
function in connection.h so that if we need it for other socket layers
it's not too hard to reuse.

The code was really only moved and not changed at all.

4 years agoMINOR: connection: remove sock-specific code from conn_sock_send()
Willy Tarreau [Fri, 11 Dec 2020 14:26:55 +0000 (15:26 +0100)] 
MINOR: connection: remove sock-specific code from conn_sock_send()

The send() loop present in this function and the error handling is already
present in raw_sock_from_buf(). Let's rely on it instead and stop touching
the FD from this place. The send flag was changed to use a more agnostic
CO_SFL_*. The name was changed to "conn_ctrl_send()" to remind that it's
meant to be used to send at the lowest level.

4 years agoCLEANUP: connection: remove the unneeded fd_stop_{recv,send} on read0/shutw
Willy Tarreau [Fri, 11 Dec 2020 12:56:12 +0000 (13:56 +0100)] 
CLEANUP: connection: remove the unneeded fd_stop_{recv,send} on read0/shutw

These are two other areas where this fd_stop_recv()/fd_stop_send() makes no
sense anymore. Both happen by definition while the FD is *not* subscribed,
since nowadays it's subscribed after failing recv()/send(), in which case
we cannot close.

4 years agoCLEANUP: remove the unused fd_stop_send() in conn_xprt_shutw{,_hard}()
Willy Tarreau [Fri, 11 Dec 2020 12:49:19 +0000 (13:49 +0100)] 
CLEANUP: remove the unused fd_stop_send() in conn_xprt_shutw{,_hard}()

These functions used to disable polling for writes when shutting down
but this is no longer used as it still happens later when closing if the
connection was subscribed to FD events. Let's just remove this fake and
undesired dependency on the FD layer.

4 years agoREGTESTS: add regtest for http-request set-timeout
Amaury Denoyelle [Thu, 10 Dec 2020 12:44:01 +0000 (13:44 +0100)] 
REGTESTS: add regtest for http-request set-timeout

This test compares the timeout value for requests using the sample
fetches in accordance with the application of set-timeout rules.

4 years agoMINOR: stream: add timeout sample fetches
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:58 +0000 (13:43 +0100)] 
MINOR: stream: add timeout sample fetches

Add cur_server_timeout and cur_tunnel_timeout.

These sample fetches return the current timeout value for a stream. This
is useful to retrieve the value of a timeout which was changed via a
set-timeout rule.

4 years agoMINOR: stream: add sample fetches
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:57 +0000 (13:43 +0100)] 
MINOR: stream: add sample fetches

Prepare the possibility to register sample fetches on the stream.

This commit is necessary to implement sample fetches to retrieve the
current timeout values.

4 years agoMINOR: backend: add timeout sample fetches
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:56 +0000 (13:43 +0100)] 
MINOR: backend: add timeout sample fetches

Add be_server_timeout and be_tunnel_timeout.

These sample fetches return the configuration value for server or tunnel
timeout on the backend side.

4 years agoMINOR: frontend: add client timeout sample fetch
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:55 +0000 (13:43 +0100)] 
MINOR: frontend: add client timeout sample fetch

Add a sample fetch named fe_client_timeout to return the configuration
value for the client timeout on a frontend.

4 years agoMEDIUM: http_act: define set-timeout server/tunnel action
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:54 +0000 (13:43 +0100)] 
MEDIUM: http_act: define set-timeout server/tunnel action

Add a new http-request action 'set-timeout [server/tunnel]'. This action
can be used to update the server or tunnel timeout of a stream. It takes
two parameters, the timeout name to update and the new timeout value.
This rule is only valid for a proxy with backend capabilities. The
timeout value cannot be null. A sample expression can also be used
instead of a plain value.

4 years agoMEDIUM: stream: support a dynamic tunnel timeout
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:53 +0000 (13:43 +0100)] 
MEDIUM: stream: support a dynamic tunnel timeout

Allow the modification of the tunnel timeout on the stream side.
Use a new field in the stream for the tunnel timeout. It is initialized
by the tunnel timeout from backend unless it has already been set by a
set-timeout tunnel rule.

4 years agoMEDIUM: stream: support a dynamic server timeout
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:52 +0000 (13:43 +0100)] 
MEDIUM: stream: support a dynamic server timeout

Allow the modification of the timeout server value on the stream side.
Do not apply the default backend server timeout in back_establish if it
is already defined. This is the case if a set-timeout server rule has
been executed.

4 years agoMINOR: stream: prepare the hot refresh of timeouts
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:51 +0000 (13:43 +0100)] 
MINOR: stream: prepare the hot refresh of timeouts

Define a stream function to allow to update the timeouts.
This commit is in preparation for the support of dynamic timeouts with
the set-timeout rule.

4 years agoMINOR: action: define enum for timeout type of the set-timeout rule
Amaury Denoyelle [Thu, 10 Dec 2020 12:43:50 +0000 (13:43 +0100)] 
MINOR: action: define enum for timeout type of the set-timeout rule

This enum is used to specify the timeout targetted by a set-timeout
rule.

4 years agoBUG/MINOR: tools: Reject size format not starting by a digit
Christopher Faulet [Fri, 11 Dec 2020 08:30:45 +0000 (09:30 +0100)] 
BUG/MINOR: tools: Reject size format not starting by a digit

parse_size_err() function is now more strict on the size format. The first
character must be a digit. Otherwise an error is returned. Thus "size k" is
now rejected.

This patch must be backported to all stable versions.

4 years agoBUG/MINOR: tools: make parse_time_err() more strict on the timer validity
Christopher Faulet [Fri, 11 Dec 2020 08:23:07 +0000 (09:23 +0100)] 
BUG/MINOR: tools: make parse_time_err() more strict on the timer validity

First, an error is now reported if the first character is not a digit. Thus,
"timeout client s" triggers an error now. Then 'u' is also rejected
now. 'us' is valid and should be used set the timer in microseconds. However
'u' alone is not a valid unit. It was just ignored before (default to
milliseconds). Now, it is an error. Finally, a warning is reported if the
end of the text is not reached after the timer parsing. This warning will
probably be switched to an error in a futur version.

This patch must be backported to all stable versions.

4 years agoMINOR: tcpcheck: Only wait for more payload data on HTTP expect rules
Christopher Faulet [Wed, 9 Dec 2020 17:45:47 +0000 (18:45 +0100)] 
MINOR: tcpcheck: Only wait for more payload data on HTTP expect rules

For HTTP expect rules, if the buffer is not empty, it is guarantee that all
responses headers are received, with the start-line. Thus, except for
payload matching, there is no reason to wait for more data from the moment
the htx message is not empty.

This patch may be backported as far as 2.2.

4 years agoBUG/MINOR: tcpcheck: Don't rearm the check timeout on each read
Christopher Faulet [Wed, 9 Dec 2020 18:46:38 +0000 (19:46 +0100)] 
BUG/MINOR: tcpcheck: Don't rearm the check timeout on each read

The check timeout is used to limit a health-check execution. By default
inter timeout is used. But when defined the check timeout is used. In this
case, the inter timeout (or connect timeout) is used for the connection
establishment only. And the check timeout for the health-check
execution. Thus, it must be set after a successfull connect. It means it is
rearm at the end of each connect rule.

This patch with the previous one (BUG/MINOR: http-check: Use right condition
to consider HTX message as full) should solve the issue #991. It must be
backported as far as 2.2. On the 2.3 and 2.2, there are 2 places were the
connection establishement is handled. The check timeout must be set on both.

4 years agoBUG/MINOR: http-check: Use right condition to consider HTX message as full
Christopher Faulet [Wed, 9 Dec 2020 18:45:07 +0000 (19:45 +0100)] 
BUG/MINOR: http-check: Use right condition to consider HTX message as full

When an HTTP expect rule is evaluated, we must know if more data is expected
or not to wait if the matching fails. If the whole response is received or
if the HTX message is full, we must not wait. In this context,
htx_free_data_space() must be used instead of htx_free_space(). The fisrt
one count down the block size. Otherwise at the edge, when only the block
size remains free (8 bytes), we may think there is some place for more data
while the mux is unable to add more block.

This bug explains the loop described on the GH issue #991. It should be
backported as far as 2.2.

4 years agoCLEANUP: connection: remove the unused conn_{stop,cond_update}_polling()
Willy Tarreau [Fri, 11 Dec 2020 10:21:53 +0000 (11:21 +0100)] 
CLEANUP: connection: remove the unused conn_{stop,cond_update}_polling()

These functions are not used anymore and were quite confusing given that
their names reflected their original role and not the current ones. Let's
kill them before they inspire anyone.

4 years agoCLEANUP: connection: open-code conn_cond_update_polling() and update the comment
Willy Tarreau [Fri, 11 Dec 2020 10:19:24 +0000 (11:19 +0100)] 
CLEANUP: connection: open-code conn_cond_update_polling() and update the comment

This last call to conn_cond_update_polling() is now totally misleading as
the function only stops polling in case of unrecoverable connection error.
Let's open-code the test to make it more prominent and explain what we're
trying to do there. It's even almost certain this code is never executed
anymore, as the only remaining case should be a mux's wake function setting
CO_FL_ERROR without disabling the polling, but they need to be audited first
to make sure this is the case.

4 years agoMINOR: checks: don't call conn_cond_update_polling() anymore
Willy Tarreau [Fri, 11 Dec 2020 10:11:06 +0000 (11:11 +0100)] 
MINOR: checks: don't call conn_cond_update_polling() anymore

This was a leftover of the pre-mux v1.8-dev3 era. It makes no sense anymore
to try to disable polling on a connection we don't own, it's the mux's job
and it's properly done upon shutdowns and closes.

4 years agoMINOR: checks: use cs_drain_and_close() instead of draining the connection
Willy Tarreau [Fri, 11 Dec 2020 10:09:29 +0000 (11:09 +0100)] 
MINOR: checks: use cs_drain_and_close() instead of draining the connection

As explained in previous commit, the situation is absurd as we try to
cleanly drain pending data before impolitely shutting down, and it could
be counter productive on real muxes. Let's use cs_drain_and_close() instead.

4 years agoMINOR: mux-pt: take care of CS_SHR_DRAIN in shutr()
Willy Tarreau [Fri, 11 Dec 2020 10:07:19 +0000 (11:07 +0100)] 
MINOR: mux-pt: take care of CS_SHR_DRAIN in shutr()

When the shutr() requests CS_SHR_DRAIN and there's no particular shutr
implemented on the underlying transport layer, we must drain pending data.
This is what happens when cs_drain_and_close() is called. It is important
for TCP checks to drain large responses and close cleanly.

4 years agoMINOR: connection: implement cs_drain_and_close()
Willy Tarreau [Fri, 11 Dec 2020 10:04:51 +0000 (11:04 +0100)] 
MINOR: connection: implement cs_drain_and_close()

We had cs_close() which forces a CS_SHR_RESET mode on the read side,
and due to this there are a few call places in the checks which
perform a manual call to conn_sock_drain() before calling cs_close().
This is absurd by principle, and it can be counter-productive in the
case of a mux where this could even cause the opposite of the desired
effect by deleting pending frames on the socket before closing.

Let's add cs_drain_and_close() which uses the CS_SHR_DRAIN mode to
prepare this.

4 years agoMINOR: stream-int: don't touch polling anymore on shutdown
Willy Tarreau [Fri, 11 Dec 2020 09:24:05 +0000 (10:24 +0100)] 
MINOR: stream-int: don't touch polling anymore on shutdown

Not only it's become totally useless with muxes, in addition it's
dangerous to play with the mux's FD while shutting a stream down for
writes. It's already done *if necessary* by the cs_shutw() code at the
mux layer. Fortunately it doesn't seem to have any impact, most likely
the polling updates used to immediately revert this operation.

4 years agoCLEANUP: connection: use fd_stop_both() instead of conn_stop_polling()
Willy Tarreau [Fri, 11 Dec 2020 08:56:53 +0000 (09:56 +0100)] 
CLEANUP: connection: use fd_stop_both() instead of conn_stop_polling()

conn_stop_polling() in fact only calls fd_stop_both() after checking
that the ctrl layer is ready. It's the case in conn_fd_check() so
let's get rid of this next-to-last user of this function.

4 years agoMINOR: cache: Dump secondary entries in "show cache"
Remi Tricot-Le Breton [Fri, 27 Nov 2020 14:48:40 +0000 (15:48 +0100)] 
MINOR: cache: Dump secondary entries in "show cache"

The duplicated entries (in case of vary) were not taken into account by
the "show cache" command. They are now dumped too.
A new "vary" column is added to the output. It contains the complete
seocndary key (in hex format).

4 years agoDOC: email change of the DeviceAtlas maintainer
David Carlier [Thu, 10 Dec 2020 09:56:09 +0000 (09:56 +0000)] 
DOC: email change of the DeviceAtlas maintainer

4 years agoBUG/MEDIUM: spoa/python: Fixing references to None
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:14 +0000 (14:37 +0000)] 
BUG/MEDIUM: spoa/python: Fixing references to None

As per https://docs.python.org/3/c-api/none.html, None has to be treated
exactly like other objects for reference counting.
So, when we use it, we need to INCREF and when we are done, DECREF

This patch must be backported as far as 2.0.

4 years agoBUG/MEDIUM: spoa/python: Fixing PyObject_Call positional arguments
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:13 +0000 (14:37 +0000)] 
BUG/MEDIUM: spoa/python: Fixing PyObject_Call positional arguments

As per https://docs.python.org/3/c-api/object.html#c.PyObject_Call,
positional arguments should be an empty tuple when not used.
Previously the code had a dictionary instead of tuple. This commit is to
fix it and use tuple to avoid unexpected consequences

This patch must be backported as far as 2.0.

4 years agoBUG/MINOR: spoa/python: Cleanup ipaddress objects if initialization fails
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:12 +0000 (14:37 +0000)] 
BUG/MINOR: spoa/python: Cleanup ipaddress objects if initialization fails

This change is to ensure objects from the ipaddress module are cleaned
up when spoa module initialization fails.
In general the interpreter would just crash, but in a code where import
is conditional (try/except), then we would keep those objects around

This patch must be backported as far as 2.0.

4 years agoBUG/MINOR: spoa/python: Cleanup references for failed Module Addobject operations
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:11 +0000 (14:37 +0000)] 
BUG/MINOR: spoa/python: Cleanup references for failed Module Addobject operations

As per https://docs.python.org/3/c-api/module.html#c.PyModule_AddObject,
references are stolen by the function only for success. We must do
cleanup manually if there is a failure

This patch must be backported as far as 2.0.

4 years agoDOC: spoa/python: Fixing typos in comments
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:10 +0000 (14:37 +0000)] 
DOC: spoa/python: Fixing typos in comments

Fixing a missing letter in a comment

This patch must be backported as far as 2.0.

4 years agoDOC: spoa/python: Rephrasing memory related error messages
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:09 +0000 (14:37 +0000)] 
DOC: spoa/python: Rephrasing memory related error messages

The old message "No more space left available" was redundant with "left
available". This commit is to rephrase that sentence and make it more
explicit we are talking about memory

This patch must be backported as far as 2.0.

4 years agoDOC: spoa/python: Fixing typo in IP related error messages
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:08 +0000 (14:37 +0000)] 
DOC: spoa/python: Fixing typo in IP related error messages

This commit fixes typos in the ps_python_set_var_ip* byte manipulation error
messages

This patch must be backported as far as 2.0.

4 years agoBUG/MAJOR: spoa/python: Fixing return None
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:07 +0000 (14:37 +0000)] 
BUG/MAJOR: spoa/python: Fixing return None

As per https://docs.python.org/3/c-api/none.html, None requires to be
incremented before being returned to prevent deallocating none

This patch must be backported as far as 2.0.

4 years agoMINOR: udp: export udp_suspend_receiver() and udp_resume_receiver()
Willy Tarreau [Tue, 8 Dec 2020 17:05:16 +0000 (18:05 +0100)] 
MINOR: udp: export udp_suspend_receiver() and udp_resume_receiver()

QUIC will rely on UDP at the receiver level, and will need these functions
to suspend/resume the receivers. In the future, protocol chaining may
simplify this.

4 years agoMINOR: connection: use the control layer's init/close
Willy Tarreau [Tue, 8 Dec 2020 14:53:45 +0000 (15:53 +0100)] 
MINOR: connection: use the control layer's init/close

In conn_ctrl_init() and conn_ctrl_close() we now use the control layer's
functions instead of manipulating the FD directly. This is safe since the
control layer is always present when done. Note that now we also adjust
the flag before calling the function to make things cleaner in case such
a layer would need to call the same functions again for any reason.

4 years agoMINOR: protocol: add a set of ctrl_init/ctrl_close methods for setup/teardown
Willy Tarreau [Tue, 8 Dec 2020 14:50:56 +0000 (15:50 +0100)] 
MINOR: protocol: add a set of ctrl_init/ctrl_close methods for setup/teardown

Currnetly conn_ctrl_init() does an fd_insert() and conn_ctrl_close() does an
fd_delete(). These are the two only short-term obstacles against using a
non-fd handle to set up a connection. Let's have pur these into the protocol
layer, along with the other connection-level stuff so that the generic
connection code uses them instead. This will allow to define new ones for
other protocols (e.g. QUIC).

Since we only support regular sockets at the moment, the code was placed
into sock.c and shared with proto_tcp, proto_uxst and proto_sockpair.

4 years agoCLEANUP: protocol: group protocol struct members by usage
Willy Tarreau [Tue, 8 Dec 2020 13:54:20 +0000 (14:54 +0100)] 
CLEANUP: protocol: group protocol struct members by usage

For the sake of an improved readability, let's group the protocol
field members according to where they're supposed to be defined:
  - connection layer (note: for now even UDP needs one)
  - binding layer
  - address family
  - socket layer
Nothing else was changed.

4 years agoMINOR: protocol: export protocol definitions
Willy Tarreau [Tue, 8 Dec 2020 13:13:11 +0000 (14:13 +0100)] 
MINOR: protocol: export protocol definitions

The various protocols were made static since there was no point in
exporting them in the past. Nowadays with QUIC relying on UDP we'll
significantly benefit from UDP being exported and more generally from
being able to declare some functions as being the same as other
protocols'.

In an ideal world it should not be these protocols which should be
exported, but the intermediary levels:
  - socket layer (sock.c only right now), already exported as functions
    but nothing structured at the moment ;
  - family layer (sock_inet, sock_unix, sockpair etc): already structured
    and exported
  - binding layer (the part that relies on the receiver): currently fused
    within the protocol
  - connectiong layer (the part that manipulates connections): currently
    fused within the protocol
  - protocol (connection's control): shouldn't need to be exposed
    ultimately once the elements above are in an easily sharable way.

4 years agoMINOR: protocol: remove the redundant ->sock_domain field
Willy Tarreau [Tue, 8 Dec 2020 11:13:54 +0000 (12:13 +0100)] 
MINOR: protocol: remove the redundant ->sock_domain field

This field used to be needed before commit 2b5e0d8b6 ("MEDIUM: proto_udp:
replace last AF_CUST_UDP* with AF_INET*") as it was used as a protocol
entry selector. Since this commit it's always equal to the socket family's
value so it's entirely redundant. Let's remove it now to simplify the
protocol definition a little bit.

4 years agoBUG/MINOR: stream: Don't use input buffer after the ownership xfer
Christopher Faulet [Fri, 4 Dec 2020 16:22:49 +0000 (17:22 +0100)] 
BUG/MINOR: stream: Don't use input buffer after the ownership xfer

At the end of stream_new(), once the input buffer is transfer to the request
channel, it must not be used anymore. The previous patch (16df178b6 "BUG/MEDIUM:
stream: Xfer the input buffer to a fully created stream") was pushed to quickly.

No backport needed.

4 years agoBUG/MEDIUM: stream: Xfer the input buffer to a fully created stream
Christopher Faulet [Fri, 4 Dec 2020 15:47:41 +0000 (16:47 +0100)] 
BUG/MEDIUM: stream: Xfer the input buffer to a fully created stream

The input buffer passed as argument to create a new stream must not be
transferred when the request channel is initialized because the channel
flags are not set at this stage. In addition, the API is a bit confusing
regarding the buffer owner when an error occurred. The caller remains the
owner, but reading the code it is not obvious.

So, first of all, to avoid any ambiguities, comments are added on the
calling chain to make it clear. The buffer owner is the caller if any error
occurred. And the ownership is transferred to the stream on success.

Then, to make things simple, the ownership is transferred at the end of
stream_new(), in case of success. And the input buffer is updated to point
on BUF_NULL. Thus, in all cases, if the caller try to release it calling
b_free() on it, it is not a problem. Of course, it remains the caller
responsibility to release it on error.

The patch fixes a bug introduced by the commit 26256f86e ("MINOR: stream:
Pass an optional input buffer when a stream is created"). No backport is
needed.

4 years agoMEDIUM: ssl: fatal error with bundle + openssl < 1.1.1
William Lallemand [Fri, 4 Dec 2020 14:45:02 +0000 (15:45 +0100)] 
MEDIUM: ssl: fatal error with bundle + openssl < 1.1.1

Since HAProxy 2.3, OpenSSL 1.1.1 is a requirement for using a
multi-certificate bundle in the configuration. This patch emits a fatal
error when HAProxy tries to load a bundle with an older version of
HAProxy.

This problem was encountered by an user in issue #990.

This must be backported in 2.3.

4 years agoMINOR: listener: now use a generic add_listener() function
Willy Tarreau [Fri, 4 Dec 2020 14:03:36 +0000 (15:03 +0100)] 
MINOR: listener: now use a generic add_listener() function

With the removal of the family-specific port setting, all protocol had
exactly the same implementation of ->add(). A generic one was created
with the name "default_add_listener" so that all other ones can now be
removed. The API was slightly adjusted so that the protocol and the
listener are passed instead of the listener and the port.

Note that all protocols continue to provide this ->add() method instead
of routinely calling default_add_listener() from create_listeners(). This
makes sure that any non-standard protocol will still be able to intercept
the listener addition if needed.

This could be backported to 2.3 along with the few previous patches on
listners as a pure code cleanup.

4 years agoMINOR: listener: automatically set the port when creating listeners
Willy Tarreau [Fri, 4 Dec 2020 13:49:11 +0000 (14:49 +0100)] 
MINOR: listener: automatically set the port when creating listeners

In create_listeners() we iterate over a port range and call the
protocol's ->add() function to add a new listener on the specified
port. Only tcp4/tcp6/udp4/udp6 support a port, the other ones ignore
it. Now that we can rely on the address family to properly set the
port, better do it this way directly from create_listeners() and
remove the family-specific case from the protocol layer.

4 years agoMINOR: protocol: add a ->set_port() helper to address families
Willy Tarreau [Fri, 4 Dec 2020 13:43:36 +0000 (14:43 +0100)] 
MINOR: protocol: add a ->set_port() helper to address families

At various places we need to set a port on an IPv4 or IPv6 address, and
it requires casts that are easy to get wrong. Let's add a new set_port()
helper to the address family to assist in this. It will be directly
accessible from the protocol and will make the operation seamless.
Right now this is only implemented for sock_inet as other families do
not need a port.

4 years agoMINOR: h1-htx/http-ana: Set BODYLESS flag on message in TUNNEL state
Christopher Faulet [Fri, 20 Nov 2020 13:30:38 +0000 (14:30 +0100)] 
MINOR: h1-htx/http-ana: Set BODYLESS flag on message in TUNNEL state

When a H1 message is parsed, if the parser state is switched to TUNNEL mode
just after the header parsing, the BODYLESS flag is set on the HTX
start-line. By transitivity, the corresponding flag is set on the message in
HTTP analysers.  Thus it is possible to rely on it to not wait for the
request body.

4 years agoMINOR: http-ana: Properly set message flags from the start-line flags
Christopher Faulet [Fri, 20 Nov 2020 13:22:37 +0000 (14:22 +0100)] 
MINOR: http-ana: Properly set message flags from the start-line flags

CNT_LEN and TE_CHNK flags must be set on the message only when the
corresponding flag is set on the HTX start-line. Before, when the transfer
length was known XFER_LEN set), the HTTP_MSGF_TE_CHNK was the default. But
it is not appropriate. Now, it is only set if the message is chunked. Thus,
it is now possible to have a known transfer length without CNT_LEN or
TE_CHNK.

In addition, the BODYLESS flags may be set, independently on XFER_LEN one.

4 years agoREGTESTS: Fix proxy_protocol_tlv_validation
Christopher Faulet [Tue, 20 Oct 2020 07:10:25 +0000 (09:10 +0200)] 
REGTESTS: Fix proxy_protocol_tlv_validation

Remaining data after the PROXYv2 header now trigger a parsing error in the
H1 multiplexer Thus the required version for this test is now set to 2.4.

4 years agoCLEANUP: connection: Remove CS_FL_READ_PARTIAL flag
Christopher Faulet [Mon, 12 Oct 2020 13:56:16 +0000 (15:56 +0200)] 
CLEANUP: connection: Remove CS_FL_READ_PARTIAL flag

Since the recent refactoring of the H1 multiplexer, this flag is no more
used. Thus it is removed.

4 years agoCLEANUP: http-ana: Remove TX_WAIT_NEXT_RQ unsued flag
Christopher Faulet [Tue, 6 Oct 2020 15:58:43 +0000 (17:58 +0200)] 
CLEANUP: http-ana: Remove TX_WAIT_NEXT_RQ unsued flag

This flags is now unused. It was used in REQ_WAIT_HTTP analyser, when a
stream was waiting for a request, to set the keep-alive timeout or to avoid
to send HTTP errors to client.

4 years agoMEDIUM: http-ana: Don't process partial or empty request anymore
Christopher Faulet [Tue, 6 Oct 2020 15:54:56 +0000 (17:54 +0200)] 
MEDIUM: http-ana: Don't process partial or empty request anymore

It is now impossible to start the HTTP request processing in the stream
analysers with a partial or empty request message. The mux-h2 was already
waiting of the request headers before creating the stream. Now the mux-h1
does the same. All errors (aborts, timeout or invalid requests) waiting for
the request headers are now handled by the multiplexers. So there is no
reason to still handle them in the REQ_WAIT_HTTP (http_wait_for_request)
analyser.

To ensure there is no ambiguity, a BUG_ON() was added to exit if a partial
request is received in this analyser.

4 years agoCLEANUP: htx: Remove HTX_FL_UPGRADE unsued flag
Christopher Faulet [Tue, 6 Oct 2020 15:48:05 +0000 (17:48 +0200)] 
CLEANUP: htx: Remove HTX_FL_UPGRADE unsued flag

Now the H1 to H2 upgrade is handled before the stream
creation. HTX_FL_UPGRADE flag is now unused.

4 years agoMINOR: http-ana: Remove useless update of t_idle duration of the stream
Christopher Faulet [Wed, 30 Sep 2020 13:12:13 +0000 (15:12 +0200)] 
MINOR: http-ana: Remove useless update of t_idle duration of the stream

Becaues the stream is now created after the request headers parsing, the
idle duration from the session is always up-to-date.

4 years agoCLEANUP: mux-h1: Rename H1C_F_CS_* flags and reorder H1C flags
Christopher Faulet [Fri, 27 Nov 2020 15:44:01 +0000 (16:44 +0100)] 
CLEANUP: mux-h1: Rename H1C_F_CS_* flags and reorder H1C flags

H1C_F_CS_* flags are renamed into H1C_F_ST_*. They reflect the connection
state. So "ST" is well suited. "CS" is confusing because it is also the
abbreviation for conn-stream.

In addition, H1C flags are reordered.

4 years agoDOC: config: Add notes about errors emitted by H1 mux
Christopher Faulet [Wed, 2 Dec 2020 07:40:14 +0000 (08:40 +0100)] 
DOC: config: Add notes about errors emitted by H1 mux

Now, some errors are handled by the H1 multiplexer. During the headers
parsing request, there is no stream attached to the H1 mux. Thus, if an
error is reported at this stage, it is handled by the mux itself. If
possible the corresponding frontend errorfile is used, but it should be a
static message. Custom error messages are not supported. Otherwise, default
error messages are used.

In addition, the http analysis has not started yet, so http-after-response
ruleset is not evaluated and cannot alter these early responses.

4 years agoMAJOR: mux-h1: Create the client stream as later as possible
Christopher Faulet [Tue, 6 Oct 2020 15:45:34 +0000 (17:45 +0200)] 
MAJOR: mux-h1: Create the client stream as later as possible

This is the reason for all previous patches. The conn-stream and the
associated stream are created as later as possible. It only concerns the
frontend connections. But it means the request headers, and possibly the
first data block, are received and parsed before the conn-stream
creation. To do so, an embryonic H1 stream, with no conn-stream, is
created. The result of this "early parsing" is stored in its rx buffer, used
to fill the request channel when the stream is created. During this step,
some HTTP errors may be returned by the mux. It must also handle
http-request/keep-alive timeouts. A significative change is about H1 to H2
upgrade. It happens very early now, and no H1 stream are created (and thus
of course no conn-stream).

The most important part of this patch is located to the h1_process()
function. Because it must trigger the parsing when there is no H1
stream. h1_recv() function has also been simplified.

4 years agoMINOR: mux-h1: Add functions to send HTTP errors from the mux
Christopher Faulet [Tue, 6 Oct 2020 15:41:36 +0000 (17:41 +0200)] 
MINOR: mux-h1: Add functions to send HTTP errors from the mux

For now, this part is unsued. But this patch adds functions to handle errors
on idle and embryonic H1 connections and send corresponding HTTP error
messages to the client (400, 408 or 500). Thanks to previous patches, these
functions take care to update the right stats counters, but also the
counters tracked by the session.

A field to store the HTTP error code has been added in the H1C structure. It
is used for error retransmits, if any, and to get it in http logs. It is
used to return the mux exit status code when the MUX_EXIT_STATUS ctl
parameter is requested.

4 years agoMINOR: logs: Get the multiplexer exist status when no stream is provided
Christopher Faulet [Tue, 6 Oct 2020 13:11:43 +0000 (15:11 +0200)] 
MINOR: logs: Get the multiplexer exist status when no stream is provided

When a log message is emitted from the session level, by a multiplexer,
there is no stream. Thus for HTTP session, there no status code and the
termination flags are not correctly set.

Thanks to previous patch, the HTTP status code is deduced from the mux exist
status, using the MUX_EXIT_STATE ctl param. This is only done for HTTP
frontends. If it is defined ( != 0), it is used to deduce the termination
flags.

4 years agoMINOR: mux: Add a ctl parameter to get the exit status of the multiplexers
Christopher Faulet [Tue, 6 Oct 2020 12:59:17 +0000 (14:59 +0200)] 
MINOR: mux: Add a ctl parameter to get the exit status of the multiplexers

The ctl param MUX_EXIT_STATUS can be request to get the exit status of a
multiplexer. For instance, it may be an HTTP status code or an H2 error. For
now, 0 is always returned. When the mux h1 will be able to return HTTP
errors itself, this ctl param will be used to get the HTTP status code from
the logs.

the mux_exit_status enum has been created to map internal mux exist status
to generic one. Thus there is 5 possible status for now: success, invalid
error, timeout error, internal error and unknown.

4 years agoMINOR: session: Add functions to increase http values of tracked counters
Christopher Faulet [Tue, 6 Oct 2020 12:23:34 +0000 (14:23 +0200)] 
MINOR: session: Add functions to increase http values of tracked counters

cumulative numbers of http request and http errors of counters tracked at
the session level and their rates can now be updated at the session level
thanks to two new functions. These functions are not used for now, but it
will be called to keep tracked counters up-to-date if an error occurs before
the stream creation.

4 years agoMINOR: stick-tables: Add functions to update some values of a tracked counter
Christopher Faulet [Tue, 6 Oct 2020 11:52:40 +0000 (13:52 +0200)] 
MINOR: stick-tables: Add functions to update some values of a tracked counter

The cumulative numbers of http requests, http errors, bytes received and
sent and their respective rates for a tracked counters are now updated using
specific stream independent functions. These functions are used by the
stream but the aim is to allow the session to do so too. For now, there is
no reason to perform these updates from the session, except from the mux-h2
maybe. But, the mux-h1, on the frontend side, will be able to return some
errors to the client, before the stream creation. In this case, it will be
mandatory to update counters tracked at the session level.

4 years agoMINOR: mux-h1: Add a idle expiration date on the H1 connection
Christopher Faulet [Mon, 5 Oct 2020 15:50:58 +0000 (17:50 +0200)] 
MINOR: mux-h1: Add a idle expiration date on the H1 connection

An idle expiration date is added on the H1 connection with the function to
set it depending on connection state. First, there is no idle timeout on
backend connections, For idle frontend connections, the http-request or
keep-alive timeout are used depending on which timeout is defined and if it
is the first request or not. For embryonic connections, the http-request is
always used, if defined. For attached or shutted down connections, no idle
timeout is applied.

For now the idle expiration date is never set and the h1_set_idle_expiration
function remains unused.

4 years agoMINOR: mux-h1: Process next request for IDLE connection only
Christopher Faulet [Mon, 5 Oct 2020 15:14:28 +0000 (17:14 +0200)] 
MINOR: mux-h1: Process next request for IDLE connection only

When the conn-stream is detached for a H1 connection, there is no reason to
subscribe for reads or process pending input data if the connection is not
idle. Because, it means a shutdown is pending.

4 years agoMINOR: mux-h1: Rework h1_refresh_timeout to be easier to read
Christopher Faulet [Mon, 5 Oct 2020 15:13:05 +0000 (17:13 +0200)] 
MINOR: mux-h1: Rework h1_refresh_timeout to be easier to read

Conditions to set a timeout on the H1C task have been simplified or at least
changed to rely on H1 connection flags. Now, following rules are used :

 * the shutdown timeout is applied on dead (not alive) or shutted down
   connections.

 * The client/server timeout is applied if there are still some pending
   outgoing data.

 * The client timeout is applied on alive frontend connections with no
   conn-stream. It means on idle or embryionic frontend connections.

 * For all other connections (backend or attached connections), no timeout
   is applied. For frontend or backend attached connections, the timeout is
   handled by the application layer. For idle backend connections, there is
   no timeout.

4 years agoMINOR: mux-h1: Rework how shutdowns are handled
Christopher Faulet [Mon, 5 Oct 2020 15:11:16 +0000 (17:11 +0200)] 
MINOR: mux-h1: Rework how shutdowns are handled

We now only rely on one flag to notify a shutdown. The shutdown is performed
at the connection level when there are no more pending outgoing data. So, it
means it is performed immediately if the output buffer is empty. Otherwise
it is deferred after the outgoing data are sent.

This simplify a bit the mux because there is now only one flag to check.

4 years agoMINOR: mux-h1: Disable reads if an error was reported on the H1 stream
Christopher Faulet [Wed, 30 Sep 2020 15:33:22 +0000 (17:33 +0200)] 
MINOR: mux-h1: Disable reads if an error was reported on the H1 stream

Don't try to read more data if a parsing or a formatting error was reported
on the H1 stream. There is no reason to continue to process the messages for
the current connection in this case. If a parsing error occurs, it means the
input is invalid. If a formatting error occurs, it is an internal error and
it is probably safer to give up.

4 years agoMINOR: mux-h1: Reset more H1C flags when a H1 stream is destroyed
Christopher Faulet [Wed, 30 Sep 2020 15:14:55 +0000 (17:14 +0200)] 
MINOR: mux-h1: Reset more H1C flags when a H1 stream is destroyed

When a H1 stream is destroyed, all dynamic flags on the H1 connection are
reset to be sure to leave it in a clean state.

4 years agoMINOR: mux-h1: rework the h1_timeout_task() function
Christopher Faulet [Tue, 29 Sep 2020 13:30:15 +0000 (15:30 +0200)] 
MINOR: mux-h1: rework the h1_timeout_task() function

Mainly to make it easier to read. First of all, when a H1 connection is
still there, we check if the connection was stolen by another thread or
not. If yes we release the task and leave. Then we check if the task is
expired or not. Only expired tasks are considered. Finally, if a conn-stream
is still attached to the connection (H1C_F_CS_ATTACHED flag set), we
return. Otherwise, the task and the H1 connection are released.

4 years agoMINOR: mux-h1: Add embryonic and attached states on the H1 connection
Christopher Faulet [Tue, 29 Sep 2020 13:18:40 +0000 (15:18 +0200)] 
MINOR: mux-h1: Add embryonic and attached states on the H1 connection

Be prepared to have a H1 connection in one of the following states :

 * A H1 connection waiting for a new message with no H1 stream.
   H1C_F_CS_IDLE flag is set.

 * A H1 connection processing a new message with a H1 stream but no
   conn-stream attached. H1C_F_CS_EMBRYONIC flag is set

 * A H1 connection with a H1 stream and a conn-stream attached.
   H1C_F_CS_ATTACHED flag is set.

 * A H1 connection with no H1 stream, waiting to be released. No flag is set.

These flags are mutually exclusives. When none is set, it means the
connection will be released ASAP, just remaining outgoing data must be sent
before. For now, the second state (H1C_F_CS_EMBRYONIC) is transient.

4 years agoMINOR: mux-h1: Don't set CS flags in internal parsing functions
Christopher Faulet [Thu, 24 Sep 2020 13:35:37 +0000 (15:35 +0200)] 
MINOR: mux-h1: Don't set CS flags in internal parsing functions

Now, only h1_process_input() function set or unset the conn-stream
flags. This way, internal parsing functions don't rely anymore on the
conn-stream.

4 years agoMINOR: mux-h1: Add a rxbuf into the H1 stream
Christopher Faulet [Thu, 24 Sep 2020 13:14:29 +0000 (15:14 +0200)] 
MINOR: mux-h1: Add a rxbuf into the H1 stream

For now this buffer is not used. But it will be used to parse the headers,
and possibly the first block of data, when no stream is attached to the H1
connection. The aim is to use it to create the stream, thanks to recent
changes on the streams creation api.

4 years agoMINOR: mux-h1: Split front/back h1 stream creation in 2 functions
Christopher Faulet [Thu, 24 Sep 2020 08:30:15 +0000 (10:30 +0200)] 
MINOR: mux-h1: Split front/back h1 stream creation in 2 functions

Dedicated functions are now used to create frontend and backend H1
streams. h1c_frt_stream_new() is now used to create frontend H1 streams and
h1c_bck_stream_new() to create backend ones. Both rely on h1s_new() function
to allocate the stream itself. It is a bit easier to add specific processing
depending we are on the frontend or the backend side.

4 years agoMINOR: mux-h1: Separate parsing and formatting errors at H1 stream level
Christopher Faulet [Thu, 24 Sep 2020 08:05:44 +0000 (10:05 +0200)] 
MINOR: mux-h1: Separate parsing and formatting errors at H1 stream level

Instead of using H1S flags to report an error on the request or the
response, independently it is a parsing or a formatting error, we now use a
flag to report parsing errors and another one to report formatting
ones. This simplify the message parsing. It is also easier to figure out
what error happened when one of this flag is set. The side may be deduced
checking the H1C_F_IS_BACK flag.

4 years agoMINOR: mux-h1: Introduce H1C_F_IS_BACK flag on the H1 connection
Christopher Faulet [Thu, 24 Sep 2020 07:52:52 +0000 (09:52 +0200)] 
MINOR: mux-h1: Introduce H1C_F_IS_BACK flag on the H1 connection

This flag is only set on the backend side and is tested instead of calling
conn_is_back() function.

4 years agoMEDIUM: mux-h1: Use a h1c flag to block reads when splicing is in-progress
Christopher Faulet [Mon, 21 Sep 2020 09:47:16 +0000 (11:47 +0200)] 
MEDIUM: mux-h1: Use a h1c flag to block reads when splicing is in-progress

Instead of using 2 flags on the H1 stream (H1S_F_BUF_FLUSH and
H1S_F_SPLICED_DATA), we now only use one flag on the H1 connection
(H1C_F_WANT_SPLICE) to notify we want to use splicing or we are using
splicing. This flag blocks the calls to rcv_buf() connection callback.

It is a bit easier to set the H1 connection capability to receive data in
its input buffer instead of relying on the H1 stream.

4 years agoMINOR: mux-h1: Add a flag to disable reads to wait opposite side
Christopher Faulet [Mon, 21 Sep 2020 08:57:52 +0000 (10:57 +0200)] 
MINOR: mux-h1: Add a flag to disable reads to wait opposite side

H1C_F_WAIT_OPPOSITE must be set on the H1 conenction to don't read more data
because we must be sync with the opposite side. This flag replaces the
H1C_F_IN_BUSY flag. Its name is a bit explicit. It is automatically set on
the backend side when the mux is created. It is safe to do so because at
this stage, the request has not yet been sent to the server. This way, in
h1_recv_allowed(), a test on this flag is enough to block the reads instead
of testing the H1 stream state on the backend side.

4 years agoMINOR: stream: Pass an optional input buffer when a stream is created
Christopher Faulet [Mon, 14 Sep 2020 09:40:13 +0000 (11:40 +0200)] 
MINOR: stream: Pass an optional input buffer when a stream is created

It is now possible to set the buffer used by the channel request buffer when
a stream is created. It may be useful if input data are already received,
instead of waiting the first call to the mux rcv_buf() callback. This change
is mandatory to support H1 connection with no stream attached.

For now, the multiplexers don't pass any buffer. BUF_NULL is thus used to
call stream_create_from_cs().

4 years agoMINOR: muxes: Remove get_cs_info callback function now useless
Christopher Faulet [Wed, 30 Sep 2020 12:08:30 +0000 (14:08 +0200)] 
MINOR: muxes: Remove get_cs_info callback function now useless

This callback function was only defined by the mux-h1. But it has been
removed in the previous commit because it is unused now. So, we can do a
step forward removing the callback function from the mux definition and the
cs_info structure.

4 years agoMINOR: mux-h1: Don't provide anymore timing info using cs_info structure
Christopher Faulet [Wed, 30 Sep 2020 12:06:23 +0000 (14:06 +0200)] 
MINOR: mux-h1: Don't provide anymore timing info using cs_info structure

The cs_info are now unused. The stream uses the session to get these
info. So we can safely remove it from the mux-h1.

4 years agoMINOR: stream: Don't retrieve anymore timing info from the mux csinfo
Christopher Faulet [Wed, 30 Sep 2020 12:03:54 +0000 (14:03 +0200)] 
MINOR: stream: Don't retrieve anymore timing info from the mux csinfo

These info are only provided by the mux-h1. But, thanks to previous patches,
we can get them from the session directly. There is no need to retrieve them
from the mux anymore.

4 years agoMINOR: stream: Always get idle duration from the session
Christopher Faulet [Wed, 30 Sep 2020 11:49:56 +0000 (13:49 +0200)] 
MINOR: stream: Always get idle duration from the session

Since the idle duration provided by the session is always up-to-date, there
is no more reason to rely on the multiplexer cs_info to set it to the
stream.

4 years agoMINOR: logs: Use session idle duration when no stream is provided
Christopher Faulet [Wed, 30 Sep 2020 13:10:07 +0000 (15:10 +0200)] 
MINOR: logs: Use session idle duration when no stream is provided

When a log message is emitted from the session, using sess_log() function,
there is no stream available. In this case, instead of deducing the idle
duration from the accept date, we use the one provided by the session. 0 is
used if it is undefined (i.e set to -1).

4 years agoMINOR: mux-h1: Reset session dates and durations info when the CS is detached
Christopher Faulet [Mon, 5 Oct 2020 09:35:17 +0000 (11:35 +0200)] 
MINOR: mux-h1: Reset session dates and durations info when the CS is detached

These info are reset for the next transaction, if the connection is kept
alive. From the stream point of view, it should be the same a new
connection, except there is no handshake. Thus the handshake duration is set
to 0.

4 years agoMINOR: mux-h1: Update session idle duration when data are received
Christopher Faulet [Wed, 30 Sep 2020 11:47:09 +0000 (13:47 +0200)] 
MINOR: mux-h1: Update session idle duration when data are received

The session idle duration is set if not already done when data are
received. For now, this value is still unused.

4 years agoMINOR: session: Add the idle duration field into the session
Christopher Faulet [Wed, 30 Sep 2020 08:28:02 +0000 (10:28 +0200)] 
MINOR: session: Add the idle duration field into the session

The idle duration between two streams is added to the session structure. It
is not necessarily pertinent on all protocols. In fact, it is only defined
for H1 connections. It is the duration between two H1 transactions. But the
.get_cs_info() callback function on the multiplexers only exists because
this duration is missing at the session level. So it is a simplification
opportunity for a really low cost.

To reduce the cost, a hole in the session structure is filled by moving
.srv_list field at the end of the structure.

4 years agoBUG/MINOR: mux-h1: Handle keep-alive timeout for idle frontend connections
Christopher Faulet [Tue, 1 Dec 2020 10:42:53 +0000 (11:42 +0100)] 
BUG/MINOR: mux-h1: Handle keep-alive timeout for idle frontend connections

IDLE frontend connections have no stream attached. The stream is only
created when new data are received, when the parsing of the next request
starts. Thus the keep-alive timeout, handled into the HTTP analysers, is not
considered while nothing is received. But this is especially when this
timeout must be considered. Concretely the http-keep-alive is ignored while
no data are received. Only the client timeout is used. It will only be
considered on incomplete requests, if the http-request timeout is not set.

To fix the bug, the http-keep-alive timeout must be handled at the mux
level, for IDLE frontend connection only.

This patch should fix the issue #984. It must be backported as far as
2.2. On prior versions, the stream is created earlier. So, it is not a
problem, except if this behavior changes of course (it was an optim of the
2.2, but don't remember the commit).

4 years agoBUG/MINOR: listener: use sockaddr_in6 for IPv6
Willy Tarreau [Fri, 4 Dec 2020 13:28:23 +0000 (14:28 +0100)] 
BUG/MINOR: listener: use sockaddr_in6 for IPv6

A copy-paste bug between {tcp,udp}{4,6}_add_listener() resulted in
using a struct sockaddr_in to set the TCP/UDP port while it ought to
be a struct sockaddr_in6. Fortunately, the port has the same offset
(2) in both so it was harmless. A cleaner way to proceed would be
to have a set_port function exported by the address family layer.

This needs to be backported to 2.3.

4 years agoBUG/MINOR: lua-thread: close all states on deinit
Willy Tarreau [Fri, 4 Dec 2020 10:48:12 +0000 (11:48 +0100)] 
BUG/MINOR: lua-thread: close all states on deinit

It seems to me that lua_close() must be called on all states at deinit
time, not just the first two ones. This is likely a remnant of commit
59f11be43 ("MEDIUM: lua-thread: Add the lua-load-per-thread directive").
There should likely be some memory leak reports when using Lua without
this fix, though none were observed for now.

No backport is needed as this was merged into 2.4-dev.

4 years agoBUG/MEDIUM: lua-thread: some parts must be initialized once
Thierry Fournier [Fri, 4 Dec 2020 10:47:47 +0000 (11:47 +0100)] 
BUG/MEDIUM: lua-thread: some parts must be initialized once

Lua dedicated TCP, HTTP and SSL socket and proxies must be initialized
once. Right now, they are initialized from the Lua init state, but since
commit 59f11be43 ("MEDIUM: lua-thread: Add the lua-load-per-thread
directive") this function is called one time per lua context. This
caused some fields to be cleared and overwritten, and pre-allocated
object to be lost. This is why the address sanitizer detected memory
leaks from the socket_ssl server initialization.

Let's move all the state-independent part of the function to the
hlua_init() function to avoid this.

No backport is needed, this is only 2.4-dev.

4 years agoMINOR: cache: Consider invalid Age values as stale
Remi Tricot-Le Breton [Thu, 3 Dec 2020 17:19:32 +0000 (18:19 +0100)] 
MINOR: cache: Consider invalid Age values as stale

Do not store responses that have an invalid age header (non numerical,
negative ...).

4 years agoMEDIUM: cache: Remove cache entry in case of POST on the same resource
Remi Tricot-Le Breton [Thu, 3 Dec 2020 17:19:31 +0000 (18:19 +0100)] 
MEDIUM: cache: Remove cache entry in case of POST on the same resource

In case of successful unsafe method on a stored resource, the cached entry
must be invalidated (see RFC7234#4.4).
A "non-error response" is one with a 2xx (Successful) or 3xx (Redirection)
status code.
This implies that the primary hash must now be calculated on requests
that have an unsafe method (POST or PUT for instance) so that we can
disable the corresponding entries when we process the response.