blob: 553cf521edd381f0cb23c4b3ec82351b5786c1bc [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
58 **NOTE**: It is possible that this function cannot found the required data
59 in the original HAProxy sample-fetches, in this case, it cannot return the
60 result. This case is not yet supported
61
David Carlier61fdf8b2015-10-02 11:59:38 +0100626. The **converter context**. It is a Lua function that takes a string as input
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010063 and returns another string as output. These types of function are stateless,
64 it cannot access to any context. They don't execute any blocking function.
65 The call prototype is `function string fcn(string)`. This function can be
66 registered with the Lua function `core.register_converters()`. Each declared
67 converter is prefixed by the string "lua.".
68
69HAProxy Lua Hello world
70-----------------------
71
72HAProxy configuration file (`hello_world.conf`):
73
74::
75
76 global
77 lua-load hello_world.lua
78
79 listen proxy
80 bind 127.0.0.1:10001
Thierry FOURNIERa2d02252015-10-01 15:00:42 +020081 tcp-request inspect-delay 1s
82 tcp-request content use-service lua.hello_world
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010083
84HAProxy Lua file (`hello_world.lua`):
85
86.. code-block:: lua
87
Thierry FOURNIERa2d02252015-10-01 15:00:42 +020088 core.register_service("hello_world", "tcp", function(applet)
89 applet:send("hello world\n")
90 end)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +010091
92How to start HAProxy for testing this configuration:
93
94::
95
96 ./haproxy -f hello_world.conf
97
98On other terminal, you can test with telnet:
99
100::
101
102 #:~ telnet 127.0.0.1 10001
103 hello world
104
105Core class
106==========
107
108.. js:class:: core
109
110 The "core" class contains all the HAProxy core functions. These function are
111 useful for the controlling the execution flow, registering hooks, manipulating
112 global maps or ACL, ...
113
114 "core" class is basically provided with HAProxy. No `require` line is
115 required to uses these function.
116
David Carlier61fdf8b2015-10-02 11:59:38 +0100117 The "core" class is static, it is not possible to create a new object of this
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100118 type.
119
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100120.. js:attribute:: core.emerg
121
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100122 :returns: integer
123
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100124 This attribute is an integer, it contains the value of the loglevel "emergency" (0).
125
126.. js:attribute:: core.alert
127
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100128 :returns: integer
129
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100130 This attribute is an integer, it contains the value of the loglevel "alert" (1).
131
132.. js:attribute:: core.crit
133
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100134 :returns: integer
135
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100136 This attribute is an integer, it contains the value of the loglevel "critical" (2).
137
138.. js:attribute:: core.err
139
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100140 :returns: integer
141
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100142 This attribute is an integer, it contains the value of the loglevel "error" (3).
143
144.. js:attribute:: core.warning
145
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100146 :returns: integer
147
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100148 This attribute is an integer, it contains the value of the loglevel "warning" (4).
149
150.. js:attribute:: core.notice
151
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100152 :returns: integer
153
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100154 This attribute is an integer, it contains the value of the loglevel "notice" (5).
155
156.. js:attribute:: core.info
157
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100158 :returns: integer
159
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100160 This attribute is an integer, it contains the value of the loglevel "info" (6).
161
162.. js:attribute:: core.debug
163
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100164 :returns: integer
165
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100166 This attribute is an integer, it contains the value of the loglevel "debug" (7).
167
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100168.. js:attribute:: core.proxies
169
170 **context**: task, action, sample-fetch, converter
171
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400172 This attribute is a table of declared proxies (frontend and backends). Each
173 proxy give an access to his list of listeners and servers. The table is
174 indexed by proxy name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100175
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200176 Warning, if you are declared frontend and backend with the same name, only one
177 of these are listed.
178
179 :see: :js:attr:`core.backends`
180 :see: :js:attr:`core.frontends`
181
182.. js:attribute:: core.backends
183
184 **context**: task, action, sample-fetch, converter
185
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400186 This attribute is a table of declared proxies with backend capability. Each
187 proxy give an access to his list of listeners and servers. The table is
188 indexed by the backend name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200189
190 :see: :js:attr:`core.proxies`
191 :see: :js:attr:`core.frontends`
192
193.. js:attribute:: core.frontends
194
195 **context**: task, action, sample-fetch, converter
196
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400197 This attribute is a table of declared proxies with frontend capability. Each
198 proxy give an access to his list of listeners and servers. The table is
199 indexed by the frontend name, and each entry is of type :ref:`proxy_class`.
Thierry FOURNIER9b82a582017-07-24 13:30:43 +0200200
201 :see: :js:attr:`core.proxies`
202 :see: :js:attr:`core.backends`
203
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100204.. js:function:: core.log(loglevel, msg)
205
206 **context**: body, init, task, action, sample-fetch, converter
207
David Carlier61fdf8b2015-10-02 11:59:38 +0100208 This function sends a log. The log is sent, according with the HAProxy
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100209 configuration file, on the default syslog server if it is configured and on
210 the stderr if it is allowed.
211
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100212 :param integer loglevel: Is the log level associated with the message. It is a
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100213 number between 0 and 7.
214 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100215 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
216 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
217 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
218 :see: :js:func:`core.Debug`
219 :see: :js:func:`core.Info`
220 :see: :js:func:`core.Warning`
221 :see: :js:func:`core.Alert`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100222
223.. js:function:: core.Debug(msg)
224
225 **context**: body, init, task, action, sample-fetch, converter
226
227 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100228 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100229
230 Does the same job than:
231
232.. code-block:: lua
233
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100234 function Debug(msg)
235 core.log(core.debug, msg)
236 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100237..
238
239.. js:function:: core.Info(msg)
240
241 **context**: body, init, task, action, sample-fetch, converter
242
243 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100244 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100245
246.. code-block:: lua
247
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100248 function Info(msg)
249 core.log(core.info, msg)
250 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100251..
252
253.. js:function:: core.Warning(msg)
254
255 **context**: body, init, task, action, sample-fetch, converter
256
257 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100258 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100259
260.. code-block:: lua
261
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100262 function Warning(msg)
263 core.log(core.warning, msg)
264 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100265..
266
267.. js:function:: core.Alert(msg)
268
269 **context**: body, init, task, action, sample-fetch, converter
270
271 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +0100272 :see: :js:func:`core.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100273
274.. code-block:: lua
275
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100276 function Alert(msg)
277 core.log(core.alert, msg)
278 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +0100279..
280
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100281.. js:function:: core.add_acl(filename, key)
282
283 **context**: init, task, action, sample-fetch, converter
284
285 Add the ACL *key* in the ACLs list referenced by the file *filename*.
286
287 :param string filename: the filename that reference the ACL entries.
288 :param string key: the key which will be added.
289
290.. js:function:: core.del_acl(filename, key)
291
292 **context**: init, task, action, sample-fetch, converter
293
294 Delete the ACL entry referenced by the key *key* in the list of ACLs
295 referenced by *filename*.
296
297 :param string filename: the filename that reference the ACL entries.
298 :param string key: the key which will be deleted.
299
300.. js:function:: core.del_map(filename, key)
301
302 **context**: init, task, action, sample-fetch, converter
303
304 Delete the map entry indexed with the specified key in the list of maps
305 referenced by his filename.
306
307 :param string filename: the filename that reference the map entries.
308 :param string key: the key which will be deleted.
309
Thierry Fourniereea77c02016-03-18 08:47:13 +0100310.. js:function:: core.get_info()
311
312 **context**: body, init, task, action, sample-fetch, converter
313
314 Returns HAProxy core informations. We can found information like the uptime,
315 the pid, memory pool usage, tasks number, ...
316
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100317 These information are also returned by the management socket via the command
318 "show info". See the management socket documentation for more information
Thierry Fourniereea77c02016-03-18 08:47:13 +0100319 about the content of these variables.
320
321 :returns: an array of values.
322
Thierry Fournierb1f46562016-01-21 09:46:15 +0100323.. js:function:: core.now()
324
325 **context**: body, init, task, action
326
327 This function returns the current time. The time returned is fixed by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100328 HAProxy core and assures than the hour will be monotonic and that the system
Thierry Fournierb1f46562016-01-21 09:46:15 +0100329 call 'gettimeofday' will not be called too. The time is refreshed between each
330 Lua execution or resume, so two consecutive call to the function "now" will
331 probably returns the same result.
332
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400333 :returns: a table which contains two entries "sec" and "usec". "sec"
Thierry Fournierb1f46562016-01-21 09:46:15 +0100334 contains the current at the epoch format, and "usec" contains the
335 current microseconds.
336
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100337.. js:function:: core.http_date(date)
338
339 **context**: body, init, task, action
340
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100341 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100342 containing the corresponding date with a epoch format. A valid http date
343 me respect the format IMF, RFC850 or ASCTIME.
344
345 :param string date: a date http-date formatted
346 :returns: integer containing epoch date
347 :see: :js:func:`core.imf_date`.
348 :see: :js:func:`core.rfc850_date`.
349 :see: :js:func:`core.asctime_date`.
350 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
351
352.. js:function:: core.imf_date(date)
353
354 **context**: body, init, task, action
355
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100356 This function take a string representing IMF date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100357 containing the corresponding date with a epoch format.
358
359 :param string date: a date IMF formatted
360 :returns: integer containing epoch date
361 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
362
363 The IMF format is like this:
364
365.. code-block:: text
366
367 Sun, 06 Nov 1994 08:49:37 GMT
368..
369
370.. js:function:: core.rfc850_date(date)
371
372 **context**: body, init, task, action
373
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100374 This function take a string representing RFC850 date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100375 containing the corresponding date with a epoch format.
376
377 :param string date: a date RFC859 formatted
378 :returns: integer containing epoch date
379 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
380
381 The RFC850 format is like this:
382
383.. code-block:: text
384
385 Sunday, 06-Nov-94 08:49:37 GMT
386..
387
388.. js:function:: core.asctime_date(date)
389
390 **context**: body, init, task, action
391
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100392 This function take a string representing ASCTIME date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100393 containing the corresponding date with a epoch format.
394
395 :param string date: a date ASCTIME formatted
396 :returns: integer containing epoch date
397 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
398
399 The ASCTIME format is like this:
400
401.. code-block:: text
402
403 Sun Nov 6 08:49:37 1994
404..
405
406.. js:function:: core.rfc850_date(date)
407
408 **context**: body, init, task, action
409
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100410 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100411 containing the corresponding date with a epoch format.
412
413 :param string date: a date http-date formatted
414
415.. js:function:: core.asctime_date(date)
416
417 **context**: body, init, task, action
418
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100419 This function take a string representing http date, and returns an integer
Thierry FOURNIERa78f0372016-12-14 19:04:41 +0100420 containing the corresponding date with a epoch format.
421
422 :param string date: a date http-date formatted
423
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100424.. js:function:: core.msleep(milliseconds)
425
426 **context**: body, init, task, action
427
428 The `core.msleep()` stops the Lua execution between specified milliseconds.
429
430 :param integer milliseconds: the required milliseconds.
431
Thierry Fournierf61aa632016-02-19 20:56:00 +0100432.. js:attribute:: core.proxies
433
434 **context**: body, init, task, action, sample-fetch, converter
435
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100436 Proxies is a table containing the list of all proxies declared in the
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400437 configuration file. The table is indexed by the proxy name, and each entry
438 of the proxies table is an object of type :ref:`proxy_class`.
439
440 Warning, if you have declared a frontend and backend with the same name, only
441 one of these are listed.
Thierry Fournierf61aa632016-02-19 20:56:00 +0100442
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100443.. js:function:: core.register_action(name, actions, func [, nb_args])
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200444
445 **context**: body
446
David Carlier61fdf8b2015-10-02 11:59:38 +0100447 Register a Lua function executed as action. All the registered action can be
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200448 used in HAProxy with the prefix "lua.". An action gets a TXN object class as
449 input.
450
451 :param string name: is the name of the converter.
Willy Tarreau61add3c2015-09-28 15:39:10 +0200452 :param table actions: is a table of string describing the HAProxy actions who
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200453 want to register to. The expected actions are 'tcp-req',
454 'tcp-res', 'http-req' or 'http-res'.
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100455 :param integer nb_args: is the expected number of argument for the action.
456 By default the value is 0.
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200457 :param function func: is the Lua function called to work as converter.
458
459 The prototype of the Lua function used as argument is:
460
461.. code-block:: lua
462
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100463 function(txn [, arg1 [, arg2]])
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200464..
465
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100466 * **txn** (:ref:`txn_class`): this is a TXN object used for manipulating the
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200467 current request or TCP stream.
468
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100469 * **argX**: this is argument provided through the HAProxy configuration file.
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100470
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100471 Here, an example of action registration. The action just send an 'Hello world'
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200472 in the logs.
473
474.. code-block:: lua
475
476 core.register_action("hello-world", { "tcp-req", "http-req" }, function(txn)
477 txn:Info("Hello world")
478 end)
479..
480
481 This example code is used in HAproxy configuration like this:
482
483::
484
485 frontend tcp_frt
486 mode tcp
487 tcp-request content lua.hello-world
488
489 frontend http_frt
490 mode http
491 http-request lua.hello-world
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100492..
493
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100494 A second example using arguments
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100495
496.. code-block:: lua
497
498 function hello_world(txn, arg)
499 txn:Info("Hello world for " .. arg)
500 end
501 core.register_action("hello-world", { "tcp-req", "http-req" }, hello_world, 2)
502..
Thierry FOURNIER8255a752015-09-23 21:03:35 +0200503
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100504 This example code is used in HAproxy configuration like this:
505
506::
507
508 frontend tcp_frt
509 mode tcp
510 tcp-request content lua.hello-world everybody
511..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100512.. js:function:: core.register_converters(name, func)
513
514 **context**: body
515
David Carlier61fdf8b2015-10-02 11:59:38 +0100516 Register a Lua function executed as converter. All the registered converters
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100517 can be used in HAProxy with the prefix "lua.". An converter get a string as
518 input and return a string as output. The registered function can take up to 9
519 values as parameter. All the value are strings.
520
521 :param string name: is the name of the converter.
522 :param function func: is the Lua function called to work as converter.
523
524 The prototype of the Lua function used as argument is:
525
526.. code-block:: lua
527
528 function(str, [p1 [, p2 [, ... [, p5]]]])
529..
530
531 * **str** (*string*): this is the input value automatically converted in
532 string.
533 * **p1** .. **p5** (*string*): this is a list of string arguments declared in
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100534 the HAProxy configuration file. The number of arguments doesn't exceed 5.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100535 The order and the nature of these is conventionally choose by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100536 developer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100537
538.. js:function:: core.register_fetches(name, func)
539
540 **context**: body
541
David Carlier61fdf8b2015-10-02 11:59:38 +0100542 Register a Lua function executed as sample fetch. All the registered sample
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100543 fetch can be used in HAProxy with the prefix "lua.". A Lua sample fetch
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100544 return a string as output. The registered function can take up to 9 values as
545 parameter. All the value are strings.
546
547 :param string name: is the name of the converter.
548 :param function func: is the Lua function called to work as sample fetch.
549
550 The prototype of the Lua function used as argument is:
551
552.. code-block:: lua
553
554 string function(txn, [p1 [, p2 [, ... [, p5]]]])
555..
556
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100557 * **txn** (:ref:`txn_class`): this is the txn object associated with the current
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100558 request.
559 * **p1** .. **p5** (*string*): this is a list of string arguments declared in
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100560 the HAProxy configuration file. The number of arguments doesn't exceed 5.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100561 The order and the nature of these is conventionally choose by the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100562 developer.
563 * **Returns**: A string containing some data, or nil if the value cannot be
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100564 returned now.
565
566 lua example code:
567
568.. code-block:: lua
569
570 core.register_fetches("hello", function(txn)
571 return "hello"
572 end)
573..
574
575 HAProxy example configuration:
576
577::
578
579 frontend example
580 http-request redirect location /%[lua.hello]
581
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200582.. js:function:: core.register_service(name, mode, func)
583
584 **context**: body
585
David Carlier61fdf8b2015-10-02 11:59:38 +0100586 Register a Lua function executed as a service. All the registered service can
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200587 be used in HAProxy with the prefix "lua.". A service gets an object class as
588 input according with the required mode.
589
590 :param string name: is the name of the converter.
Willy Tarreau61add3c2015-09-28 15:39:10 +0200591 :param string mode: is string describing the required mode. Only 'tcp' or
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200592 'http' are allowed.
593 :param function func: is the Lua function called to work as converter.
594
595 The prototype of the Lua function used as argument is:
596
597.. code-block:: lua
598
599 function(applet)
600..
601
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100602 * **applet** *applet* will be a :ref:`applettcp_class` or a
603 :ref:`applethttp_class`. It depends the type of registered applet. An applet
604 registered with the 'http' value for the *mode* parameter will gets a
605 :ref:`applethttp_class`. If the *mode* value is 'tcp', the applet will gets
606 a :ref:`applettcp_class`.
607
608 **warning**: Applets of type 'http' cannot be called from 'tcp-*'
609 rulesets. Only the 'http-*' rulesets are authorized, this means
610 that is not possible to call an HTTP applet from a proxy in tcp
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100611 mode. Applets of type 'tcp' can be called from anywhere.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200612
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100613 Here, an example of service registration. The service just send an 'Hello world'
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200614 as an http response.
615
616.. code-block:: lua
617
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100618 core.register_service("hello-world", "http", function(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200619 local response = "Hello World !"
620 applet:set_status(200)
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +0200621 applet:add_header("content-length", string.len(response))
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200622 applet:add_header("content-type", "text/plain")
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +0200623 applet:start_response()
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200624 applet:send(response)
625 end)
626..
627
628 This example code is used in HAproxy configuration like this:
629
630::
631
632 frontend example
633 http-request use-service lua.hello-world
634
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100635.. js:function:: core.register_init(func)
636
637 **context**: body
638
639 Register a function executed after the configuration parsing. This is useful
640 to check any parameters.
641
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100642 :param function func: is the Lua function called to work as initializer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100643
644 The prototype of the Lua function used as argument is:
645
646.. code-block:: lua
647
648 function()
649..
650
651 It takes no input, and no output is expected.
652
653.. js:function:: core.register_task(func)
654
655 **context**: body, init, task, action, sample-fetch, converter
656
657 Register and start independent task. The task is started when the HAProxy
658 main scheduler starts. For example this type of tasks can be executed to
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +0100659 perform complex health checks.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100660
Pieter Baauw4d7f7662015-11-08 16:38:08 +0100661 :param function func: is the Lua function called to work as initializer.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100662
663 The prototype of the Lua function used as argument is:
664
665.. code-block:: lua
666
667 function()
668..
669
670 It takes no input, and no output is expected.
671
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100672.. js:function:: core.register_cli([path], usage, func)
673
674 **context**: body
675
676 Register and start independent task. The task is started when the HAProxy
677 main scheduler starts. For example this type of tasks can be executed to
678 perform complex health checks.
679
680 :param array path: is the sequence of word for which the cli execute the Lua
681 binding.
682 :param string usage: is the usage message displayed in the help.
683 :param function func: is the Lua function called to handle the CLI commands.
684
685 The prototype of the Lua function used as argument is:
686
687.. code-block:: lua
688
689 function(AppletTCP, [arg1, [arg2, [...]]])
690..
691
692 I/O are managed with the :ref:`applettcp_class` object. Args are given as
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100693 parameter. The args embed the registered path. If the path is declared like
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100694 this:
695
696.. code-block:: lua
697
698 core.register_cli({"show", "ssl", "stats"}, "Display SSL stats..", function(applet, arg1, arg2, arg3, arg4, arg5)
699 end)
700..
701
702 And we execute this in the prompt:
703
704.. code-block:: text
705
706 > prompt
707 > show ssl stats all
708..
709
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100710 Then, arg1, arg2 and arg3 will contains respectively "show", "ssl" and "stats".
Thierry FOURNIER / OZON.IOa44fdd92016-11-13 13:19:20 +0100711 arg4 will contain "all". arg5 contains nil.
712
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100713.. js:function:: core.set_nice(nice)
714
715 **context**: task, action, sample-fetch, converter
716
717 Change the nice of the current task or current session.
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +0100718
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100719 :param integer nice: the nice value, it must be between -1024 and 1024.
720
721.. js:function:: core.set_map(filename, key, value)
722
723 **context**: init, task, action, sample-fetch, converter
724
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100725 Set the value *value* associated to the key *key* in the map referenced by
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100726 *filename*.
727
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100728 :param string filename: the Map reference
729 :param string key: the key to set or replace
730 :param string value: the associated value
731
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100732.. js:function:: core.sleep(int seconds)
733
734 **context**: body, init, task, action
735
736 The `core.sleep()` functions stop the Lua execution between specified seconds.
737
738 :param integer seconds: the required seconds.
739
740.. js:function:: core.tcp()
741
742 **context**: init, task, action
743
744 This function returns a new object of a *socket* class.
745
Thierry FOURNIERdc595002015-12-21 11:13:52 +0100746 :returns: A :ref:`socket_class` object.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100747
Thierry Fournier1de16592016-01-27 09:49:07 +0100748.. js:function:: core.concat()
749
750 **context**: body, init, task, action, sample-fetch, converter
751
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100752 This function returns a new concat object.
Thierry Fournier1de16592016-01-27 09:49:07 +0100753
754 :returns: A :ref:`concat_class` object.
755
Thierry FOURNIER0a99b892015-08-26 00:14:17 +0200756.. js:function:: core.done(data)
757
758 **context**: body, init, task, action, sample-fetch, converter
759
760 :param any data: Return some data for the caller. It is useful with
761 sample-fetches and sample-converters.
762
763 Immediately stops the current Lua execution and returns to the caller which
764 may be a sample fetch, a converter or an action and returns the specified
765 value (ignored for actions). It is used when the LUA process finishes its
766 work and wants to give back the control to HAProxy without executing the
767 remaining code. It can be seen as a multi-level "return".
768
Thierry FOURNIER486f5a02015-03-16 15:13:03 +0100769.. js:function:: core.yield()
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100770
771 **context**: task, action, sample-fetch, converter
772
773 Give back the hand at the HAProxy scheduler. It is used when the LUA
774 processing consumes a lot of processing time.
775
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100776.. js:function:: core.parse_addr(address)
777
778 **context**: body, init, task, action, sample-fetch, converter
779
780 :param network: is a string describing an ipv4 or ipv6 address and optionally
781 its network length, like this: "127.0.0.1/8" or "aaaa::1234/32".
782 :returns: a userdata containing network or nil if an error occurs.
783
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100784 Parse ipv4 or ipv6 addresses and its facultative associated network.
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100785
786.. js:function:: core.match_addr(addr1, addr2)
787
788 **context**: body, init, task, action, sample-fetch, converter
789
790 :param addr1: is an address created with "core.parse_addr".
791 :param addr2: is an address created with "core.parse_addr".
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100792 :returns: boolean, true if the network of the addresses match, else returns
Thierry FOURNIER / OZON.IO62fec752016-11-10 20:38:11 +0100793 false.
794
795 Match two networks. For example "127.0.0.1/32" matchs "127.0.0.0/8". The order
796 of network is not important.
797
Thierry FOURNIER / OZON.IO8a1027a2016-11-24 20:48:38 +0100798.. js:function:: core.tokenize(str, separators [, noblank])
799
800 **context**: body, init, task, action, sample-fetch, converter
801
802 This function is useful for tokenizing an entry, or splitting some messages.
803 :param string str: The string which will be split.
804 :param string separators: A string containing a list of separators.
805 :param boolean noblank: Ignore empty entries.
806 :returns: an array of string.
807
808 For example:
809
810.. code-block:: lua
811
812 local array = core.tokenize("This function is useful, for tokenizing an entry.", "., ", true)
813 print_r(array)
814..
815
816 Returns this array:
817
818.. code-block:: text
819
820 (table) table: 0x21c01e0 [
821 1: (string) "This"
822 2: (string) "function"
823 3: (string) "is"
824 4: (string) "useful"
825 5: (string) "for"
826 6: (string) "tokenizing"
827 7: (string) "an"
828 8: (string) "entry"
829 ]
830..
831
Thierry Fournierf61aa632016-02-19 20:56:00 +0100832.. _proxy_class:
833
834Proxy class
835============
836
837.. js:class:: Proxy
838
839 This class provides a way for manipulating proxy and retrieving information
840 like statistics.
841
Thierry FOURNIER817e7592017-07-24 14:35:04 +0200842.. js:attribute:: Proxy.name
843
844 Contain the name of the proxy.
845
Baptiste Assmann46c72552017-10-26 21:51:58 +0200846.. js:attribute:: Proxy.uuid
847
848 Contain the unique identifier of the proxy.
849
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100850.. js:attribute:: Proxy.servers
851
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400852 Contain a table with the attached servers. The table is indexed by server
853 name, and each server entry is an object of type :ref:`server_class`.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100854
Thierry Fournierff480422016-02-25 08:36:46 +0100855.. js:attribute:: Proxy.listeners
856
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400857 Contain a table with the attached listeners. The table is indexed by listener
858 name, and each each listeners entry is an object of type
859 :ref:`listener_class`.
Thierry Fournierff480422016-02-25 08:36:46 +0100860
Thierry Fournierf61aa632016-02-19 20:56:00 +0100861.. js:function:: Proxy.pause(px)
862
863 Pause the proxy. See the management socket documentation for more information.
864
865 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
866 proxy.
867
868.. js:function:: Proxy.resume(px)
869
870 Resume the proxy. See the management socket documentation for more
871 information.
872
873 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
874 proxy.
875
876.. js:function:: Proxy.stop(px)
877
878 Stop the proxy. See the management socket documentation for more information.
879
880 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
881 proxy.
882
883.. js:function:: Proxy.shut_bcksess(px)
884
885 Kill the session attached to a backup server. See the management socket
886 documentation for more information.
887
888 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
889 proxy.
890
891.. js:function:: Proxy.get_cap(px)
892
893 Returns a string describing the capabilities of the proxy.
894
895 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
896 proxy.
897 :returns: a string "frontend", "backend", "proxy" or "ruleset".
898
899.. js:function:: Proxy.get_mode(px)
900
901 Returns a string describing the mode of the current proxy.
902
903 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
904 proxy.
905 :returns: a string "tcp", "http", "health" or "unknown"
906
907.. js:function:: Proxy.get_stats(px)
908
Bertrand Jacquin874a35c2018-09-10 21:26:07 +0100909 Returns a table containing the proxy statistics. The statistics returned are
Thierry Fournierf61aa632016-02-19 20:56:00 +0100910 not the same if the proxy is frontend or a backend.
911
912 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated
913 proxy.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400914 :returns: a key/value table containing stats
Thierry Fournierf61aa632016-02-19 20:56:00 +0100915
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100916.. _server_class:
917
918Server class
919============
920
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400921.. js:class:: Server
922
923 This class provides a way for manipulating servers and retrieving information.
924
Patrick Hemmera62ae7e2018-04-29 14:23:48 -0400925.. js:attribute:: Server.name
926
927 Contain the name of the server.
928
929.. js:attribute:: Server.puid
930
931 Contain the proxy unique identifier of the server.
932
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100933.. js:function:: Server.is_draining(sv)
934
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400935 Return true if the server is currently draining sticky connections.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100936
937 :param class_server sv: A :ref:`server_class` which indicates the manipulated
938 server.
939 :returns: a boolean
940
Patrick Hemmer32d539f2018-04-29 14:25:46 -0400941.. js:function:: Server.set_maxconn(sv, weight)
942
943 Dynamically change the maximum connections of the server. See the management
944 socket documentation for more information about the format of the string.
945
946 :param class_server sv: A :ref:`server_class` which indicates the manipulated
947 server.
948 :param string maxconn: A string describing the server maximum connections.
949
950.. js:function:: Server.get_maxconn(sv, weight)
951
952 This function returns an integer representing the server maximum connections.
953
954 :param class_server sv: A :ref:`server_class` which indicates the manipulated
955 server.
956 :returns: an integer.
957
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100958.. js:function:: Server.set_weight(sv, weight)
959
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400960 Dynamically change the weight of the server. See the management socket
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100961 documentation for more information about the format of the string.
962
963 :param class_server sv: A :ref:`server_class` which indicates the manipulated
964 server.
965 :param string weight: A string describing the server weight.
966
967.. js:function:: Server.get_weight(sv)
968
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400969 This function returns an integer representing the server weight.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100970
971 :param class_server sv: A :ref:`server_class` which indicates the manipulated
972 server.
973 :returns: an integer.
974
975.. js:function:: Server.set_addr(sv, addr)
976
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400977 Dynamically change the address of the server. See the management socket
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100978 documentation for more information about the format of the string.
979
980 :param class_server sv: A :ref:`server_class` which indicates the manipulated
981 server.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400982 :param string addr: A string describing the server address.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100983
984.. js:function:: Server.get_addr(sv)
985
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400986 Returns a string describing the address of the server.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100987
988 :param class_server sv: A :ref:`server_class` which indicates the manipulated
989 server.
990 :returns: A string
991
992.. js:function:: Server.get_stats(sv)
993
994 Returns server statistics.
995
996 :param class_server sv: A :ref:`server_class` which indicates the manipulated
997 server.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400998 :returns: a key/value table containing stats
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100999
1000.. js:function:: Server.shut_sess(sv)
1001
1002 Shutdown all the sessions attached to the server. See the management socket
1003 documentation for more information about this function.
1004
1005 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1006 server.
1007
1008.. js:function:: Server.set_drain(sv)
1009
1010 Drain sticky sessions. See the management socket documentation for more
1011 information about this function.
1012
1013 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1014 server.
1015
1016.. js:function:: Server.set_maint(sv)
1017
1018 Set maintenance mode. See the management socket documentation for more
1019 information about this function.
1020
1021 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1022 server.
1023
1024.. js:function:: Server.set_ready(sv)
1025
1026 Set normal mode. See the management socket documentation for more information
1027 about this function.
1028
1029 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1030 server.
1031
1032.. js:function:: Server.check_enable(sv)
1033
1034 Enable health checks. See the management socket documentation for more
1035 information about this function.
1036
1037 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1038 server.
1039
1040.. js:function:: Server.check_disable(sv)
1041
1042 Disable health checks. See the management socket documentation for more
1043 information about this function.
1044
1045 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1046 server.
1047
1048.. js:function:: Server.check_force_up(sv)
1049
1050 Force health-check up. See the management socket documentation for more
1051 information about this function.
1052
1053 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1054 server.
1055
1056.. js:function:: Server.check_force_nolb(sv)
1057
1058 Force health-check nolb mode. See the management socket documentation for more
1059 information about this function.
1060
1061 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1062 server.
1063
1064.. js:function:: Server.check_force_down(sv)
1065
1066 Force health-check down. See the management socket documentation for more
1067 information about this function.
1068
1069 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1070 server.
1071
1072.. js:function:: Server.agent_enable(sv)
1073
1074 Enable agent check. See the management socket documentation for more
1075 information about this function.
1076
1077 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1078 server.
1079
1080.. js:function:: Server.agent_disable(sv)
1081
1082 Disable agent check. See the management socket documentation for more
1083 information about this function.
1084
1085 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1086 server.
1087
1088.. js:function:: Server.agent_force_up(sv)
1089
1090 Force agent check up. See the management socket documentation for more
1091 information about this function.
1092
1093 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1094 server.
1095
1096.. js:function:: Server.agent_force_down(sv)
1097
1098 Force agent check down. See the management socket documentation for more
1099 information about this function.
1100
1101 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1102 server.
1103
Thierry Fournierff480422016-02-25 08:36:46 +01001104.. _listener_class:
1105
1106Listener class
1107==============
1108
1109.. js:function:: Listener.get_stats(ls)
1110
1111 Returns server statistics.
1112
1113 :param class_listener ls: A :ref:`listener_class` which indicates the
1114 manipulated listener.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001115 :returns: a key/value table containing stats
Thierry Fournierff480422016-02-25 08:36:46 +01001116
Thierry Fournier1de16592016-01-27 09:49:07 +01001117.. _concat_class:
1118
1119Concat class
1120============
1121
1122.. js:class:: Concat
1123
1124 This class provides a fast way for string concatenation. The way using native
1125 Lua concatenation like the code below is slow for some reasons.
1126
1127.. code-block:: lua
1128
1129 str = "string1"
1130 str = str .. ", string2"
1131 str = str .. ", string3"
1132..
1133
1134 For each concatenation, Lua:
1135 * allocate memory for the result,
1136 * catenate the two string copying the strings in the new memory bloc,
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001137 * free the old memory block containing the string which is no longer used.
Thierry Fournier1de16592016-01-27 09:49:07 +01001138 This process does many memory move, allocation and free. In addition, the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001139 memory is not really freed, it is just mark mark as unused and wait for the
Thierry Fournier1de16592016-01-27 09:49:07 +01001140 garbage collector.
1141
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001142 The Concat class provide an alternative way to concatenate strings. It uses
Thierry Fournier1de16592016-01-27 09:49:07 +01001143 the internal Lua mechanism (it does not allocate memory), but it doesn't copy
1144 the data more than once.
1145
1146 On my computer, the following loops spends 0.2s for the Concat method and
1147 18.5s for the pure Lua implementation. So, the Concat class is about 1000x
1148 faster than the embedded solution.
1149
1150.. code-block:: lua
1151
1152 for j = 1, 100 do
1153 c = core.concat()
1154 for i = 1, 20000 do
1155 c:add("#####")
1156 end
1157 end
1158..
1159
1160.. code-block:: lua
1161
1162 for j = 1, 100 do
1163 c = ""
1164 for i = 1, 20000 do
1165 c = c .. "#####"
1166 end
1167 end
1168..
1169
1170.. js:function:: Concat.add(concat, string)
1171
1172 This function adds a string to the current concatenated string.
1173
1174 :param class_concat concat: A :ref:`concat_class` which contains the currently
1175 builded string.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001176 :param string string: A new string to concatenate to the current built
Thierry Fournier1de16592016-01-27 09:49:07 +01001177 string.
1178
1179.. js:function:: Concat.dump(concat)
1180
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001181 This function returns the concatenated string.
Thierry Fournier1de16592016-01-27 09:49:07 +01001182
1183 :param class_concat concat: A :ref:`concat_class` which contains the currently
1184 builded string.
1185 :returns: the concatenated string
1186
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001187.. _fetches_class:
1188
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001189Fetches class
1190=============
1191
1192.. js:class:: Fetches
1193
1194 This class contains a lot of internal HAProxy sample fetches. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001195 HAProxy "configuration.txt" documentation for more information about her
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001196 usage. They are the chapters 7.3.2 to 7.3.6.
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001197
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001198 **warning** some sample fetches are not available in some context. These
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001199 limitations are specified in this documentation when they're useful.
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001200
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001201 :see: :js:attr:`TXN.f`
1202 :see: :js:attr:`TXN.sf`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001203
1204 Fetches are useful for:
1205
1206 * get system time,
1207 * get environment variable,
1208 * get random numbers,
1209 * known backend status like the number of users in queue or the number of
1210 connections established,
1211 * client information like ip source or destination,
1212 * deal with stick tables,
1213 * Established SSL informations,
1214 * HTTP information like headers or method.
1215
1216.. code-block:: lua
1217
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001218 function action(txn)
1219 -- Get source IP
1220 local clientip = txn.f:src()
1221 end
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001222..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001223
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001224.. _converters_class:
1225
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001226Converters class
1227================
1228
1229.. js:class:: Converters
1230
1231 This class contains a lot of internal HAProxy sample converters. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001232 HAProxy documentation "configuration.txt" for more information about her
1233 usage. Its the chapter 7.3.1.
1234
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001235 :see: :js:attr:`TXN.c`
1236 :see: :js:attr:`TXN.sc`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001237
1238 Converters provides statefull transformation. They are useful for:
1239
1240 * converting input to base64,
1241 * applying hash on input string (djb2, crc32, sdbm, wt6),
1242 * format date,
1243 * json escape,
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001244 * extracting preferred language comparing two lists,
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001245 * turn to lower or upper chars,
1246 * deal with stick tables.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001247
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001248.. _channel_class:
1249
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001250Channel class
1251=============
1252
1253.. js:class:: Channel
1254
1255 HAProxy uses two buffers for the processing of the requests. The first one is
1256 used with the request data (from the client to the server) and the second is
1257 used for the response data (from the server to the client).
1258
1259 Each buffer contains two types of data. The first type is the incoming data
1260 waiting for a processing. The second part is the outgoing data already
1261 processed. Usually, the incoming data is processed, after it is tagged as
1262 outgoing data, and finally it is sent. The following functions provides tools
1263 for manipulating these data in a buffer.
1264
1265 The following diagram shows where the channel class function are applied.
1266
1267 **Warning**: It is not possible to read from the response in request action,
1268 and it is not possible to read for the request channel in response action.
1269
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001270.. image:: _static/channel.png
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001271
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001272.. js:function:: Channel.dup(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001273
1274 This function returns a string that contain the entire buffer. The data is
1275 not remove from the buffer and can be reprocessed later.
1276
1277 If the buffer cant receive more data, a 'nil' value is returned.
1278
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001279 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001280 :returns: a string containing all the available data or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001281
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001282.. js:function:: Channel.get(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001283
1284 This function returns a string that contain the entire buffer. The data is
1285 consumed from the buffer.
1286
1287 If the buffer cant receive more data, a 'nil' value is returned.
1288
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001289 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001290 :returns: a string containing all the available data or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001291
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001292.. js:function:: Channel.getline(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001293
1294 This function returns a string that contain the first line of the buffer. The
1295 data is consumed. If the data returned doesn't contains a final '\n' its
1296 assumed than its the last available data in the buffer.
1297
1298 If the buffer cant receive more data, a 'nil' value is returned.
1299
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001300 :param class_channel channel: The manipulated Channel.
Pieter Baauw386a1272015-08-16 15:26:24 +02001301 :returns: a string containing the available line or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001302
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001303.. js:function:: Channel.set(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001304
1305 This function replace the content of the buffer by the string. The function
1306 returns the copied length, otherwise, it returns -1.
1307
1308 The data set with this function are not send. They wait for the end of
1309 HAProxy processing, so the buffer can be full.
1310
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001311 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001312 :param string string: The data which will sent.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001313 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001314
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001315.. js:function:: Channel.append(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001316
1317 This function append the string argument to the content of the buffer. The
1318 function returns the copied length, otherwise, it returns -1.
1319
1320 The data set with this function are not send. They wait for the end of
1321 HAProxy processing, so the buffer can be full.
1322
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001323 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001324 :param string string: The data which will sent.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001325 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001326
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001327.. js:function:: Channel.send(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001328
1329 This function required immediate send of the data. Unless if the connection
1330 is close, the buffer is regularly flushed and all the string can be sent.
1331
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001332 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001333 :param string string: The data which will sent.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001334 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001335
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001336.. js:function:: Channel.get_in_length(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001337
1338 This function returns the length of the input part of the buffer.
1339
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001340 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001341 :returns: an integer containing the amount of available bytes.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001342
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001343.. js:function:: Channel.get_out_length(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001344
1345 This function returns the length of the output part of the buffer.
1346
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001347 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001348 :returns: an integer containing the amount of available bytes.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001349
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001350.. js:function:: Channel.forward(channel, int)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001351
1352 This function transfer bytes from the input part of the buffer to the output
1353 part.
1354
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001355 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001356 :param integer int: The amount of data which will be forwarded.
1357
Thierry FOURNIER / OZON.IO65192f32016-11-07 15:28:40 +01001358.. js:function:: Channel.is_full(channel)
1359
1360 This function returns true if the buffer channel is full.
1361
1362 :returns: a boolean
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001363
1364.. _http_class:
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001365
1366HTTP class
1367==========
1368
1369.. js:class:: HTTP
1370
1371 This class contain all the HTTP manipulation functions.
1372
Pieter Baauw386a1272015-08-16 15:26:24 +02001373.. js:function:: HTTP.req_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001374
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001375 Returns a table containing all the request headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001376
1377 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001378 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001379 :see: :js:func:`HTTP.res_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001380
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001381 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001382
1383.. code-block:: lua
1384
1385 HTTP:req_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1386
1387 local hdr = HTTP:req_get_headers()
1388 hdr["host"][0] = "www.test.com"
1389 hdr["accept"][0] = "audio/basic q=1"
1390 hdr["accept"][1] = "audio/*, q=0.2"
1391 hdr["accept"][2] = "*/*, q=0.1"
1392..
1393
Pieter Baauw386a1272015-08-16 15:26:24 +02001394.. js:function:: HTTP.res_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001395
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001396 Returns a table containing all the response headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001397
1398 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001399 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001400 :see: :js:func:`HTTP.req_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001401
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001402 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001403
1404.. code-block:: lua
1405
1406 HTTP:res_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1407
1408 local hdr = HTTP:req_get_headers()
1409 hdr["host"][0] = "www.test.com"
1410 hdr["accept"][0] = "audio/basic q=1"
1411 hdr["accept"][1] = "audio/*, q=0.2"
1412 hdr["accept"][2] = "*.*, q=0.1"
1413..
1414
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001415.. js:function:: HTTP.req_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001416
1417 Appends an HTTP header field in the request whose name is
1418 specified in "name" and whose value is defined in "value".
1419
1420 :param class_http http: The related http object.
1421 :param string name: The header name.
1422 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001423 :see: :js:func:`HTTP.res_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001424
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001425.. js:function:: HTTP.res_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001426
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001427 Appends an HTTP header field in the response whose name is
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001428 specified in "name" and whose value is defined in "value".
1429
1430 :param class_http http: The related http object.
1431 :param string name: The header name.
1432 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001433 :see: :js:func:`HTTP.req_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001434
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001435.. js:function:: HTTP.req_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001436
1437 Removes all HTTP header fields in the request whose name is
1438 specified in "name".
1439
1440 :param class_http http: The related http object.
1441 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001442 :see: :js:func:`HTTP.res_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001443
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001444.. js:function:: HTTP.res_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001445
1446 Removes all HTTP header fields in the response whose name is
1447 specified in "name".
1448
1449 :param class_http http: The related http object.
1450 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001451 :see: :js:func:`HTTP.req_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001452
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001453.. js:function:: HTTP.req_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001454
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001455 This variable replace all occurrence of all header "name", by only
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001456 one containing the "value".
1457
1458 :param class_http http: The related http object.
1459 :param string name: The header name.
1460 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001461 :see: :js:func:`HTTP.res_set_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001462
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001463 This function does the same work as the following code:
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001464
1465.. code-block:: lua
1466
1467 function fcn(txn)
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001468 TXN.http:req_del_header("header")
1469 TXN.http:req_add_header("header", "value")
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001470 end
1471..
1472
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001473.. js:function:: HTTP.res_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001474
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001475 This variable replace all occurrence of all header "name", by only
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001476 one containing the "value".
1477
1478 :param class_http http: The related http object.
1479 :param string name: The header name.
1480 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001481 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001482
Pieter Baauw386a1272015-08-16 15:26:24 +02001483.. js:function:: HTTP.req_rep_header(http, name, regex, replace)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001484
1485 Matches the regular expression in all occurrences of header field "name"
1486 according to "regex", and replaces them with the "replace" argument. The
1487 replacement value can contain back references like \1, \2, ... This
1488 function works with the request.
1489
1490 :param class_http http: The related http object.
1491 :param string name: The header name.
1492 :param string regex: The match regular expression.
1493 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001494 :see: :js:func:`HTTP.res_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001495
Pieter Baauw386a1272015-08-16 15:26:24 +02001496.. js:function:: HTTP.res_rep_header(http, name, regex, string)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001497
1498 Matches the regular expression in all occurrences of header field "name"
1499 according to "regex", and replaces them with the "replace" argument. The
1500 replacement value can contain back references like \1, \2, ... This
1501 function works with the request.
1502
1503 :param class_http http: The related http object.
1504 :param string name: The header name.
1505 :param string regex: The match regular expression.
1506 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001507 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001508
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001509.. js:function:: HTTP.req_set_method(http, method)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001510
1511 Rewrites the request method with the parameter "method".
1512
1513 :param class_http http: The related http object.
1514 :param string method: The new method.
1515
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001516.. js:function:: HTTP.req_set_path(http, path)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001517
1518 Rewrites the request path with the "path" parameter.
1519
1520 :param class_http http: The related http object.
1521 :param string path: The new path.
1522
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001523.. js:function:: HTTP.req_set_query(http, query)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001524
1525 Rewrites the request's query string which appears after the first question
1526 mark ("?") with the parameter "query".
1527
1528 :param class_http http: The related http object.
1529 :param string query: The new query.
1530
Thierry FOURNIER0d79cf62015-08-26 14:20:58 +02001531.. js:function:: HTTP.req_set_uri(http, uri)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001532
1533 Rewrites the request URI with the parameter "uri".
1534
1535 :param class_http http: The related http object.
1536 :param string uri: The new uri.
1537
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001538.. js:function:: HTTP.res_set_status(http, status [, reason])
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001539
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001540 Rewrites the response status code with the parameter "code".
1541
1542 If no custom reason is provided, it will be generated from the status.
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001543
1544 :param class_http http: The related http object.
1545 :param integer status: The new response status code.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001546 :param string reason: The new response reason (optional).
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001547
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001548.. _txn_class:
1549
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001550TXN class
1551=========
1552
1553.. js:class:: TXN
1554
1555 The txn class contain all the functions relative to the http or tcp
1556 transaction (Note than a tcp stream is the same than a tcp transaction, but
1557 an HTTP transaction is not the same than a tcp stream).
1558
1559 The usage of this class permits to retrieve data from the requests, alter it
1560 and forward it.
1561
1562 All the functions provided by this class are available in the context
1563 **sample-fetches** and **actions**.
1564
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001565.. js:attribute:: TXN.c
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001566
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001567 :returns: An :ref:`converters_class`.
1568
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001569 This attribute contains a Converters class object.
1570
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001571.. js:attribute:: TXN.sc
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001572
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001573 :returns: An :ref:`converters_class`.
1574
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001575 This attribute contains a Converters class object. The functions of
1576 this object returns always a string.
1577
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001578.. js:attribute:: TXN.f
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001579
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001580 :returns: An :ref:`fetches_class`.
1581
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001582 This attribute contains a Fetches class object.
1583
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001584.. js:attribute:: TXN.sf
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001585
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001586 :returns: An :ref:`fetches_class`.
1587
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001588 This attribute contains a Fetches class object. The functions of
1589 this object returns always a string.
1590
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001591.. js:attribute:: TXN.req
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001592
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001593 :returns: An :ref:`channel_class`.
1594
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001595 This attribute contains a channel class object for the request buffer.
1596
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001597.. js:attribute:: TXN.res
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001598
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001599 :returns: An :ref:`channel_class`.
1600
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001601 This attribute contains a channel class object for the response buffer.
1602
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001603.. js:attribute:: TXN.http
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001604
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001605 :returns: An :ref:`http_class`.
1606
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001607 This attribute contains an HTTP class object. It is available only if the
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001608 proxy has the "mode http" enabled.
1609
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001610.. js:function:: TXN.log(TXN, loglevel, msg)
1611
1612 This function sends a log. The log is sent, according with the HAProxy
1613 configuration file, on the default syslog server if it is configured and on
1614 the stderr if it is allowed.
1615
1616 :param class_txn txn: The class txn object containing the data.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001617 :param integer loglevel: Is the log level associated with the message. It is a
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001618 number between 0 and 7.
1619 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001620 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
1621 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
1622 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
1623 :see: :js:func:`TXN.deflog`
1624 :see: :js:func:`TXN.Debug`
1625 :see: :js:func:`TXN.Info`
1626 :see: :js:func:`TXN.Warning`
1627 :see: :js:func:`TXN.Alert`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001628
1629.. js:function:: TXN.deflog(TXN, msg)
1630
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001631 Sends a log line with the default loglevel for the proxy associated with the
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001632 transaction.
1633
1634 :param class_txn txn: The class txn object containing the data.
1635 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001636 :see: :js:func:`TXN.log
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001637
1638.. js:function:: TXN.Debug(txn, msg)
1639
1640 :param class_txn txn: The class txn object containing the data.
1641 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001642 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001643
1644 Does the same job than:
1645
1646.. code-block:: lua
1647
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001648 function Debug(txn, msg)
1649 TXN.log(txn, core.debug, msg)
1650 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001651..
1652
1653.. js:function:: TXN.Info(txn, msg)
1654
1655 :param class_txn txn: The class txn object containing the data.
1656 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001657 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001658
1659.. code-block:: lua
1660
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001661 function Debug(txn, msg)
1662 TXN.log(txn, core.info, msg)
1663 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001664..
1665
1666.. js:function:: TXN.Warning(txn, msg)
1667
1668 :param class_txn txn: The class txn object containing the data.
1669 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001670 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001671
1672.. code-block:: lua
1673
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001674 function Debug(txn, msg)
1675 TXN.log(txn, core.warning, msg)
1676 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001677..
1678
1679.. js:function:: TXN.Alert(txn, msg)
1680
1681 :param class_txn txn: The class txn object containing the data.
1682 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001683 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001684
1685.. code-block:: lua
1686
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001687 function Debug(txn, msg)
1688 TXN.log(txn, core.alert, msg)
1689 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001690..
1691
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001692.. js:function:: TXN.get_priv(txn)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001693
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001694 Return Lua data stored in the current transaction (with the `TXN.set_priv()`)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001695 function. If no data are stored, it returns a nil value.
1696
1697 :param class_txn txn: The class txn object containing the data.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001698 :returns: the opaque data previously stored, or nil if nothing is
1699 available.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001700
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001701.. js:function:: TXN.set_priv(txn, data)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001702
1703 Store any data in the current HAProxy transaction. This action replace the
1704 old stored data.
1705
1706 :param class_txn txn: The class txn object containing the data.
1707 :param opaque data: The data which is stored in the transaction.
1708
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001709.. js:function:: TXN.set_var(TXN, var, value)
1710
David Carlier61fdf8b2015-10-02 11:59:38 +01001711 Converts a Lua type in a HAProxy type and store it in a variable <var>.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001712
1713 :param class_txn txn: The class txn object containing the data.
1714 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER / OZON.IOb210bcc2016-12-12 16:24:16 +01001715 :param type value: The value associated to the variable. The type can be string or
1716 integer.
Christopher Faulet85d79c92016-11-09 16:54:56 +01001717
1718.. js:function:: TXN.unset_var(TXN, var)
1719
1720 Unset the variable <var>.
1721
1722 :param class_txn txn: The class txn object containing the data.
1723 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001724
1725.. js:function:: TXN.get_var(TXN, var)
1726
1727 Returns data stored in the variable <var> converter in Lua type.
1728
1729 :param class_txn txn: The class txn object containing the data.
1730 :param string var: The variable name according with the HAProxy variable syntax.
1731
Willy Tarreaubc183a62015-08-28 10:39:11 +02001732.. js:function:: TXN.done(txn)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001733
Willy Tarreaubc183a62015-08-28 10:39:11 +02001734 This function terminates processing of the transaction and the associated
1735 session. It can be used when a critical error is detected or to terminate
1736 processing after some data have been returned to the client (eg: a redirect).
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001737
Thierry FOURNIERab00df62016-07-14 11:42:37 +02001738 *Warning*: It not make sense to call this function from sample-fetches. In
1739 this case the behaviour of this one is the same than core.done(): it quit
1740 the Lua execution. The transaction is really aborted only from an action
1741 registered function.
1742
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001743 :param class_txn txn: The class txn object containing the data.
1744
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001745.. js:function:: TXN.set_loglevel(txn, loglevel)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001746
1747 Is used to change the log level of the current request. The "loglevel" must
1748 be an integer between 0 and 7.
1749
1750 :param class_txn txn: The class txn object containing the data.
1751 :param integer loglevel: The required log level. This variable can be one of
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001752 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
1753 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
1754 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001755
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001756.. js:function:: TXN.set_tos(txn, tos)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001757
1758 Is used to set the TOS or DSCP field value of packets sent to the client to
1759 the value passed in "tos" on platforms which support this.
1760
1761 :param class_txn txn: The class txn object containing the data.
1762 :param integer tos: The new TOS os DSCP.
1763
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001764.. js:function:: TXN.set_mark(txn, mark)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001765
1766 Is used to set the Netfilter MARK on all packets sent to the client to the
1767 value passed in "mark" on platforms which support it.
1768
1769 :param class_txn txn: The class txn object containing the data.
1770 :param integer mark: The mark value.
1771
Patrick Hemmer268a7072018-05-11 12:52:31 -04001772.. js:function:: TXN.set_priority_class(txn, prio)
1773
1774 This function adjusts the priority class of the transaction. The value should
1775 be within the range -2047..2047. Values outside this range will be
1776 truncated.
1777
1778 See the HAProxy configuration.txt file keyword "http-request" action
1779 "set-priority-class" for details.
1780
1781.. js:function:: TXN.set_priority_offset(txn, prio)
1782
1783 This function adjusts the priority offset of the transaction. The value
1784 should be within the range -524287..524287. Values outside this range will be
1785 truncated.
1786
1787 See the HAProxy configuration.txt file keyword "http-request" action
1788 "set-priority-offset" for details.
1789
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001790.. _socket_class:
1791
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001792Socket class
1793============
1794
1795.. js:class:: Socket
1796
1797 This class must be compatible with the Lua Socket class. Only the 'client'
1798 functions are available. See the Lua Socket documentation:
1799
1800 `http://w3.impa.br/~diego/software/luasocket/tcp.html
1801 <http://w3.impa.br/~diego/software/luasocket/tcp.html>`_
1802
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001803.. js:function:: Socket.close(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001804
1805 Closes a TCP object. The internal socket used by the object is closed and the
1806 local address to which the object was bound is made available to other
1807 applications. No further operations (except for further calls to the close
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001808 method) are allowed on a closed Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001809
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001810 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001811
1812 Note: It is important to close all used sockets once they are not needed,
1813 since, in many systems, each socket uses a file descriptor, which are limited
1814 system resources. Garbage-collected objects are automatically closed before
1815 destruction, though.
1816
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001817.. js:function:: Socket.connect(socket, address[, port])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001818
1819 Attempts to connect a socket object to a remote host.
1820
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001821
1822 In case of error, the method returns nil followed by a string describing the
1823 error. In case of success, the method returns 1.
1824
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001825 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001826 :param string address: can be an IP address or a host name. See below for more
1827 information.
1828 :param integer port: must be an integer number in the range [1..64K].
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001829 :returns: 1 or nil.
1830
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001831 An address field extension permits to use the connect() function to connect to
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001832 other stream than TCP. The syntax containing a simpleipv4 or ipv6 address is
1833 the basically expected format. This format requires the port.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001834
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001835 Other format accepted are a socket path like "/socket/path", it permits to
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001836 connect to a socket. Abstract namespaces are supported with the prefix
1837 "abns@", and finaly a file descriptor can be passed with the prefix "fd@".
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001838 The prefix "ipv4@", "ipv6@" and "unix@" are also supported. The port can be
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001839 passed int the string. The syntax "127.0.0.1:1234" is valid. In this case, the
Tim Duesterhus6edab862018-01-06 19:04:45 +01001840 parameter *port* must not be set.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001841
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001842.. js:function:: Socket.connect_ssl(socket, address, port)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001843
1844 Same behavior than the function socket:connect, but uses SSL.
1845
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001846 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001847 :returns: 1 or nil.
1848
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001849.. js:function:: Socket.getpeername(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001850
1851 Returns information about the remote side of a connected client object.
1852
1853 Returns a string with the IP address of the peer, followed by the port number
1854 that peer is using for the connection. In case of error, the method returns
1855 nil.
1856
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001857 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001858 :returns: a string containing the server information.
1859
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001860.. js:function:: Socket.getsockname(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001861
1862 Returns the local address information associated to the object.
1863
1864 The method returns a string with local IP address and a number with the port.
1865 In case of error, the method returns nil.
1866
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001867 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001868 :returns: a string containing the client information.
1869
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001870.. js:function:: Socket.receive(socket, [pattern [, prefix]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001871
1872 Reads data from a client object, according to the specified read pattern.
1873 Patterns follow the Lua file I/O format, and the difference in performance
1874 between all patterns is negligible.
1875
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001876 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001877 :param string|integer pattern: Describe what is required (see below).
1878 :param string prefix: A string which will be prefix the returned data.
1879 :returns: a string containing the required data or nil.
1880
1881 Pattern can be any of the following:
1882
1883 * **`*a`**: reads from the socket until the connection is closed. No
1884 end-of-line translation is performed;
1885
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001886 * **`*l`**: reads a line of text from the Socket. The line is terminated by a
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001887 LF character (ASCII 10), optionally preceded by a CR character
1888 (ASCII 13). The CR and LF characters are not included in the
1889 returned line. In fact, all CR characters are ignored by the
1890 pattern. This is the default pattern.
1891
1892 * **number**: causes the method to read a specified number of bytes from the
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001893 Socket. Prefix is an optional string to be concatenated to the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001894 beginning of any received data before return.
1895
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001896 * **empty**: If the pattern is left empty, the default option is `*l`.
1897
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001898 If successful, the method returns the received pattern. In case of error, the
1899 method returns nil followed by an error message which can be the string
1900 'closed' in case the connection was closed before the transmission was
1901 completed or the string 'timeout' in case there was a timeout during the
1902 operation. Also, after the error message, the function returns the partial
1903 result of the transmission.
1904
1905 Important note: This function was changed severely. It used to support
1906 multiple patterns (but I have never seen this feature used) and now it
1907 doesn't anymore. Partial results used to be returned in the same way as
1908 successful results. This last feature violated the idea that all functions
1909 should return nil on error. Thus it was changed too.
1910
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001911.. js:function:: Socket.send(socket, data [, start [, end ]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001912
1913 Sends data through client object.
1914
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001915 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001916 :param string data: The data that will be sent.
1917 :param integer start: The start position in the buffer of the data which will
1918 be sent.
1919 :param integer end: The end position in the buffer of the data which will
1920 be sent.
1921 :returns: see below.
1922
1923 Data is the string to be sent. The optional arguments i and j work exactly
1924 like the standard string.sub Lua function to allow the selection of a
1925 substring to be sent.
1926
1927 If successful, the method returns the index of the last byte within [start,
1928 end] that has been sent. Notice that, if start is 1 or absent, this is
1929 effectively the total number of bytes sent. In case of error, the method
1930 returns nil, followed by an error message, followed by the index of the last
1931 byte within [start, end] that has been sent. You might want to try again from
1932 the byte following that. The error message can be 'closed' in case the
1933 connection was closed before the transmission was completed or the string
1934 'timeout' in case there was a timeout during the operation.
1935
1936 Note: Output is not buffered. For small strings, it is always better to
1937 concatenate them in Lua (with the '..' operator) and send the result in one
1938 call instead of calling the method several times.
1939
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001940.. js:function:: Socket.setoption(socket, option [, value])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001941
1942 Just implemented for compatibility, this cal does nothing.
1943
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001944.. js:function:: Socket.settimeout(socket, value [, mode])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001945
1946 Changes the timeout values for the object. All I/O operations are blocking.
1947 That is, any call to the methods send, receive, and accept will block
1948 indefinitely, until the operation completes. The settimeout method defines a
1949 limit on the amount of time the I/O methods can block. When a timeout time
1950 has elapsed, the affected methods give up and fail with an error code.
1951
1952 The amount of time to wait is specified as the value parameter, in seconds.
1953
Mark Lakes56cc1252018-03-27 09:48:06 +02001954 The timeout modes are not implemented, the only settable timeout is the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001955 inactivity time waiting for complete the internal buffer send or waiting for
1956 receive data.
1957
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001958 :param class_socket socket: Is the manipulated Socket.
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01001959 :param float value: The timeout value. Use floating point to specify
Mark Lakes56cc1252018-03-27 09:48:06 +02001960 milliseconds.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001961
Thierry FOURNIER31904272017-10-25 12:59:51 +02001962.. _regex_class:
1963
1964Regex class
1965===========
1966
1967.. js:class:: Regex
1968
1969 This class allows the usage of HAProxy regexes because classic lua doesn't
1970 provides regexes. This class inherits the HAProxy compilation options, so the
1971 regexes can be libc regex, pcre regex or pcre JIT regex.
1972
1973 The expression matching number is limited to 20 per regex. The only available
1974 option is case sensitive.
1975
1976 Because regexes compilation is a heavy process, it is better to define all
1977 your regexes in the **body context** and use it during the runtime.
1978
1979.. code-block:: lua
1980
1981 -- Create the regex
1982 st, regex = Regex.new("needle (..) (...)", true);
1983
1984 -- Check compilation errors
1985 if st == false then
1986 print "error: " .. regex
1987 end
1988
1989 -- Match the regexes
1990 print(regex:exec("Looking for a needle in the haystack")) -- true
1991 print(regex:exec("Lokking for a cat in the haystack")) -- false
1992
1993 -- Extract words
1994 st, list = regex:match("Looking for a needle in the haystack")
1995 print(st) -- true
1996 print(list[1]) -- needle in the
1997 print(list[2]) -- in
1998 print(list[3]) -- the
1999
2000.. js:function:: Regex.new(regex, case_sensitive)
2001
2002 Create and compile a regex.
2003
2004 :param string regex: The regular expression according with the libc or pcre
2005 standard
2006 :param boolean case_sensitive: Match is case sensitive or not.
2007 :returns: boolean status and :ref:`regex_class` or string containing fail reason.
2008
2009.. js:function:: Regex.exec(regex, str)
2010
2011 Execute the regex.
2012
2013 :param class_regex regex: A :ref:`regex_class` object.
2014 :param string str: The input string will be compared with the compiled regex.
2015 :returns: a boolean status according with the match result.
2016
2017.. js:function:: Regex.match(regex, str)
2018
2019 Execute the regex and return matched expressions.
2020
2021 :param class_map map: A :ref:`regex_class` object.
2022 :param string str: The input string will be compared with the compiled regex.
2023 :returns: a boolean status according with the match result, and
2024 a table containing all the string matched in order of declaration.
2025
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002026.. _map_class:
2027
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002028Map class
2029=========
2030
2031.. js:class:: Map
2032
2033 This class permits to do some lookup in HAProxy maps. The declared maps can
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002034 be modified during the runtime through the HAProxy management socket.
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002035
2036.. code-block:: lua
2037
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002038 default = "usa"
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002039
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002040 -- Create and load map
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002041 geo = Map.new("geo.map", Map._ip);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002042
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002043 -- Create new fetch that returns the user country
2044 core.register_fetches("country", function(txn)
2045 local src;
2046 local loc;
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002047
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002048 src = txn.f:fhdr("x-forwarded-for");
2049 if (src == nil) then
2050 src = txn.f:src()
2051 if (src == nil) then
2052 return default;
2053 end
2054 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002055
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002056 -- Perform lookup
2057 loc = geo:lookup(src);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002058
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002059 if (loc == nil) then
2060 return default;
2061 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002062
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002063 return loc;
2064 end);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002065
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002066.. js:attribute:: Map._int
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002067
2068 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2069 samples" ans subchapter "ACL basics" to understand this pattern matching
2070 method.
2071
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002072 Note that :js:attr:`Map.int` is also available for compatibility.
2073
2074.. js:attribute:: Map._ip
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002075
2076 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2077 samples" ans subchapter "ACL basics" to understand this pattern matching
2078 method.
2079
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002080 Note that :js:attr:`Map.ip` is also available for compatibility.
2081
2082.. js:attribute:: Map._str
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002083
2084 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2085 samples" ans subchapter "ACL basics" to understand this pattern matching
2086 method.
2087
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002088 Note that :js:attr:`Map.str` is also available for compatibility.
2089
2090.. js:attribute:: Map._beg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002091
2092 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2093 samples" ans subchapter "ACL basics" to understand this pattern matching
2094 method.
2095
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002096 Note that :js:attr:`Map.beg` is also available for compatibility.
2097
2098.. js:attribute:: Map._sub
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002099
2100 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2101 samples" ans subchapter "ACL basics" to understand this pattern matching
2102 method.
2103
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002104 Note that :js:attr:`Map.sub` is also available for compatibility.
2105
2106.. js:attribute:: Map._dir
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002107
2108 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2109 samples" ans subchapter "ACL basics" to understand this pattern matching
2110 method.
2111
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002112 Note that :js:attr:`Map.dir` is also available for compatibility.
2113
2114.. js:attribute:: Map._dom
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002115
2116 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2117 samples" ans subchapter "ACL basics" to understand this pattern matching
2118 method.
2119
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002120 Note that :js:attr:`Map.dom` is also available for compatibility.
2121
2122.. js:attribute:: Map._end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002123
2124 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2125 samples" ans subchapter "ACL basics" to understand this pattern matching
2126 method.
2127
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002128.. js:attribute:: Map._reg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002129
2130 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2131 samples" ans subchapter "ACL basics" to understand this pattern matching
2132 method.
2133
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002134 Note that :js:attr:`Map.reg` is also available for compatibility.
2135
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002136
2137.. js:function:: Map.new(file, method)
2138
2139 Creates and load a map.
2140
2141 :param string file: Is the file containing the map.
2142 :param integer method: Is the map pattern matching method. See the attributes
2143 of the Map class.
2144 :returns: a class Map object.
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002145 :see: The Map attributes: :js:attr:`Map._int`, :js:attr:`Map._ip`,
2146 :js:attr:`Map._str`, :js:attr:`Map._beg`, :js:attr:`Map._sub`,
2147 :js:attr:`Map._dir`, :js:attr:`Map._dom`, :js:attr:`Map._end` and
2148 :js:attr:`Map._reg`.
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002149
2150.. js:function:: Map.lookup(map, str)
2151
2152 Perform a lookup in a map.
2153
2154 :param class_map map: Is the class Map object.
2155 :param string str: Is the string used as key.
2156 :returns: a string containing the result or nil if no match.
2157
2158.. js:function:: Map.slookup(map, str)
2159
2160 Perform a lookup in a map.
2161
2162 :param class_map map: Is the class Map object.
2163 :param string str: Is the string used as key.
2164 :returns: a string containing the result or empty string if no match.
2165
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002166.. _applethttp_class:
2167
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002168AppletHTTP class
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002169================
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002170
2171.. js:class:: AppletHTTP
2172
2173 This class is used with applets that requires the 'http' mode. The http applet
2174 can be registered with the *core.register_service()* function. They are used
2175 for processing an http request like a server in back of HAProxy.
2176
2177 This is an hello world sample code:
2178
2179.. code-block:: lua
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002180
Pieter Baauw4d7f7662015-11-08 16:38:08 +01002181 core.register_service("hello-world", "http", function(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002182 local response = "Hello World !"
2183 applet:set_status(200)
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002184 applet:add_header("content-length", string.len(response))
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002185 applet:add_header("content-type", "text/plain")
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002186 applet:start_response()
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002187 applet:send(response)
2188 end)
2189
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002190.. js:attribute:: AppletHTTP.c
2191
2192 :returns: A :ref:`converters_class`
2193
2194 This attribute contains a Converters class object.
2195
2196.. js:attribute:: AppletHTTP.sc
2197
2198 :returns: A :ref:`converters_class`
2199
2200 This attribute contains a Converters class object. The
2201 functions of this object returns always a string.
2202
2203.. js:attribute:: AppletHTTP.f
2204
2205 :returns: A :ref:`fetches_class`
2206
2207 This attribute contains a Fetches class object. Note that the
2208 applet execution place cannot access to a valid HAProxy core HTTP
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002209 transaction, so some sample fetches related to the HTTP dependant
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002210 values (hdr, path, ...) are not available.
2211
2212.. js:attribute:: AppletHTTP.sf
2213
2214 :returns: A :ref:`fetches_class`
2215
2216 This attribute contains a Fetches class object. The functions of
2217 this object returns always a string. Note that the applet
2218 execution place cannot access to a valid HAProxy core HTTP
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002219 transaction, so some sample fetches related to the HTTP dependant
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002220 values (hdr, path, ...) are not available.
2221
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002222.. js:attribute:: AppletHTTP.method
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002223
2224 :returns: string
2225
2226 The attribute method returns a string containing the HTTP
2227 method.
2228
2229.. js:attribute:: AppletHTTP.version
2230
2231 :returns: string
2232
2233 The attribute version, returns a string containing the HTTP
2234 request version.
2235
2236.. js:attribute:: AppletHTTP.path
2237
2238 :returns: string
2239
2240 The attribute path returns a string containing the HTTP
2241 request path.
2242
2243.. js:attribute:: AppletHTTP.qs
2244
2245 :returns: string
2246
2247 The attribute qs returns a string containing the HTTP
2248 request query string.
2249
2250.. js:attribute:: AppletHTTP.length
2251
2252 :returns: integer
2253
2254 The attribute length returns an integer containing the HTTP
2255 body length.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002256
Thierry FOURNIER841475e2015-12-11 17:10:09 +01002257.. js:attribute:: AppletHTTP.headers
2258
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002259 :returns: table
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002260
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002261 The attribute headers returns a table containing the HTTP
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002262 headers. The header names are always in lower case. As the header name can be
2263 encountered more than once in each request, the value is indexed with 0 as
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002264 first index value. The table have this form:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002265
2266.. code-block:: lua
2267
2268 AppletHTTP.headers['<header-name>'][<header-index>] = "<header-value>"
2269
2270 AppletHTTP.headers["host"][0] = "www.test.com"
2271 AppletHTTP.headers["accept"][0] = "audio/basic q=1"
2272 AppletHTTP.headers["accept"][1] = "audio/*, q=0.2"
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002273 AppletHTTP.headers["accept"][2] = "*/*, q=0.1"
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002274..
2275
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002276.. js:function:: AppletHTTP.set_status(applet, code [, reason])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002277
2278 This function sets the HTTP status code for the response. The allowed code are
2279 from 100 to 599.
2280
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002281 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002282 :param integer code: the status code returned to the client.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002283 :param string reason: the status reason returned to the client (optional).
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002284
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002285.. js:function:: AppletHTTP.add_header(applet, name, value)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002286
2287 This function add an header in the response. Duplicated headers are not
2288 collapsed. The special header *content-length* is used to determinate the
2289 response length. If it not exists, a *transfer-encoding: chunked* is set, and
2290 all the write from the funcion *AppletHTTP:send()* become a chunk.
2291
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002292 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002293 :param string name: the header name
2294 :param string value: the header value
2295
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002296.. js:function:: AppletHTTP.start_response(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002297
2298 This function indicates to the HTTP engine that it can process and send the
2299 response headers. After this called we cannot add headers to the response; We
2300 cannot use the *AppletHTTP:send()* function if the
2301 *AppletHTTP:start_response()* is not called.
2302
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002303 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2304
2305.. js:function:: AppletHTTP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002306
2307 This function returns a string containing one line from the http body. If the
2308 data returned doesn't contains a final '\\n' its assumed than its the last
2309 available data before the end of stream.
2310
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002311 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002312 :returns: a string. The string can be empty if we reach the end of the stream.
2313
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002314.. js:function:: AppletHTTP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002315
2316 Reads data from the HTTP body, according to the specified read *size*. If the
2317 *size* is missing, the function tries to read all the content of the stream
2318 until the end. If the *size* is bigger than the http body, it returns the
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002319 amount of data available.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002320
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002321 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002322 :param integer size: the required read size.
2323 :returns: always return a string,the string can be empty is the connexion is
2324 closed.
2325
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002326.. js:function:: AppletHTTP.send(applet, msg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002327
2328 Send the message *msg* on the http request body.
2329
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002330 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002331 :param string msg: the message to send.
2332
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002333.. js:function:: AppletHTTP.get_priv(applet)
2334
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002335 Return Lua data stored in the current transaction. If no data are stored,
2336 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002337
2338 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002339 :returns: the opaque data previously stored, or nil if nothing is
2340 available.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002341 :see: :js:func:`AppletHTTP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002342
2343.. js:function:: AppletHTTP.set_priv(applet, data)
2344
2345 Store any data in the current HAProxy transaction. This action replace the
2346 old stored data.
2347
2348 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2349 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002350 :see: :js:func:`AppletHTTP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002351
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002352.. js:function:: AppletHTTP.set_var(applet, var, value)
2353
2354 Converts a Lua type in a HAProxy type and store it in a variable <var>.
2355
2356 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2357 :param string var: The variable name according with the HAProxy variable syntax.
2358 :param type value: The value associated to the variable. The type ca be string or
2359 integer.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002360 :see: :js:func:`AppletHTTP.unset_var`
2361 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002362
2363.. js:function:: AppletHTTP.unset_var(applet, var)
2364
2365 Unset the variable <var>.
2366
2367 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2368 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002369 :see: :js:func:`AppletHTTP.set_var`
2370 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002371
2372.. js:function:: AppletHTTP.get_var(applet, var)
2373
2374 Returns data stored in the variable <var> converter in Lua type.
2375
2376 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2377 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002378 :see: :js:func:`AppletHTTP.set_var`
2379 :see: :js:func:`AppletHTTP.unset_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002380
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002381.. _applettcp_class:
2382
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002383AppletTCP class
2384===============
2385
2386.. js:class:: AppletTCP
2387
2388 This class is used with applets that requires the 'tcp' mode. The tcp applet
2389 can be registered with the *core.register_service()* function. They are used
2390 for processing a tcp stream like a server in back of HAProxy.
2391
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002392.. js:attribute:: AppletTCP.c
2393
2394 :returns: A :ref:`converters_class`
2395
2396 This attribute contains a Converters class object.
2397
2398.. js:attribute:: AppletTCP.sc
2399
2400 :returns: A :ref:`converters_class`
2401
2402 This attribute contains a Converters class object. The
2403 functions of this object returns always a string.
2404
2405.. js:attribute:: AppletTCP.f
2406
2407 :returns: A :ref:`fetches_class`
2408
2409 This attribute contains a Fetches class object.
2410
2411.. js:attribute:: AppletTCP.sf
2412
2413 :returns: A :ref:`fetches_class`
2414
2415 This attribute contains a Fetches class object.
2416
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002417.. js:function:: AppletTCP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002418
2419 This function returns a string containing one line from the stream. If the
2420 data returned doesn't contains a final '\\n' its assumed than its the last
2421 available data before the end of stream.
2422
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002423 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002424 :returns: a string. The string can be empty if we reach the end of the stream.
2425
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002426.. js:function:: AppletTCP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002427
2428 Reads data from the TCP stream, according to the specified read *size*. If the
2429 *size* is missing, the function tries to read all the content of the stream
2430 until the end.
2431
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002432 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002433 :param integer size: the required read size.
2434 :returns: always return a string,the string can be empty is the connexion is
2435 closed.
2436
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002437.. js:function:: AppletTCP.send(appletmsg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002438
2439 Send the message on the stream.
2440
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002441 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002442 :param string msg: the message to send.
2443
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002444.. js:function:: AppletTCP.get_priv(applet)
2445
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002446 Return Lua data stored in the current transaction. If no data are stored,
2447 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002448
2449 :param class_AppletTCP applet: An :ref:`applettcp_class`
Bertrand Jacquin874a35c2018-09-10 21:26:07 +01002450 :returns: the opaque data previously stored, or nil if nothing is
2451 available.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002452 :see: :js:func:`AppletTCP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002453
2454.. js:function:: AppletTCP.set_priv(applet, data)
2455
2456 Store any data in the current HAProxy transaction. This action replace the
2457 old stored data.
2458
2459 :param class_AppletTCP applet: An :ref:`applettcp_class`
2460 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002461 :see: :js:func:`AppletTCP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002462
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002463.. js:function:: AppletTCP.set_var(applet, var, value)
2464
2465 Converts a Lua type in a HAProxy type and stores it in a variable <var>.
2466
2467 :param class_AppletTCP applet: An :ref:`applettcp_class`
2468 :param string var: The variable name according with the HAProxy variable syntax.
2469 :param type value: The value associated to the variable. The type can be string or
2470 integer.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002471 :see: :js:func:`AppletTCP.unset_var`
2472 :see: :js:func:`AppletTCP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002473
2474.. js:function:: AppletTCP.unset_var(applet, var)
2475
2476 Unsets the variable <var>.
2477
2478 :param class_AppletTCP applet: An :ref:`applettcp_class`
2479 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002480 :see: :js:func:`AppletTCP.unset_var`
2481 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002482
2483.. js:function:: AppletTCP.get_var(applet, var)
2484
2485 Returns data stored in the variable <var> converter in Lua type.
2486
2487 :param class_AppletTCP applet: An :ref:`applettcp_class`
2488 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002489 :see: :js:func:`AppletTCP.unset_var`
2490 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002491
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002492External Lua libraries
2493======================
2494
2495A lot of useful lua libraries can be found here:
2496
2497* `https://lua-toolbox.com/ <https://lua-toolbox.com/>`_
2498
2499Redis acces:
2500
2501* `https://github.com/nrk/redis-lua <https://github.com/nrk/redis-lua>`_
2502
2503This is an example about the usage of the Redis library with HAProxy. Note that
2504each call of any function of this library can throw an error if the socket
2505connection fails.
2506
2507.. code-block:: lua
2508
2509 -- load the redis library
2510 local redis = require("redis");
2511
2512 function do_something(txn)
2513
2514 -- create and connect new tcp socket
2515 local tcp = core.tcp();
2516 tcp:settimeout(1);
2517 tcp:connect("127.0.0.1", 6379);
2518
2519 -- use the redis library with this new socket
2520 local client = redis.connect({socket=tcp});
2521 client:ping();
2522
2523 end
2524
2525OpenSSL:
2526
2527* `http://mkottman.github.io/luacrypto/index.html
2528 <http://mkottman.github.io/luacrypto/index.html>`_
2529
2530* `https://github.com/brunoos/luasec/wiki
2531 <https://github.com/brunoos/luasec/wiki>`_
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01002532