blob: bf96a47b4818a64f0093f0f945f7211e2773bc7e [file] [log] [blame]
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001.. toctree::
2 :maxdepth: 2
3
4
5How Lua runs in HAProxy
6=======================
7
8HAProxy Lua running contexts
9----------------------------
10
11The Lua code executed in HAProxy can be processed in 2 main modes. The first one
12is the **initialisation mode**, and the second is the **runtime mode**.
13
14* In the **initialisation mode**, we can perform DNS solves, but we cannot
15 perform socket I/O. In this initialisation mode, HAProxy still blocked during
16 the execution of the Lua program.
17
18* In the **runtime mode**, we cannot perform DNS solves, but we can use sockets.
19 The execution of the Lua code is multiplexed with the requests processing, so
20 the Lua code seems to be run in blocking, but it is not the case.
21
22The Lua code is loaded in one or more files. These files contains main code and
Christopher Faulet5a2c6612021-08-15 20:35:25 +020023functions. Lua have 7 execution context.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010024
251. The Lua file **body context**. It is executed during the load of the Lua file
26 in the HAProxy `[global]` section with the directive `lua-load`. It is
27 executed in initialisation mode. This section is use for configuring Lua
28 bindings in HAProxy.
29
David Carlier61fdf8b2015-10-02 11:59:38 +0100302. The Lua **init context**. It is a Lua function executed just after the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010031 HAProxy configuration parsing. The execution is in initialisation mode. In
32 this context the HAProxy environment are already initialized. It is useful to
33 check configuration, or initializing socket connections or tasks. These
34 functions are declared in the body context with the Lua function
35 `core.register_init()`. The prototype of the function is a simple function
36 without return value and without parameters, like this: `function fcn()`.
37
David Carlier61fdf8b2015-10-02 11:59:38 +0100383. The Lua **task context**. It is a Lua function executed after the start
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010039 of the HAProxy scheduler, and just after the declaration of the task with the
40 Lua function `core.register_task()`. This context can be concurrent with the
41 traffic processing. It is executed in runtime mode. The prototype of the
42 function is a simple function without return value and without parameters,
43 like this: `function fcn()`.
44
David Carlier61fdf8b2015-10-02 11:59:38 +0100454. The **action context**. It is a Lua function conditionally executed. These
Thierry FOURNIERa2d02252015-10-01 15:00:42 +020046 actions are registered by the Lua directives "`core.register_action()`". The
47 prototype of the Lua called function is a function with doesn't returns
48 anything and that take an object of class TXN as entry. `function fcn(txn)`.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010049
505. The **sample-fetch context**. This function takes a TXN object as entry
51 argument and returns a string. These types of function cannot execute any
52 blocking function. They are useful to aggregate some of original HAProxy
53 sample-fetches and return the result. The prototype of the function is
54 `function string fcn(txn)`. These functions can be registered with the Lua
55 function `core.register_fetches()`. Each declared sample-fetch is prefixed by
56 the string "lua.".
57
Christopher Faulet1e9b1b62021-08-11 10:14:30 +020058 .. note::
59 It is possible that this function cannot found the required data in the
60 original HAProxy sample-fetches, in this case, it cannot return the
61 result. This case is not yet supported
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010062
David Carlier61fdf8b2015-10-02 11:59:38 +0100636. The **converter context**. It is a Lua function that takes a string as input
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010064 and returns another string as output. These types of function are stateless,
65 it cannot access to any context. They don't execute any blocking function.
66 The call prototype is `function string fcn(string)`. This function can be
67 registered with the Lua function `core.register_converters()`. Each declared
68 converter is prefixed by the string "lua.".
69
Christopher Faulet5a2c6612021-08-15 20:35:25 +0200707. The **filter context**: It is a Lua object based on a class defining filter
71 callback functions. Lua filters are registered using
72 `core.register_filter()`. Each declared filter is prefixed by the string
73 "lua.".
74
75 .. warning::
76 The Lua filter support is highly experimental. The API is still unstable
77 and may change without notice. No backward compatibility should be
78 expected for now. Use it with an extreme caution and report any issue or
79 comment about it. The feature was unveiled to improve it and to adapt it
80 to real usages.
81
82
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010083HAProxy Lua Hello world
84-----------------------
85
86HAProxy configuration file (`hello_world.conf`):
87
88::
89
90 global
91 lua-load hello_world.lua
92
93 listen proxy
94 bind 127.0.0.1:10001
Thierry FOURNIERa2d02252015-10-01 15:00:42 +020095 tcp-request inspect-delay 1s
96 tcp-request content use-service lua.hello_world
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010097
98HAProxy Lua file (`hello_world.lua`):
99
100.. code-block:: lua
101
Thierry FOURNIERa2d02252015-10-01 15:00:42 +0200102 core.register_service("hello_world", "tcp", function(applet)
103 applet:send("hello world\n")
104 end)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100105
106How to start HAProxy for testing this configuration:
107
108::
109
110 ./haproxy -f hello_world.conf
111
112On other terminal, you can test with telnet:
113
114::
115
116 #:~ telnet 127.0.0.1 10001
117 hello world
118
119Core class
120==========
121
122.. js:class:: core
123
124 The "core" class contains all the HAProxy core functions. These function are
125 useful for the controlling the execution flow, registering hooks, manipulating
126 global maps or ACL, ...
127
128 "core" class is basically provided with HAProxy. No `require` line is
129 required to uses these function.
130
David Carlier61fdf8b2015-10-02 11:59:38 +0100131 The "core" class is static, it is not possible to create a new object of this
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100132 type.
133
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100134.. js:attribute:: core.emerg
135
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100136 :returns: integer
137
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100138 This attribute is an integer, it contains the value of the loglevel "emergency" (0).
139
140.. js:attribute:: core.alert
141
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100142 :returns: integer
143
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100144 This attribute is an integer, it contains the value of the loglevel "alert" (1).
145
146.. js:attribute:: core.crit
147
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100148 :returns: integer
149
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100150 This attribute is an integer, it contains the value of the loglevel "critical" (2).
151
152.. js:attribute:: core.err
153
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100154 :returns: integer
155
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100156 This attribute is an integer, it contains the value of the loglevel "error" (3).
157
158.. js:attribute:: core.warning
159
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100160 :returns: integer
161
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100162 This attribute is an integer, it contains the value of the loglevel "warning" (4).
163
164.. js:attribute:: core.notice
165
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100166 :returns: integer
167
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100168 This attribute is an integer, it contains the value of the loglevel "notice" (5).
169
170.. js:attribute:: core.info
171
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100172 :returns: integer
173
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100174 This attribute is an integer, it contains the value of the loglevel "info" (6).
175
176.. js:attribute:: core.debug
177
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100178 :returns: integer
179
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100180 This attribute is an integer, it contains the value of the loglevel "debug" (7).
181
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100182.. js:attribute:: core.proxies
183
184 **context**: task, action, sample-fetch, converter
185
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400186 This attribute is a table of declared proxies (frontend and backends). Each
187 proxy give an access to his list of listeners and servers. The table is
188 indexed by proxy name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100189
Christopher Faulet1e9b1b62021-08-11 10:14:30 +0200190 .. Warning::
191 if you are declared frontend and backend with the same name, only one of
192 these are listed.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200193
194 :see: :js:attr:`core.backends`
195 :see: :js:attr:`core.frontends`
196
197.. js:attribute:: core.backends
198
199 **context**: task, action, sample-fetch, converter
200
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400201 This attribute is a table of declared proxies with backend capability. Each
202 proxy give an access to his list of listeners and servers. The table is
203 indexed by the backend name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200204
205 :see: :js:attr:`core.proxies`
206 :see: :js:attr:`core.frontends`
207
208.. js:attribute:: core.frontends
209
210 **context**: task, action, sample-fetch, converter
211
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400212 This attribute is a table of declared proxies with frontend capability. Each
213 proxy give an access to his list of listeners and servers. The table is
214 indexed by the frontend name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200215
216 :see: :js:attr:`core.proxies`
217 :see: :js:attr:`core.backends`
218
Thierry Fournierecb83c22020-11-28 15:49:44 +0100219.. js:attribute:: core.thread
220
221 **context**: task, action, sample-fetch, converter, applet
222
223 This variable contains the executing thread number starting at 1. 0 is a
224 special case for the common lua context. So, if thread is 0, Lua scope is
225 shared by all threads, otherwise the scope is dedicated to a single thread.
226 A program which needs to execute some parts exactly once regardless of the
227 number of threads can check that core.thread is 0 or 1.
228
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100229.. js:function:: core.log(loglevel, msg)
230
231 **context**: body, init, task, action, sample-fetch, converter
232
David Carlier61fdf8b2015-10-02 11:59:38 +0100233 This function sends a log. The log is sent, according with the HAProxy
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100234 configuration file, on the default syslog server if it is configured and on
235 the stderr if it is allowed.
236
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100237 :param integer loglevel: Is the log level associated with the message. It is a
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100238 number between 0 and 7.
239 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100240 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
241 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
242 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
243 :see: :js:func:`core.Debug`
244 :see: :js:func:`core.Info`
245 :see: :js:func:`core.Warning`
246 :see: :js:func:`core.Alert`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100247
248.. js:function:: core.Debug(msg)
249
250 **context**: body, init, task, action, sample-fetch, converter
251
252 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100253 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100254
255 Does the same job than:
256
257.. code-block:: lua
258
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100259 function Debug(msg)
260 core.log(core.debug, msg)
261 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100262..
263
264.. js:function:: core.Info(msg)
265
266 **context**: body, init, task, action, sample-fetch, converter
267
268 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100269 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100270
271.. code-block:: lua
272
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100273 function Info(msg)
274 core.log(core.info, msg)
275 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100276..
277
278.. js:function:: core.Warning(msg)
279
280 **context**: body, init, task, action, sample-fetch, converter
281
282 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100283 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100284
285.. code-block:: lua
286
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100287 function Warning(msg)
288 core.log(core.warning, msg)
289 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100290..
291
292.. js:function:: core.Alert(msg)
293
294 **context**: body, init, task, action, sample-fetch, converter
295
296 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100297 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100298
299.. code-block:: lua
300
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100301 function Alert(msg)
302 core.log(core.alert, msg)
303 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100304..
305
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100306.. js:function:: core.add_acl(filename, key)
307
308 **context**: init, task, action, sample-fetch, converter
309
310 Add the ACL *key* in the ACLs list referenced by the file *filename*.
311
312 :param string filename: the filename that reference the ACL entries.
313 :param string key: the key which will be added.
314
315.. js:function:: core.del_acl(filename, key)
316
317 **context**: init, task, action, sample-fetch, converter
318
319 Delete the ACL entry referenced by the key *key* in the list of ACLs
320 referenced by *filename*.
321
322 :param string filename: the filename that reference the ACL entries.
323 :param string key: the key which will be deleted.
324
325.. js:function:: core.del_map(filename, key)
326
327 **context**: init, task, action, sample-fetch, converter
328
329 Delete the map entry indexed with the specified key in the list of maps
330 referenced by his filename.
331
332 :param string filename: the filename that reference the map entries.
333 :param string key: the key which will be deleted.
334
Thierry Fourniereea77c02016-03-18 08:47:13 +0100335.. js:function:: core.get_info()
336
337 **context**: body, init, task, action, sample-fetch, converter
338
Ilya Shipitsin2075ca82020-03-06 23:22:22 +0500339 Returns HAProxy core information. We can found information like the uptime,
Thierry Fourniereea77c02016-03-18 08:47:13 +0100340 the pid, memory pool usage, tasks number, ...
341
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100342 These information are also returned by the management socket via the command
343 "show info". See the management socket documentation for more information
Thierry Fourniereea77c02016-03-18 08:47:13 +0100344 about the content of these variables.
345
346 :returns: an array of values.
347
Thierry Fournierb1f46562016-01-21 09:46:15 +0100348.. js:function:: core.now()
349
350 **context**: body, init, task, action
351
352 This function returns the current time. The time returned is fixed by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100353 HAProxy core and assures than the hour will be monotonic and that the system
Thierry Fournierb1f46562016-01-21 09:46:15 +0100354 call 'gettimeofday' will not be called too. The time is refreshed between each
355 Lua execution or resume, so two consecutive call to the function "now" will
356 probably returns the same result.
357
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400358 :returns: a table which contains two entries "sec" and "usec". "sec"
Thierry Fournierb1f46562016-01-21 09:46:15 +0100359 contains the current at the epoch format, and "usec" contains the
360 current microseconds.
361
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100362.. js:function:: core.http_date(date)
363
364 **context**: body, init, task, action
365
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100366 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100367 containing the corresponding date with a epoch format. A valid http date
368 me respect the format IMF, RFC850 or ASCTIME.
369
370 :param string date: a date http-date formatted
371 :returns: integer containing epoch date
372 :see: :js:func:`core.imf_date`.
373 :see: :js:func:`core.rfc850_date`.
374 :see: :js:func:`core.asctime_date`.
375 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
376
377.. js:function:: core.imf_date(date)
378
379 **context**: body, init, task, action
380
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100381 This function take a string representing IMF date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100382 containing the corresponding date with a epoch format.
383
384 :param string date: a date IMF formatted
385 :returns: integer containing epoch date
386 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
387
388 The IMF format is like this:
389
390.. code-block:: text
391
392 Sun, 06 Nov 1994 08:49:37 GMT
393..
394
395.. js:function:: core.rfc850_date(date)
396
397 **context**: body, init, task, action
398
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100399 This function take a string representing RFC850 date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100400 containing the corresponding date with a epoch format.
401
402 :param string date: a date RFC859 formatted
403 :returns: integer containing epoch date
404 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
405
406 The RFC850 format is like this:
407
408.. code-block:: text
409
410 Sunday, 06-Nov-94 08:49:37 GMT
411..
412
413.. js:function:: core.asctime_date(date)
414
415 **context**: body, init, task, action
416
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100417 This function take a string representing ASCTIME date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100418 containing the corresponding date with a epoch format.
419
420 :param string date: a date ASCTIME formatted
421 :returns: integer containing epoch date
422 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
423
424 The ASCTIME format is like this:
425
426.. code-block:: text
427
428 Sun Nov 6 08:49:37 1994
429..
430
431.. js:function:: core.rfc850_date(date)
432
433 **context**: body, init, task, action
434
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100435 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100436 containing the corresponding date with a epoch format.
437
438 :param string date: a date http-date formatted
439
440.. js:function:: core.asctime_date(date)
441
442 **context**: body, init, task, action
443
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100444 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100445 containing the corresponding date with a epoch format.
446
447 :param string date: a date http-date formatted
448
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100449.. js:function:: core.msleep(milliseconds)
450
451 **context**: body, init, task, action
452
453 The `core.msleep()` stops the Lua execution between specified milliseconds.
454
455 :param integer milliseconds: the required milliseconds.
456
Thierry Fournierf61aa632016-02-19 20:56:00 +0100457.. js:attribute:: core.proxies
458
459 **context**: body, init, task, action, sample-fetch, converter
460
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100461 Proxies is a table containing the list of all proxies declared in the
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400462 configuration file. The table is indexed by the proxy name, and each entry
463 of the proxies table is an object of type :ref:`proxy_class`.
464
Christopher Faulet1e9b1b62021-08-11 10:14:30 +0200465 .. warning::
466 if you have declared a frontend and backend with the same name, only one of
467 these are listed.
Thierry Fournierf61aa632016-02-19 20:56:00 +0100468
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100469.. js:function:: core.register_action(name, actions, func [, nb_args])
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200470
471 **context**: body
472
David Carlier61fdf8b2015-10-02 11:59:38 +0100473 Register a Lua function executed as action. All the registered action can be
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200474 used in HAProxy with the prefix "lua.". An action gets a TXN object class as
475 input.
476
477 :param string name: is the name of the converter.
Willy Tarreau61add3c2015-09-28 15:39:10 +0200478 :param table actions: is a table of string describing the HAProxy actions who
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200479 want to register to. The expected actions are 'tcp-req',
480 'tcp-res', 'http-req' or 'http-res'.
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100481 :param integer nb_args: is the expected number of argument for the action.
482 By default the value is 0.
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200483 :param function func: is the Lua function called to work as converter.
484
485 The prototype of the Lua function used as argument is:
486
487.. code-block:: lua
488
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100489 function(txn [, arg1 [, arg2]])
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200490..
491
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100492 * **txn** (:ref:`txn_class`): this is a TXN object used for manipulating the
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200493 current request or TCP stream.
494
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100495 * **argX**: this is argument provided through the HAProxy configuration file.
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100496
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100497 Here, an example of action registration. The action just send an 'Hello world'
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200498 in the logs.
499
500.. code-block:: lua
501
502 core.register_action("hello-world", { "tcp-req", "http-req" }, function(txn)
503 txn:Info("Hello world")
504 end)
505..
506
Willy Tarreau714f3452021-05-09 06:47:26 +0200507 This example code is used in HAProxy configuration like this:
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200508
509::
510
511 frontend tcp_frt
512 mode tcp
513 tcp-request content lua.hello-world
514
515 frontend http_frt
516 mode http
517 http-request lua.hello-world
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100518..
519
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100520 A second example using arguments
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100521
522.. code-block:: lua
523
524 function hello_world(txn, arg)
525 txn:Info("Hello world for " .. arg)
526 end
527 core.register_action("hello-world", { "tcp-req", "http-req" }, hello_world, 2)
528..
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200529
Willy Tarreau714f3452021-05-09 06:47:26 +0200530 This example code is used in HAProxy configuration like this:
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100531
532::
533
534 frontend tcp_frt
535 mode tcp
536 tcp-request content lua.hello-world everybody
537..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100538.. js:function:: core.register_converters(name, func)
539
540 **context**: body
541
David Carlier61fdf8b2015-10-02 11:59:38 +0100542 Register a Lua function executed as converter. All the registered converters
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100543 can be used in HAProxy with the prefix "lua.". An converter get a string as
544 input and return a string as output. The registered function can take up to 9
545 values as parameter. All the value are strings.
546
547 :param string name: is the name of the converter.
548 :param function func: is the Lua function called to work as converter.
549
550 The prototype of the Lua function used as argument is:
551
552.. code-block:: lua
553
554 function(str, [p1 [, p2 [, ... [, p5]]]])
555..
556
557 * **str** (*string*): this is the input value automatically converted in
558 string.
559 * **p1** .. **p5** (*string*): this is a list of string arguments declared in
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100560 the HAProxy configuration file. The number of arguments doesn't exceed 5.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100561 The order and the nature of these is conventionally choose by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100562 developer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100563
564.. js:function:: core.register_fetches(name, func)
565
566 **context**: body
567
David Carlier61fdf8b2015-10-02 11:59:38 +0100568 Register a Lua function executed as sample fetch. All the registered sample
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100569 fetch can be used in HAProxy with the prefix "lua.". A Lua sample fetch
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100570 return a string as output. The registered function can take up to 9 values as
571 parameter. All the value are strings.
572
573 :param string name: is the name of the converter.
574 :param function func: is the Lua function called to work as sample fetch.
575
576 The prototype of the Lua function used as argument is:
577
578.. code-block:: lua
579
580 string function(txn, [p1 [, p2 [, ... [, p5]]]])
581..
582
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100583 * **txn** (:ref:`txn_class`): this is the txn object associated with the current
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100584 request.
585 * **p1** .. **p5** (*string*): this is a list of string arguments declared in
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100586 the HAProxy configuration file. The number of arguments doesn't exceed 5.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100587 The order and the nature of these is conventionally choose by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100588 developer.
589 * **Returns**: A string containing some data, or nil if the value cannot be
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100590 returned now.
591
592 lua example code:
593
594.. code-block:: lua
595
596 core.register_fetches("hello", function(txn)
597 return "hello"
598 end)
599..
600
601 HAProxy example configuration:
602
603::
604
605 frontend example
606 http-request redirect location /%[lua.hello]
607
Christopher Faulet5a2c6612021-08-15 20:35:25 +0200608.. js:function:: core.register_filter(name, Flt, func)
609
610 **context**: body
611
612 Register a Lua function used to declare a filter. All the registered filters
613 can by used in HAProxy with the prefix "lua.".
614
615 :param string name: is the name of the filter.
616 :param table Flt: is a Lua class containing the filter definition (id, flags,
617 callbacks).
618 :param function func: is the Lua function called to create the Lua filter.
619
620 The prototype of the Lua function used as argument is:
621
622.. code-block:: lua
623
624 function(flt, args)
625..
626
627 * **flt** : Is a filter object based on the class provided in
628 :js:func:`core.register_filter()` function.
629
630 * **args**: Is a table of strings containing all arguments provided through
631 the HAProxy configuration file, on the filter line.
632
633 It must return the filter to use or nil to ignore it. Here, an example of
634 filter registration.
635
636.. code-block:: lua
637
638 core.register_filter("my-filter", MyFilter, function(flt, args)
639 flt.args = args -- Save arguments
640 return flt
641 end)
642..
643
644 This example code is used in HAProxy configuration like this:
645
646::
647
648 frontend http
649 mode http
650 filter lua.my-filter arg1 arg2 arg3
651..
652
653 :see: :js:class:`Filter`
654
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200655.. js:function:: core.register_service(name, mode, func)
656
657 **context**: body
658
David Carlier61fdf8b2015-10-02 11:59:38 +0100659 Register a Lua function executed as a service. All the registered service can
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200660 be used in HAProxy with the prefix "lua.". A service gets an object class as
661 input according with the required mode.
662
663 :param string name: is the name of the converter.
Willy Tarreau61add3c2015-09-28 15:39:10 +0200664 :param string mode: is string describing the required mode. Only 'tcp' or
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200665 'http' are allowed.
666 :param function func: is the Lua function called to work as converter.
667
668 The prototype of the Lua function used as argument is:
669
670.. code-block:: lua
671
672 function(applet)
673..
674
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100675 * **applet** *applet* will be a :ref:`applettcp_class` or a
676 :ref:`applethttp_class`. It depends the type of registered applet. An applet
677 registered with the 'http' value for the *mode* parameter will gets a
678 :ref:`applethttp_class`. If the *mode* value is 'tcp', the applet will gets
679 a :ref:`applettcp_class`.
680
Christopher Faulet1e9b1b62021-08-11 10:14:30 +0200681 .. warning::
682 Applets of type 'http' cannot be called from 'tcp-*' rulesets. Only the
683 'http-*' rulesets are authorized, this means that is not possible to call
684 an HTTP applet from a proxy in tcp mode. Applets of type 'tcp' can be
685 called from anywhere.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200686
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100687 Here, an example of service registration. The service just send an 'Hello world'
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200688 as an http response.
689
690.. code-block:: lua
691
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100692 core.register_service("hello-world", "http", function(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200693 local response = "Hello World !"
694 applet:set_status(200)
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +0200695 applet:add_header("content-length", string.len(response))
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200696 applet:add_header("content-type", "text/plain")
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +0200697 applet:start_response()
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200698 applet:send(response)
699 end)
700..
701
Willy Tarreau714f3452021-05-09 06:47:26 +0200702 This example code is used in HAProxy configuration like this:
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200703
704::
705
706 frontend example
707 http-request use-service lua.hello-world
708
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100709.. js:function:: core.register_init(func)
710
711 **context**: body
712
713 Register a function executed after the configuration parsing. This is useful
714 to check any parameters.
715
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100716 :param function func: is the Lua function called to work as initializer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100717
718 The prototype of the Lua function used as argument is:
719
720.. code-block:: lua
721
722 function()
723..
724
725 It takes no input, and no output is expected.
726
727.. js:function:: core.register_task(func)
728
729 **context**: body, init, task, action, sample-fetch, converter
730
731 Register and start independent task. The task is started when the HAProxy
732 main scheduler starts. For example this type of tasks can be executed to
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +0100733 perform complex health checks.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100734
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100735 :param function func: is the Lua function called to work as initializer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100736
737 The prototype of the Lua function used as argument is:
738
739.. code-block:: lua
740
741 function()
742..
743
744 It takes no input, and no output is expected.
745
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100746.. js:function:: core.register_cli([path], usage, func)
747
748 **context**: body
749
750 Register and start independent task. The task is started when the HAProxy
751 main scheduler starts. For example this type of tasks can be executed to
752 perform complex health checks.
753
754 :param array path: is the sequence of word for which the cli execute the Lua
755 binding.
756 :param string usage: is the usage message displayed in the help.
757 :param function func: is the Lua function called to handle the CLI commands.
758
759 The prototype of the Lua function used as argument is:
760
761.. code-block:: lua
762
763 function(AppletTCP, [arg1, [arg2, [...]]])
764..
765
766 I/O are managed with the :ref:`applettcp_class` object. Args are given as
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100767 parameter. The args embed the registered path. If the path is declared like
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100768 this:
769
770.. code-block:: lua
771
772 core.register_cli({"show", "ssl", "stats"}, "Display SSL stats..", function(applet, arg1, arg2, arg3, arg4, arg5)
773 end)
774..
775
776 And we execute this in the prompt:
777
778.. code-block:: text
779
780 > prompt
781 > show ssl stats all
782..
783
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100784 Then, arg1, arg2 and arg3 will contains respectively "show", "ssl" and "stats".
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100785 arg4 will contain "all". arg5 contains nil.
786
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100787.. js:function:: core.set_nice(nice)
788
789 **context**: task, action, sample-fetch, converter
790
791 Change the nice of the current task or current session.
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +0100792
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100793 :param integer nice: the nice value, it must be between -1024 and 1024.
794
795.. js:function:: core.set_map(filename, key, value)
796
797 **context**: init, task, action, sample-fetch, converter
798
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100799 Set the value *value* associated to the key *key* in the map referenced by
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100800 *filename*.
801
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100802 :param string filename: the Map reference
803 :param string key: the key to set or replace
804 :param string value: the associated value
805
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100806.. js:function:: core.sleep(int seconds)
807
808 **context**: body, init, task, action
809
810 The `core.sleep()` functions stop the Lua execution between specified seconds.
811
812 :param integer seconds: the required seconds.
813
814.. js:function:: core.tcp()
815
816 **context**: init, task, action
817
818 This function returns a new object of a *socket* class.
819
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100820 :returns: A :ref:`socket_class` object.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100821
William Lallemand00a15022021-11-19 16:02:44 +0100822.. js:function:: core.httpclient()
823
824 **context**: init, task, action
825
826 This function returns a new object of a *httpclient* class.
827
828 :returns: A :ref:`httpclient_class` object.
829
Thierry Fournier1de16592016-01-27 09:49:07 +0100830.. js:function:: core.concat()
831
832 **context**: body, init, task, action, sample-fetch, converter
833
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100834 This function returns a new concat object.
Thierry Fournier1de16592016-01-27 09:49:07 +0100835
836 :returns: A :ref:`concat_class` object.
837
Thierry FOURNIER0a99b892015-08-26 00:14:17 +0200838.. js:function:: core.done(data)
839
840 **context**: body, init, task, action, sample-fetch, converter
841
842 :param any data: Return some data for the caller. It is useful with
843 sample-fetches and sample-converters.
844
845 Immediately stops the current Lua execution and returns to the caller which
846 may be a sample fetch, a converter or an action and returns the specified
Thierry Fournier4234dbd2020-11-28 13:18:23 +0100847 value (ignored for actions and init). It is used when the LUA process finishes
848 its work and wants to give back the control to HAProxy without executing the
Thierry FOURNIER0a99b892015-08-26 00:14:17 +0200849 remaining code. It can be seen as a multi-level "return".
850
Thierry FOURNIER486f5a02015-03-16 15:13:03 +0100851.. js:function:: core.yield()
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100852
853 **context**: task, action, sample-fetch, converter
854
855 Give back the hand at the HAProxy scheduler. It is used when the LUA
856 processing consumes a lot of processing time.
857
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100858.. js:function:: core.parse_addr(address)
859
860 **context**: body, init, task, action, sample-fetch, converter
861
862 :param network: is a string describing an ipv4 or ipv6 address and optionally
863 its network length, like this: "127.0.0.1/8" or "aaaa::1234/32".
864 :returns: a userdata containing network or nil if an error occurs.
865
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100866 Parse ipv4 or ipv6 addresses and its facultative associated network.
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100867
868.. js:function:: core.match_addr(addr1, addr2)
869
870 **context**: body, init, task, action, sample-fetch, converter
871
872 :param addr1: is an address created with "core.parse_addr".
873 :param addr2: is an address created with "core.parse_addr".
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100874 :returns: boolean, true if the network of the addresses match, else returns
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100875 false.
876
Ilya Shipitsin2075ca82020-03-06 23:22:22 +0500877 Match two networks. For example "127.0.0.1/32" matches "127.0.0.0/8". The order
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100878 of network is not important.
879
Thierry FOURNIER / OZON.IO8a1027a2016-11-24 20:48:38 +0100880.. js:function:: core.tokenize(str, separators [, noblank])
881
882 **context**: body, init, task, action, sample-fetch, converter
883
884 This function is useful for tokenizing an entry, or splitting some messages.
885 :param string str: The string which will be split.
886 :param string separators: A string containing a list of separators.
887 :param boolean noblank: Ignore empty entries.
888 :returns: an array of string.
889
890 For example:
891
892.. code-block:: lua
893
894 local array = core.tokenize("This function is useful, for tokenizing an entry.", "., ", true)
895 print_r(array)
896..
897
898 Returns this array:
899
900.. code-block:: text
901
902 (table) table: 0x21c01e0 [
903 1: (string) "This"
904 2: (string) "function"
905 3: (string) "is"
906 4: (string) "useful"
907 5: (string) "for"
908 6: (string) "tokenizing"
909 7: (string) "an"
910 8: (string) "entry"
911 ]
912..
913
Thierry Fournierf61aa632016-02-19 20:56:00 +0100914.. _proxy_class:
915
916Proxy class
917============
918
919.. js:class:: Proxy
920
921 This class provides a way for manipulating proxy and retrieving information
922 like statistics.
923
Thierry FOURNIER817e7592017-07-24 14:35:04 +0200924.. js:attribute:: Proxy.name
925
926 Contain the name of the proxy.
927
Baptiste Assmann46c72552017-10-26 21:51:58 +0200928.. js:attribute:: Proxy.uuid
929
930 Contain the unique identifier of the proxy.
931
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100932.. js:attribute:: Proxy.servers
933
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400934 Contain a table with the attached servers. The table is indexed by server
935 name, and each server entry is an object of type :ref:`server_class`.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100936
Adis Nezirovic8878f8e2018-07-13 12:18:33 +0200937.. js:attribute:: Proxy.stktable
938
939 Contains a stick table object attached to the proxy.
940
Thierry Fournierff480422016-02-25 08:36:46 +0100941.. js:attribute:: Proxy.listeners
942
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400943 Contain a table with the attached listeners. The table is indexed by listener
944 name, and each each listeners entry is an object of type
945 :ref:`listener_class`.
Thierry Fournierff480422016-02-25 08:36:46 +0100946
Thierry Fournierf61aa632016-02-19 20:56:00 +0100947.. js:function:: Proxy.pause(px)
948
949 Pause the proxy. See the management socket documentation for more information.
950
951 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
952 proxy.
953
954.. js:function:: Proxy.resume(px)
955
956 Resume the proxy. See the management socket documentation for more
957 information.
958
959 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
960 proxy.
961
962.. js:function:: Proxy.stop(px)
963
964 Stop the proxy. See the management socket documentation for more information.
965
966 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
967 proxy.
968
969.. js:function:: Proxy.shut_bcksess(px)
970
971 Kill the session attached to a backup server. See the management socket
972 documentation for more information.
973
974 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
975 proxy.
976
977.. js:function:: Proxy.get_cap(px)
978
979 Returns a string describing the capabilities of the proxy.
980
981 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
982 proxy.
983 :returns: a string "frontend", "backend", "proxy" or "ruleset".
984
985.. js:function:: Proxy.get_mode(px)
986
987 Returns a string describing the mode of the current proxy.
988
989 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
990 proxy.
991 :returns: a string "tcp", "http", "health" or "unknown"
992
993.. js:function:: Proxy.get_stats(px)
994
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100995 Returns a table containing the proxy statistics. The statistics returned are
Thierry Fournierf61aa632016-02-19 20:56:00 +0100996 not the same if the proxy is frontend or a backend.
997
998 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
999 proxy.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001000 :returns: a key/value table containing stats
Thierry Fournierf61aa632016-02-19 20:56:00 +01001001
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001002.. _server_class:
1003
1004Server class
1005============
1006
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001007.. js:class:: Server
1008
1009 This class provides a way for manipulating servers and retrieving information.
1010
Patrick Hemmera62ae7e2018-04-29 14:23:48 -04001011.. js:attribute:: Server.name
1012
1013 Contain the name of the server.
1014
1015.. js:attribute:: Server.puid
1016
1017 Contain the proxy unique identifier of the server.
1018
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001019.. js:function:: Server.is_draining(sv)
1020
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001021 Return true if the server is currently draining sticky connections.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001022
1023 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1024 server.
1025 :returns: a boolean
1026
Patrick Hemmer32d539f2018-04-29 14:25:46 -04001027.. js:function:: Server.set_maxconn(sv, weight)
1028
1029 Dynamically change the maximum connections of the server. See the management
1030 socket documentation for more information about the format of the string.
1031
1032 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1033 server.
1034 :param string maxconn: A string describing the server maximum connections.
1035
1036.. js:function:: Server.get_maxconn(sv, weight)
1037
1038 This function returns an integer representing the server maximum connections.
1039
1040 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1041 server.
1042 :returns: an integer.
1043
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001044.. js:function:: Server.set_weight(sv, weight)
1045
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001046 Dynamically change the weight of the server. See the management socket
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001047 documentation for more information about the format of the string.
1048
1049 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1050 server.
1051 :param string weight: A string describing the server weight.
1052
1053.. js:function:: Server.get_weight(sv)
1054
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001055 This function returns an integer representing the server weight.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001056
1057 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1058 server.
1059 :returns: an integer.
1060
Joseph C. Sible49bbf522020-05-04 22:20:32 -04001061.. js:function:: Server.set_addr(sv, addr[, port])
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001062
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001063 Dynamically change the address of the server. See the management socket
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001064 documentation for more information about the format of the string.
1065
1066 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1067 server.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001068 :param string addr: A string describing the server address.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001069
1070.. js:function:: Server.get_addr(sv)
1071
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001072 Returns a string describing the address of the server.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001073
1074 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1075 server.
1076 :returns: A string
1077
1078.. js:function:: Server.get_stats(sv)
1079
1080 Returns server statistics.
1081
1082 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1083 server.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001084 :returns: a key/value table containing stats
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001085
1086.. js:function:: Server.shut_sess(sv)
1087
1088 Shutdown all the sessions attached to the server. See the management socket
1089 documentation for more information about this function.
1090
1091 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1092 server.
1093
1094.. js:function:: Server.set_drain(sv)
1095
1096 Drain sticky sessions. See the management socket documentation for more
1097 information about this function.
1098
1099 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1100 server.
1101
1102.. js:function:: Server.set_maint(sv)
1103
1104 Set maintenance mode. See the management socket documentation for more
1105 information about this function.
1106
1107 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1108 server.
1109
1110.. js:function:: Server.set_ready(sv)
1111
1112 Set normal mode. See the management socket documentation for more information
1113 about this function.
1114
1115 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1116 server.
1117
1118.. js:function:: Server.check_enable(sv)
1119
1120 Enable health checks. See the management socket documentation for more
1121 information about this function.
1122
1123 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1124 server.
1125
1126.. js:function:: Server.check_disable(sv)
1127
1128 Disable health checks. See the management socket documentation for more
1129 information about this function.
1130
1131 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1132 server.
1133
1134.. js:function:: Server.check_force_up(sv)
1135
1136 Force health-check up. See the management socket documentation for more
1137 information about this function.
1138
1139 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1140 server.
1141
1142.. js:function:: Server.check_force_nolb(sv)
1143
1144 Force health-check nolb mode. See the management socket documentation for more
1145 information about this function.
1146
1147 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1148 server.
1149
1150.. js:function:: Server.check_force_down(sv)
1151
1152 Force health-check down. See the management socket documentation for more
1153 information about this function.
1154
1155 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1156 server.
1157
1158.. js:function:: Server.agent_enable(sv)
1159
1160 Enable agent check. See the management socket documentation for more
1161 information about this function.
1162
1163 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1164 server.
1165
1166.. js:function:: Server.agent_disable(sv)
1167
1168 Disable agent check. See the management socket documentation for more
1169 information about this function.
1170
1171 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1172 server.
1173
1174.. js:function:: Server.agent_force_up(sv)
1175
1176 Force agent check up. See the management socket documentation for more
1177 information about this function.
1178
1179 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1180 server.
1181
1182.. js:function:: Server.agent_force_down(sv)
1183
1184 Force agent check down. See the management socket documentation for more
1185 information about this function.
1186
1187 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1188 server.
1189
Thierry Fournierff480422016-02-25 08:36:46 +01001190.. _listener_class:
1191
1192Listener class
1193==============
1194
1195.. js:function:: Listener.get_stats(ls)
1196
1197 Returns server statistics.
1198
1199 :param class_listener ls: A :ref:`listener_class` which indicates the
1200 manipulated listener.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001201 :returns: a key/value table containing stats
Thierry Fournierff480422016-02-25 08:36:46 +01001202
Thierry Fournier1de16592016-01-27 09:49:07 +01001203.. _concat_class:
1204
1205Concat class
1206============
1207
1208.. js:class:: Concat
1209
1210 This class provides a fast way for string concatenation. The way using native
1211 Lua concatenation like the code below is slow for some reasons.
1212
1213.. code-block:: lua
1214
1215 str = "string1"
1216 str = str .. ", string2"
1217 str = str .. ", string3"
1218..
1219
1220 For each concatenation, Lua:
1221 * allocate memory for the result,
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001222 * catenate the two string copying the strings in the new memory block,
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001223 * free the old memory block containing the string which is no longer used.
Thierry Fournier1de16592016-01-27 09:49:07 +01001224 This process does many memory move, allocation and free. In addition, the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001225 memory is not really freed, it is just mark mark as unused and wait for the
Thierry Fournier1de16592016-01-27 09:49:07 +01001226 garbage collector.
1227
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001228 The Concat class provide an alternative way to concatenate strings. It uses
Thierry Fournier1de16592016-01-27 09:49:07 +01001229 the internal Lua mechanism (it does not allocate memory), but it doesn't copy
1230 the data more than once.
1231
1232 On my computer, the following loops spends 0.2s for the Concat method and
1233 18.5s for the pure Lua implementation. So, the Concat class is about 1000x
1234 faster than the embedded solution.
1235
1236.. code-block:: lua
1237
1238 for j = 1, 100 do
1239 c = core.concat()
1240 for i = 1, 20000 do
1241 c:add("#####")
1242 end
1243 end
1244..
1245
1246.. code-block:: lua
1247
1248 for j = 1, 100 do
1249 c = ""
1250 for i = 1, 20000 do
1251 c = c .. "#####"
1252 end
1253 end
1254..
1255
1256.. js:function:: Concat.add(concat, string)
1257
1258 This function adds a string to the current concatenated string.
1259
1260 :param class_concat concat: A :ref:`concat_class` which contains the currently
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001261 built string.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001262 :param string string: A new string to concatenate to the current built
Thierry Fournier1de16592016-01-27 09:49:07 +01001263 string.
1264
1265.. js:function:: Concat.dump(concat)
1266
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001267 This function returns the concatenated string.
Thierry Fournier1de16592016-01-27 09:49:07 +01001268
1269 :param class_concat concat: A :ref:`concat_class` which contains the currently
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001270 built string.
Thierry Fournier1de16592016-01-27 09:49:07 +01001271 :returns: the concatenated string
1272
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001273.. _fetches_class:
1274
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001275Fetches class
1276=============
1277
1278.. js:class:: Fetches
1279
1280 This class contains a lot of internal HAProxy sample fetches. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001281 HAProxy "configuration.txt" documentation for more information about her
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001282 usage. They are the chapters 7.3.2 to 7.3.6.
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001283
Christopher Faulet1e9b1b62021-08-11 10:14:30 +02001284 .. warning::
1285 some sample fetches are not available in some context. These limitations
1286 are specified in this documentation when they're useful.
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001287
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001288 :see: :js:attr:`TXN.f`
1289 :see: :js:attr:`TXN.sf`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001290
1291 Fetches are useful for:
1292
1293 * get system time,
1294 * get environment variable,
1295 * get random numbers,
1296 * known backend status like the number of users in queue or the number of
1297 connections established,
1298 * client information like ip source or destination,
1299 * deal with stick tables,
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001300 * Established SSL information,
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001301 * HTTP information like headers or method.
1302
1303.. code-block:: lua
1304
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001305 function action(txn)
1306 -- Get source IP
1307 local clientip = txn.f:src()
1308 end
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001309..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001310
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001311.. _converters_class:
1312
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001313Converters class
1314================
1315
1316.. js:class:: Converters
1317
1318 This class contains a lot of internal HAProxy sample converters. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001319 HAProxy documentation "configuration.txt" for more information about her
1320 usage. Its the chapter 7.3.1.
1321
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001322 :see: :js:attr:`TXN.c`
1323 :see: :js:attr:`TXN.sc`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001324
1325 Converters provides statefull transformation. They are useful for:
1326
1327 * converting input to base64,
1328 * applying hash on input string (djb2, crc32, sdbm, wt6),
1329 * format date,
1330 * json escape,
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001331 * extracting preferred language comparing two lists,
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001332 * turn to lower or upper chars,
1333 * deal with stick tables.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001334
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001335.. _channel_class:
1336
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001337Channel class
1338=============
1339
1340.. js:class:: Channel
1341
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001342 **context**: action, sample-fetch, convert, filter
1343
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001344 HAProxy uses two buffers for the processing of the requests. The first one is
1345 used with the request data (from the client to the server) and the second is
1346 used for the response data (from the server to the client).
1347
1348 Each buffer contains two types of data. The first type is the incoming data
1349 waiting for a processing. The second part is the outgoing data already
1350 processed. Usually, the incoming data is processed, after it is tagged as
1351 outgoing data, and finally it is sent. The following functions provides tools
1352 for manipulating these data in a buffer.
1353
1354 The following diagram shows where the channel class function are applied.
1355
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001356 .. image:: _static/channel.png
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001357
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001358 .. warning::
1359 It is not possible to read from the response in request action, and it is
1360 not possible to read for the request channel in response action.
Christopher Faulet09530392021-06-14 11:43:18 +02001361
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001362 .. warning::
1363 It is forbidden to alter the Channels buffer from HTTP contexts. So only
1364 :js:func:`Channel.input`, :js:func:`Channel.output`,
1365 :js:func:`Channel.may_recv`, :js:func:`Channel.is_full` and
1366 :js:func:`Channel.is_resp` can be called from an HTTP conetext.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001367
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001368 All the functions provided by this class are available in the
1369 **sample-fetches**, **actions** and **filters** contexts. For **filters**,
1370 incoming data (offset and length) are relative to the filter. Some functions
1371 may yield, by only for **actions**. Yield is not possible for
1372 **sample-fetches**, **converters** and **filters**.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001373
1374.. js:function:: Channel.append(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001375
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001376 This function copies the string **string** at the end of incoming data of the
1377 channel buffer. The function returns the copied length on success or -1 if
1378 data cannot be copied.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001379
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001380 Same that :js:func:`Channel.insert(channel, string, channel:input())`.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001381
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001382 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001383 :param string string: The data to copied into incoming data.
1384 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001385
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001386.. js:function:: Channel.data(channel [, offset [, length]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001387
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001388 This function returns **length** bytes of incoming data from the channel
1389 buffer, starting at the offset **offset**. The data are not removed from the
1390 buffer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001391
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001392 By default, if no length is provided, all incoming data found, starting at the
1393 given offset, are returned. If **length** is set to -1, the function tries to
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001394 retrieve a maximum of data and, if called by an action, it yields if
1395 necessary. It also waits for more data if the requested length exceeds the
1396 available amount of incoming data. Do not providing an offset is the same that
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05001397 setting it to 0. A positive offset is relative to the beginning of incoming
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001398 data of the channel buffer while negative offset is relative to their end.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001399
1400 If there is no incoming data and the channel can't receive more data, a 'nil'
1401 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001402
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001403 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001404 :param integer offset: *optional* The offset in incoming data to start to get
1405 data. 0 by default. May be negative to be relative to
1406 the end of incoming data.
1407 :param integer length: *optional* The expected length of data to retrieve. All
1408 incoming data by default. May be set to -1 to get a
1409 maximum of data.
1410 :returns: a string containing the data found or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001411
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001412.. js:function:: Channel.forward(channel, length)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001413
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001414 This function forwards **length** bytes of data from the channel buffer. If
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001415 the requested length exceeds the available amount of incoming data, and if
1416 called by an action, the function yields, waiting for more data to forward. It
1417 returns the amount of data forwarded.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001418
1419 :param class_channel channel: The manipulated Channel.
1420 :param integer int: The amount of data to forward.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001421
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001422.. js:function:: Channel.input(channel)
1423
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001424 This function returns the length of incoming data in the channel buffer. When
1425 called by a filter, this value is relative to the filter.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001426
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001427 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001428 :returns: an integer containing the amount of available bytes.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001429
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001430.. js:function:: Channel.insert(channel, string [, offset])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001431
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001432 This function copies the string **string** at the offset **offset** in
1433 incoming data of the channel buffer. The function returns the copied length on
1434 success or -1 if data cannot be copied.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001435
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001436 By default, if no offset is provided, the string is copied in front of
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05001437 incoming data. A positive offset is relative to the beginning of incoming data
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001438 of the channel buffer while negative offset is relative to their end.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001439
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001440 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001441 :param string string: The data to copied into incoming data.
1442 :param integer offset: *optional* The offset in incomding data where to copied
1443 data. 0 by default. May be negative to be relative to
1444 the end of incoming data.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001445 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001446
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001447.. js:function:: Channel.is_full(channel)
1448
1449 This function returns true if the channel buffer is full.
1450
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001451 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001452 :returns: a boolean
1453
1454.. js:function:: Channel.is_resp(channel)
1455
1456 This function returns true if the channel is the response one.
1457
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001458 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001459 :returns: a boolean
1460
1461.. js:function:: Channel.line(channel [, offset [, length]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001462
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001463 This function parses **length** bytes of incoming data of the channel buffer,
1464 starting at offset **offset**, and returns the first line found, including the
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001465 '\\n'. The data are not removed from the buffer. If no line is found, all data
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001466 are returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001467
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001468 By default, if no length is provided, all incoming data, starting at the given
1469 offset, are evaluated. If **length** is set to -1, the function tries to
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001470 retrieve a maximum of data and, if called by an action, yields if
1471 necessary. It also waits for more data if the requested length exceeds the
1472 available amount of incoming data. Do not providing an offset is the same that
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05001473 setting it to 0. A positive offset is relative to the beginning of incoming
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001474 data of the channel buffer while negative offset is relative to their end.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001475
1476 If there is no incoming data and the channel can't receive more data, a 'nil'
1477 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001478
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001479 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001480 :param integer offset: *optional* The offset in incomding data to start to
1481 parse data. 0 by default. May be negative to be
1482 relative to the end of incoming data.
1483 :param integer length: *optional* The length of data to parse. All incoming
1484 data by default. May be set to -1 to get a maximum of
1485 data.
1486 :returns: a string containing the line found or nil.
1487
1488.. js:function:: Channel.may_recv(channel)
1489
1490 This function returns true if the channel may still receive data.
1491
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001492 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001493 :returns: a boolean
1494
1495.. js:function:: Channel.output(channel)
1496
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001497 This function returns the length of outgoing data of the channel buffer. When
1498 called by a filter, this value is relative to the filter.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001499
1500 :param class_channel channel: The manipulated Channel.
1501 :returns: an integer containing the amount of available bytes.
1502
1503.. js:function:: Channel.prepend(channel, string)
1504
1505 This function copies the string **string** in front of incoming data of the
1506 channel buffer. The function returns the copied length on success or -1 if
1507 data cannot be copied.
1508
1509 Same that :js:func:`Channel.insert(channel, string, 0)`.
1510
1511 :param class_channel channel: The manipulated Channel.
1512 :param string string: The data to copied into incoming data.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001513 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001514
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001515.. js:function:: Channel.remove(channel [, offset [, length]])
1516
1517 This function removes **length** bytes of incoming data of the channel buffer,
1518 starting at offset **offset**. This function returns number of bytes removed
1519 on success.
1520
1521 By default, if no length is provided, all incoming data, starting at the given
1522 offset, are removed. Do not providing an offset is the same that setting it
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05001523 to 0. A positive offset is relative to the beginning of incoming data of the
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001524 channel buffer while negative offset is relative to their end.
1525
1526 :param class_channel channel: The manipulated Channel.
1527 :param integer offset: *optional* The offset in incomding data where to start
1528 to remove data. 0 by default. May be negative to
1529 be relative to the end of incoming data.
1530 :param integer length: *optional* The length of data to remove. All incoming
1531 data by default.
1532 :returns: an integer containing the amount of bytes removed.
1533
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001534.. js:function:: Channel.send(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001535
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001536 This function requires immediate send of the string **string**. It means the
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05001537 string is copied at the beginning of incoming data of the channel buffer and
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001538 immediately forwarded. Unless if the connection is close, and if called by an
1539 action, this function yields to copied and forward all the string.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001540
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001541 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001542 :param string string: The data to send.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001543 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001544
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001545.. js:function:: Channel.set(channel, string [, offset [, length]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001546
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001547 This function replace **length** bytes of incoming data of the channel buffer,
1548 starting at offset **offset**, by the string **string**. The function returns
1549 the copied length on success or -1 if data cannot be copied.
1550
1551 By default, if no length is provided, all incoming data, starting at the given
1552 offset, are replaced. Do not providing an offset is the same that setting it
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05001553 to 0. A positive offset is relative to the beginning of incoming data of the
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001554 channel buffer while negative offset is relative to their end.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001555
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001556 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001557 :param string string: The data to copied into incoming data.
1558 :param integer offset: *optional* The offset in incomding data where to start
1559 the data replacement. 0 by default. May be negative to
1560 be relative to the end of incoming data.
1561 :param integer length: *optional* The length of data to replace. All incoming
1562 data by default.
1563 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001564
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001565.. js:function:: Channel.dup(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001566
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001567 **DEPRECATED**
1568
1569 This function returns all incoming data found in the channel buffer. The data
1570 are not remove from the buffer and can be reprocessed later.
1571
1572 If there is no incoming data and the channel can't receive more data, a 'nil'
1573 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001574
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001575 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001576 :returns: a string containing all data found or nil.
1577
1578 .. warning::
1579 This function is deprecated. :js:func:`Channel.data()` must be used
1580 instead.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001581
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001582.. js:function:: Channel.get(channel)
1583
1584 **DEPRECATED**
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001585
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001586 This function returns all incoming data found in the channel buffer and remove
1587 them from the buffer.
1588
1589 If there is no incoming data and the channel can't receive more data, a 'nil'
1590 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001591
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001592 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001593 :returns: a string containing all the data found or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001594
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001595 .. warning::
1596 This function is deprecated. :js:func:`Channel.data()` must be used to
1597 retrieve data followed by a call to :js:func:`Channel:remove()` to remove
1598 data.
Thierry FOURNIER / OZON.IO65192f32016-11-07 15:28:40 +01001599
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001600 .. code-block:: lua
Thierry FOURNIER / OZON.IO65192f32016-11-07 15:28:40 +01001601
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001602 local data = chn:data()
1603 chn:remove(0, data:len())
1604
1605 ..
1606
1607.. js:function:: Channel.getline(channel)
1608
1609 **DEPRECATED**
1610
1611 This function returns the first line found in incoming data of the channel
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001612 buffer, including the '\\n'. The returned data are removed from the buffer. If
1613 no line is found, and if called by an action, this function yields to wait for
1614 more data, except if the channel can't receive more data. In this case all
1615 data are returned.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001616
1617 If there is no incoming data and the channel can't receive more data, a 'nil'
1618 value is returned.
1619
1620 :param class_channel channel: The manipulated Channel.
1621 :returns: a string containing the line found or nil.
1622
1623 .. warning::
1624 This function is depdrecated. :js:func:`Channel.line()` must be used to
1625 retrieve a line followed by a call to :js:func:`Channel:remove()` to remove
1626 data.
1627
1628 .. code-block:: lua
1629
1630 local line = chn:line(0, -1)
1631 chn:remove(0, line:len())
1632
1633 ..
1634
1635.. js:function:: Channel.get_in_len(channel)
1636
1637 **DEPDRECATED**
1638
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001639 This function returns the length of the input part of the buffer. When called
1640 by a filter, this value is relative to the filter.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001641
1642 :param class_channel channel: The manipulated Channel.
1643 :returns: an integer containing the amount of available bytes.
1644
1645 .. warning::
1646 This function is deprecated. :js:func:`Channel.input()` must be used
1647 instead.
1648
1649.. js:function:: Channel.get_out_len(channel)
1650
1651 **DEPDRECATED**
1652
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001653 This function returns the length of the output part of the buffer. When called
1654 by a filter, this value is relative to the filter.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001655
1656 :param class_channel channel: The manipulated Channel.
1657 :returns: an integer containing the amount of available bytes.
1658
1659 .. warning::
1660 This function is deprecated. :js:func:`Channel.output()` must be used
1661 instead.
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001662
1663.. _http_class:
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001664
1665HTTP class
1666==========
1667
1668.. js:class:: HTTP
1669
1670 This class contain all the HTTP manipulation functions.
1671
Pieter Baauw386a1272015-08-16 15:26:24 +02001672.. js:function:: HTTP.req_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001673
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001674 Returns a table containing all the request headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001675
1676 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001677 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001678 :see: :js:func:`HTTP.res_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001679
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001680 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001681
1682.. code-block:: lua
1683
1684 HTTP:req_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1685
1686 local hdr = HTTP:req_get_headers()
1687 hdr["host"][0] = "www.test.com"
1688 hdr["accept"][0] = "audio/basic q=1"
1689 hdr["accept"][1] = "audio/*, q=0.2"
1690 hdr["accept"][2] = "*/*, q=0.1"
1691..
1692
Pieter Baauw386a1272015-08-16 15:26:24 +02001693.. js:function:: HTTP.res_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001694
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001695 Returns a table containing all the response headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001696
1697 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001698 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001699 :see: :js:func:`HTTP.req_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001700
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001701 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001702
1703.. code-block:: lua
1704
1705 HTTP:res_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1706
1707 local hdr = HTTP:req_get_headers()
1708 hdr["host"][0] = "www.test.com"
1709 hdr["accept"][0] = "audio/basic q=1"
1710 hdr["accept"][1] = "audio/*, q=0.2"
1711 hdr["accept"][2] = "*.*, q=0.1"
1712..
1713
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001714.. js:function:: HTTP.req_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001715
1716 Appends an HTTP header field in the request whose name is
1717 specified in "name" and whose value is defined in "value".
1718
1719 :param class_http http: The related http object.
1720 :param string name: The header name.
1721 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001722 :see: :js:func:`HTTP.res_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001723
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001724.. js:function:: HTTP.res_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001725
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001726 Appends an HTTP header field in the response whose name is
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001727 specified in "name" and whose value is defined in "value".
1728
1729 :param class_http http: The related http object.
1730 :param string name: The header name.
1731 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001732 :see: :js:func:`HTTP.req_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001733
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001734.. js:function:: HTTP.req_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001735
1736 Removes all HTTP header fields in the request whose name is
1737 specified in "name".
1738
1739 :param class_http http: The related http object.
1740 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001741 :see: :js:func:`HTTP.res_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001742
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001743.. js:function:: HTTP.res_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001744
1745 Removes all HTTP header fields in the response whose name is
1746 specified in "name".
1747
1748 :param class_http http: The related http object.
1749 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001750 :see: :js:func:`HTTP.req_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001751
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001752.. js:function:: HTTP.req_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001753
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001754 This variable replace all occurrence of all header "name", by only
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001755 one containing the "value".
1756
1757 :param class_http http: The related http object.
1758 :param string name: The header name.
1759 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001760 :see: :js:func:`HTTP.res_set_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001761
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001762 This function does the same work as the following code:
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001763
1764.. code-block:: lua
1765
1766 function fcn(txn)
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001767 TXN.http:req_del_header("header")
1768 TXN.http:req_add_header("header", "value")
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001769 end
1770..
1771
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001772.. js:function:: HTTP.res_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001773
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001774 This variable replace all occurrence of all header "name", by only
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001775 one containing the "value".
1776
1777 :param class_http http: The related http object.
1778 :param string name: The header name.
1779 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001780 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001781
Pieter Baauw386a1272015-08-16 15:26:24 +02001782.. js:function:: HTTP.req_rep_header(http, name, regex, replace)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001783
1784 Matches the regular expression in all occurrences of header field "name"
1785 according to "regex", and replaces them with the "replace" argument. The
1786 replacement value can contain back references like \1, \2, ... This
1787 function works with the request.
1788
1789 :param class_http http: The related http object.
1790 :param string name: The header name.
1791 :param string regex: The match regular expression.
1792 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001793 :see: :js:func:`HTTP.res_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001794
Pieter Baauw386a1272015-08-16 15:26:24 +02001795.. js:function:: HTTP.res_rep_header(http, name, regex, string)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001796
1797 Matches the regular expression in all occurrences of header field "name"
1798 according to "regex", and replaces them with the "replace" argument. The
1799 replacement value can contain back references like \1, \2, ... This
1800 function works with the request.
1801
1802 :param class_http http: The related http object.
1803 :param string name: The header name.
1804 :param string regex: The match regular expression.
1805 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001806 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001807
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001808.. js:function:: HTTP.req_set_method(http, method)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001809
1810 Rewrites the request method with the parameter "method".
1811
1812 :param class_http http: The related http object.
1813 :param string method: The new method.
1814
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001815.. js:function:: HTTP.req_set_path(http, path)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001816
1817 Rewrites the request path with the "path" parameter.
1818
1819 :param class_http http: The related http object.
1820 :param string path: The new path.
1821
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001822.. js:function:: HTTP.req_set_query(http, query)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001823
1824 Rewrites the request's query string which appears after the first question
1825 mark ("?") with the parameter "query".
1826
1827 :param class_http http: The related http object.
1828 :param string query: The new query.
1829
Thierry FOURNIER0d79cf62015-08-26 14:20:58 +02001830.. js:function:: HTTP.req_set_uri(http, uri)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001831
1832 Rewrites the request URI with the parameter "uri".
1833
1834 :param class_http http: The related http object.
1835 :param string uri: The new uri.
1836
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001837.. js:function:: HTTP.res_set_status(http, status [, reason])
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001838
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001839 Rewrites the response status code with the parameter "code".
1840
1841 If no custom reason is provided, it will be generated from the status.
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001842
1843 :param class_http http: The related http object.
1844 :param integer status: The new response status code.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001845 :param string reason: The new response reason (optional).
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001846
William Lallemand00a15022021-11-19 16:02:44 +01001847.. _httpclient_class:
1848
1849HTTPClient class
1850================
1851
1852.. js:class:: HTTPClient
1853
1854 The httpclient class allows issue of outbound HTTP requests through a simple
1855 API without the knowledge of HAProxy internals.
1856
1857.. js:function:: HTTPClient.get(httpclient, request)
1858.. js:function:: HTTPClient.head(httpclient, request)
1859.. js:function:: HTTPClient.put(httpclient, request)
1860.. js:function:: HTTPClient.post(httpclient, request)
1861.. js:function:: HTTPClient.delete(httpclient, request)
1862
1863 Send an HTTP request and wait for a response. GET, HEAD PUT, POST and DELETE methods can be used.
1864 The HTTPClient will send asynchronously the data and is able to send and receive more than an HAProxy bufsize.
1865
1866
1867 :param class httpclient: Is the manipulated HTTPClient.
1868 :param table request: Is a table containing the parameters of the request that will be send.
1869 :param string request.url: Is a mandatory parameter for the request that contains the URL.
1870 :param string request.body: Is an optional parameter for the request that contains the body to send.
1871 :param table request.headers: Is an optional parameter for the request that contains the headers to send.
1872 :returns: Lua table containing the response
1873
1874
1875.. code-block:: lua
1876
1877 local httpclient = core.httpclient()
1878 local response = httpclient:post{url="http://127.0.0.1", body=body}
1879
1880..
1881
1882.. code-block:: lua
1883
1884 response = {
1885 status = 400,
1886 reason = "Bad request",
1887 headers = {
1888 ["content-type"] = { "text/html" },
1889 ["cache-control"] = { "no-cache", "no-store" },
1890 },
1891 body = "<html><body><h1>invalid request<h1></body></html>"
1892 }
1893..
1894
1895
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001896.. _txn_class:
1897
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001898TXN class
1899=========
1900
1901.. js:class:: TXN
1902
1903 The txn class contain all the functions relative to the http or tcp
1904 transaction (Note than a tcp stream is the same than a tcp transaction, but
1905 an HTTP transaction is not the same than a tcp stream).
1906
1907 The usage of this class permits to retrieve data from the requests, alter it
1908 and forward it.
1909
1910 All the functions provided by this class are available in the context
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001911 **sample-fetches**, **actions** and **filters**.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001912
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001913.. js:attribute:: TXN.c
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001914
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001915 :returns: An :ref:`converters_class`.
1916
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001917 This attribute contains a Converters class object.
1918
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001919.. js:attribute:: TXN.sc
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001920
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001921 :returns: An :ref:`converters_class`.
1922
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001923 This attribute contains a Converters class object. The functions of
1924 this object returns always a string.
1925
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001926.. js:attribute:: TXN.f
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001927
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001928 :returns: An :ref:`fetches_class`.
1929
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001930 This attribute contains a Fetches class object.
1931
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001932.. js:attribute:: TXN.sf
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001933
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001934 :returns: An :ref:`fetches_class`.
1935
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001936 This attribute contains a Fetches class object. The functions of
1937 this object returns always a string.
1938
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001939.. js:attribute:: TXN.req
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001940
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001941 :returns: An :ref:`channel_class`.
1942
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001943 This attribute contains a channel class object for the request buffer.
1944
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001945.. js:attribute:: TXN.res
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001946
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001947 :returns: An :ref:`channel_class`.
1948
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001949 This attribute contains a channel class object for the response buffer.
1950
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001951.. js:attribute:: TXN.http
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001952
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001953 :returns: An :ref:`http_class`.
1954
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001955 This attribute contains an HTTP class object. It is available only if the
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001956 proxy has the "mode http" enabled.
1957
Christopher Faulet5a2c6612021-08-15 20:35:25 +02001958.. js:attribute:: TXN.http_req
1959
1960 :returns: An :ref:`httpmessage_class`.
1961
1962 This attribute contains the request HTTPMessage class object. It is available
1963 only if the proxy has the "mode http" enabled and only in the **filters**
1964 context.
1965
1966.. js:attribute:: TXN.http_res
1967
1968 :returns: An :ref:`httpmessage_class`.
1969
1970 This attribute contains the response HTTPMessage class object. It is available
1971 only if the proxy has the "mode http" enabled and only in the **filters**
1972 context.
1973
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001974.. js:function:: TXN.log(TXN, loglevel, msg)
1975
1976 This function sends a log. The log is sent, according with the HAProxy
1977 configuration file, on the default syslog server if it is configured and on
1978 the stderr if it is allowed.
1979
1980 :param class_txn txn: The class txn object containing the data.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001981 :param integer loglevel: Is the log level associated with the message. It is a
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001982 number between 0 and 7.
1983 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001984 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
1985 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
1986 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
1987 :see: :js:func:`TXN.deflog`
1988 :see: :js:func:`TXN.Debug`
1989 :see: :js:func:`TXN.Info`
1990 :see: :js:func:`TXN.Warning`
1991 :see: :js:func:`TXN.Alert`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001992
1993.. js:function:: TXN.deflog(TXN, msg)
1994
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001995 Sends a log line with the default loglevel for the proxy associated with the
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001996 transaction.
1997
1998 :param class_txn txn: The class txn object containing the data.
1999 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002000 :see: :js:func:`TXN.log
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002001
2002.. js:function:: TXN.Debug(txn, msg)
2003
2004 :param class_txn txn: The class txn object containing the data.
2005 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002006 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002007
2008 Does the same job than:
2009
2010.. code-block:: lua
2011
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002012 function Debug(txn, msg)
2013 TXN.log(txn, core.debug, msg)
2014 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002015..
2016
2017.. js:function:: TXN.Info(txn, msg)
2018
2019 :param class_txn txn: The class txn object containing the data.
2020 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002021 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002022
2023.. code-block:: lua
2024
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002025 function Debug(txn, msg)
2026 TXN.log(txn, core.info, msg)
2027 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002028..
2029
2030.. js:function:: TXN.Warning(txn, msg)
2031
2032 :param class_txn txn: The class txn object containing the data.
2033 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002034 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002035
2036.. code-block:: lua
2037
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002038 function Debug(txn, msg)
2039 TXN.log(txn, core.warning, msg)
2040 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002041..
2042
2043.. js:function:: TXN.Alert(txn, msg)
2044
2045 :param class_txn txn: The class txn object containing the data.
2046 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002047 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002048
2049.. code-block:: lua
2050
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002051 function Debug(txn, msg)
2052 TXN.log(txn, core.alert, msg)
2053 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01002054..
2055
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002056.. js:function:: TXN.get_priv(txn)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002057
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002058 Return Lua data stored in the current transaction (with the `TXN.set_priv()`)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002059 function. If no data are stored, it returns a nil value.
2060
2061 :param class_txn txn: The class txn object containing the data.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002062 :returns: the opaque data previously stored, or nil if nothing is
2063 available.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002064
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002065.. js:function:: TXN.set_priv(txn, data)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002066
2067 Store any data in the current HAProxy transaction. This action replace the
2068 old stored data.
2069
2070 :param class_txn txn: The class txn object containing the data.
2071 :param opaque data: The data which is stored in the transaction.
2072
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002073.. js:function:: TXN.set_var(TXN, var, value[, ifexist])
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02002074
David Carlier61fdf8b2015-10-02 11:59:38 +01002075 Converts a Lua type in a HAProxy type and store it in a variable <var>.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02002076
2077 :param class_txn txn: The class txn object containing the data.
2078 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER / OZON.IOb210bcc2016-12-12 16:24:16 +01002079 :param type value: The value associated to the variable. The type can be string or
2080 integer.
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002081 :param boolean ifexist: If this parameter is set to a truthy value the variable
2082 will only be set if it was defined elsewhere (i.e. used
Willy Tarreau7978c5c2021-09-07 14:24:07 +02002083 within the configuration). For global variables (using the
2084 "proc" scope), they will only be updated and never created.
2085 It is highly recommended to always set this to true.
Christopher Faulet85d79c92016-11-09 16:54:56 +01002086
2087.. js:function:: TXN.unset_var(TXN, var)
2088
2089 Unset the variable <var>.
2090
2091 :param class_txn txn: The class txn object containing the data.
2092 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02002093
2094.. js:function:: TXN.get_var(TXN, var)
2095
2096 Returns data stored in the variable <var> converter in Lua type.
2097
2098 :param class_txn txn: The class txn object containing the data.
2099 :param string var: The variable name according with the HAProxy variable syntax.
2100
Christopher Faulet700d9e82020-01-31 12:21:52 +01002101.. js:function:: TXN.reply([reply])
2102
2103 Return a new reply object
2104
2105 :param table reply: A table containing info to initialize the reply fields.
2106 :returns: A :ref:`reply_class` object.
2107
2108 The table used to initialized the reply object may contain following entries :
2109
2110 * status : The reply status code. the code 200 is used by default.
2111 * reason : The reply reason. The reason corresponding to the status code is
2112 used by default.
2113 * headers : An list of headers, indexed by header name. Empty by default. For
2114 a given name, multiple values are possible, stored in an ordered list.
2115 * body : The reply body, empty by default.
2116
2117.. code-block:: lua
2118
2119 local reply = txn:reply{
2120 status = 400,
2121 reason = "Bad request",
2122 headers = {
2123 ["content-type"] = { "text/html" },
2124 ["cache-control"] = {"no-cache", "no-store" }
2125 },
2126 body = "<html><body><h1>invalid request<h1></body></html>"
2127 }
2128..
2129 :see: :js:class:`Reply`
2130
2131.. js:function:: TXN.done(txn[, reply])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002132
Willy Tarreaubc183a62015-08-28 10:39:11 +02002133 This function terminates processing of the transaction and the associated
Christopher Faulet700d9e82020-01-31 12:21:52 +01002134 session and optionally reply to the client for HTTP sessions.
2135
2136 :param class_txn txn: The class txn object containing the data.
2137 :param class_reply reply: The class reply object to return to the client.
2138
2139 This functions can be used when a critical error is detected or to terminate
Willy Tarreaubc183a62015-08-28 10:39:11 +02002140 processing after some data have been returned to the client (eg: a redirect).
Christopher Faulet700d9e82020-01-31 12:21:52 +01002141 To do so, a reply may be provided. This object is optional and may contain a
2142 status code, a reason, a header list and a body. All these fields are
Christopher Faulet7855b192021-11-09 18:39:51 +01002143 optional. When not provided, the default values are used. By default, with an
2144 empty reply object, an empty HTTP 200 response is returned to the client. If
2145 no reply object is provided, the transaction is terminated without any
2146 reply. If a reply object is provided, it must not exceed the buffer size once
2147 converted into the internal HTTP representing. Because for now there is no
2148 easy way to be sure it fits, it is probably better to keep it reasonably
2149 small.
Christopher Faulet700d9e82020-01-31 12:21:52 +01002150
2151 The reply object may be fully created in lua or the class Reply may be used to
2152 create it.
2153
2154.. code-block:: lua
2155
2156 local reply = txn:reply()
2157 reply:set_status(400, "Bad request")
2158 reply:add_header("content-type", "text/html")
2159 reply:add_header("cache-control", "no-cache")
2160 reply:add_header("cache-control", "no-store")
2161 reply:set_body("<html><body><h1>invalid request<h1></body></html>")
2162 txn:done(reply)
2163..
2164
2165.. code-block:: lua
2166
2167 txn:done{
2168 status = 400,
2169 reason = "Bad request",
2170 headers = {
2171 ["content-type"] = { "text/html" },
2172 ["cache-control"] = { "no-cache", "no-store" },
2173 },
2174 body = "<html><body><h1>invalid request<h1></body></html>"
2175 }
2176..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002177
Christopher Faulet1e9b1b62021-08-11 10:14:30 +02002178 .. warning::
2179 It not make sense to call this function from sample-fetches. In this case
2180 the behaviour of this one is the same than core.done(): it quit the Lua
2181 execution. The transaction is really aborted only from an action registered
2182 function.
Thierry FOURNIERab00df62016-07-14 11:42:37 +02002183
Christopher Faulet700d9e82020-01-31 12:21:52 +01002184 :see: :js:func:`TXN.reply`, :js:class:`Reply`
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002185
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002186.. js:function:: TXN.set_loglevel(txn, loglevel)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002187
2188 Is used to change the log level of the current request. The "loglevel" must
2189 be an integer between 0 and 7.
2190
2191 :param class_txn txn: The class txn object containing the data.
2192 :param integer loglevel: The required log level. This variable can be one of
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002193 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
2194 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
2195 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002196
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002197.. js:function:: TXN.set_tos(txn, tos)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002198
2199 Is used to set the TOS or DSCP field value of packets sent to the client to
2200 the value passed in "tos" on platforms which support this.
2201
2202 :param class_txn txn: The class txn object containing the data.
2203 :param integer tos: The new TOS os DSCP.
2204
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002205.. js:function:: TXN.set_mark(txn, mark)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002206
2207 Is used to set the Netfilter MARK on all packets sent to the client to the
2208 value passed in "mark" on platforms which support it.
2209
2210 :param class_txn txn: The class txn object containing the data.
2211 :param integer mark: The mark value.
2212
Patrick Hemmer268a7072018-05-11 12:52:31 -04002213.. js:function:: TXN.set_priority_class(txn, prio)
2214
2215 This function adjusts the priority class of the transaction. The value should
2216 be within the range -2047..2047. Values outside this range will be
2217 truncated.
2218
2219 See the HAProxy configuration.txt file keyword "http-request" action
2220 "set-priority-class" for details.
2221
2222.. js:function:: TXN.set_priority_offset(txn, prio)
2223
2224 This function adjusts the priority offset of the transaction. The value
2225 should be within the range -524287..524287. Values outside this range will be
2226 truncated.
2227
2228 See the HAProxy configuration.txt file keyword "http-request" action
2229 "set-priority-offset" for details.
2230
Christopher Faulet700d9e82020-01-31 12:21:52 +01002231.. _reply_class:
2232
2233Reply class
2234============
2235
2236.. js:class:: Reply
2237
2238 **context**: action
2239
2240 This class represents an HTTP response message. It provides some methods to
Christopher Faulet7855b192021-11-09 18:39:51 +01002241 enrich it. Once converted into the internal HTTP representation, the response
2242 message must not exceed the buffer size. Because for now there is no
2243 easy way to be sure it fits, it is probably better to keep it reasonably
2244 small.
2245
2246 See tune.bufsize in the configuration manual for dettails.
Christopher Faulet700d9e82020-01-31 12:21:52 +01002247
2248.. code-block:: lua
2249
2250 local reply = txn:reply({status = 400}) -- default HTTP 400 reason-phase used
2251 reply:add_header("content-type", "text/html")
2252 reply:add_header("cache-control", "no-cache")
2253 reply:add_header("cache-control", "no-store")
2254 reply:set_body("<html><body><h1>invalid request<h1></body></html>")
2255..
2256
2257 :see: :js:func:`TXN.reply`
2258
2259.. js:attribute:: Reply.status
2260
2261 The reply status code. By default, the status code is set to 200.
2262
2263 :returns: integer
2264
2265.. js:attribute:: Reply.reason
2266
2267 The reason string describing the status code.
2268
2269 :returns: string
2270
2271.. js:attribute:: Reply.headers
2272
2273 A table indexing all reply headers by name. To each name is associated an
2274 ordered list of values.
2275
2276 :returns: Lua table
2277
2278.. code-block:: lua
2279
2280 {
2281 ["content-type"] = { "text/html" },
2282 ["cache-control"] = {"no-cache", "no-store" },
2283 x_header_name = { "value1", "value2", ... }
2284 ...
2285 }
2286..
2287
2288.. js:attribute:: Reply.body
2289
2290 The reply payload.
2291
2292 :returns: string
2293
2294.. js:function:: Reply.set_status(REPLY, status[, reason])
2295
2296 Set the reply status code and optionally the reason-phrase. If the reason is
2297 not provided, the default reason corresponding to the status code is used.
2298
2299 :param class_reply reply: The related Reply object.
2300 :param integer status: The reply status code.
2301 :param string reason: The reply status reason (optional).
2302
2303.. js:function:: Reply.add_header(REPLY, name, value)
2304
2305 Add a header to the reply object. If the header does not already exist, a new
2306 entry is created with its name as index and a one-element list containing its
2307 value as value. Otherwise, the header value is appended to the ordered list of
2308 values associated to the header name.
2309
2310 :param class_reply reply: The related Reply object.
2311 :param string name: The header field name.
2312 :param string value: The header field value.
2313
2314.. js:function:: Reply.del_header(REPLY, name)
2315
2316 Remove all occurrences of a header name from the reply object.
2317
2318 :param class_reply reply: The related Reply object.
2319 :param string name: The header field name.
2320
2321.. js:function:: Reply.set_body(REPLY, body)
2322
2323 Set the reply payload.
2324
2325 :param class_reply reply: The related Reply object.
2326 :param string body: The reply payload.
2327
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002328.. _socket_class:
2329
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002330Socket class
2331============
2332
2333.. js:class:: Socket
2334
2335 This class must be compatible with the Lua Socket class. Only the 'client'
2336 functions are available. See the Lua Socket documentation:
2337
2338 `http://w3.impa.br/~diego/software/luasocket/tcp.html
2339 <http://w3.impa.br/~diego/software/luasocket/tcp.html>`_
2340
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002341.. js:function:: Socket.close(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002342
2343 Closes a TCP object. The internal socket used by the object is closed and the
2344 local address to which the object was bound is made available to other
2345 applications. No further operations (except for further calls to the close
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002346 method) are allowed on a closed Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002347
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002348 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002349
2350 Note: It is important to close all used sockets once they are not needed,
2351 since, in many systems, each socket uses a file descriptor, which are limited
2352 system resources. Garbage-collected objects are automatically closed before
2353 destruction, though.
2354
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002355.. js:function:: Socket.connect(socket, address[, port])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002356
2357 Attempts to connect a socket object to a remote host.
2358
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002359
2360 In case of error, the method returns nil followed by a string describing the
2361 error. In case of success, the method returns 1.
2362
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002363 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002364 :param string address: can be an IP address or a host name. See below for more
2365 information.
2366 :param integer port: must be an integer number in the range [1..64K].
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002367 :returns: 1 or nil.
2368
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002369 An address field extension permits to use the connect() function to connect to
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002370 other stream than TCP. The syntax containing a simpleipv4 or ipv6 address is
2371 the basically expected format. This format requires the port.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002372
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002373 Other format accepted are a socket path like "/socket/path", it permits to
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002374 connect to a socket. Abstract namespaces are supported with the prefix
Joseph Herlant02cedc42018-11-13 19:45:17 -08002375 "abns@", and finally a file descriptor can be passed with the prefix "fd@".
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002376 The prefix "ipv4@", "ipv6@" and "unix@" are also supported. The port can be
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002377 passed int the string. The syntax "127.0.0.1:1234" is valid. In this case, the
Tim Duesterhus6edab862018-01-06 19:04:45 +01002378 parameter *port* must not be set.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002379
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002380.. js:function:: Socket.connect_ssl(socket, address, port)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002381
2382 Same behavior than the function socket:connect, but uses SSL.
2383
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002384 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002385 :returns: 1 or nil.
2386
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002387.. js:function:: Socket.getpeername(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002388
2389 Returns information about the remote side of a connected client object.
2390
2391 Returns a string with the IP address of the peer, followed by the port number
2392 that peer is using for the connection. In case of error, the method returns
2393 nil.
2394
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002395 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002396 :returns: a string containing the server information.
2397
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002398.. js:function:: Socket.getsockname(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002399
2400 Returns the local address information associated to the object.
2401
2402 The method returns a string with local IP address and a number with the port.
2403 In case of error, the method returns nil.
2404
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002405 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002406 :returns: a string containing the client information.
2407
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002408.. js:function:: Socket.receive(socket, [pattern [, prefix]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002409
2410 Reads data from a client object, according to the specified read pattern.
2411 Patterns follow the Lua file I/O format, and the difference in performance
2412 between all patterns is negligible.
2413
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002414 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002415 :param string|integer pattern: Describe what is required (see below).
2416 :param string prefix: A string which will be prefix the returned data.
2417 :returns: a string containing the required data or nil.
2418
2419 Pattern can be any of the following:
2420
2421 * **`*a`**: reads from the socket until the connection is closed. No
2422 end-of-line translation is performed;
2423
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002424 * **`*l`**: reads a line of text from the Socket. The line is terminated by a
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002425 LF character (ASCII 10), optionally preceded by a CR character
2426 (ASCII 13). The CR and LF characters are not included in the
2427 returned line. In fact, all CR characters are ignored by the
2428 pattern. This is the default pattern.
2429
2430 * **number**: causes the method to read a specified number of bytes from the
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002431 Socket. Prefix is an optional string to be concatenated to the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002432 beginning of any received data before return.
2433
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002434 * **empty**: If the pattern is left empty, the default option is `*l`.
2435
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002436 If successful, the method returns the received pattern. In case of error, the
2437 method returns nil followed by an error message which can be the string
2438 'closed' in case the connection was closed before the transmission was
2439 completed or the string 'timeout' in case there was a timeout during the
2440 operation. Also, after the error message, the function returns the partial
2441 result of the transmission.
2442
2443 Important note: This function was changed severely. It used to support
2444 multiple patterns (but I have never seen this feature used) and now it
2445 doesn't anymore. Partial results used to be returned in the same way as
2446 successful results. This last feature violated the idea that all functions
2447 should return nil on error. Thus it was changed too.
2448
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002449.. js:function:: Socket.send(socket, data [, start [, end ]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002450
2451 Sends data through client object.
2452
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002453 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002454 :param string data: The data that will be sent.
2455 :param integer start: The start position in the buffer of the data which will
2456 be sent.
2457 :param integer end: The end position in the buffer of the data which will
2458 be sent.
2459 :returns: see below.
2460
2461 Data is the string to be sent. The optional arguments i and j work exactly
2462 like the standard string.sub Lua function to allow the selection of a
2463 substring to be sent.
2464
2465 If successful, the method returns the index of the last byte within [start,
2466 end] that has been sent. Notice that, if start is 1 or absent, this is
2467 effectively the total number of bytes sent. In case of error, the method
2468 returns nil, followed by an error message, followed by the index of the last
2469 byte within [start, end] that has been sent. You might want to try again from
2470 the byte following that. The error message can be 'closed' in case the
2471 connection was closed before the transmission was completed or the string
2472 'timeout' in case there was a timeout during the operation.
2473
2474 Note: Output is not buffered. For small strings, it is always better to
2475 concatenate them in Lua (with the '..' operator) and send the result in one
2476 call instead of calling the method several times.
2477
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002478.. js:function:: Socket.setoption(socket, option [, value])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002479
2480 Just implemented for compatibility, this cal does nothing.
2481
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002482.. js:function:: Socket.settimeout(socket, value [, mode])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002483
2484 Changes the timeout values for the object. All I/O operations are blocking.
2485 That is, any call to the methods send, receive, and accept will block
2486 indefinitely, until the operation completes. The settimeout method defines a
2487 limit on the amount of time the I/O methods can block. When a timeout time
2488 has elapsed, the affected methods give up and fail with an error code.
2489
2490 The amount of time to wait is specified as the value parameter, in seconds.
2491
Mark Lakes56cc1252018-03-27 09:48:06 +02002492 The timeout modes are not implemented, the only settable timeout is the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002493 inactivity time waiting for complete the internal buffer send or waiting for
2494 receive data.
2495
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002496 :param class_socket socket: Is the manipulated Socket.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002497 :param float value: The timeout value. Use floating point to specify
Mark Lakes56cc1252018-03-27 09:48:06 +02002498 milliseconds.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002499
Thierry FOURNIER31904272017-10-25 12:59:51 +02002500.. _regex_class:
2501
2502Regex class
2503===========
2504
2505.. js:class:: Regex
2506
2507 This class allows the usage of HAProxy regexes because classic lua doesn't
2508 provides regexes. This class inherits the HAProxy compilation options, so the
2509 regexes can be libc regex, pcre regex or pcre JIT regex.
2510
2511 The expression matching number is limited to 20 per regex. The only available
2512 option is case sensitive.
2513
2514 Because regexes compilation is a heavy process, it is better to define all
2515 your regexes in the **body context** and use it during the runtime.
2516
2517.. code-block:: lua
2518
2519 -- Create the regex
2520 st, regex = Regex.new("needle (..) (...)", true);
2521
2522 -- Check compilation errors
2523 if st == false then
2524 print "error: " .. regex
2525 end
2526
2527 -- Match the regexes
2528 print(regex:exec("Looking for a needle in the haystack")) -- true
2529 print(regex:exec("Lokking for a cat in the haystack")) -- false
2530
2531 -- Extract words
2532 st, list = regex:match("Looking for a needle in the haystack")
2533 print(st) -- true
2534 print(list[1]) -- needle in the
2535 print(list[2]) -- in
2536 print(list[3]) -- the
2537
2538.. js:function:: Regex.new(regex, case_sensitive)
2539
2540 Create and compile a regex.
2541
2542 :param string regex: The regular expression according with the libc or pcre
2543 standard
2544 :param boolean case_sensitive: Match is case sensitive or not.
2545 :returns: boolean status and :ref:`regex_class` or string containing fail reason.
2546
2547.. js:function:: Regex.exec(regex, str)
2548
2549 Execute the regex.
2550
2551 :param class_regex regex: A :ref:`regex_class` object.
2552 :param string str: The input string will be compared with the compiled regex.
2553 :returns: a boolean status according with the match result.
2554
2555.. js:function:: Regex.match(regex, str)
2556
2557 Execute the regex and return matched expressions.
2558
2559 :param class_map map: A :ref:`regex_class` object.
2560 :param string str: The input string will be compared with the compiled regex.
2561 :returns: a boolean status according with the match result, and
2562 a table containing all the string matched in order of declaration.
2563
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002564.. _map_class:
2565
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002566Map class
2567=========
2568
2569.. js:class:: Map
2570
2571 This class permits to do some lookup in HAProxy maps. The declared maps can
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002572 be modified during the runtime through the HAProxy management socket.
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002573
2574.. code-block:: lua
2575
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002576 default = "usa"
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002577
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002578 -- Create and load map
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002579 geo = Map.new("geo.map", Map._ip);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002580
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002581 -- Create new fetch that returns the user country
2582 core.register_fetches("country", function(txn)
2583 local src;
2584 local loc;
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002585
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002586 src = txn.f:fhdr("x-forwarded-for");
2587 if (src == nil) then
2588 src = txn.f:src()
2589 if (src == nil) then
2590 return default;
2591 end
2592 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002593
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002594 -- Perform lookup
2595 loc = geo:lookup(src);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002596
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002597 if (loc == nil) then
2598 return default;
2599 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002600
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002601 return loc;
2602 end);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002603
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002604.. js:attribute:: Map._int
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002605
2606 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002607 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002608 method.
2609
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002610 Note that :js:attr:`Map.int` is also available for compatibility.
2611
2612.. js:attribute:: Map._ip
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002613
2614 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002615 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002616 method.
2617
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002618 Note that :js:attr:`Map.ip` is also available for compatibility.
2619
2620.. js:attribute:: Map._str
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002621
2622 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002623 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002624 method.
2625
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002626 Note that :js:attr:`Map.str` is also available for compatibility.
2627
2628.. js:attribute:: Map._beg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002629
2630 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002631 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002632 method.
2633
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002634 Note that :js:attr:`Map.beg` is also available for compatibility.
2635
2636.. js:attribute:: Map._sub
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002637
2638 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002639 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002640 method.
2641
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002642 Note that :js:attr:`Map.sub` is also available for compatibility.
2643
2644.. js:attribute:: Map._dir
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002645
2646 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002647 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002648 method.
2649
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002650 Note that :js:attr:`Map.dir` is also available for compatibility.
2651
2652.. js:attribute:: Map._dom
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002653
2654 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002655 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002656 method.
2657
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002658 Note that :js:attr:`Map.dom` is also available for compatibility.
2659
2660.. js:attribute:: Map._end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002661
2662 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002663 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002664 method.
2665
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002666.. js:attribute:: Map._reg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002667
2668 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002669 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002670 method.
2671
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002672 Note that :js:attr:`Map.reg` is also available for compatibility.
2673
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002674
2675.. js:function:: Map.new(file, method)
2676
2677 Creates and load a map.
2678
2679 :param string file: Is the file containing the map.
2680 :param integer method: Is the map pattern matching method. See the attributes
2681 of the Map class.
2682 :returns: a class Map object.
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002683 :see: The Map attributes: :js:attr:`Map._int`, :js:attr:`Map._ip`,
2684 :js:attr:`Map._str`, :js:attr:`Map._beg`, :js:attr:`Map._sub`,
2685 :js:attr:`Map._dir`, :js:attr:`Map._dom`, :js:attr:`Map._end` and
2686 :js:attr:`Map._reg`.
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002687
2688.. js:function:: Map.lookup(map, str)
2689
2690 Perform a lookup in a map.
2691
2692 :param class_map map: Is the class Map object.
2693 :param string str: Is the string used as key.
2694 :returns: a string containing the result or nil if no match.
2695
2696.. js:function:: Map.slookup(map, str)
2697
2698 Perform a lookup in a map.
2699
2700 :param class_map map: Is the class Map object.
2701 :param string str: Is the string used as key.
2702 :returns: a string containing the result or empty string if no match.
2703
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002704.. _applethttp_class:
2705
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002706AppletHTTP class
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002707================
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002708
2709.. js:class:: AppletHTTP
2710
2711 This class is used with applets that requires the 'http' mode. The http applet
2712 can be registered with the *core.register_service()* function. They are used
2713 for processing an http request like a server in back of HAProxy.
2714
2715 This is an hello world sample code:
2716
2717.. code-block:: lua
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002718
Pieter Baauw4d7f7662015-11-08 16:38:08 +01002719 core.register_service("hello-world", "http", function(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002720 local response = "Hello World !"
2721 applet:set_status(200)
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002722 applet:add_header("content-length", string.len(response))
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002723 applet:add_header("content-type", "text/plain")
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002724 applet:start_response()
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002725 applet:send(response)
2726 end)
2727
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002728.. js:attribute:: AppletHTTP.c
2729
2730 :returns: A :ref:`converters_class`
2731
2732 This attribute contains a Converters class object.
2733
2734.. js:attribute:: AppletHTTP.sc
2735
2736 :returns: A :ref:`converters_class`
2737
2738 This attribute contains a Converters class object. The
2739 functions of this object returns always a string.
2740
2741.. js:attribute:: AppletHTTP.f
2742
2743 :returns: A :ref:`fetches_class`
2744
2745 This attribute contains a Fetches class object. Note that the
2746 applet execution place cannot access to a valid HAProxy core HTTP
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002747 transaction, so some sample fetches related to the HTTP dependent
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002748 values (hdr, path, ...) are not available.
2749
2750.. js:attribute:: AppletHTTP.sf
2751
2752 :returns: A :ref:`fetches_class`
2753
2754 This attribute contains a Fetches class object. The functions of
2755 this object returns always a string. Note that the applet
2756 execution place cannot access to a valid HAProxy core HTTP
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002757 transaction, so some sample fetches related to the HTTP dependent
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002758 values (hdr, path, ...) are not available.
2759
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002760.. js:attribute:: AppletHTTP.method
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002761
2762 :returns: string
2763
2764 The attribute method returns a string containing the HTTP
2765 method.
2766
2767.. js:attribute:: AppletHTTP.version
2768
2769 :returns: string
2770
2771 The attribute version, returns a string containing the HTTP
2772 request version.
2773
2774.. js:attribute:: AppletHTTP.path
2775
2776 :returns: string
2777
2778 The attribute path returns a string containing the HTTP
2779 request path.
2780
2781.. js:attribute:: AppletHTTP.qs
2782
2783 :returns: string
2784
2785 The attribute qs returns a string containing the HTTP
2786 request query string.
2787
2788.. js:attribute:: AppletHTTP.length
2789
2790 :returns: integer
2791
2792 The attribute length returns an integer containing the HTTP
2793 body length.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002794
Thierry FOURNIER841475e2015-12-11 17:10:09 +01002795.. js:attribute:: AppletHTTP.headers
2796
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002797 :returns: table
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002798
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002799 The attribute headers returns a table containing the HTTP
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002800 headers. The header names are always in lower case. As the header name can be
2801 encountered more than once in each request, the value is indexed with 0 as
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002802 first index value. The table have this form:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002803
2804.. code-block:: lua
2805
2806 AppletHTTP.headers['<header-name>'][<header-index>] = "<header-value>"
2807
2808 AppletHTTP.headers["host"][0] = "www.test.com"
2809 AppletHTTP.headers["accept"][0] = "audio/basic q=1"
2810 AppletHTTP.headers["accept"][1] = "audio/*, q=0.2"
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002811 AppletHTTP.headers["accept"][2] = "*/*, q=0.1"
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002812..
2813
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002814.. js:function:: AppletHTTP.set_status(applet, code [, reason])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002815
2816 This function sets the HTTP status code for the response. The allowed code are
2817 from 100 to 599.
2818
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002819 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002820 :param integer code: the status code returned to the client.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002821 :param string reason: the status reason returned to the client (optional).
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002822
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002823.. js:function:: AppletHTTP.add_header(applet, name, value)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002824
2825 This function add an header in the response. Duplicated headers are not
2826 collapsed. The special header *content-length* is used to determinate the
2827 response length. If it not exists, a *transfer-encoding: chunked* is set, and
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002828 all the write from the function *AppletHTTP:send()* become a chunk.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002829
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002830 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002831 :param string name: the header name
2832 :param string value: the header value
2833
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002834.. js:function:: AppletHTTP.start_response(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002835
2836 This function indicates to the HTTP engine that it can process and send the
2837 response headers. After this called we cannot add headers to the response; We
2838 cannot use the *AppletHTTP:send()* function if the
2839 *AppletHTTP:start_response()* is not called.
2840
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002841 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2842
2843.. js:function:: AppletHTTP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002844
2845 This function returns a string containing one line from the http body. If the
2846 data returned doesn't contains a final '\\n' its assumed than its the last
2847 available data before the end of stream.
2848
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002849 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002850 :returns: a string. The string can be empty if we reach the end of the stream.
2851
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002852.. js:function:: AppletHTTP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002853
2854 Reads data from the HTTP body, according to the specified read *size*. If the
2855 *size* is missing, the function tries to read all the content of the stream
2856 until the end. If the *size* is bigger than the http body, it returns the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002857 amount of data available.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002858
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002859 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002860 :param integer size: the required read size.
Ilya Shipitsin11057a32020-06-21 21:18:27 +05002861 :returns: always return a string,the string can be empty is the connection is
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002862 closed.
2863
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002864.. js:function:: AppletHTTP.send(applet, msg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002865
2866 Send the message *msg* on the http request body.
2867
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002868 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002869 :param string msg: the message to send.
2870
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002871.. js:function:: AppletHTTP.get_priv(applet)
2872
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002873 Return Lua data stored in the current transaction. If no data are stored,
2874 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002875
2876 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002877 :returns: the opaque data previously stored, or nil if nothing is
2878 available.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002879 :see: :js:func:`AppletHTTP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002880
2881.. js:function:: AppletHTTP.set_priv(applet, data)
2882
2883 Store any data in the current HAProxy transaction. This action replace the
2884 old stored data.
2885
2886 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2887 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002888 :see: :js:func:`AppletHTTP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002889
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002890.. js:function:: AppletHTTP.set_var(applet, var, value[, ifexist])
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002891
2892 Converts a Lua type in a HAProxy type and store it in a variable <var>.
2893
2894 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2895 :param string var: The variable name according with the HAProxy variable syntax.
2896 :param type value: The value associated to the variable. The type ca be string or
2897 integer.
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002898 :param boolean ifexist: If this parameter is set to a truthy value the variable
2899 will only be set if it was defined elsewhere (i.e. used
Willy Tarreau7978c5c2021-09-07 14:24:07 +02002900 within the configuration). For global variables (using the
2901 "proc" scope), they will only be updated and never created.
2902 It is highly recommended to
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002903 always set this to true.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002904 :see: :js:func:`AppletHTTP.unset_var`
2905 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002906
2907.. js:function:: AppletHTTP.unset_var(applet, var)
2908
2909 Unset the variable <var>.
2910
2911 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2912 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002913 :see: :js:func:`AppletHTTP.set_var`
2914 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002915
2916.. js:function:: AppletHTTP.get_var(applet, var)
2917
2918 Returns data stored in the variable <var> converter in Lua type.
2919
2920 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2921 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002922 :see: :js:func:`AppletHTTP.set_var`
2923 :see: :js:func:`AppletHTTP.unset_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002924
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002925.. _applettcp_class:
2926
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002927AppletTCP class
2928===============
2929
2930.. js:class:: AppletTCP
2931
2932 This class is used with applets that requires the 'tcp' mode. The tcp applet
2933 can be registered with the *core.register_service()* function. They are used
2934 for processing a tcp stream like a server in back of HAProxy.
2935
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002936.. js:attribute:: AppletTCP.c
2937
2938 :returns: A :ref:`converters_class`
2939
2940 This attribute contains a Converters class object.
2941
2942.. js:attribute:: AppletTCP.sc
2943
2944 :returns: A :ref:`converters_class`
2945
2946 This attribute contains a Converters class object. The
2947 functions of this object returns always a string.
2948
2949.. js:attribute:: AppletTCP.f
2950
2951 :returns: A :ref:`fetches_class`
2952
2953 This attribute contains a Fetches class object.
2954
2955.. js:attribute:: AppletTCP.sf
2956
2957 :returns: A :ref:`fetches_class`
2958
2959 This attribute contains a Fetches class object.
2960
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002961.. js:function:: AppletTCP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002962
2963 This function returns a string containing one line from the stream. If the
2964 data returned doesn't contains a final '\\n' its assumed than its the last
2965 available data before the end of stream.
2966
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002967 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002968 :returns: a string. The string can be empty if we reach the end of the stream.
2969
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002970.. js:function:: AppletTCP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002971
2972 Reads data from the TCP stream, according to the specified read *size*. If the
2973 *size* is missing, the function tries to read all the content of the stream
2974 until the end.
2975
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002976 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002977 :param integer size: the required read size.
Ilya Shipitsin11057a32020-06-21 21:18:27 +05002978 :returns: always return a string,the string can be empty is the connection is
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002979 closed.
2980
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002981.. js:function:: AppletTCP.send(appletmsg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002982
2983 Send the message on the stream.
2984
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002985 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002986 :param string msg: the message to send.
2987
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002988.. js:function:: AppletTCP.get_priv(applet)
2989
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002990 Return Lua data stored in the current transaction. If no data are stored,
2991 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002992
2993 :param class_AppletTCP applet: An :ref:`applettcp_class`
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002994 :returns: the opaque data previously stored, or nil if nothing is
2995 available.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002996 :see: :js:func:`AppletTCP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002997
2998.. js:function:: AppletTCP.set_priv(applet, data)
2999
3000 Store any data in the current HAProxy transaction. This action replace the
3001 old stored data.
3002
3003 :param class_AppletTCP applet: An :ref:`applettcp_class`
3004 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01003005 :see: :js:func:`AppletTCP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01003006
Tim Duesterhus4e172c92020-05-19 13:49:42 +02003007.. js:function:: AppletTCP.set_var(applet, var, value[, ifexist])
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01003008
3009 Converts a Lua type in a HAProxy type and stores it in a variable <var>.
3010
3011 :param class_AppletTCP applet: An :ref:`applettcp_class`
3012 :param string var: The variable name according with the HAProxy variable syntax.
3013 :param type value: The value associated to the variable. The type can be string or
3014 integer.
Tim Duesterhus4e172c92020-05-19 13:49:42 +02003015 :param boolean ifexist: If this parameter is set to a truthy value the variable
3016 will only be set if it was defined elsewhere (i.e. used
Willy Tarreau7978c5c2021-09-07 14:24:07 +02003017 within the configuration). For global variables (using the
3018 "proc" scope), they will only be updated and never created.
3019 It is highly recommended to
Tim Duesterhus4e172c92020-05-19 13:49:42 +02003020 always set this to true.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01003021 :see: :js:func:`AppletTCP.unset_var`
3022 :see: :js:func:`AppletTCP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01003023
3024.. js:function:: AppletTCP.unset_var(applet, var)
3025
3026 Unsets the variable <var>.
3027
3028 :param class_AppletTCP applet: An :ref:`applettcp_class`
3029 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01003030 :see: :js:func:`AppletTCP.unset_var`
3031 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01003032
3033.. js:function:: AppletTCP.get_var(applet, var)
3034
3035 Returns data stored in the variable <var> converter in Lua type.
3036
3037 :param class_AppletTCP applet: An :ref:`applettcp_class`
3038 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01003039 :see: :js:func:`AppletTCP.unset_var`
3040 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01003041
Adis Nezirovic8878f8e2018-07-13 12:18:33 +02003042StickTable class
3043================
3044
3045.. js:class:: StickTable
3046
3047 **context**: task, action, sample-fetch
3048
3049 This class can be used to access the HAProxy stick tables from Lua.
3050
3051.. js:function:: StickTable.info()
3052
3053 Returns stick table attributes as a Lua table. See HAProxy documentation for
Ilya Shipitsin2272d8a2020-12-21 01:22:40 +05003054 "stick-table" for canonical info, or check out example below.
Adis Nezirovic8878f8e2018-07-13 12:18:33 +02003055
3056 :returns: Lua table
3057
3058 Assume our table has IPv4 key and gpc0 and conn_rate "columns":
3059
3060.. code-block:: lua
3061
3062 {
3063 expire=<int>, # Value in ms
3064 size=<int>, # Maximum table size
3065 used=<int>, # Actual number of entries in table
3066 data={ # Data columns, with types as key, and periods as values
3067 (-1 if type is not rate counter)
3068 conn_rate=<int>,
3069 gpc0=-1
3070 },
3071 length=<int>, # max string length for string table keys, key length
3072 # otherwise
3073 nopurge=<boolean>, # purge oldest entries when table is full
3074 type="ip" # can be "ip", "ipv6", "integer", "string", "binary"
3075 }
3076
3077.. js:function:: StickTable.lookup(key)
3078
3079 Returns stick table entry for given <key>
3080
3081 :param string key: Stick table key (IP addresses and strings are supported)
3082 :returns: Lua table
3083
3084.. js:function:: StickTable.dump([filter])
3085
3086 Returns all entries in stick table. An optional filter can be used
3087 to extract entries with specific data values. Filter is a table with valid
3088 comparison operators as keys followed by data type name and value pairs.
3089 Check out the HAProxy docs for "show table" for more details. For the
3090 reference, the supported operators are:
3091 "eq", "ne", "le", "lt", "ge", "gt"
3092
3093 For large tables, execution of this function can take a long time (for
3094 HAProxy standards). That's also true when filter is used, so take care and
3095 measure the impact.
3096
3097 :param table filter: Stick table filter
3098 :returns: Stick table entries (table)
3099
3100 See below for example filter, which contains 4 entries (or comparisons).
3101 (Maximum number of filter entries is 4, defined in the source code)
3102
3103.. code-block:: lua
3104
3105 local filter = {
3106 {"gpc0", "gt", 30}, {"gpc1", "gt", 20}}, {"conn_rate", "le", 10}
3107 }
3108
Christopher Faulet0f3c8902020-01-31 18:57:12 +01003109.. _action_class:
3110
3111Action class
3112=============
3113
3114.. js:class:: Act
3115
3116 **context**: action
3117
3118 This class contains all return codes an action may return. It is the lua
3119 equivalent to HAProxy "ACT_RET_*" code.
3120
3121.. code-block:: lua
3122
3123 core.register_action("deny", { "http-req" }, function (txn)
3124 return act.DENY
3125 end)
3126..
3127.. js:attribute:: act.CONTINUE
3128
3129 This attribute is an integer (0). It instructs HAProxy to continue the current
3130 ruleset processing on the message. It is the default return code for a lua
3131 action.
3132
3133 :returns: integer
3134
3135.. js:attribute:: act.STOP
3136
3137 This attribute is an integer (1). It instructs HAProxy to stop the current
3138 ruleset processing on the message.
3139
3140.. js:attribute:: act.YIELD
3141
3142 This attribute is an integer (2). It instructs HAProxy to temporarily pause
3143 the message processing. It will be resumed later on the same rule. The
3144 corresponding lua script is re-executed for the start.
3145
3146.. js:attribute:: act.ERROR
3147
3148 This attribute is an integer (3). It triggers an internal errors The message
3149 processing is stopped and the transaction is terminated. For HTTP streams, an
3150 HTTP 500 error is returned to the client.
3151
3152 :returns: integer
3153
3154.. js:attribute:: act.DONE
3155
3156 This attribute is an integer (4). It instructs HAProxy to stop the message
3157 processing.
3158
3159 :returns: integer
3160
3161.. js:attribute:: act.DENY
3162
3163 This attribute is an integer (5). It denies the current message. The message
3164 processing is stopped and the transaction is terminated. For HTTP streams, an
3165 HTTP 403 error is returned to the client if the deny is returned during the
3166 request analysis. During the response analysis, an HTTP 502 error is returned
3167 and the server response is discarded.
3168
3169 :returns: integer
3170
3171.. js:attribute:: act.ABORT
3172
3173 This attribute is an integer (6). It aborts the current message. The message
3174 processing is stopped and the transaction is terminated. For HTTP streams,
Willy Tarreau714f3452021-05-09 06:47:26 +02003175 HAProxy assumes a response was already sent to the client. From the Lua
Christopher Faulet0f3c8902020-01-31 18:57:12 +01003176 actions point of view, when this code is used, the transaction is terminated
3177 with no reply.
3178
3179 :returns: integer
3180
3181.. js:attribute:: act.INVALID
3182
3183 This attribute is an integer (7). It triggers an internal errors. The message
3184 processing is stopped and the transaction is terminated. For HTTP streams, an
3185 HTTP 400 error is returned to the client if the error is returned during the
3186 request analysis. During the response analysis, an HTTP 502 error is returned
3187 and the server response is discarded.
3188
3189 :returns: integer
Adis Nezirovic8878f8e2018-07-13 12:18:33 +02003190
Christopher Faulet2c2c2e32020-01-31 19:07:52 +01003191.. js:function:: act:wake_time(milliseconds)
3192
3193 **context**: action
3194
3195 Set the script pause timeout to the specified time, defined in
3196 milliseconds.
3197
3198 :param integer milliseconds: the required milliseconds.
3199
3200 This function may be used when a lua action returns `act.YIELD`, to force its
3201 wake-up at most after the specified number of milliseconds.
3202
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003203.. _filter_class:
3204
3205Filter class
3206=============
3207
3208.. js:class:: filter
3209
3210 **context**: filter
3211
3212 This class contains return codes some filter callback functions may return. It
3213 also contains configuration flags and some helper functions. To understand how
3214 the filter API works, see `doc/internal/filters.txt` documentation.
3215
3216.. js:attribute:: filter.CONTINUE
3217
3218 This attribute is an integer (1). It may be returned by some filter callback
3219 functions to instruct this filtering step is finished for this filter.
3220
3221.. js:attribute:: filter.WAIT
3222
3223 This attribute is an integer (0). It may be returned by some filter callback
3224 functions to instruct the filtering must be paused, waiting for more data or
3225 for an external event depending on this filter.
3226
3227.. js:attribute:: filter.ERROR
3228
3229 This attribute is an integer (-1). It may be returned by some filter callback
3230 functions to trigger an error.
3231
3232.. js:attribute:: filter.FLT_CFG_FL_HTX
3233
3234 This attribute is a flag corresponding to the filter flag FLT_CFG_FL_HTX. When
3235 it is set for a filter, it means the filter is able to filter HTTP streams.
3236
3237.. js:function:: filter.register_data_filter(chn)
3238
3239 **context**: filter
3240
3241 Enable the data filtering on the channel **chn** for the current filter. It
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003242 may be called at any time from any callback functions proceeding the data
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003243 analysis.
3244
3245 :param class_Channel chn: A :ref:`channel_class`.
3246
3247.. js:function:: filter.unregister_data_filter(chn)
3248
3249 **context**: filter
3250
3251 Disable the data filtering on the channel **chn** for the current filter. It
3252 may be called at any time from any callback functions.
3253
3254 :param class_Channel chn: A :ref:`channel_class`.
3255
3256.. js:function:: filter.wake_time(milliseconds)
3257
3258 **context**: filter
3259
3260 Set the script pause timeout to the specified time, defined in
3261 milliseconds.
3262
3263 :param integer milliseconds: the required milliseconds.
3264
3265 This function may be used from any lua filter callback function to force its
3266 wake-up at most after the specified number of milliseconds. Especially, when
3267 `filter.CONTINUE` is returned.
3268
3269
3270A filters is declared using :js:func:`core.register_filter()` function. The
3271provided class will be used to instantiate filters. It may define following
3272attributes:
3273
3274* id: The filter identifier. It is a string that identifies the filter and is
3275 optional.
3276
3277* flags: The filter flags. Only :js:attr:`filter.FLT_CFG_FL_HTX` may be set for now.
3278
3279Such filter class must also define all required callback functions in the
3280following list. Note that :js:func:`Filter.new()` must be defined otherwise the
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003281filter is ignored. Others are optional.
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003282
3283* .. js:function:: FILTER.new()
3284
3285 Called to instantiate a new filter. This function must be defined.
3286
3287 :returns: a Lua object that will be used as filter instance for the current
3288 stream.
3289
3290* .. js:function:: FILTER.start_analyze(flt, txn, chn)
3291
3292 Called when the analysis starts on the channel **chn**.
3293
3294* .. js:function:: FILTER.end_analyze(flt, txn, chn)
3295
3296 Called when the analysis ends on the channel **chn**.
3297
3298* .. js:function:: FILTER.http_headers(flt, txn, http_msg)
3299
3300 Called just before the HTTP payload analysis and after any processing on the
3301 HTTP message **http_msg**. This callback functions is only called for HTTP
3302 streams.
3303
3304* .. js:function:: FILTER.http_payload(flt, txn, http_msg)
3305
3306 Called during the HTTP payload analysis on the HTTP message **http_msg**. This
3307 callback functions is only called for HTTP streams.
3308
3309* .. js:function:: FILTER.http_end(flt, txn, http_msg)
3310
3311 Called after the HTTP payload analysis on the HTTP message **http_msg**. This
3312 callback functions is only called for HTTP streams.
3313
3314* .. js:function:: FILTER.tcp_payload(flt, txn, chn)
3315
3316 Called during the TCP payload analysis on the channel **chn**.
3317
3318Here is an full example:
3319
3320.. code-block:: lua
3321
3322 Trace = {}
3323 Trace.id = "Lua trace filter"
3324 Trace.flags = filter.FLT_CFG_FL_HTX;
3325 Trace.__index = Trace
3326
3327 function Trace:new()
3328 local trace = {}
3329 setmetatable(trace, Trace)
3330 trace.req_len = 0
3331 trace.res_len = 0
3332 return trace
3333 end
3334
3335 function Trace:start_analyze(txn, chn)
3336 if chn:is_resp() then
3337 print("Start response analysis")
3338 else
3339 print("Start request analysis")
3340 end
3341 filter.register_data_filter(self, chn)
3342 end
3343
3344 function Trace:end_analyze(txn, chn)
3345 if chn:is_resp() then
3346 print("End response analysis: "..self.res_len.." bytes filtered")
3347 else
3348 print("End request analysis: "..self.req_len.." bytes filtered")
3349 end
3350 end
3351
3352 function Trace:http_headers(txn, http_msg)
3353 stline = http_msg:get_stline()
3354 if http_msg.channel:is_resp() then
3355 print("response:")
3356 print(stline.version.." "..stline.code.." "..stline.reason)
3357 else
3358 print("request:")
3359 print(stline.method.." "..stline.uri.." "..stline.version)
3360 end
3361
3362 for n, hdrs in pairs(http_msg:get_headers()) do
3363 for i,v in pairs(hdrs) do
3364 print(n..": "..v)
3365 end
3366 end
3367 return filter.CONTINUE
3368 end
3369
3370 function Trace:http_payload(txn, http_msg)
3371 body = http_msg:body(-20000)
3372 if http_msg.channel:is_resp() then
3373 self.res_len = self.res_len + body:len()
3374 else
3375 self.req_len = self.req_len + body:len()
3376 end
3377 end
3378
3379 core.register_filter("trace", Trace, function(trace, args)
3380 return trace
3381 end)
3382
3383..
3384
3385.. _httpmessage_class:
3386
3387HTTPMessage class
3388===================
3389
3390.. js:class:: HTTPMessage
3391
3392 **context**: filter
3393
3394 This class contains all functions to manipulate an HTTP message. For now, this
3395 class is only available from a filter context.
3396
3397.. js:function:: HTTPMessage.add_header(http_msg, name, value)
3398
3399 Appends an HTTP header field in the HTTP message **http_msg** whose name is
3400 specified in **name** and whose value is defined in **value**.
3401
3402 :param class_httpmessage http_msg: The manipulated HTTP message.
3403 :param string name: The header name.
3404 :param string value: The header value.
3405
3406.. js:function:: HTTPMessage.append(http_msg, string)
3407
3408 This function copies the string **string** at the end of incoming data of the
3409 HTTP message **http_msg**. The function returns the copied length on success
3410 or -1 if data cannot be copied.
3411
3412 Same that :js:func:`HTTPMessage.insert(http_msg, string, http_msg:input())`.
3413
3414 :param class_httpmessage http_msg: The manipulated HTTP message.
3415 :param string string: The data to copied into incoming data.
3416 :returns: an integer containing the amount of bytes copied or -1.
3417
3418.. js:function:: HTTPMessage.body(http_msgl[, offset[, length]])
3419
3420 This function returns **length** bytes of incoming data from the HTTP message
3421 **http_msg**, starting at the offset **offset**. The data are not removed from
3422 the buffer.
3423
3424 By default, if no length is provided, all incoming data found, starting at the
3425 given offset, are returned. If **length** is set to -1, the function tries to
3426 retrieve a maximum of data. Because it is called in the filter context, it
3427 never yield. Do not providing an offset is the same that setting it to 0. A
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003428 positive offset is relative to the beginning of incoming data of the
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003429 http_message buffer while negative offset is relative to their end.
3430
3431 If there is no incoming data and the HTTP message can't receive more data, a 'nil'
3432 value is returned.
3433
3434 :param class_httpmessage http_msg: The manipulated HTTP message.
3435 :param integer offset: *optional* The offset in incoming data to start to get
3436 data. 0 by default. May be negative to be relative to
3437 the end of incoming data.
3438 :param integer length: *optional* The expected length of data to retrieve. All
3439 incoming data by default. May be set to -1 to get a
3440 maximum of data.
3441 :returns: a string containing the data found or nil.
3442
3443.. js:function:: HTTPMessage.eom(http_msg)
3444
3445 This function returns true if the end of message is reached for the HTTP
3446 message **http_msg**.
3447
3448 :param class_httpmessage http_msg: The manipulated HTTP message.
3449 :returns: an integer containing the amount of available bytes.
3450
3451.. js:function:: HTTPMessage.del_header(http_msg, name)
3452
3453 Removes all HTTP header fields in the HTTP message **http_msg** whose name is
3454 specified in **name**.
3455
3456 :param class_httpmessage http_msg: The manipulated http message.
3457 :param string name: The header name.
3458
3459.. js:function:: HTTPMessage.get_headers(http_msg)
3460
3461 Returns a table containing all the headers of the HTTP message **http_msg**.
3462
3463 :param class_httpmessage http_msg: The manipulated http message.
3464 :returns: table of headers.
3465
3466 This is the form of the returned table:
3467
3468.. code-block:: lua
3469
3470 http_msg:get_headers()['<header-name>'][<header-index>] = "<header-value>"
3471
3472 local hdr = http_msg:get_headers()
3473 hdr["host"][0] = "www.test.com"
3474 hdr["accept"][0] = "audio/basic q=1"
3475 hdr["accept"][1] = "audio/*, q=0.2"
3476 hdr["accept"][2] = "*.*, q=0.1"
3477..
3478
3479.. js:function:: HTTPMessage.get_stline(http_msg)
3480
3481 Returns a table containing the start-line of the HTTP message **http_msg**.
3482
3483 :param class_httpmessage http_msg: The manipulated http message.
3484 :returns: the start-line.
3485
3486 This is the form of the returned table:
3487
3488.. code-block:: lua
3489
3490 -- for the request :
3491 {"method" = string, "uri" = string, "version" = string}
3492
3493 -- for the response:
3494 {"version" = string, "code" = string, "reason" = string}
3495..
3496
3497.. js:function:: HTTPMessage.forward(http_msg, length)
3498
3499 This function forwards **length** bytes of data from the HTTP message
3500 **http_msg**. Because it is called in the filter context, it never yield. Only
3501 available incoming data may be forwarded, event if the requested length
3502 exceeds the available amount of incoming data. It returns the amount of data
3503 forwarded.
3504
3505 :param class_httpmessage http_msg: The manipulated HTTP message.
3506 :param integer int: The amount of data to forward.
3507
3508.. js:function:: HTTPMessage.input(http_msg)
3509
3510 This function returns the length of incoming data in the HTTP message
3511 **http_msg** from the calling filter point of view.
3512
3513 :param class_httpmessage http_msg: The manipulated HTTP message.
3514 :returns: an integer containing the amount of available bytes.
3515
3516.. js:function:: HTTPMessage.insert(http_msg, string[, offset])
3517
3518 This function copies the string **string** at the offset **offset** in
3519 incoming data of the HTTP message **http_msg**. The function returns the
3520 copied length on success or -1 if data cannot be copied.
3521
3522 By default, if no offset is provided, the string is copied in front of
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003523 incoming data. A positive offset is relative to the beginning of incoming data
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003524 of the HTTP message while negative offset is relative to their end.
3525
3526 :param class_httpmessage http_msg: The manipulated HTTP message.
3527 :param string string: The data to copied into incoming data.
3528 :param integer offset: *optional* The offset in incomding data where to copied
3529 data. 0 by default. May be negative to be relative to
3530 the end of incoming data.
3531 :returns: an integer containing the amount of bytes copied or -1.
3532
3533.. js:function:: HTTPMessage.is_full(http_msg)
3534
3535 This function returns true if the HTTP message **http_msg** is full.
3536
3537 :param class_httpmessage http_msg: The manipulated HTTP message.
3538 :returns: a boolean
3539
3540.. js:function:: HTTPMessage.is_resp(http_msg)
3541
3542 This function returns true if the HTTP message **http_msg** is the response
3543 one.
3544
3545 :param class_httpmessage http_msg: The manipulated HTTP message.
3546 :returns: a boolean
3547
3548.. js:function:: HTTPMessage.may_recv(http_msg)
3549
3550 This function returns true if the HTTP message **http_msg** may still receive
3551 data.
3552
3553 :param class_httpmessage http_msg: The manipulated HTTP message.
3554 :returns: a boolean
3555
3556.. js:function:: HTTPMessage.output(http_msg)
3557
3558 This function returns the length of outgoing data of the HTTP message
3559 **http_msg**.
3560
3561 :param class_httpmessage http_msg: The manipulated HTTP message.
3562 :returns: an integer containing the amount of available bytes.
3563
3564.. js:function:: HTTPMessage.prepend(http_msg, string)
3565
3566 This function copies the string **string** in front of incoming data of the
3567 HTTP message **http_msg**. The function returns the copied length on success
3568 or -1 if data cannot be copied.
3569
3570 Same that :js:func:`HTTPMessage.insert(http_msg, string, 0)`.
3571
3572 :param class_httpmessage http_msg: The manipulated HTTP message.
3573 :param string string: The data to copied into incoming data.
3574 :returns: an integer containing the amount of bytes copied or -1.
3575
3576.. js:function:: HTTPMessage.remove(http_msg[, offset[, length]])
3577
3578 This function removes **length** bytes of incoming data of the HTTP message
3579 **http_msg**, starting at offset **offset**. This function returns number of
3580 bytes removed on success.
3581
3582 By default, if no length is provided, all incoming data, starting at the given
3583 offset, are removed. Do not providing an offset is the same that setting it
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003584 to 0. A positive offset is relative to the beginning of incoming data of the
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003585 HTTP message while negative offset is relative to their end.
3586
3587 :param class_httpmessage http_msg: The manipulated HTTP message.
3588 :param integer offset: *optional* The offset in incomding data where to start
3589 to remove data. 0 by default. May be negative to
3590 be relative to the end of incoming data.
3591 :param integer length: *optional* The length of data to remove. All incoming
3592 data by default.
3593 :returns: an integer containing the amount of bytes removed.
3594
3595.. js:function:: HTTPMessage.rep_header(http_msg, name, regex, replace)
3596
3597 Matches the regular expression in all occurrences of header field **name**
3598 according to regex **regex**, and replaces them with the string **replace**.
3599 The replacement value can contain back references like \1, \2, ... This
3600 function acts on whole header lines, regardless of the number of values they
3601 may contain.
3602
3603 :param class_httpmessage http_msg: The manipulated HTTP message.
3604 :param string name: The header name.
3605 :param string regex: The match regular expression.
3606 :param string replace: The replacement value.
3607
3608.. js:function:: HTTPMessage.rep_value(http_msg, name, regex, replace)
3609
3610 Matches the regular expression on every comma-delimited value of header field
3611 **name** according to regex **regex**, and replaces them with the string
3612 **replace**. The replacement value can contain back references like \1, \2,
3613 ...
3614
3615 :param class_httpmessage http_msg: The manipulated HTTP message.
3616 :param string name: The header name.
3617 :param string regex: The match regular expression.
3618 :param string replace: The replacement value.
3619
3620.. js:function:: HTTPMessage.send(http_msg, string)
3621
3622 This function required immediate send of the string **string**. It means the
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003623 string is copied at the beginning of incoming data of the HTTP message
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003624 **http_msg** and immediately forwarded. Because it is called in the filter
3625 context, it never yield.
3626
3627 :param class_httpmessage http_msg: The manipulated HTTP message.
3628 :param string string: The data to send.
3629 :returns: an integer containing the amount of bytes copied or -1.
3630
3631.. js:function:: HTTPMessage.set(http_msg, string[, offset[, length]])
3632
3633 This function replace **length** bytes of incoming data of the HTTP message
3634 **http_msg**, starting at offset **offset**, by the string **string**. The
3635 function returns the copied length on success or -1 if data cannot be copied.
3636
3637 By default, if no length is provided, all incoming data, starting at the given
3638 offset, are replaced. Do not providing an offset is the same that setting it
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003639 to 0. A positive offset is relative to the beginning of incoming data of the
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003640 HTTP message while negative offset is relative to their end.
3641
3642 :param class_httpmessage http_msg: The manipulated HTTP message.
3643 :param string string: The data to copied into incoming data.
3644 :param integer offset: *optional* The offset in incomding data where to start
3645 the data replacement. 0 by default. May be negative to
3646 be relative to the end of incoming data.
3647 :param integer length: *optional* The length of data to replace. All incoming
3648 data by default.
3649 :returns: an integer containing the amount of bytes copied or -1.
3650
3651.. js:function:: HTTPMessage.set_eom(http_msg)
3652
3653 This function set the end of message for the HTTP message **http_msg**.
3654
3655 :param class_httpmessage http_msg: The manipulated HTTP message.
3656
3657.. js:function:: HTTPMessage.set_header(http_msg, name, value)
3658
3659 This variable replace all occurrence of all header matching the name **name**,
3660 by only one containing the value **value**.
3661
3662 :param class_httpmessage http_msg: The manipulated HTTP message.
3663 :param string name: The header name.
3664 :param string value: The header value.
3665
3666 This function does the same work as the following code:
3667
3668.. code-block:: lua
3669
3670 http_msg:del_header("header")
3671 http_msg:add_header("header", "value")
3672..
3673
3674.. js:function:: HTTPMessage.set_method(http_msg, method)
3675
3676 Rewrites the request method with the string **method**. The HTTP message
3677 **http_msg** must be the request.
3678
3679 :param class_httpmessage http_msg: The manipulated HTTP message.
3680 :param string method: The new method.
3681
3682.. js:function:: HTTPMessage.set_path(http_msg, path)
3683
3684 Rewrites the request path with the string **path**. The HTTP message
3685 **http_msg** must be the request.
3686
3687 :param class_httpmessage http_msg: The manipulated HTTP message.
3688 :param string method: The new method.
3689
3690.. js:function:: HTTPMessage.set_query(http_msg, query)
3691
3692 Rewrites the request's query string which appears after the first question
3693 mark ("?") with the string **query**. The HTTP message **http_msg** must be
3694 the request.
3695
3696 :param class_httpmessage http_msg: The manipulated HTTP message.
3697 :param string query: The new query.
3698
3699.. js:function:: HTTPMessage.set_status(http_msg, status[, reason])
3700
Ilya Shipitsinff0f2782021-08-22 22:18:07 +05003701 Rewrites the response status code with the integer **code** and optional the
Christopher Faulet5a2c6612021-08-15 20:35:25 +02003702 reason **reason**. If no custom reason is provided, it will be generated from
3703 the status. The HTTP message **http_msg** must be the response.
3704
3705 :param class_httpmessage http_msg: The manipulated HTTP message.
3706 :param integer status: The new response status code.
3707 :param string reason: The new response reason (optional).
3708
3709.. js:function:: HTTPMessage.set_uri(http_msg, uri)
3710
3711 Rewrites the request URI with the string **uri**. The HTTP message
3712 **http_msg** must be the request.
3713
3714 :param class_httpmessage http_msg: The manipulated HTTP message.
3715 :param string uri: The new uri.
3716
3717.. js:function:: HTTPMessage.unset_eom(http_msg)
3718
3719 This function remove the end of message for the HTTP message **http_msg**.
3720
3721 :param class_httpmessage http_msg: The manipulated HTTP message.
3722
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01003723External Lua libraries
3724======================
3725
3726A lot of useful lua libraries can be found here:
3727
3728* `https://lua-toolbox.com/ <https://lua-toolbox.com/>`_
3729
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05003730Redis client library:
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01003731
3732* `https://github.com/nrk/redis-lua <https://github.com/nrk/redis-lua>`_
3733
3734This is an example about the usage of the Redis library with HAProxy. Note that
3735each call of any function of this library can throw an error if the socket
3736connection fails.
3737
3738.. code-block:: lua
3739
3740 -- load the redis library
3741 local redis = require("redis");
3742
3743 function do_something(txn)
3744
3745 -- create and connect new tcp socket
3746 local tcp = core.tcp();
3747 tcp:settimeout(1);
3748 tcp:connect("127.0.0.1", 6379);
3749
3750 -- use the redis library with this new socket
3751 local client = redis.connect({socket=tcp});
3752 client:ping();
3753
3754 end
3755
3756OpenSSL:
3757
3758* `http://mkottman.github.io/luacrypto/index.html
3759 <http://mkottman.github.io/luacrypto/index.html>`_
3760
3761* `https://github.com/brunoos/luasec/wiki
3762 <https://github.com/brunoos/luasec/wiki>`_