blob: 8d22b4fe060c9ae329c67ec520824bc119ac06bb [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
23functions. Lua have 6 execution context.
24
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
70HAProxy Lua Hello world
71-----------------------
72
73HAProxy configuration file (`hello_world.conf`):
74
75::
76
77 global
78 lua-load hello_world.lua
79
80 listen proxy
81 bind 127.0.0.1:10001
Thierry FOURNIERa2d02252015-10-01 15:00:42 +020082 tcp-request inspect-delay 1s
83 tcp-request content use-service lua.hello_world
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010084
85HAProxy Lua file (`hello_world.lua`):
86
87.. code-block:: lua
88
Thierry FOURNIERa2d02252015-10-01 15:00:42 +020089 core.register_service("hello_world", "tcp", function(applet)
90 applet:send("hello world\n")
91 end)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010092
93How to start HAProxy for testing this configuration:
94
95::
96
97 ./haproxy -f hello_world.conf
98
99On other terminal, you can test with telnet:
100
101::
102
103 #:~ telnet 127.0.0.1 10001
104 hello world
105
106Core class
107==========
108
109.. js:class:: core
110
111 The "core" class contains all the HAProxy core functions. These function are
112 useful for the controlling the execution flow, registering hooks, manipulating
113 global maps or ACL, ...
114
115 "core" class is basically provided with HAProxy. No `require` line is
116 required to uses these function.
117
David Carlier61fdf8b2015-10-02 11:59:38 +0100118 The "core" class is static, it is not possible to create a new object of this
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100119 type.
120
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100121.. js:attribute:: core.emerg
122
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100123 :returns: integer
124
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100125 This attribute is an integer, it contains the value of the loglevel "emergency" (0).
126
127.. js:attribute:: core.alert
128
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100129 :returns: integer
130
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100131 This attribute is an integer, it contains the value of the loglevel "alert" (1).
132
133.. js:attribute:: core.crit
134
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100135 :returns: integer
136
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100137 This attribute is an integer, it contains the value of the loglevel "critical" (2).
138
139.. js:attribute:: core.err
140
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100141 :returns: integer
142
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100143 This attribute is an integer, it contains the value of the loglevel "error" (3).
144
145.. js:attribute:: core.warning
146
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100147 :returns: integer
148
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100149 This attribute is an integer, it contains the value of the loglevel "warning" (4).
150
151.. js:attribute:: core.notice
152
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100153 :returns: integer
154
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100155 This attribute is an integer, it contains the value of the loglevel "notice" (5).
156
157.. js:attribute:: core.info
158
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100159 :returns: integer
160
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100161 This attribute is an integer, it contains the value of the loglevel "info" (6).
162
163.. js:attribute:: core.debug
164
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100165 :returns: integer
166
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100167 This attribute is an integer, it contains the value of the loglevel "debug" (7).
168
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100169.. js:attribute:: core.proxies
170
171 **context**: task, action, sample-fetch, converter
172
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400173 This attribute is a table of declared proxies (frontend and backends). Each
174 proxy give an access to his list of listeners and servers. The table is
175 indexed by proxy name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100176
Christopher Faulet1e9b1b62021-08-11 10:14:30 +0200177 .. Warning::
178 if you are declared frontend and backend with the same name, only one of
179 these are listed.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200180
181 :see: :js:attr:`core.backends`
182 :see: :js:attr:`core.frontends`
183
184.. js:attribute:: core.backends
185
186 **context**: task, action, sample-fetch, converter
187
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400188 This attribute is a table of declared proxies with backend capability. Each
189 proxy give an access to his list of listeners and servers. The table is
190 indexed by the backend name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200191
192 :see: :js:attr:`core.proxies`
193 :see: :js:attr:`core.frontends`
194
195.. js:attribute:: core.frontends
196
197 **context**: task, action, sample-fetch, converter
198
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400199 This attribute is a table of declared proxies with frontend capability. Each
200 proxy give an access to his list of listeners and servers. The table is
201 indexed by the frontend name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200202
203 :see: :js:attr:`core.proxies`
204 :see: :js:attr:`core.backends`
205
Thierry Fournierecb83c22020-11-28 15:49:44 +0100206.. js:attribute:: core.thread
207
208 **context**: task, action, sample-fetch, converter, applet
209
210 This variable contains the executing thread number starting at 1. 0 is a
211 special case for the common lua context. So, if thread is 0, Lua scope is
212 shared by all threads, otherwise the scope is dedicated to a single thread.
213 A program which needs to execute some parts exactly once regardless of the
214 number of threads can check that core.thread is 0 or 1.
215
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100216.. js:function:: core.log(loglevel, msg)
217
218 **context**: body, init, task, action, sample-fetch, converter
219
David Carlier61fdf8b2015-10-02 11:59:38 +0100220 This function sends a log. The log is sent, according with the HAProxy
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100221 configuration file, on the default syslog server if it is configured and on
222 the stderr if it is allowed.
223
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100224 :param integer loglevel: Is the log level associated with the message. It is a
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100225 number between 0 and 7.
226 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100227 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
228 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
229 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
230 :see: :js:func:`core.Debug`
231 :see: :js:func:`core.Info`
232 :see: :js:func:`core.Warning`
233 :see: :js:func:`core.Alert`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100234
235.. js:function:: core.Debug(msg)
236
237 **context**: body, init, task, action, sample-fetch, converter
238
239 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100240 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100241
242 Does the same job than:
243
244.. code-block:: lua
245
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100246 function Debug(msg)
247 core.log(core.debug, msg)
248 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100249..
250
251.. js:function:: core.Info(msg)
252
253 **context**: body, init, task, action, sample-fetch, converter
254
255 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100256 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100257
258.. code-block:: lua
259
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100260 function Info(msg)
261 core.log(core.info, msg)
262 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100263..
264
265.. js:function:: core.Warning(msg)
266
267 **context**: body, init, task, action, sample-fetch, converter
268
269 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100270 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100271
272.. code-block:: lua
273
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100274 function Warning(msg)
275 core.log(core.warning, msg)
276 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100277..
278
279.. js:function:: core.Alert(msg)
280
281 **context**: body, init, task, action, sample-fetch, converter
282
283 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100284 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100285
286.. code-block:: lua
287
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100288 function Alert(msg)
289 core.log(core.alert, msg)
290 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100291..
292
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100293.. js:function:: core.add_acl(filename, key)
294
295 **context**: init, task, action, sample-fetch, converter
296
297 Add the ACL *key* in the ACLs list referenced by the file *filename*.
298
299 :param string filename: the filename that reference the ACL entries.
300 :param string key: the key which will be added.
301
302.. js:function:: core.del_acl(filename, key)
303
304 **context**: init, task, action, sample-fetch, converter
305
306 Delete the ACL entry referenced by the key *key* in the list of ACLs
307 referenced by *filename*.
308
309 :param string filename: the filename that reference the ACL entries.
310 :param string key: the key which will be deleted.
311
312.. js:function:: core.del_map(filename, key)
313
314 **context**: init, task, action, sample-fetch, converter
315
316 Delete the map entry indexed with the specified key in the list of maps
317 referenced by his filename.
318
319 :param string filename: the filename that reference the map entries.
320 :param string key: the key which will be deleted.
321
Thierry Fourniereea77c02016-03-18 08:47:13 +0100322.. js:function:: core.get_info()
323
324 **context**: body, init, task, action, sample-fetch, converter
325
Ilya Shipitsin2075ca82020-03-06 23:22:22 +0500326 Returns HAProxy core information. We can found information like the uptime,
Thierry Fourniereea77c02016-03-18 08:47:13 +0100327 the pid, memory pool usage, tasks number, ...
328
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100329 These information are also returned by the management socket via the command
330 "show info". See the management socket documentation for more information
Thierry Fourniereea77c02016-03-18 08:47:13 +0100331 about the content of these variables.
332
333 :returns: an array of values.
334
Thierry Fournierb1f46562016-01-21 09:46:15 +0100335.. js:function:: core.now()
336
337 **context**: body, init, task, action
338
339 This function returns the current time. The time returned is fixed by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100340 HAProxy core and assures than the hour will be monotonic and that the system
Thierry Fournierb1f46562016-01-21 09:46:15 +0100341 call 'gettimeofday' will not be called too. The time is refreshed between each
342 Lua execution or resume, so two consecutive call to the function "now" will
343 probably returns the same result.
344
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400345 :returns: a table which contains two entries "sec" and "usec". "sec"
Thierry Fournierb1f46562016-01-21 09:46:15 +0100346 contains the current at the epoch format, and "usec" contains the
347 current microseconds.
348
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100349.. js:function:: core.http_date(date)
350
351 **context**: body, init, task, action
352
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100353 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100354 containing the corresponding date with a epoch format. A valid http date
355 me respect the format IMF, RFC850 or ASCTIME.
356
357 :param string date: a date http-date formatted
358 :returns: integer containing epoch date
359 :see: :js:func:`core.imf_date`.
360 :see: :js:func:`core.rfc850_date`.
361 :see: :js:func:`core.asctime_date`.
362 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
363
364.. js:function:: core.imf_date(date)
365
366 **context**: body, init, task, action
367
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100368 This function take a string representing IMF date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100369 containing the corresponding date with a epoch format.
370
371 :param string date: a date IMF formatted
372 :returns: integer containing epoch date
373 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
374
375 The IMF format is like this:
376
377.. code-block:: text
378
379 Sun, 06 Nov 1994 08:49:37 GMT
380..
381
382.. js:function:: core.rfc850_date(date)
383
384 **context**: body, init, task, action
385
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100386 This function take a string representing RFC850 date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100387 containing the corresponding date with a epoch format.
388
389 :param string date: a date RFC859 formatted
390 :returns: integer containing epoch date
391 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
392
393 The RFC850 format is like this:
394
395.. code-block:: text
396
397 Sunday, 06-Nov-94 08:49:37 GMT
398..
399
400.. js:function:: core.asctime_date(date)
401
402 **context**: body, init, task, action
403
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100404 This function take a string representing ASCTIME date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100405 containing the corresponding date with a epoch format.
406
407 :param string date: a date ASCTIME formatted
408 :returns: integer containing epoch date
409 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
410
411 The ASCTIME format is like this:
412
413.. code-block:: text
414
415 Sun Nov 6 08:49:37 1994
416..
417
418.. js:function:: core.rfc850_date(date)
419
420 **context**: body, init, task, action
421
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100422 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100423 containing the corresponding date with a epoch format.
424
425 :param string date: a date http-date formatted
426
427.. js:function:: core.asctime_date(date)
428
429 **context**: body, init, task, action
430
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100431 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100432 containing the corresponding date with a epoch format.
433
434 :param string date: a date http-date formatted
435
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100436.. js:function:: core.msleep(milliseconds)
437
438 **context**: body, init, task, action
439
440 The `core.msleep()` stops the Lua execution between specified milliseconds.
441
442 :param integer milliseconds: the required milliseconds.
443
Thierry Fournierf61aa632016-02-19 20:56:00 +0100444.. js:attribute:: core.proxies
445
446 **context**: body, init, task, action, sample-fetch, converter
447
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100448 Proxies is a table containing the list of all proxies declared in the
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400449 configuration file. The table is indexed by the proxy name, and each entry
450 of the proxies table is an object of type :ref:`proxy_class`.
451
Christopher Faulet1e9b1b62021-08-11 10:14:30 +0200452 .. warning::
453 if you have declared a frontend and backend with the same name, only one of
454 these are listed.
Thierry Fournierf61aa632016-02-19 20:56:00 +0100455
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100456.. js:function:: core.register_action(name, actions, func [, nb_args])
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200457
458 **context**: body
459
David Carlier61fdf8b2015-10-02 11:59:38 +0100460 Register a Lua function executed as action. All the registered action can be
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200461 used in HAProxy with the prefix "lua.". An action gets a TXN object class as
462 input.
463
464 :param string name: is the name of the converter.
Willy Tarreau61add3c2015-09-28 15:39:10 +0200465 :param table actions: is a table of string describing the HAProxy actions who
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200466 want to register to. The expected actions are 'tcp-req',
467 'tcp-res', 'http-req' or 'http-res'.
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100468 :param integer nb_args: is the expected number of argument for the action.
469 By default the value is 0.
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200470 :param function func: is the Lua function called to work as converter.
471
472 The prototype of the Lua function used as argument is:
473
474.. code-block:: lua
475
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100476 function(txn [, arg1 [, arg2]])
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200477..
478
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100479 * **txn** (:ref:`txn_class`): this is a TXN object used for manipulating the
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200480 current request or TCP stream.
481
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100482 * **argX**: this is argument provided through the HAProxy configuration file.
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100483
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100484 Here, an example of action registration. The action just send an 'Hello world'
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200485 in the logs.
486
487.. code-block:: lua
488
489 core.register_action("hello-world", { "tcp-req", "http-req" }, function(txn)
490 txn:Info("Hello world")
491 end)
492..
493
Willy Tarreau714f3452021-05-09 06:47:26 +0200494 This example code is used in HAProxy configuration like this:
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200495
496::
497
498 frontend tcp_frt
499 mode tcp
500 tcp-request content lua.hello-world
501
502 frontend http_frt
503 mode http
504 http-request lua.hello-world
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100505..
506
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100507 A second example using arguments
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100508
509.. code-block:: lua
510
511 function hello_world(txn, arg)
512 txn:Info("Hello world for " .. arg)
513 end
514 core.register_action("hello-world", { "tcp-req", "http-req" }, hello_world, 2)
515..
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200516
Willy Tarreau714f3452021-05-09 06:47:26 +0200517 This example code is used in HAProxy configuration like this:
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100518
519::
520
521 frontend tcp_frt
522 mode tcp
523 tcp-request content lua.hello-world everybody
524..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100525.. js:function:: core.register_converters(name, func)
526
527 **context**: body
528
David Carlier61fdf8b2015-10-02 11:59:38 +0100529 Register a Lua function executed as converter. All the registered converters
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100530 can be used in HAProxy with the prefix "lua.". An converter get a string as
531 input and return a string as output. The registered function can take up to 9
532 values as parameter. All the value are strings.
533
534 :param string name: is the name of the converter.
535 :param function func: is the Lua function called to work as converter.
536
537 The prototype of the Lua function used as argument is:
538
539.. code-block:: lua
540
541 function(str, [p1 [, p2 [, ... [, p5]]]])
542..
543
544 * **str** (*string*): this is the input value automatically converted in
545 string.
546 * **p1** .. **p5** (*string*): this is a list of string arguments declared in
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100547 the HAProxy configuration file. The number of arguments doesn't exceed 5.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100548 The order and the nature of these is conventionally choose by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100549 developer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100550
551.. js:function:: core.register_fetches(name, func)
552
553 **context**: body
554
David Carlier61fdf8b2015-10-02 11:59:38 +0100555 Register a Lua function executed as sample fetch. All the registered sample
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100556 fetch can be used in HAProxy with the prefix "lua.". A Lua sample fetch
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100557 return a string as output. The registered function can take up to 9 values as
558 parameter. All the value are strings.
559
560 :param string name: is the name of the converter.
561 :param function func: is the Lua function called to work as sample fetch.
562
563 The prototype of the Lua function used as argument is:
564
565.. code-block:: lua
566
567 string function(txn, [p1 [, p2 [, ... [, p5]]]])
568..
569
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100570 * **txn** (:ref:`txn_class`): this is the txn object associated with the current
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100571 request.
572 * **p1** .. **p5** (*string*): this is a list of string arguments declared in
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100573 the HAProxy configuration file. The number of arguments doesn't exceed 5.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100574 The order and the nature of these is conventionally choose by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100575 developer.
576 * **Returns**: A string containing some data, or nil if the value cannot be
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100577 returned now.
578
579 lua example code:
580
581.. code-block:: lua
582
583 core.register_fetches("hello", function(txn)
584 return "hello"
585 end)
586..
587
588 HAProxy example configuration:
589
590::
591
592 frontend example
593 http-request redirect location /%[lua.hello]
594
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200595.. js:function:: core.register_service(name, mode, func)
596
597 **context**: body
598
David Carlier61fdf8b2015-10-02 11:59:38 +0100599 Register a Lua function executed as a service. All the registered service can
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200600 be used in HAProxy with the prefix "lua.". A service gets an object class as
601 input according with the required mode.
602
603 :param string name: is the name of the converter.
Willy Tarreau61add3c2015-09-28 15:39:10 +0200604 :param string mode: is string describing the required mode. Only 'tcp' or
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200605 'http' are allowed.
606 :param function func: is the Lua function called to work as converter.
607
608 The prototype of the Lua function used as argument is:
609
610.. code-block:: lua
611
612 function(applet)
613..
614
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100615 * **applet** *applet* will be a :ref:`applettcp_class` or a
616 :ref:`applethttp_class`. It depends the type of registered applet. An applet
617 registered with the 'http' value for the *mode* parameter will gets a
618 :ref:`applethttp_class`. If the *mode* value is 'tcp', the applet will gets
619 a :ref:`applettcp_class`.
620
Christopher Faulet1e9b1b62021-08-11 10:14:30 +0200621 .. warning::
622 Applets of type 'http' cannot be called from 'tcp-*' rulesets. Only the
623 'http-*' rulesets are authorized, this means that is not possible to call
624 an HTTP applet from a proxy in tcp mode. Applets of type 'tcp' can be
625 called from anywhere.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200626
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100627 Here, an example of service registration. The service just send an 'Hello world'
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200628 as an http response.
629
630.. code-block:: lua
631
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100632 core.register_service("hello-world", "http", function(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200633 local response = "Hello World !"
634 applet:set_status(200)
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +0200635 applet:add_header("content-length", string.len(response))
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200636 applet:add_header("content-type", "text/plain")
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +0200637 applet:start_response()
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200638 applet:send(response)
639 end)
640..
641
Willy Tarreau714f3452021-05-09 06:47:26 +0200642 This example code is used in HAProxy configuration like this:
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200643
644::
645
646 frontend example
647 http-request use-service lua.hello-world
648
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100649.. js:function:: core.register_init(func)
650
651 **context**: body
652
653 Register a function executed after the configuration parsing. This is useful
654 to check any parameters.
655
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100656 :param function func: is the Lua function called to work as initializer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100657
658 The prototype of the Lua function used as argument is:
659
660.. code-block:: lua
661
662 function()
663..
664
665 It takes no input, and no output is expected.
666
667.. js:function:: core.register_task(func)
668
669 **context**: body, init, task, action, sample-fetch, converter
670
671 Register and start independent task. The task is started when the HAProxy
672 main scheduler starts. For example this type of tasks can be executed to
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +0100673 perform complex health checks.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100674
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100675 :param function func: is the Lua function called to work as initializer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100676
677 The prototype of the Lua function used as argument is:
678
679.. code-block:: lua
680
681 function()
682..
683
684 It takes no input, and no output is expected.
685
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100686.. js:function:: core.register_cli([path], usage, func)
687
688 **context**: body
689
690 Register and start independent task. The task is started when the HAProxy
691 main scheduler starts. For example this type of tasks can be executed to
692 perform complex health checks.
693
694 :param array path: is the sequence of word for which the cli execute the Lua
695 binding.
696 :param string usage: is the usage message displayed in the help.
697 :param function func: is the Lua function called to handle the CLI commands.
698
699 The prototype of the Lua function used as argument is:
700
701.. code-block:: lua
702
703 function(AppletTCP, [arg1, [arg2, [...]]])
704..
705
706 I/O are managed with the :ref:`applettcp_class` object. Args are given as
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100707 parameter. The args embed the registered path. If the path is declared like
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100708 this:
709
710.. code-block:: lua
711
712 core.register_cli({"show", "ssl", "stats"}, "Display SSL stats..", function(applet, arg1, arg2, arg3, arg4, arg5)
713 end)
714..
715
716 And we execute this in the prompt:
717
718.. code-block:: text
719
720 > prompt
721 > show ssl stats all
722..
723
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100724 Then, arg1, arg2 and arg3 will contains respectively "show", "ssl" and "stats".
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100725 arg4 will contain "all". arg5 contains nil.
726
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100727.. js:function:: core.set_nice(nice)
728
729 **context**: task, action, sample-fetch, converter
730
731 Change the nice of the current task or current session.
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +0100732
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100733 :param integer nice: the nice value, it must be between -1024 and 1024.
734
735.. js:function:: core.set_map(filename, key, value)
736
737 **context**: init, task, action, sample-fetch, converter
738
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100739 Set the value *value* associated to the key *key* in the map referenced by
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100740 *filename*.
741
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100742 :param string filename: the Map reference
743 :param string key: the key to set or replace
744 :param string value: the associated value
745
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100746.. js:function:: core.sleep(int seconds)
747
748 **context**: body, init, task, action
749
750 The `core.sleep()` functions stop the Lua execution between specified seconds.
751
752 :param integer seconds: the required seconds.
753
754.. js:function:: core.tcp()
755
756 **context**: init, task, action
757
758 This function returns a new object of a *socket* class.
759
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100760 :returns: A :ref:`socket_class` object.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100761
Thierry Fournier1de16592016-01-27 09:49:07 +0100762.. js:function:: core.concat()
763
764 **context**: body, init, task, action, sample-fetch, converter
765
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100766 This function returns a new concat object.
Thierry Fournier1de16592016-01-27 09:49:07 +0100767
768 :returns: A :ref:`concat_class` object.
769
Thierry FOURNIER0a99b892015-08-26 00:14:17 +0200770.. js:function:: core.done(data)
771
772 **context**: body, init, task, action, sample-fetch, converter
773
774 :param any data: Return some data for the caller. It is useful with
775 sample-fetches and sample-converters.
776
777 Immediately stops the current Lua execution and returns to the caller which
778 may be a sample fetch, a converter or an action and returns the specified
Thierry Fournier4234dbd2020-11-28 13:18:23 +0100779 value (ignored for actions and init). It is used when the LUA process finishes
780 its work and wants to give back the control to HAProxy without executing the
Thierry FOURNIER0a99b892015-08-26 00:14:17 +0200781 remaining code. It can be seen as a multi-level "return".
782
Thierry FOURNIER486f5a02015-03-16 15:13:03 +0100783.. js:function:: core.yield()
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100784
785 **context**: task, action, sample-fetch, converter
786
787 Give back the hand at the HAProxy scheduler. It is used when the LUA
788 processing consumes a lot of processing time.
789
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100790.. js:function:: core.parse_addr(address)
791
792 **context**: body, init, task, action, sample-fetch, converter
793
794 :param network: is a string describing an ipv4 or ipv6 address and optionally
795 its network length, like this: "127.0.0.1/8" or "aaaa::1234/32".
796 :returns: a userdata containing network or nil if an error occurs.
797
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100798 Parse ipv4 or ipv6 addresses and its facultative associated network.
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100799
800.. js:function:: core.match_addr(addr1, addr2)
801
802 **context**: body, init, task, action, sample-fetch, converter
803
804 :param addr1: is an address created with "core.parse_addr".
805 :param addr2: is an address created with "core.parse_addr".
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100806 :returns: boolean, true if the network of the addresses match, else returns
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100807 false.
808
Ilya Shipitsin2075ca82020-03-06 23:22:22 +0500809 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 +0100810 of network is not important.
811
Thierry FOURNIER / OZON.IO8a1027a2016-11-24 20:48:38 +0100812.. js:function:: core.tokenize(str, separators [, noblank])
813
814 **context**: body, init, task, action, sample-fetch, converter
815
816 This function is useful for tokenizing an entry, or splitting some messages.
817 :param string str: The string which will be split.
818 :param string separators: A string containing a list of separators.
819 :param boolean noblank: Ignore empty entries.
820 :returns: an array of string.
821
822 For example:
823
824.. code-block:: lua
825
826 local array = core.tokenize("This function is useful, for tokenizing an entry.", "., ", true)
827 print_r(array)
828..
829
830 Returns this array:
831
832.. code-block:: text
833
834 (table) table: 0x21c01e0 [
835 1: (string) "This"
836 2: (string) "function"
837 3: (string) "is"
838 4: (string) "useful"
839 5: (string) "for"
840 6: (string) "tokenizing"
841 7: (string) "an"
842 8: (string) "entry"
843 ]
844..
845
Thierry Fournierf61aa632016-02-19 20:56:00 +0100846.. _proxy_class:
847
848Proxy class
849============
850
851.. js:class:: Proxy
852
853 This class provides a way for manipulating proxy and retrieving information
854 like statistics.
855
Thierry FOURNIER817e7592017-07-24 14:35:04 +0200856.. js:attribute:: Proxy.name
857
858 Contain the name of the proxy.
859
Baptiste Assmann46c72552017-10-26 21:51:58 +0200860.. js:attribute:: Proxy.uuid
861
862 Contain the unique identifier of the proxy.
863
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100864.. js:attribute:: Proxy.servers
865
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400866 Contain a table with the attached servers. The table is indexed by server
867 name, and each server entry is an object of type :ref:`server_class`.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100868
Adis Nezirovic8878f8e2018-07-13 12:18:33 +0200869.. js:attribute:: Proxy.stktable
870
871 Contains a stick table object attached to the proxy.
872
Thierry Fournierff480422016-02-25 08:36:46 +0100873.. js:attribute:: Proxy.listeners
874
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400875 Contain a table with the attached listeners. The table is indexed by listener
876 name, and each each listeners entry is an object of type
877 :ref:`listener_class`.
Thierry Fournierff480422016-02-25 08:36:46 +0100878
Thierry Fournierf61aa632016-02-19 20:56:00 +0100879.. js:function:: Proxy.pause(px)
880
881 Pause the proxy. See the management socket documentation for more information.
882
883 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
884 proxy.
885
886.. js:function:: Proxy.resume(px)
887
888 Resume the proxy. See the management socket documentation for more
889 information.
890
891 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
892 proxy.
893
894.. js:function:: Proxy.stop(px)
895
896 Stop the proxy. See the management socket documentation for more information.
897
898 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
899 proxy.
900
901.. js:function:: Proxy.shut_bcksess(px)
902
903 Kill the session attached to a backup server. See the management socket
904 documentation for more information.
905
906 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
907 proxy.
908
909.. js:function:: Proxy.get_cap(px)
910
911 Returns a string describing the capabilities of the proxy.
912
913 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
914 proxy.
915 :returns: a string "frontend", "backend", "proxy" or "ruleset".
916
917.. js:function:: Proxy.get_mode(px)
918
919 Returns a string describing the mode of the current proxy.
920
921 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
922 proxy.
923 :returns: a string "tcp", "http", "health" or "unknown"
924
925.. js:function:: Proxy.get_stats(px)
926
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100927 Returns a table containing the proxy statistics. The statistics returned are
Thierry Fournierf61aa632016-02-19 20:56:00 +0100928 not the same if the proxy is frontend or a backend.
929
930 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
931 proxy.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400932 :returns: a key/value table containing stats
Thierry Fournierf61aa632016-02-19 20:56:00 +0100933
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100934.. _server_class:
935
936Server class
937============
938
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400939.. js:class:: Server
940
941 This class provides a way for manipulating servers and retrieving information.
942
Patrick Hemmera62ae7e2018-04-29 14:23:48 -0400943.. js:attribute:: Server.name
944
945 Contain the name of the server.
946
947.. js:attribute:: Server.puid
948
949 Contain the proxy unique identifier of the server.
950
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100951.. js:function:: Server.is_draining(sv)
952
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400953 Return true if the server is currently draining sticky connections.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100954
955 :param class_server sv: A :ref:`server_class` which indicates the manipulated
956 server.
957 :returns: a boolean
958
Patrick Hemmer32d539f2018-04-29 14:25:46 -0400959.. js:function:: Server.set_maxconn(sv, weight)
960
961 Dynamically change the maximum connections of the server. See the management
962 socket documentation for more information about the format of the string.
963
964 :param class_server sv: A :ref:`server_class` which indicates the manipulated
965 server.
966 :param string maxconn: A string describing the server maximum connections.
967
968.. js:function:: Server.get_maxconn(sv, weight)
969
970 This function returns an integer representing the server maximum connections.
971
972 :param class_server sv: A :ref:`server_class` which indicates the manipulated
973 server.
974 :returns: an integer.
975
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100976.. js:function:: Server.set_weight(sv, weight)
977
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400978 Dynamically change the weight of the server. See the management socket
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100979 documentation for more information about the format of the string.
980
981 :param class_server sv: A :ref:`server_class` which indicates the manipulated
982 server.
983 :param string weight: A string describing the server weight.
984
985.. js:function:: Server.get_weight(sv)
986
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400987 This function returns an integer representing the server weight.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100988
989 :param class_server sv: A :ref:`server_class` which indicates the manipulated
990 server.
991 :returns: an integer.
992
Joseph C. Sible49bbf522020-05-04 22:20:32 -0400993.. js:function:: Server.set_addr(sv, addr[, port])
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100994
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400995 Dynamically change the address of the server. See the management socket
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100996 documentation for more information about the format of the string.
997
998 :param class_server sv: A :ref:`server_class` which indicates the manipulated
999 server.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001000 :param string addr: A string describing the server address.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001001
1002.. js:function:: Server.get_addr(sv)
1003
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001004 Returns a string describing the address of the server.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001005
1006 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1007 server.
1008 :returns: A string
1009
1010.. js:function:: Server.get_stats(sv)
1011
1012 Returns server statistics.
1013
1014 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1015 server.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001016 :returns: a key/value table containing stats
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +01001017
1018.. js:function:: Server.shut_sess(sv)
1019
1020 Shutdown all the sessions attached to the server. See the management socket
1021 documentation for more information about this function.
1022
1023 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1024 server.
1025
1026.. js:function:: Server.set_drain(sv)
1027
1028 Drain sticky sessions. See the management socket documentation for more
1029 information about this function.
1030
1031 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1032 server.
1033
1034.. js:function:: Server.set_maint(sv)
1035
1036 Set maintenance mode. See the management socket documentation for more
1037 information about this function.
1038
1039 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1040 server.
1041
1042.. js:function:: Server.set_ready(sv)
1043
1044 Set normal mode. See the management socket documentation for more information
1045 about this function.
1046
1047 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1048 server.
1049
1050.. js:function:: Server.check_enable(sv)
1051
1052 Enable health checks. See the management socket documentation for more
1053 information about this function.
1054
1055 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1056 server.
1057
1058.. js:function:: Server.check_disable(sv)
1059
1060 Disable health checks. See the management socket documentation for more
1061 information about this function.
1062
1063 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1064 server.
1065
1066.. js:function:: Server.check_force_up(sv)
1067
1068 Force health-check up. See the management socket documentation for more
1069 information about this function.
1070
1071 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1072 server.
1073
1074.. js:function:: Server.check_force_nolb(sv)
1075
1076 Force health-check nolb mode. See the management socket documentation for more
1077 information about this function.
1078
1079 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1080 server.
1081
1082.. js:function:: Server.check_force_down(sv)
1083
1084 Force health-check down. See the management socket documentation for more
1085 information about this function.
1086
1087 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1088 server.
1089
1090.. js:function:: Server.agent_enable(sv)
1091
1092 Enable agent check. See the management socket documentation for more
1093 information about this function.
1094
1095 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1096 server.
1097
1098.. js:function:: Server.agent_disable(sv)
1099
1100 Disable agent check. See the management socket documentation for more
1101 information about this function.
1102
1103 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1104 server.
1105
1106.. js:function:: Server.agent_force_up(sv)
1107
1108 Force agent check up. See the management socket documentation for more
1109 information about this function.
1110
1111 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1112 server.
1113
1114.. js:function:: Server.agent_force_down(sv)
1115
1116 Force agent check down. See the management socket documentation for more
1117 information about this function.
1118
1119 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1120 server.
1121
Thierry Fournierff480422016-02-25 08:36:46 +01001122.. _listener_class:
1123
1124Listener class
1125==============
1126
1127.. js:function:: Listener.get_stats(ls)
1128
1129 Returns server statistics.
1130
1131 :param class_listener ls: A :ref:`listener_class` which indicates the
1132 manipulated listener.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001133 :returns: a key/value table containing stats
Thierry Fournierff480422016-02-25 08:36:46 +01001134
Thierry Fournier1de16592016-01-27 09:49:07 +01001135.. _concat_class:
1136
1137Concat class
1138============
1139
1140.. js:class:: Concat
1141
1142 This class provides a fast way for string concatenation. The way using native
1143 Lua concatenation like the code below is slow for some reasons.
1144
1145.. code-block:: lua
1146
1147 str = "string1"
1148 str = str .. ", string2"
1149 str = str .. ", string3"
1150..
1151
1152 For each concatenation, Lua:
1153 * allocate memory for the result,
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001154 * catenate the two string copying the strings in the new memory block,
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001155 * free the old memory block containing the string which is no longer used.
Thierry Fournier1de16592016-01-27 09:49:07 +01001156 This process does many memory move, allocation and free. In addition, the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001157 memory is not really freed, it is just mark mark as unused and wait for the
Thierry Fournier1de16592016-01-27 09:49:07 +01001158 garbage collector.
1159
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001160 The Concat class provide an alternative way to concatenate strings. It uses
Thierry Fournier1de16592016-01-27 09:49:07 +01001161 the internal Lua mechanism (it does not allocate memory), but it doesn't copy
1162 the data more than once.
1163
1164 On my computer, the following loops spends 0.2s for the Concat method and
1165 18.5s for the pure Lua implementation. So, the Concat class is about 1000x
1166 faster than the embedded solution.
1167
1168.. code-block:: lua
1169
1170 for j = 1, 100 do
1171 c = core.concat()
1172 for i = 1, 20000 do
1173 c:add("#####")
1174 end
1175 end
1176..
1177
1178.. code-block:: lua
1179
1180 for j = 1, 100 do
1181 c = ""
1182 for i = 1, 20000 do
1183 c = c .. "#####"
1184 end
1185 end
1186..
1187
1188.. js:function:: Concat.add(concat, string)
1189
1190 This function adds a string to the current concatenated string.
1191
1192 :param class_concat concat: A :ref:`concat_class` which contains the currently
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001193 built string.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001194 :param string string: A new string to concatenate to the current built
Thierry Fournier1de16592016-01-27 09:49:07 +01001195 string.
1196
1197.. js:function:: Concat.dump(concat)
1198
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001199 This function returns the concatenated string.
Thierry Fournier1de16592016-01-27 09:49:07 +01001200
1201 :param class_concat concat: A :ref:`concat_class` which contains the currently
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001202 built string.
Thierry Fournier1de16592016-01-27 09:49:07 +01001203 :returns: the concatenated string
1204
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001205.. _fetches_class:
1206
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001207Fetches class
1208=============
1209
1210.. js:class:: Fetches
1211
1212 This class contains a lot of internal HAProxy sample fetches. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001213 HAProxy "configuration.txt" documentation for more information about her
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001214 usage. They are the chapters 7.3.2 to 7.3.6.
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001215
Christopher Faulet1e9b1b62021-08-11 10:14:30 +02001216 .. warning::
1217 some sample fetches are not available in some context. These limitations
1218 are specified in this documentation when they're useful.
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001219
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001220 :see: :js:attr:`TXN.f`
1221 :see: :js:attr:`TXN.sf`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001222
1223 Fetches are useful for:
1224
1225 * get system time,
1226 * get environment variable,
1227 * get random numbers,
1228 * known backend status like the number of users in queue or the number of
1229 connections established,
1230 * client information like ip source or destination,
1231 * deal with stick tables,
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05001232 * Established SSL information,
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001233 * HTTP information like headers or method.
1234
1235.. code-block:: lua
1236
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001237 function action(txn)
1238 -- Get source IP
1239 local clientip = txn.f:src()
1240 end
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001241..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001242
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001243.. _converters_class:
1244
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001245Converters class
1246================
1247
1248.. js:class:: Converters
1249
1250 This class contains a lot of internal HAProxy sample converters. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001251 HAProxy documentation "configuration.txt" for more information about her
1252 usage. Its the chapter 7.3.1.
1253
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001254 :see: :js:attr:`TXN.c`
1255 :see: :js:attr:`TXN.sc`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001256
1257 Converters provides statefull transformation. They are useful for:
1258
1259 * converting input to base64,
1260 * applying hash on input string (djb2, crc32, sdbm, wt6),
1261 * format date,
1262 * json escape,
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001263 * extracting preferred language comparing two lists,
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001264 * turn to lower or upper chars,
1265 * deal with stick tables.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001266
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001267.. _channel_class:
1268
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001269Channel class
1270=============
1271
1272.. js:class:: Channel
1273
1274 HAProxy uses two buffers for the processing of the requests. The first one is
1275 used with the request data (from the client to the server) and the second is
1276 used for the response data (from the server to the client).
1277
1278 Each buffer contains two types of data. The first type is the incoming data
1279 waiting for a processing. The second part is the outgoing data already
1280 processed. Usually, the incoming data is processed, after it is tagged as
1281 outgoing data, and finally it is sent. The following functions provides tools
1282 for manipulating these data in a buffer.
1283
1284 The following diagram shows where the channel class function are applied.
1285
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001286 .. image:: _static/channel.png
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001287
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001288 .. warning::
1289 It is not possible to read from the response in request action, and it is
1290 not possible to read for the request channel in response action.
Christopher Faulet09530392021-06-14 11:43:18 +02001291
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001292 .. warning::
1293 It is forbidden to alter the Channels buffer from HTTP contexts. So only
1294 :js:func:`Channel.input`, :js:func:`Channel.output`,
1295 :js:func:`Channel.may_recv`, :js:func:`Channel.is_full` and
1296 :js:func:`Channel.is_resp` can be called from an HTTP conetext.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001297
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001298 .. note::
1299 Channel object may only be manipulated in the context of a registered
1300 action, sample-fetch or converter. However, only actions are allowed to
1301 yield. When it is said one of the following functions may yield, it is only
1302 true in the context of an action.
1303
1304.. js:function:: Channel.append(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001305
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001306 This function copies the string **string** at the end of incoming data of the
1307 channel buffer. The function returns the copied length on success or -1 if
1308 data cannot be copied.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001309
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001310 Same that :js:func:`Channel.insert(channel, string, channel:input())`.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001311
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001312 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001313 :param string string: The data to copied into incoming data.
1314 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001315
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001316.. js:function:: Channel.data(channel [, offset [, length]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001317
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001318 This function returns **length** bytes of incoming data from the channel
1319 buffer, starting at the offset **offset**. The data are not removed from the
1320 buffer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001321
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001322 By default, if no length is provided, all incoming data found, starting at the
1323 given offset, are returned. If **length** is set to -1, the function tries to
1324 retrieve a maximum of data and yields if necessary. It also waits for more
1325 data if the requested length exceeds the available amount of incoming data. Do
1326 not providing an offset is the same that setting it to 0. A positive offset is
1327 relative to the begining of incoming data of the channel buffer while negative
1328 offset is relative to their end.
1329
1330 If there is no incoming data and the channel can't receive more data, a 'nil'
1331 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001332
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001333 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001334 :param integer offset: *optional* The offset in incoming data to start to get
1335 data. 0 by default. May be negative to be relative to
1336 the end of incoming data.
1337 :param integer length: *optional* The expected length of data to retrieve. All
1338 incoming data by default. May be set to -1 to get a
1339 maximum of data.
1340 :returns: a string containing the data found or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001341
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001342.. js:function:: Channel.forward(channel, length)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001343
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001344 This function forwards **length** bytes of data from the channel buffer. If
1345 the requested length exceeds the available amount of incoming data, the
1346 function yields, waiting for more data to forward. It returns the amount of
1347 data forwarded.
1348
1349 :param class_channel channel: The manipulated Channel.
1350 :param integer int: The amount of data to forward.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001351
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001352.. js:function:: Channel.input(channel)
1353
1354 This function returns the length of incoming data of the channel buffer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001355
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001356 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001357 :returns: an integer containing the amount of available bytes.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001358
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001359.. js:function:: Channel.insert(channel, string [, offset])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001360
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001361 This function copies the string **string** at the offset **offset** in
1362 incoming data of the channel buffer. The function returns the copied length on
1363 success or -1 if data cannot be copied.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001364
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001365 By default, if no offset is provided, the string is copied in front of
1366 incoming data. A positive offset is relative to the begining of incoming data
1367 of the channel buffer while negative offset is relative to their end.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001368
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001369 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001370 :param string string: The data to copied into incoming data.
1371 :param integer offset: *optional* The offset in incomding data where to copied
1372 data. 0 by default. May be negative to be relative to
1373 the end of incoming data.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001374 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001375
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001376.. js:function:: Channel.is_full(channel)
1377
1378 This function returns true if the channel buffer is full.
1379
1380 :returns: a boolean
1381
1382.. js:function:: Channel.is_resp(channel)
1383
1384 This function returns true if the channel is the response one.
1385
1386 :returns: a boolean
1387
1388.. js:function:: Channel.line(channel [, offset [, length]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001389
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001390 This function parses **length** bytes of incoming data of the channel buffer,
1391 starting at offset **offset**, and returns the first line found, including the
1392 '\n'. The data are not removed from the buffer. If no line is found, all data
1393 are returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001394
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001395 By default, if no length is provided, all incoming data, starting at the given
1396 offset, are evaluated. If **length** is set to -1, the function tries to
1397 retrieve a maximum of data and yields if necessary. It also waits for more
1398 data if the requested length exceeds the available amount of incoming data. Do
1399 not providing an offset is the same that setting it to 0. A positive offset is
1400 relative to the begining of incoming data of the channel buffer while negative
1401 offset is relative to their end.
1402
1403 If there is no incoming data and the channel can't receive more data, a 'nil'
1404 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001405
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001406 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001407 :param integer offset: *optional* The offset in incomding data to start to
1408 parse data. 0 by default. May be negative to be
1409 relative to the end of incoming data.
1410 :param integer length: *optional* The length of data to parse. All incoming
1411 data by default. May be set to -1 to get a maximum of
1412 data.
1413 :returns: a string containing the line found or nil.
1414
1415.. js:function:: Channel.may_recv(channel)
1416
1417 This function returns true if the channel may still receive data.
1418
1419 :returns: a boolean
1420
1421.. js:function:: Channel.output(channel)
1422
1423 This function returns the length of outgoing data of the channel buffer.
1424
1425 :param class_channel channel: The manipulated Channel.
1426 :returns: an integer containing the amount of available bytes.
1427
1428.. js:function:: Channel.prepend(channel, string)
1429
1430 This function copies the string **string** in front of incoming data of the
1431 channel buffer. The function returns the copied length on success or -1 if
1432 data cannot be copied.
1433
1434 Same that :js:func:`Channel.insert(channel, string, 0)`.
1435
1436 :param class_channel channel: The manipulated Channel.
1437 :param string string: The data to copied into incoming data.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001438 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001439
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001440.. js:function:: Channel.remove(channel [, offset [, length]])
1441
1442 This function removes **length** bytes of incoming data of the channel buffer,
1443 starting at offset **offset**. This function returns number of bytes removed
1444 on success.
1445
1446 By default, if no length is provided, all incoming data, starting at the given
1447 offset, are removed. Do not providing an offset is the same that setting it
1448 to 0. A positive offset is relative to the begining of incoming data of the
1449 channel buffer while negative offset is relative to their end.
1450
1451 :param class_channel channel: The manipulated Channel.
1452 :param integer offset: *optional* The offset in incomding data where to start
1453 to remove data. 0 by default. May be negative to
1454 be relative to the end of incoming data.
1455 :param integer length: *optional* The length of data to remove. All incoming
1456 data by default.
1457 :returns: an integer containing the amount of bytes removed.
1458
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001459.. js:function:: Channel.send(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001460
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001461 This function required immediate send of the string **string**. It means the
1462 string is copied at the begining of incoming data of the channel buffer and
1463 immediately forwarded. Unless if the connection is close, this function yields
1464 to copied and forward all the string.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001465
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001466 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001467 :param string string: The data to send.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001468 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001469
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001470.. js:function:: Channel.set(channel, string [, offset [, length]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001471
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001472 This function replace **length** bytes of incoming data of the channel buffer,
1473 starting at offset **offset**, by the string **string**. The function returns
1474 the copied length on success or -1 if data cannot be copied.
1475
1476 By default, if no length is provided, all incoming data, starting at the given
1477 offset, are replaced. Do not providing an offset is the same that setting it
1478 to 0. A positive offset is relative to the begining of incoming data of the
1479 channel buffer while negative offset is relative to their end.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001480
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001481 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001482 :param string string: The data to copied into incoming data.
1483 :param integer offset: *optional* The offset in incomding data where to start
1484 the data replacement. 0 by default. May be negative to
1485 be relative to the end of incoming data.
1486 :param integer length: *optional* The length of data to replace. All incoming
1487 data by default.
1488 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001489
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001490.. js:function:: Channel.dup(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001491
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001492 **DEPRECATED**
1493
1494 This function returns all incoming data found in the channel buffer. The data
1495 are not remove from the buffer and can be reprocessed later.
1496
1497 If there is no incoming data and the channel can't receive more data, a 'nil'
1498 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001499
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001500 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001501 :returns: a string containing all data found or nil.
1502
1503 .. warning::
1504 This function is deprecated. :js:func:`Channel.data()` must be used
1505 instead.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001506
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001507.. js:function:: Channel.get(channel)
1508
1509 **DEPRECATED**
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001510
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001511 This function returns all incoming data found in the channel buffer and remove
1512 them from the buffer.
1513
1514 If there is no incoming data and the channel can't receive more data, a 'nil'
1515 value is returned.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001516
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001517 :param class_channel channel: The manipulated Channel.
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001518 :returns: a string containing all the data found or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001519
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001520 .. warning::
1521 This function is deprecated. :js:func:`Channel.data()` must be used to
1522 retrieve data followed by a call to :js:func:`Channel:remove()` to remove
1523 data.
Thierry FOURNIER / OZON.IO65192f32016-11-07 15:28:40 +01001524
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001525 .. code-block:: lua
Thierry FOURNIER / OZON.IO65192f32016-11-07 15:28:40 +01001526
Christopher Faulet6a79fc12021-08-06 16:02:36 +02001527 local data = chn:data()
1528 chn:remove(0, data:len())
1529
1530 ..
1531
1532.. js:function:: Channel.getline(channel)
1533
1534 **DEPRECATED**
1535
1536 This function returns the first line found in incoming data of the channel
1537 buffer, including the '\n'. The returned data are removed from the buffer. If
1538 no line is found, this function yields to wait for more data, except if the
1539 channel can't receive more data. In this case all data are returned.
1540
1541 If there is no incoming data and the channel can't receive more data, a 'nil'
1542 value is returned.
1543
1544 :param class_channel channel: The manipulated Channel.
1545 :returns: a string containing the line found or nil.
1546
1547 .. warning::
1548 This function is depdrecated. :js:func:`Channel.line()` must be used to
1549 retrieve a line followed by a call to :js:func:`Channel:remove()` to remove
1550 data.
1551
1552 .. code-block:: lua
1553
1554 local line = chn:line(0, -1)
1555 chn:remove(0, line:len())
1556
1557 ..
1558
1559.. js:function:: Channel.get_in_len(channel)
1560
1561 **DEPDRECATED**
1562
1563 This function returns the length of the input part of the buffer.
1564
1565 :param class_channel channel: The manipulated Channel.
1566 :returns: an integer containing the amount of available bytes.
1567
1568 .. warning::
1569 This function is deprecated. :js:func:`Channel.input()` must be used
1570 instead.
1571
1572.. js:function:: Channel.get_out_len(channel)
1573
1574 **DEPDRECATED**
1575
1576 This function returns the length of the output part of the buffer.
1577
1578 :param class_channel channel: The manipulated Channel.
1579 :returns: an integer containing the amount of available bytes.
1580
1581 .. warning::
1582 This function is deprecated. :js:func:`Channel.output()` must be used
1583 instead.
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001584
1585.. _http_class:
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001586
1587HTTP class
1588==========
1589
1590.. js:class:: HTTP
1591
1592 This class contain all the HTTP manipulation functions.
1593
Pieter Baauw386a1272015-08-16 15:26:24 +02001594.. js:function:: HTTP.req_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001595
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001596 Returns a table containing all the request headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001597
1598 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001599 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001600 :see: :js:func:`HTTP.res_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001601
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001602 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001603
1604.. code-block:: lua
1605
1606 HTTP:req_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1607
1608 local hdr = HTTP:req_get_headers()
1609 hdr["host"][0] = "www.test.com"
1610 hdr["accept"][0] = "audio/basic q=1"
1611 hdr["accept"][1] = "audio/*, q=0.2"
1612 hdr["accept"][2] = "*/*, q=0.1"
1613..
1614
Pieter Baauw386a1272015-08-16 15:26:24 +02001615.. js:function:: HTTP.res_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001616
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001617 Returns a table containing all the response headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001618
1619 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001620 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001621 :see: :js:func:`HTTP.req_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001622
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001623 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001624
1625.. code-block:: lua
1626
1627 HTTP:res_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1628
1629 local hdr = HTTP:req_get_headers()
1630 hdr["host"][0] = "www.test.com"
1631 hdr["accept"][0] = "audio/basic q=1"
1632 hdr["accept"][1] = "audio/*, q=0.2"
1633 hdr["accept"][2] = "*.*, q=0.1"
1634..
1635
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001636.. js:function:: HTTP.req_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001637
1638 Appends an HTTP header field in the request whose name is
1639 specified in "name" and whose value is defined in "value".
1640
1641 :param class_http http: The related http object.
1642 :param string name: The header name.
1643 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001644 :see: :js:func:`HTTP.res_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001645
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001646.. js:function:: HTTP.res_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001647
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001648 Appends an HTTP header field in the response whose name is
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001649 specified in "name" and whose value is defined in "value".
1650
1651 :param class_http http: The related http object.
1652 :param string name: The header name.
1653 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001654 :see: :js:func:`HTTP.req_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001655
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001656.. js:function:: HTTP.req_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001657
1658 Removes all HTTP header fields in the request whose name is
1659 specified in "name".
1660
1661 :param class_http http: The related http object.
1662 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001663 :see: :js:func:`HTTP.res_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001664
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001665.. js:function:: HTTP.res_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001666
1667 Removes all HTTP header fields in the response whose name is
1668 specified in "name".
1669
1670 :param class_http http: The related http object.
1671 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001672 :see: :js:func:`HTTP.req_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001673
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001674.. js:function:: HTTP.req_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001675
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001676 This variable replace all occurrence of all header "name", by only
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001677 one containing the "value".
1678
1679 :param class_http http: The related http object.
1680 :param string name: The header name.
1681 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001682 :see: :js:func:`HTTP.res_set_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001683
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001684 This function does the same work as the following code:
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001685
1686.. code-block:: lua
1687
1688 function fcn(txn)
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001689 TXN.http:req_del_header("header")
1690 TXN.http:req_add_header("header", "value")
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001691 end
1692..
1693
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001694.. js:function:: HTTP.res_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001695
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001696 This variable replace all occurrence of all header "name", by only
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001697 one containing the "value".
1698
1699 :param class_http http: The related http object.
1700 :param string name: The header name.
1701 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001702 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001703
Pieter Baauw386a1272015-08-16 15:26:24 +02001704.. js:function:: HTTP.req_rep_header(http, name, regex, replace)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001705
1706 Matches the regular expression in all occurrences of header field "name"
1707 according to "regex", and replaces them with the "replace" argument. The
1708 replacement value can contain back references like \1, \2, ... This
1709 function works with the request.
1710
1711 :param class_http http: The related http object.
1712 :param string name: The header name.
1713 :param string regex: The match regular expression.
1714 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001715 :see: :js:func:`HTTP.res_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001716
Pieter Baauw386a1272015-08-16 15:26:24 +02001717.. js:function:: HTTP.res_rep_header(http, name, regex, string)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001718
1719 Matches the regular expression in all occurrences of header field "name"
1720 according to "regex", and replaces them with the "replace" argument. The
1721 replacement value can contain back references like \1, \2, ... This
1722 function works with the request.
1723
1724 :param class_http http: The related http object.
1725 :param string name: The header name.
1726 :param string regex: The match regular expression.
1727 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001728 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001729
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001730.. js:function:: HTTP.req_set_method(http, method)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001731
1732 Rewrites the request method with the parameter "method".
1733
1734 :param class_http http: The related http object.
1735 :param string method: The new method.
1736
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001737.. js:function:: HTTP.req_set_path(http, path)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001738
1739 Rewrites the request path with the "path" parameter.
1740
1741 :param class_http http: The related http object.
1742 :param string path: The new path.
1743
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001744.. js:function:: HTTP.req_set_query(http, query)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001745
1746 Rewrites the request's query string which appears after the first question
1747 mark ("?") with the parameter "query".
1748
1749 :param class_http http: The related http object.
1750 :param string query: The new query.
1751
Thierry FOURNIER0d79cf62015-08-26 14:20:58 +02001752.. js:function:: HTTP.req_set_uri(http, uri)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001753
1754 Rewrites the request URI with the parameter "uri".
1755
1756 :param class_http http: The related http object.
1757 :param string uri: The new uri.
1758
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001759.. js:function:: HTTP.res_set_status(http, status [, reason])
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001760
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001761 Rewrites the response status code with the parameter "code".
1762
1763 If no custom reason is provided, it will be generated from the status.
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001764
1765 :param class_http http: The related http object.
1766 :param integer status: The new response status code.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001767 :param string reason: The new response reason (optional).
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001768
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001769.. _txn_class:
1770
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001771TXN class
1772=========
1773
1774.. js:class:: TXN
1775
1776 The txn class contain all the functions relative to the http or tcp
1777 transaction (Note than a tcp stream is the same than a tcp transaction, but
1778 an HTTP transaction is not the same than a tcp stream).
1779
1780 The usage of this class permits to retrieve data from the requests, alter it
1781 and forward it.
1782
1783 All the functions provided by this class are available in the context
1784 **sample-fetches** and **actions**.
1785
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001786.. js:attribute:: TXN.c
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001787
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001788 :returns: An :ref:`converters_class`.
1789
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001790 This attribute contains a Converters class object.
1791
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001792.. js:attribute:: TXN.sc
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001793
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001794 :returns: An :ref:`converters_class`.
1795
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001796 This attribute contains a Converters class object. The functions of
1797 this object returns always a string.
1798
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001799.. js:attribute:: TXN.f
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001800
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001801 :returns: An :ref:`fetches_class`.
1802
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001803 This attribute contains a Fetches class object.
1804
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001805.. js:attribute:: TXN.sf
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001806
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001807 :returns: An :ref:`fetches_class`.
1808
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001809 This attribute contains a Fetches class object. The functions of
1810 this object returns always a string.
1811
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001812.. js:attribute:: TXN.req
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001813
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001814 :returns: An :ref:`channel_class`.
1815
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001816 This attribute contains a channel class object for the request buffer.
1817
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001818.. js:attribute:: TXN.res
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001819
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001820 :returns: An :ref:`channel_class`.
1821
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001822 This attribute contains a channel class object for the response buffer.
1823
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001824.. js:attribute:: TXN.http
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001825
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001826 :returns: An :ref:`http_class`.
1827
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001828 This attribute contains an HTTP class object. It is available only if the
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001829 proxy has the "mode http" enabled.
1830
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001831.. js:function:: TXN.log(TXN, loglevel, msg)
1832
1833 This function sends a log. The log is sent, according with the HAProxy
1834 configuration file, on the default syslog server if it is configured and on
1835 the stderr if it is allowed.
1836
1837 :param class_txn txn: The class txn object containing the data.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001838 :param integer loglevel: Is the log level associated with the message. It is a
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001839 number between 0 and 7.
1840 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001841 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
1842 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
1843 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
1844 :see: :js:func:`TXN.deflog`
1845 :see: :js:func:`TXN.Debug`
1846 :see: :js:func:`TXN.Info`
1847 :see: :js:func:`TXN.Warning`
1848 :see: :js:func:`TXN.Alert`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001849
1850.. js:function:: TXN.deflog(TXN, msg)
1851
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001852 Sends a log line with the default loglevel for the proxy associated with the
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001853 transaction.
1854
1855 :param class_txn txn: The class txn object containing the data.
1856 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001857 :see: :js:func:`TXN.log
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001858
1859.. js:function:: TXN.Debug(txn, msg)
1860
1861 :param class_txn txn: The class txn object containing the data.
1862 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001863 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001864
1865 Does the same job than:
1866
1867.. code-block:: lua
1868
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001869 function Debug(txn, msg)
1870 TXN.log(txn, core.debug, msg)
1871 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001872..
1873
1874.. js:function:: TXN.Info(txn, msg)
1875
1876 :param class_txn txn: The class txn object containing the data.
1877 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001878 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001879
1880.. code-block:: lua
1881
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001882 function Debug(txn, msg)
1883 TXN.log(txn, core.info, msg)
1884 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001885..
1886
1887.. js:function:: TXN.Warning(txn, msg)
1888
1889 :param class_txn txn: The class txn object containing the data.
1890 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001891 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001892
1893.. code-block:: lua
1894
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001895 function Debug(txn, msg)
1896 TXN.log(txn, core.warning, msg)
1897 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001898..
1899
1900.. js:function:: TXN.Alert(txn, msg)
1901
1902 :param class_txn txn: The class txn object containing the data.
1903 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001904 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001905
1906.. code-block:: lua
1907
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001908 function Debug(txn, msg)
1909 TXN.log(txn, core.alert, msg)
1910 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001911..
1912
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001913.. js:function:: TXN.get_priv(txn)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001914
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001915 Return Lua data stored in the current transaction (with the `TXN.set_priv()`)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001916 function. If no data are stored, it returns a nil value.
1917
1918 :param class_txn txn: The class txn object containing the data.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001919 :returns: the opaque data previously stored, or nil if nothing is
1920 available.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001921
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001922.. js:function:: TXN.set_priv(txn, data)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001923
1924 Store any data in the current HAProxy transaction. This action replace the
1925 old stored data.
1926
1927 :param class_txn txn: The class txn object containing the data.
1928 :param opaque data: The data which is stored in the transaction.
1929
Tim Duesterhus4e172c92020-05-19 13:49:42 +02001930.. js:function:: TXN.set_var(TXN, var, value[, ifexist])
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001931
David Carlier61fdf8b2015-10-02 11:59:38 +01001932 Converts a Lua type in a HAProxy type and store it in a variable <var>.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001933
1934 :param class_txn txn: The class txn object containing the data.
1935 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER / OZON.IOb210bcc2016-12-12 16:24:16 +01001936 :param type value: The value associated to the variable. The type can be string or
1937 integer.
Tim Duesterhus4e172c92020-05-19 13:49:42 +02001938 :param boolean ifexist: If this parameter is set to a truthy value the variable
1939 will only be set if it was defined elsewhere (i.e. used
1940 within the configuration). It is highly recommended to
1941 always set this to true.
Christopher Faulet85d79c92016-11-09 16:54:56 +01001942
1943.. js:function:: TXN.unset_var(TXN, var)
1944
1945 Unset the variable <var>.
1946
1947 :param class_txn txn: The class txn object containing the data.
1948 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001949
1950.. js:function:: TXN.get_var(TXN, var)
1951
1952 Returns data stored in the variable <var> converter in Lua type.
1953
1954 :param class_txn txn: The class txn object containing the data.
1955 :param string var: The variable name according with the HAProxy variable syntax.
1956
Christopher Faulet700d9e82020-01-31 12:21:52 +01001957.. js:function:: TXN.reply([reply])
1958
1959 Return a new reply object
1960
1961 :param table reply: A table containing info to initialize the reply fields.
1962 :returns: A :ref:`reply_class` object.
1963
1964 The table used to initialized the reply object may contain following entries :
1965
1966 * status : The reply status code. the code 200 is used by default.
1967 * reason : The reply reason. The reason corresponding to the status code is
1968 used by default.
1969 * headers : An list of headers, indexed by header name. Empty by default. For
1970 a given name, multiple values are possible, stored in an ordered list.
1971 * body : The reply body, empty by default.
1972
1973.. code-block:: lua
1974
1975 local reply = txn:reply{
1976 status = 400,
1977 reason = "Bad request",
1978 headers = {
1979 ["content-type"] = { "text/html" },
1980 ["cache-control"] = {"no-cache", "no-store" }
1981 },
1982 body = "<html><body><h1>invalid request<h1></body></html>"
1983 }
1984..
1985 :see: :js:class:`Reply`
1986
1987.. js:function:: TXN.done(txn[, reply])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001988
Willy Tarreaubc183a62015-08-28 10:39:11 +02001989 This function terminates processing of the transaction and the associated
Christopher Faulet700d9e82020-01-31 12:21:52 +01001990 session and optionally reply to the client for HTTP sessions.
1991
1992 :param class_txn txn: The class txn object containing the data.
1993 :param class_reply reply: The class reply object to return to the client.
1994
1995 This functions can be used when a critical error is detected or to terminate
Willy Tarreaubc183a62015-08-28 10:39:11 +02001996 processing after some data have been returned to the client (eg: a redirect).
Christopher Faulet700d9e82020-01-31 12:21:52 +01001997 To do so, a reply may be provided. This object is optional and may contain a
1998 status code, a reason, a header list and a body. All these fields are
1999 optionnals. When not provided, the default values are used. By default, with
2000 an empty reply object, an empty HTTP 200 response is returned to the
2001 client. If no reply object is provided, the transaction is terminated without
2002 any reply.
2003
2004 The reply object may be fully created in lua or the class Reply may be used to
2005 create it.
2006
2007.. code-block:: lua
2008
2009 local reply = txn:reply()
2010 reply:set_status(400, "Bad request")
2011 reply:add_header("content-type", "text/html")
2012 reply:add_header("cache-control", "no-cache")
2013 reply:add_header("cache-control", "no-store")
2014 reply:set_body("<html><body><h1>invalid request<h1></body></html>")
2015 txn:done(reply)
2016..
2017
2018.. code-block:: lua
2019
2020 txn:done{
2021 status = 400,
2022 reason = "Bad request",
2023 headers = {
2024 ["content-type"] = { "text/html" },
2025 ["cache-control"] = { "no-cache", "no-store" },
2026 },
2027 body = "<html><body><h1>invalid request<h1></body></html>"
2028 }
2029..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002030
Christopher Faulet1e9b1b62021-08-11 10:14:30 +02002031 .. warning::
2032 It not make sense to call this function from sample-fetches. In this case
2033 the behaviour of this one is the same than core.done(): it quit the Lua
2034 execution. The transaction is really aborted only from an action registered
2035 function.
Thierry FOURNIERab00df62016-07-14 11:42:37 +02002036
Christopher Faulet700d9e82020-01-31 12:21:52 +01002037 :see: :js:func:`TXN.reply`, :js:class:`Reply`
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002038
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002039.. js:function:: TXN.set_loglevel(txn, loglevel)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002040
2041 Is used to change the log level of the current request. The "loglevel" must
2042 be an integer between 0 and 7.
2043
2044 :param class_txn txn: The class txn object containing the data.
2045 :param integer loglevel: The required log level. This variable can be one of
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002046 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
2047 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
2048 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002049
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002050.. js:function:: TXN.set_tos(txn, tos)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002051
2052 Is used to set the TOS or DSCP field value of packets sent to the client to
2053 the value passed in "tos" on platforms which support this.
2054
2055 :param class_txn txn: The class txn object containing the data.
2056 :param integer tos: The new TOS os DSCP.
2057
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002058.. js:function:: TXN.set_mark(txn, mark)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01002059
2060 Is used to set the Netfilter MARK on all packets sent to the client to the
2061 value passed in "mark" on platforms which support it.
2062
2063 :param class_txn txn: The class txn object containing the data.
2064 :param integer mark: The mark value.
2065
Patrick Hemmer268a7072018-05-11 12:52:31 -04002066.. js:function:: TXN.set_priority_class(txn, prio)
2067
2068 This function adjusts the priority class of the transaction. The value should
2069 be within the range -2047..2047. Values outside this range will be
2070 truncated.
2071
2072 See the HAProxy configuration.txt file keyword "http-request" action
2073 "set-priority-class" for details.
2074
2075.. js:function:: TXN.set_priority_offset(txn, prio)
2076
2077 This function adjusts the priority offset of the transaction. The value
2078 should be within the range -524287..524287. Values outside this range will be
2079 truncated.
2080
2081 See the HAProxy configuration.txt file keyword "http-request" action
2082 "set-priority-offset" for details.
2083
Christopher Faulet700d9e82020-01-31 12:21:52 +01002084.. _reply_class:
2085
2086Reply class
2087============
2088
2089.. js:class:: Reply
2090
2091 **context**: action
2092
2093 This class represents an HTTP response message. It provides some methods to
2094 enrich it.
2095
2096.. code-block:: lua
2097
2098 local reply = txn:reply({status = 400}) -- default HTTP 400 reason-phase used
2099 reply:add_header("content-type", "text/html")
2100 reply:add_header("cache-control", "no-cache")
2101 reply:add_header("cache-control", "no-store")
2102 reply:set_body("<html><body><h1>invalid request<h1></body></html>")
2103..
2104
2105 :see: :js:func:`TXN.reply`
2106
2107.. js:attribute:: Reply.status
2108
2109 The reply status code. By default, the status code is set to 200.
2110
2111 :returns: integer
2112
2113.. js:attribute:: Reply.reason
2114
2115 The reason string describing the status code.
2116
2117 :returns: string
2118
2119.. js:attribute:: Reply.headers
2120
2121 A table indexing all reply headers by name. To each name is associated an
2122 ordered list of values.
2123
2124 :returns: Lua table
2125
2126.. code-block:: lua
2127
2128 {
2129 ["content-type"] = { "text/html" },
2130 ["cache-control"] = {"no-cache", "no-store" },
2131 x_header_name = { "value1", "value2", ... }
2132 ...
2133 }
2134..
2135
2136.. js:attribute:: Reply.body
2137
2138 The reply payload.
2139
2140 :returns: string
2141
2142.. js:function:: Reply.set_status(REPLY, status[, reason])
2143
2144 Set the reply status code and optionally the reason-phrase. If the reason is
2145 not provided, the default reason corresponding to the status code is used.
2146
2147 :param class_reply reply: The related Reply object.
2148 :param integer status: The reply status code.
2149 :param string reason: The reply status reason (optional).
2150
2151.. js:function:: Reply.add_header(REPLY, name, value)
2152
2153 Add a header to the reply object. If the header does not already exist, a new
2154 entry is created with its name as index and a one-element list containing its
2155 value as value. Otherwise, the header value is appended to the ordered list of
2156 values associated to the header name.
2157
2158 :param class_reply reply: The related Reply object.
2159 :param string name: The header field name.
2160 :param string value: The header field value.
2161
2162.. js:function:: Reply.del_header(REPLY, name)
2163
2164 Remove all occurrences of a header name from the reply object.
2165
2166 :param class_reply reply: The related Reply object.
2167 :param string name: The header field name.
2168
2169.. js:function:: Reply.set_body(REPLY, body)
2170
2171 Set the reply payload.
2172
2173 :param class_reply reply: The related Reply object.
2174 :param string body: The reply payload.
2175
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002176.. _socket_class:
2177
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002178Socket class
2179============
2180
2181.. js:class:: Socket
2182
2183 This class must be compatible with the Lua Socket class. Only the 'client'
2184 functions are available. See the Lua Socket documentation:
2185
2186 `http://w3.impa.br/~diego/software/luasocket/tcp.html
2187 <http://w3.impa.br/~diego/software/luasocket/tcp.html>`_
2188
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002189.. js:function:: Socket.close(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002190
2191 Closes a TCP object. The internal socket used by the object is closed and the
2192 local address to which the object was bound is made available to other
2193 applications. No further operations (except for further calls to the close
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002194 method) are allowed on a closed Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002195
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002196 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002197
2198 Note: It is important to close all used sockets once they are not needed,
2199 since, in many systems, each socket uses a file descriptor, which are limited
2200 system resources. Garbage-collected objects are automatically closed before
2201 destruction, though.
2202
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002203.. js:function:: Socket.connect(socket, address[, port])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002204
2205 Attempts to connect a socket object to a remote host.
2206
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002207
2208 In case of error, the method returns nil followed by a string describing the
2209 error. In case of success, the method returns 1.
2210
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002211 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002212 :param string address: can be an IP address or a host name. See below for more
2213 information.
2214 :param integer port: must be an integer number in the range [1..64K].
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002215 :returns: 1 or nil.
2216
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002217 An address field extension permits to use the connect() function to connect to
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002218 other stream than TCP. The syntax containing a simpleipv4 or ipv6 address is
2219 the basically expected format. This format requires the port.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002220
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002221 Other format accepted are a socket path like "/socket/path", it permits to
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002222 connect to a socket. Abstract namespaces are supported with the prefix
Joseph Herlant02cedc42018-11-13 19:45:17 -08002223 "abns@", and finally a file descriptor can be passed with the prefix "fd@".
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002224 The prefix "ipv4@", "ipv6@" and "unix@" are also supported. The port can be
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002225 passed int the string. The syntax "127.0.0.1:1234" is valid. In this case, the
Tim Duesterhus6edab862018-01-06 19:04:45 +01002226 parameter *port* must not be set.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002227
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002228.. js:function:: Socket.connect_ssl(socket, address, port)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002229
2230 Same behavior than the function socket:connect, but uses SSL.
2231
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002232 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002233 :returns: 1 or nil.
2234
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002235.. js:function:: Socket.getpeername(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002236
2237 Returns information about the remote side of a connected client object.
2238
2239 Returns a string with the IP address of the peer, followed by the port number
2240 that peer is using for the connection. In case of error, the method returns
2241 nil.
2242
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002243 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002244 :returns: a string containing the server information.
2245
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002246.. js:function:: Socket.getsockname(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002247
2248 Returns the local address information associated to the object.
2249
2250 The method returns a string with local IP address and a number with the port.
2251 In case of error, the method returns nil.
2252
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002253 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002254 :returns: a string containing the client information.
2255
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002256.. js:function:: Socket.receive(socket, [pattern [, prefix]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002257
2258 Reads data from a client object, according to the specified read pattern.
2259 Patterns follow the Lua file I/O format, and the difference in performance
2260 between all patterns is negligible.
2261
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002262 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002263 :param string|integer pattern: Describe what is required (see below).
2264 :param string prefix: A string which will be prefix the returned data.
2265 :returns: a string containing the required data or nil.
2266
2267 Pattern can be any of the following:
2268
2269 * **`*a`**: reads from the socket until the connection is closed. No
2270 end-of-line translation is performed;
2271
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002272 * **`*l`**: reads a line of text from the Socket. The line is terminated by a
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002273 LF character (ASCII 10), optionally preceded by a CR character
2274 (ASCII 13). The CR and LF characters are not included in the
2275 returned line. In fact, all CR characters are ignored by the
2276 pattern. This is the default pattern.
2277
2278 * **number**: causes the method to read a specified number of bytes from the
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002279 Socket. Prefix is an optional string to be concatenated to the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002280 beginning of any received data before return.
2281
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002282 * **empty**: If the pattern is left empty, the default option is `*l`.
2283
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002284 If successful, the method returns the received pattern. In case of error, the
2285 method returns nil followed by an error message which can be the string
2286 'closed' in case the connection was closed before the transmission was
2287 completed or the string 'timeout' in case there was a timeout during the
2288 operation. Also, after the error message, the function returns the partial
2289 result of the transmission.
2290
2291 Important note: This function was changed severely. It used to support
2292 multiple patterns (but I have never seen this feature used) and now it
2293 doesn't anymore. Partial results used to be returned in the same way as
2294 successful results. This last feature violated the idea that all functions
2295 should return nil on error. Thus it was changed too.
2296
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002297.. js:function:: Socket.send(socket, data [, start [, end ]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002298
2299 Sends data through client object.
2300
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002301 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002302 :param string data: The data that will be sent.
2303 :param integer start: The start position in the buffer of the data which will
2304 be sent.
2305 :param integer end: The end position in the buffer of the data which will
2306 be sent.
2307 :returns: see below.
2308
2309 Data is the string to be sent. The optional arguments i and j work exactly
2310 like the standard string.sub Lua function to allow the selection of a
2311 substring to be sent.
2312
2313 If successful, the method returns the index of the last byte within [start,
2314 end] that has been sent. Notice that, if start is 1 or absent, this is
2315 effectively the total number of bytes sent. In case of error, the method
2316 returns nil, followed by an error message, followed by the index of the last
2317 byte within [start, end] that has been sent. You might want to try again from
2318 the byte following that. The error message can be 'closed' in case the
2319 connection was closed before the transmission was completed or the string
2320 'timeout' in case there was a timeout during the operation.
2321
2322 Note: Output is not buffered. For small strings, it is always better to
2323 concatenate them in Lua (with the '..' operator) and send the result in one
2324 call instead of calling the method several times.
2325
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002326.. js:function:: Socket.setoption(socket, option [, value])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002327
2328 Just implemented for compatibility, this cal does nothing.
2329
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002330.. js:function:: Socket.settimeout(socket, value [, mode])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002331
2332 Changes the timeout values for the object. All I/O operations are blocking.
2333 That is, any call to the methods send, receive, and accept will block
2334 indefinitely, until the operation completes. The settimeout method defines a
2335 limit on the amount of time the I/O methods can block. When a timeout time
2336 has elapsed, the affected methods give up and fail with an error code.
2337
2338 The amount of time to wait is specified as the value parameter, in seconds.
2339
Mark Lakes56cc1252018-03-27 09:48:06 +02002340 The timeout modes are not implemented, the only settable timeout is the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002341 inactivity time waiting for complete the internal buffer send or waiting for
2342 receive data.
2343
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01002344 :param class_socket socket: Is the manipulated Socket.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002345 :param float value: The timeout value. Use floating point to specify
Mark Lakes56cc1252018-03-27 09:48:06 +02002346 milliseconds.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002347
Thierry FOURNIER31904272017-10-25 12:59:51 +02002348.. _regex_class:
2349
2350Regex class
2351===========
2352
2353.. js:class:: Regex
2354
2355 This class allows the usage of HAProxy regexes because classic lua doesn't
2356 provides regexes. This class inherits the HAProxy compilation options, so the
2357 regexes can be libc regex, pcre regex or pcre JIT regex.
2358
2359 The expression matching number is limited to 20 per regex. The only available
2360 option is case sensitive.
2361
2362 Because regexes compilation is a heavy process, it is better to define all
2363 your regexes in the **body context** and use it during the runtime.
2364
2365.. code-block:: lua
2366
2367 -- Create the regex
2368 st, regex = Regex.new("needle (..) (...)", true);
2369
2370 -- Check compilation errors
2371 if st == false then
2372 print "error: " .. regex
2373 end
2374
2375 -- Match the regexes
2376 print(regex:exec("Looking for a needle in the haystack")) -- true
2377 print(regex:exec("Lokking for a cat in the haystack")) -- false
2378
2379 -- Extract words
2380 st, list = regex:match("Looking for a needle in the haystack")
2381 print(st) -- true
2382 print(list[1]) -- needle in the
2383 print(list[2]) -- in
2384 print(list[3]) -- the
2385
2386.. js:function:: Regex.new(regex, case_sensitive)
2387
2388 Create and compile a regex.
2389
2390 :param string regex: The regular expression according with the libc or pcre
2391 standard
2392 :param boolean case_sensitive: Match is case sensitive or not.
2393 :returns: boolean status and :ref:`regex_class` or string containing fail reason.
2394
2395.. js:function:: Regex.exec(regex, str)
2396
2397 Execute the regex.
2398
2399 :param class_regex regex: A :ref:`regex_class` object.
2400 :param string str: The input string will be compared with the compiled regex.
2401 :returns: a boolean status according with the match result.
2402
2403.. js:function:: Regex.match(regex, str)
2404
2405 Execute the regex and return matched expressions.
2406
2407 :param class_map map: A :ref:`regex_class` object.
2408 :param string str: The input string will be compared with the compiled regex.
2409 :returns: a boolean status according with the match result, and
2410 a table containing all the string matched in order of declaration.
2411
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002412.. _map_class:
2413
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002414Map class
2415=========
2416
2417.. js:class:: Map
2418
2419 This class permits to do some lookup in HAProxy maps. The declared maps can
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002420 be modified during the runtime through the HAProxy management socket.
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002421
2422.. code-block:: lua
2423
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002424 default = "usa"
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002425
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002426 -- Create and load map
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002427 geo = Map.new("geo.map", Map._ip);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002428
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002429 -- Create new fetch that returns the user country
2430 core.register_fetches("country", function(txn)
2431 local src;
2432 local loc;
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002433
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002434 src = txn.f:fhdr("x-forwarded-for");
2435 if (src == nil) then
2436 src = txn.f:src()
2437 if (src == nil) then
2438 return default;
2439 end
2440 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002441
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002442 -- Perform lookup
2443 loc = geo:lookup(src);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002444
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002445 if (loc == nil) then
2446 return default;
2447 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002448
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002449 return loc;
2450 end);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002451
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002452.. js:attribute:: Map._int
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002453
2454 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002455 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002456 method.
2457
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002458 Note that :js:attr:`Map.int` is also available for compatibility.
2459
2460.. js:attribute:: Map._ip
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002461
2462 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002463 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002464 method.
2465
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002466 Note that :js:attr:`Map.ip` is also available for compatibility.
2467
2468.. js:attribute:: Map._str
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002469
2470 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002471 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002472 method.
2473
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002474 Note that :js:attr:`Map.str` is also available for compatibility.
2475
2476.. js:attribute:: Map._beg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002477
2478 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002479 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002480 method.
2481
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002482 Note that :js:attr:`Map.beg` is also available for compatibility.
2483
2484.. js:attribute:: Map._sub
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002485
2486 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002487 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002488 method.
2489
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002490 Note that :js:attr:`Map.sub` is also available for compatibility.
2491
2492.. js:attribute:: Map._dir
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002493
2494 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002495 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002496 method.
2497
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002498 Note that :js:attr:`Map.dir` is also available for compatibility.
2499
2500.. js:attribute:: Map._dom
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002501
2502 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002503 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002504 method.
2505
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002506 Note that :js:attr:`Map.dom` is also available for compatibility.
2507
2508.. js:attribute:: Map._end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002509
2510 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002511 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002512 method.
2513
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002514.. js:attribute:: Map._reg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002515
2516 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002517 samples" and subchapter "ACL basics" to understand this pattern matching
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002518 method.
2519
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002520 Note that :js:attr:`Map.reg` is also available for compatibility.
2521
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002522
2523.. js:function:: Map.new(file, method)
2524
2525 Creates and load a map.
2526
2527 :param string file: Is the file containing the map.
2528 :param integer method: Is the map pattern matching method. See the attributes
2529 of the Map class.
2530 :returns: a class Map object.
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002531 :see: The Map attributes: :js:attr:`Map._int`, :js:attr:`Map._ip`,
2532 :js:attr:`Map._str`, :js:attr:`Map._beg`, :js:attr:`Map._sub`,
2533 :js:attr:`Map._dir`, :js:attr:`Map._dom`, :js:attr:`Map._end` and
2534 :js:attr:`Map._reg`.
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002535
2536.. js:function:: Map.lookup(map, str)
2537
2538 Perform a lookup in a map.
2539
2540 :param class_map map: Is the class Map object.
2541 :param string str: Is the string used as key.
2542 :returns: a string containing the result or nil if no match.
2543
2544.. js:function:: Map.slookup(map, str)
2545
2546 Perform a lookup in a map.
2547
2548 :param class_map map: Is the class Map object.
2549 :param string str: Is the string used as key.
2550 :returns: a string containing the result or empty string if no match.
2551
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002552.. _applethttp_class:
2553
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002554AppletHTTP class
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002555================
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002556
2557.. js:class:: AppletHTTP
2558
2559 This class is used with applets that requires the 'http' mode. The http applet
2560 can be registered with the *core.register_service()* function. They are used
2561 for processing an http request like a server in back of HAProxy.
2562
2563 This is an hello world sample code:
2564
2565.. code-block:: lua
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002566
Pieter Baauw4d7f7662015-11-08 16:38:08 +01002567 core.register_service("hello-world", "http", function(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002568 local response = "Hello World !"
2569 applet:set_status(200)
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002570 applet:add_header("content-length", string.len(response))
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002571 applet:add_header("content-type", "text/plain")
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002572 applet:start_response()
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002573 applet:send(response)
2574 end)
2575
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002576.. js:attribute:: AppletHTTP.c
2577
2578 :returns: A :ref:`converters_class`
2579
2580 This attribute contains a Converters class object.
2581
2582.. js:attribute:: AppletHTTP.sc
2583
2584 :returns: A :ref:`converters_class`
2585
2586 This attribute contains a Converters class object. The
2587 functions of this object returns always a string.
2588
2589.. js:attribute:: AppletHTTP.f
2590
2591 :returns: A :ref:`fetches_class`
2592
2593 This attribute contains a Fetches class object. Note that the
2594 applet execution place cannot access to a valid HAProxy core HTTP
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002595 transaction, so some sample fetches related to the HTTP dependent
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002596 values (hdr, path, ...) are not available.
2597
2598.. js:attribute:: AppletHTTP.sf
2599
2600 :returns: A :ref:`fetches_class`
2601
2602 This attribute contains a Fetches class object. The functions of
2603 this object returns always a string. Note that the applet
2604 execution place cannot access to a valid HAProxy core HTTP
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002605 transaction, so some sample fetches related to the HTTP dependent
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002606 values (hdr, path, ...) are not available.
2607
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002608.. js:attribute:: AppletHTTP.method
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002609
2610 :returns: string
2611
2612 The attribute method returns a string containing the HTTP
2613 method.
2614
2615.. js:attribute:: AppletHTTP.version
2616
2617 :returns: string
2618
2619 The attribute version, returns a string containing the HTTP
2620 request version.
2621
2622.. js:attribute:: AppletHTTP.path
2623
2624 :returns: string
2625
2626 The attribute path returns a string containing the HTTP
2627 request path.
2628
2629.. js:attribute:: AppletHTTP.qs
2630
2631 :returns: string
2632
2633 The attribute qs returns a string containing the HTTP
2634 request query string.
2635
2636.. js:attribute:: AppletHTTP.length
2637
2638 :returns: integer
2639
2640 The attribute length returns an integer containing the HTTP
2641 body length.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002642
Thierry FOURNIER841475e2015-12-11 17:10:09 +01002643.. js:attribute:: AppletHTTP.headers
2644
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002645 :returns: table
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002646
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002647 The attribute headers returns a table containing the HTTP
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002648 headers. The header names are always in lower case. As the header name can be
2649 encountered more than once in each request, the value is indexed with 0 as
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002650 first index value. The table have this form:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002651
2652.. code-block:: lua
2653
2654 AppletHTTP.headers['<header-name>'][<header-index>] = "<header-value>"
2655
2656 AppletHTTP.headers["host"][0] = "www.test.com"
2657 AppletHTTP.headers["accept"][0] = "audio/basic q=1"
2658 AppletHTTP.headers["accept"][1] = "audio/*, q=0.2"
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002659 AppletHTTP.headers["accept"][2] = "*/*, q=0.1"
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002660..
2661
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002662.. js:function:: AppletHTTP.set_status(applet, code [, reason])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002663
2664 This function sets the HTTP status code for the response. The allowed code are
2665 from 100 to 599.
2666
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002667 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002668 :param integer code: the status code returned to the client.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002669 :param string reason: the status reason returned to the client (optional).
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002670
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002671.. js:function:: AppletHTTP.add_header(applet, name, value)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002672
2673 This function add an header in the response. Duplicated headers are not
2674 collapsed. The special header *content-length* is used to determinate the
2675 response length. If it not exists, a *transfer-encoding: chunked* is set, and
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05002676 all the write from the function *AppletHTTP:send()* become a chunk.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002677
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002678 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002679 :param string name: the header name
2680 :param string value: the header value
2681
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002682.. js:function:: AppletHTTP.start_response(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002683
2684 This function indicates to the HTTP engine that it can process and send the
2685 response headers. After this called we cannot add headers to the response; We
2686 cannot use the *AppletHTTP:send()* function if the
2687 *AppletHTTP:start_response()* is not called.
2688
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002689 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2690
2691.. js:function:: AppletHTTP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002692
2693 This function returns a string containing one line from the http body. If the
2694 data returned doesn't contains a final '\\n' its assumed than its the last
2695 available data before the end of stream.
2696
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002697 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002698 :returns: a string. The string can be empty if we reach the end of the stream.
2699
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002700.. js:function:: AppletHTTP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002701
2702 Reads data from the HTTP body, according to the specified read *size*. If the
2703 *size* is missing, the function tries to read all the content of the stream
2704 until the end. If the *size* is bigger than the http body, it returns the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002705 amount of data available.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002706
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002707 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002708 :param integer size: the required read size.
Ilya Shipitsin11057a32020-06-21 21:18:27 +05002709 :returns: always return a string,the string can be empty is the connection is
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002710 closed.
2711
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002712.. js:function:: AppletHTTP.send(applet, msg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002713
2714 Send the message *msg* on the http request body.
2715
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002716 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002717 :param string msg: the message to send.
2718
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002719.. js:function:: AppletHTTP.get_priv(applet)
2720
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002721 Return Lua data stored in the current transaction. If no data are stored,
2722 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002723
2724 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002725 :returns: the opaque data previously stored, or nil if nothing is
2726 available.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002727 :see: :js:func:`AppletHTTP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002728
2729.. js:function:: AppletHTTP.set_priv(applet, data)
2730
2731 Store any data in the current HAProxy transaction. This action replace the
2732 old stored data.
2733
2734 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2735 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002736 :see: :js:func:`AppletHTTP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002737
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002738.. js:function:: AppletHTTP.set_var(applet, var, value[, ifexist])
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002739
2740 Converts a Lua type in a HAProxy type and store it in a variable <var>.
2741
2742 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2743 :param string var: The variable name according with the HAProxy variable syntax.
2744 :param type value: The value associated to the variable. The type ca be string or
2745 integer.
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002746 :param boolean ifexist: If this parameter is set to a truthy value the variable
2747 will only be set if it was defined elsewhere (i.e. used
2748 within the configuration). It is highly recommended to
2749 always set this to true.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002750 :see: :js:func:`AppletHTTP.unset_var`
2751 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002752
2753.. js:function:: AppletHTTP.unset_var(applet, var)
2754
2755 Unset the variable <var>.
2756
2757 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2758 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002759 :see: :js:func:`AppletHTTP.set_var`
2760 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002761
2762.. js:function:: AppletHTTP.get_var(applet, var)
2763
2764 Returns data stored in the variable <var> converter in Lua type.
2765
2766 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2767 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002768 :see: :js:func:`AppletHTTP.set_var`
2769 :see: :js:func:`AppletHTTP.unset_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002770
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002771.. _applettcp_class:
2772
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002773AppletTCP class
2774===============
2775
2776.. js:class:: AppletTCP
2777
2778 This class is used with applets that requires the 'tcp' mode. The tcp applet
2779 can be registered with the *core.register_service()* function. They are used
2780 for processing a tcp stream like a server in back of HAProxy.
2781
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002782.. js:attribute:: AppletTCP.c
2783
2784 :returns: A :ref:`converters_class`
2785
2786 This attribute contains a Converters class object.
2787
2788.. js:attribute:: AppletTCP.sc
2789
2790 :returns: A :ref:`converters_class`
2791
2792 This attribute contains a Converters class object. The
2793 functions of this object returns always a string.
2794
2795.. js:attribute:: AppletTCP.f
2796
2797 :returns: A :ref:`fetches_class`
2798
2799 This attribute contains a Fetches class object.
2800
2801.. js:attribute:: AppletTCP.sf
2802
2803 :returns: A :ref:`fetches_class`
2804
2805 This attribute contains a Fetches class object.
2806
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002807.. js:function:: AppletTCP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002808
2809 This function returns a string containing one line from the stream. If the
2810 data returned doesn't contains a final '\\n' its assumed than its the last
2811 available data before the end of stream.
2812
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002813 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002814 :returns: a string. The string can be empty if we reach the end of the stream.
2815
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002816.. js:function:: AppletTCP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002817
2818 Reads data from the TCP stream, according to the specified read *size*. If the
2819 *size* is missing, the function tries to read all the content of the stream
2820 until the end.
2821
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002822 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002823 :param integer size: the required read size.
Ilya Shipitsin11057a32020-06-21 21:18:27 +05002824 :returns: always return a string,the string can be empty is the connection is
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002825 closed.
2826
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002827.. js:function:: AppletTCP.send(appletmsg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002828
2829 Send the message on the stream.
2830
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002831 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002832 :param string msg: the message to send.
2833
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002834.. js:function:: AppletTCP.get_priv(applet)
2835
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002836 Return Lua data stored in the current transaction. If no data are stored,
2837 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002838
2839 :param class_AppletTCP applet: An :ref:`applettcp_class`
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002840 :returns: the opaque data previously stored, or nil if nothing is
2841 available.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002842 :see: :js:func:`AppletTCP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002843
2844.. js:function:: AppletTCP.set_priv(applet, data)
2845
2846 Store any data in the current HAProxy transaction. This action replace the
2847 old stored data.
2848
2849 :param class_AppletTCP applet: An :ref:`applettcp_class`
2850 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002851 :see: :js:func:`AppletTCP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002852
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002853.. js:function:: AppletTCP.set_var(applet, var, value[, ifexist])
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002854
2855 Converts a Lua type in a HAProxy type and stores it in a variable <var>.
2856
2857 :param class_AppletTCP applet: An :ref:`applettcp_class`
2858 :param string var: The variable name according with the HAProxy variable syntax.
2859 :param type value: The value associated to the variable. The type can be string or
2860 integer.
Tim Duesterhus4e172c92020-05-19 13:49:42 +02002861 :param boolean ifexist: If this parameter is set to a truthy value the variable
2862 will only be set if it was defined elsewhere (i.e. used
2863 within the configuration). It is highly recommended to
2864 always set this to true.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002865 :see: :js:func:`AppletTCP.unset_var`
2866 :see: :js:func:`AppletTCP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002867
2868.. js:function:: AppletTCP.unset_var(applet, var)
2869
2870 Unsets the variable <var>.
2871
2872 :param class_AppletTCP applet: An :ref:`applettcp_class`
2873 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002874 :see: :js:func:`AppletTCP.unset_var`
2875 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002876
2877.. js:function:: AppletTCP.get_var(applet, var)
2878
2879 Returns data stored in the variable <var> converter in Lua type.
2880
2881 :param class_AppletTCP applet: An :ref:`applettcp_class`
2882 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002883 :see: :js:func:`AppletTCP.unset_var`
2884 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002885
Adis Nezirovic8878f8e2018-07-13 12:18:33 +02002886StickTable class
2887================
2888
2889.. js:class:: StickTable
2890
2891 **context**: task, action, sample-fetch
2892
2893 This class can be used to access the HAProxy stick tables from Lua.
2894
2895.. js:function:: StickTable.info()
2896
2897 Returns stick table attributes as a Lua table. See HAProxy documentation for
Ilya Shipitsin2272d8a2020-12-21 01:22:40 +05002898 "stick-table" for canonical info, or check out example below.
Adis Nezirovic8878f8e2018-07-13 12:18:33 +02002899
2900 :returns: Lua table
2901
2902 Assume our table has IPv4 key and gpc0 and conn_rate "columns":
2903
2904.. code-block:: lua
2905
2906 {
2907 expire=<int>, # Value in ms
2908 size=<int>, # Maximum table size
2909 used=<int>, # Actual number of entries in table
2910 data={ # Data columns, with types as key, and periods as values
2911 (-1 if type is not rate counter)
2912 conn_rate=<int>,
2913 gpc0=-1
2914 },
2915 length=<int>, # max string length for string table keys, key length
2916 # otherwise
2917 nopurge=<boolean>, # purge oldest entries when table is full
2918 type="ip" # can be "ip", "ipv6", "integer", "string", "binary"
2919 }
2920
2921.. js:function:: StickTable.lookup(key)
2922
2923 Returns stick table entry for given <key>
2924
2925 :param string key: Stick table key (IP addresses and strings are supported)
2926 :returns: Lua table
2927
2928.. js:function:: StickTable.dump([filter])
2929
2930 Returns all entries in stick table. An optional filter can be used
2931 to extract entries with specific data values. Filter is a table with valid
2932 comparison operators as keys followed by data type name and value pairs.
2933 Check out the HAProxy docs for "show table" for more details. For the
2934 reference, the supported operators are:
2935 "eq", "ne", "le", "lt", "ge", "gt"
2936
2937 For large tables, execution of this function can take a long time (for
2938 HAProxy standards). That's also true when filter is used, so take care and
2939 measure the impact.
2940
2941 :param table filter: Stick table filter
2942 :returns: Stick table entries (table)
2943
2944 See below for example filter, which contains 4 entries (or comparisons).
2945 (Maximum number of filter entries is 4, defined in the source code)
2946
2947.. code-block:: lua
2948
2949 local filter = {
2950 {"gpc0", "gt", 30}, {"gpc1", "gt", 20}}, {"conn_rate", "le", 10}
2951 }
2952
Christopher Faulet0f3c8902020-01-31 18:57:12 +01002953.. _action_class:
2954
2955Action class
2956=============
2957
2958.. js:class:: Act
2959
2960 **context**: action
2961
2962 This class contains all return codes an action may return. It is the lua
2963 equivalent to HAProxy "ACT_RET_*" code.
2964
2965.. code-block:: lua
2966
2967 core.register_action("deny", { "http-req" }, function (txn)
2968 return act.DENY
2969 end)
2970..
2971.. js:attribute:: act.CONTINUE
2972
2973 This attribute is an integer (0). It instructs HAProxy to continue the current
2974 ruleset processing on the message. It is the default return code for a lua
2975 action.
2976
2977 :returns: integer
2978
2979.. js:attribute:: act.STOP
2980
2981 This attribute is an integer (1). It instructs HAProxy to stop the current
2982 ruleset processing on the message.
2983
2984.. js:attribute:: act.YIELD
2985
2986 This attribute is an integer (2). It instructs HAProxy to temporarily pause
2987 the message processing. It will be resumed later on the same rule. The
2988 corresponding lua script is re-executed for the start.
2989
2990.. js:attribute:: act.ERROR
2991
2992 This attribute is an integer (3). It triggers an internal errors The message
2993 processing is stopped and the transaction is terminated. For HTTP streams, an
2994 HTTP 500 error is returned to the client.
2995
2996 :returns: integer
2997
2998.. js:attribute:: act.DONE
2999
3000 This attribute is an integer (4). It instructs HAProxy to stop the message
3001 processing.
3002
3003 :returns: integer
3004
3005.. js:attribute:: act.DENY
3006
3007 This attribute is an integer (5). It denies the current message. The message
3008 processing is stopped and the transaction is terminated. For HTTP streams, an
3009 HTTP 403 error is returned to the client if the deny is returned during the
3010 request analysis. During the response analysis, an HTTP 502 error is returned
3011 and the server response is discarded.
3012
3013 :returns: integer
3014
3015.. js:attribute:: act.ABORT
3016
3017 This attribute is an integer (6). It aborts the current message. The message
3018 processing is stopped and the transaction is terminated. For HTTP streams,
Willy Tarreau714f3452021-05-09 06:47:26 +02003019 HAProxy assumes a response was already sent to the client. From the Lua
Christopher Faulet0f3c8902020-01-31 18:57:12 +01003020 actions point of view, when this code is used, the transaction is terminated
3021 with no reply.
3022
3023 :returns: integer
3024
3025.. js:attribute:: act.INVALID
3026
3027 This attribute is an integer (7). It triggers an internal errors. The message
3028 processing is stopped and the transaction is terminated. For HTTP streams, an
3029 HTTP 400 error is returned to the client if the error is returned during the
3030 request analysis. During the response analysis, an HTTP 502 error is returned
3031 and the server response is discarded.
3032
3033 :returns: integer
Adis Nezirovic8878f8e2018-07-13 12:18:33 +02003034
Christopher Faulet2c2c2e32020-01-31 19:07:52 +01003035.. js:function:: act:wake_time(milliseconds)
3036
3037 **context**: action
3038
3039 Set the script pause timeout to the specified time, defined in
3040 milliseconds.
3041
3042 :param integer milliseconds: the required milliseconds.
3043
3044 This function may be used when a lua action returns `act.YIELD`, to force its
3045 wake-up at most after the specified number of milliseconds.
3046
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01003047External Lua libraries
3048======================
3049
3050A lot of useful lua libraries can be found here:
3051
3052* `https://lua-toolbox.com/ <https://lua-toolbox.com/>`_
3053
Ilya Shipitsin2075ca82020-03-06 23:22:22 +05003054Redis client library:
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01003055
3056* `https://github.com/nrk/redis-lua <https://github.com/nrk/redis-lua>`_
3057
3058This is an example about the usage of the Redis library with HAProxy. Note that
3059each call of any function of this library can throw an error if the socket
3060connection fails.
3061
3062.. code-block:: lua
3063
3064 -- load the redis library
3065 local redis = require("redis");
3066
3067 function do_something(txn)
3068
3069 -- create and connect new tcp socket
3070 local tcp = core.tcp();
3071 tcp:settimeout(1);
3072 tcp:connect("127.0.0.1", 6379);
3073
3074 -- use the redis library with this new socket
3075 local client = redis.connect({socket=tcp});
3076 client:ping();
3077
3078 end
3079
3080OpenSSL:
3081
3082* `http://mkottman.github.io/luacrypto/index.html
3083 <http://mkottman.github.io/luacrypto/index.html>`_
3084
3085* `https://github.com/brunoos/luasec/wiki
3086 <https://github.com/brunoos/luasec/wiki>`_