blob: 9a9e7ceef86e97713a608b89df29cb6f19e65d31 [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
212 :param integer loglevel: Is the log level asociated with the message. It is a
213 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
317 These information are also returned by the management sockat via the command
318 "show info". See the management socket documentation fpor more information
319 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
328 HAProxy core and assures than the hour will be monotnic and that the system
329 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
341 This function take a string repsenting http date, and returns an integer
342 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
356 This function take a string repsenting IMF date, and returns an integer
357 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
374 This function take a string repsenting RFC850 date, and returns an integer
375 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
392 This function take a string repsenting ASCTIME date, and returns an integer
393 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
410 This function take a string repsenting http date, and returns an integer
411 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
419 This function take a string repsenting http date, and returns an integer
420 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
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400436 proxies is a table containing the list of all proxies declared in the
437 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
Thierry FOURNIERc5d11c62018-02-12 14:46:54 +0100469 * **argX**: this is argument provided throught the HAProxy configuration file.
470
Willy Tarreau61add3c2015-09-28 15:39:10 +0200471 Here, an exemple of action registration. the action juste 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
494 A second example using aruments
495
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
534 the haroxy configuration file. The number of arguments doesn't exceed 5.
535 The order and the nature of these is conventionally choose by the
536 developper.
537
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
Thierry FOURNIER17bd1522015-03-11 20:31:00 +0100543 fetchs can be used in HAProxy with the prefix "lua.". A Lua sample fetch
544 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
560 the haroxy configuration file. The number of arguments doesn't exceed 5.
561 The order and the nature of these is conventionally choose by the
562 developper.
563 * **Returns**: A string containing some data, ot nil if the value cannot be
564 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
611 mode. Applets of type 'tcp' can be called from anywhre.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +0200612
Willy Tarreau61add3c2015-09-28 15:39:10 +0200613 Here, an exemple 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
693 paramter. The args embbed the registred path. If the path is declared like
694 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
710 Then, arg1, arg2 and arg3 will contains respectivey "show", "ssl" and "stats".
711 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
725 set the value *value* associated to the key *key* in the map referenced by
726 *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
752 This function retruns a new concat object.
753
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
784 Parse ipv4 or ipv6 adresses and its facultative associated network.
785
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".
792 :returns: boolean, true if the network of the addresses matche, else returns
793 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
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400909 Returns a table containg 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
941.. js:function:: Server.set_weight(sv, weight)
942
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400943 Dynamically change the weight of the server. See the management socket
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100944 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 weight: A string describing the server weight.
949
950.. js:function:: Server.get_weight(sv)
951
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400952 This function returns an integer representing the server weight.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100953
954 :param class_server sv: A :ref:`server_class` which indicates the manipulated
955 server.
956 :returns: an integer.
957
958.. js:function:: Server.set_addr(sv, addr)
959
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400960 Dynamically change the address 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.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400965 :param string addr: A string describing the server address.
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100966
967.. js:function:: Server.get_addr(sv)
968
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400969 Returns a string describing the address of the server.
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: A string
974
975.. js:function:: Server.get_stats(sv)
976
977 Returns server statistics.
978
979 :param class_server sv: A :ref:`server_class` which indicates the manipulated
980 server.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -0400981 :returns: a key/value table containing stats
Thierry Fournierf2fdc9d2016-02-22 08:21:39 +0100982
983.. js:function:: Server.shut_sess(sv)
984
985 Shutdown all the sessions attached to the server. See the management socket
986 documentation for more information about this function.
987
988 :param class_server sv: A :ref:`server_class` which indicates the manipulated
989 server.
990
991.. js:function:: Server.set_drain(sv)
992
993 Drain sticky sessions. See the management socket documentation for more
994 information about this function.
995
996 :param class_server sv: A :ref:`server_class` which indicates the manipulated
997 server.
998
999.. js:function:: Server.set_maint(sv)
1000
1001 Set maintenance mode. See the management socket documentation for more
1002 information about this function.
1003
1004 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1005 server.
1006
1007.. js:function:: Server.set_ready(sv)
1008
1009 Set normal mode. See the management socket documentation for more information
1010 about this function.
1011
1012 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1013 server.
1014
1015.. js:function:: Server.check_enable(sv)
1016
1017 Enable health checks. See the management socket documentation for more
1018 information about this function.
1019
1020 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1021 server.
1022
1023.. js:function:: Server.check_disable(sv)
1024
1025 Disable health checks. See the management socket documentation for more
1026 information about this function.
1027
1028 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1029 server.
1030
1031.. js:function:: Server.check_force_up(sv)
1032
1033 Force health-check up. See the management socket documentation for more
1034 information about this function.
1035
1036 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1037 server.
1038
1039.. js:function:: Server.check_force_nolb(sv)
1040
1041 Force health-check nolb mode. See the management socket documentation for more
1042 information about this function.
1043
1044 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1045 server.
1046
1047.. js:function:: Server.check_force_down(sv)
1048
1049 Force health-check down. See the management socket documentation for more
1050 information about this function.
1051
1052 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1053 server.
1054
1055.. js:function:: Server.agent_enable(sv)
1056
1057 Enable agent check. See the management socket documentation for more
1058 information about this function.
1059
1060 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1061 server.
1062
1063.. js:function:: Server.agent_disable(sv)
1064
1065 Disable agent check. See the management socket documentation for more
1066 information about this function.
1067
1068 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1069 server.
1070
1071.. js:function:: Server.agent_force_up(sv)
1072
1073 Force agent check up. See the management socket documentation for more
1074 information about this function.
1075
1076 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1077 server.
1078
1079.. js:function:: Server.agent_force_down(sv)
1080
1081 Force agent check down. See the management socket documentation for more
1082 information about this function.
1083
1084 :param class_server sv: A :ref:`server_class` which indicates the manipulated
1085 server.
1086
Thierry Fournierff480422016-02-25 08:36:46 +01001087.. _listener_class:
1088
1089Listener class
1090==============
1091
1092.. js:function:: Listener.get_stats(ls)
1093
1094 Returns server statistics.
1095
1096 :param class_listener ls: A :ref:`listener_class` which indicates the
1097 manipulated listener.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001098 :returns: a key/value table containing stats
Thierry Fournierff480422016-02-25 08:36:46 +01001099
Thierry Fournier1de16592016-01-27 09:49:07 +01001100.. _concat_class:
1101
1102Concat class
1103============
1104
1105.. js:class:: Concat
1106
1107 This class provides a fast way for string concatenation. The way using native
1108 Lua concatenation like the code below is slow for some reasons.
1109
1110.. code-block:: lua
1111
1112 str = "string1"
1113 str = str .. ", string2"
1114 str = str .. ", string3"
1115..
1116
1117 For each concatenation, Lua:
1118 * allocate memory for the result,
1119 * catenate the two string copying the strings in the new memory bloc,
1120 * free the old memory block containing the string whoch is no longer used.
1121 This process does many memory move, allocation and free. In addition, the
1122 memory is not really freed, it is just mark mark as unsused and wait for the
1123 garbage collector.
1124
1125 The Concat class provide an alternative way for catenating strings. It uses
1126 the internal Lua mechanism (it does not allocate memory), but it doesn't copy
1127 the data more than once.
1128
1129 On my computer, the following loops spends 0.2s for the Concat method and
1130 18.5s for the pure Lua implementation. So, the Concat class is about 1000x
1131 faster than the embedded solution.
1132
1133.. code-block:: lua
1134
1135 for j = 1, 100 do
1136 c = core.concat()
1137 for i = 1, 20000 do
1138 c:add("#####")
1139 end
1140 end
1141..
1142
1143.. code-block:: lua
1144
1145 for j = 1, 100 do
1146 c = ""
1147 for i = 1, 20000 do
1148 c = c .. "#####"
1149 end
1150 end
1151..
1152
1153.. js:function:: Concat.add(concat, string)
1154
1155 This function adds a string to the current concatenated string.
1156
1157 :param class_concat concat: A :ref:`concat_class` which contains the currently
1158 builded string.
1159 :param string string: A new string to concatenate to the current builded
1160 string.
1161
1162.. js:function:: Concat.dump(concat)
1163
1164 This function returns the concanated string.
1165
1166 :param class_concat concat: A :ref:`concat_class` which contains the currently
1167 builded string.
1168 :returns: the concatenated string
1169
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001170.. _fetches_class:
1171
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001172Fetches class
1173=============
1174
1175.. js:class:: Fetches
1176
1177 This class contains a lot of internal HAProxy sample fetches. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001178 HAProxy "configuration.txt" documentation for more information about her
1179 usage. they are the chapters 7.3.2 to 7.3.6.
1180
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001181 **warning** some sample fetches are not available in some context. These
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001182 limitations are specified in this documentation when they're useful.
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001183
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001184 :see: :js:attr:`TXN.f`
1185 :see: :js:attr:`TXN.sf`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001186
1187 Fetches are useful for:
1188
1189 * get system time,
1190 * get environment variable,
1191 * get random numbers,
1192 * known backend status like the number of users in queue or the number of
1193 connections established,
1194 * client information like ip source or destination,
1195 * deal with stick tables,
1196 * Established SSL informations,
1197 * HTTP information like headers or method.
1198
1199.. code-block:: lua
1200
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001201 function action(txn)
1202 -- Get source IP
1203 local clientip = txn.f:src()
1204 end
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001205..
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001206
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001207.. _converters_class:
1208
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001209Converters class
1210================
1211
1212.. js:class:: Converters
1213
1214 This class contains a lot of internal HAProxy sample converters. See the
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001215 HAProxy documentation "configuration.txt" for more information about her
1216 usage. Its the chapter 7.3.1.
1217
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001218 :see: :js:attr:`TXN.c`
1219 :see: :js:attr:`TXN.sc`
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001220
1221 Converters provides statefull transformation. They are useful for:
1222
1223 * converting input to base64,
1224 * applying hash on input string (djb2, crc32, sdbm, wt6),
1225 * format date,
1226 * json escape,
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001227 * extracting preferred language comparing two lists,
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001228 * turn to lower or upper chars,
1229 * deal with stick tables.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001230
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001231.. _channel_class:
1232
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001233Channel class
1234=============
1235
1236.. js:class:: Channel
1237
1238 HAProxy uses two buffers for the processing of the requests. The first one is
1239 used with the request data (from the client to the server) and the second is
1240 used for the response data (from the server to the client).
1241
1242 Each buffer contains two types of data. The first type is the incoming data
1243 waiting for a processing. The second part is the outgoing data already
1244 processed. Usually, the incoming data is processed, after it is tagged as
1245 outgoing data, and finally it is sent. The following functions provides tools
1246 for manipulating these data in a buffer.
1247
1248 The following diagram shows where the channel class function are applied.
1249
1250 **Warning**: It is not possible to read from the response in request action,
1251 and it is not possible to read for the request channel in response action.
1252
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01001253.. image:: _static/channel.png
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001254
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001255.. js:function:: Channel.dup(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001256
1257 This function returns a string that contain the entire buffer. The data is
1258 not remove from the buffer and can be reprocessed later.
1259
1260 If the buffer cant receive more data, a 'nil' value is returned.
1261
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001262 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001263 :returns: a string containing all the available data or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001264
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001265.. js:function:: Channel.get(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001266
1267 This function returns a string that contain the entire buffer. The data is
1268 consumed from the buffer.
1269
1270 If the buffer cant receive more data, a 'nil' value is returned.
1271
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001272 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001273 :returns: a string containing all the available data or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001274
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001275.. js:function:: Channel.getline(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001276
1277 This function returns a string that contain the first line of the buffer. The
1278 data is consumed. If the data returned doesn't contains a final '\n' its
1279 assumed than its the last available data in the buffer.
1280
1281 If the buffer cant receive more data, a 'nil' value is returned.
1282
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001283 :param class_channel channel: The manipulated Channel.
Pieter Baauw386a1272015-08-16 15:26:24 +02001284 :returns: a string containing the available line or nil.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001285
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001286.. js:function:: Channel.set(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001287
1288 This function replace the content of the buffer by the string. The function
1289 returns the copied length, otherwise, it returns -1.
1290
1291 The data set with this function are not send. They wait for the end of
1292 HAProxy processing, so the buffer can be full.
1293
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001294 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001295 :param string string: The data which will sent.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001296 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001297
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001298.. js:function:: Channel.append(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001299
1300 This function append the string argument to the content of the buffer. The
1301 function returns the copied length, otherwise, it returns -1.
1302
1303 The data set with this function are not send. They wait for the end of
1304 HAProxy processing, so the buffer can be full.
1305
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001306 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001307 :param string string: The data which will sent.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001308 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001309
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001310.. js:function:: Channel.send(channel, string)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001311
1312 This function required immediate send of the data. Unless if the connection
1313 is close, the buffer is regularly flushed and all the string can be sent.
1314
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001315 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001316 :param string string: The data which will sent.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001317 :returns: an integer containing the amount of bytes copied or -1.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001318
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001319.. js:function:: Channel.get_in_length(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001320
1321 This function returns the length of the input part of the buffer.
1322
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001323 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001324 :returns: an integer containing the amount of available bytes.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001325
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001326.. js:function:: Channel.get_out_length(channel)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001327
1328 This function returns the length of the output part of the buffer.
1329
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001330 :param class_channel channel: The manipulated Channel.
Pieter Baauw4d7f7662015-11-08 16:38:08 +01001331 :returns: an integer containing the amount of available bytes.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001332
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001333.. js:function:: Channel.forward(channel, int)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001334
1335 This function transfer bytes from the input part of the buffer to the output
1336 part.
1337
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001338 :param class_channel channel: The manipulated Channel.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001339 :param integer int: The amount of data which will be forwarded.
1340
Thierry FOURNIER / OZON.IO65192f32016-11-07 15:28:40 +01001341.. js:function:: Channel.is_full(channel)
1342
1343 This function returns true if the buffer channel is full.
1344
1345 :returns: a boolean
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001346
1347.. _http_class:
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001348
1349HTTP class
1350==========
1351
1352.. js:class:: HTTP
1353
1354 This class contain all the HTTP manipulation functions.
1355
Pieter Baauw386a1272015-08-16 15:26:24 +02001356.. js:function:: HTTP.req_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001357
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001358 Returns a table containing all the request headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001359
1360 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001361 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001362 :see: :js:func:`HTTP.res_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001363
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001364 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001365
1366.. code-block:: lua
1367
1368 HTTP:req_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1369
1370 local hdr = HTTP:req_get_headers()
1371 hdr["host"][0] = "www.test.com"
1372 hdr["accept"][0] = "audio/basic q=1"
1373 hdr["accept"][1] = "audio/*, q=0.2"
1374 hdr["accept"][2] = "*/*, q=0.1"
1375..
1376
Pieter Baauw386a1272015-08-16 15:26:24 +02001377.. js:function:: HTTP.res_get_headers(http)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001378
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001379 Returns a table containing all the response headers.
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001380
1381 :param class_http http: The related http object.
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001382 :returns: table of headers.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001383 :see: :js:func:`HTTP.req_get_headers`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001384
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04001385 This is the form of the returned table:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001386
1387.. code-block:: lua
1388
1389 HTTP:res_get_headers()['<header-name>'][<header-index>] = "<header-value>"
1390
1391 local hdr = HTTP:req_get_headers()
1392 hdr["host"][0] = "www.test.com"
1393 hdr["accept"][0] = "audio/basic q=1"
1394 hdr["accept"][1] = "audio/*, q=0.2"
1395 hdr["accept"][2] = "*.*, q=0.1"
1396..
1397
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001398.. js:function:: HTTP.req_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001399
1400 Appends an HTTP header field in the request whose name is
1401 specified in "name" and whose value is defined in "value".
1402
1403 :param class_http http: The related http object.
1404 :param string name: The header name.
1405 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001406 :see: :js:func:`HTTP.res_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001407
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001408.. js:function:: HTTP.res_add_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001409
1410 appends an HTTP header field in the response whose name is
1411 specified in "name" and whose value is defined in "value".
1412
1413 :param class_http http: The related http object.
1414 :param string name: The header name.
1415 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001416 :see: :js:func:`HTTP.req_add_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001417
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001418.. js:function:: HTTP.req_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001419
1420 Removes all HTTP header fields in the request whose name is
1421 specified in "name".
1422
1423 :param class_http http: The related http object.
1424 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001425 :see: :js:func:`HTTP.res_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001426
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001427.. js:function:: HTTP.res_del_header(http, name)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001428
1429 Removes all HTTP header fields in the response whose name is
1430 specified in "name".
1431
1432 :param class_http http: The related http object.
1433 :param string name: The header name.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001434 :see: :js:func:`HTTP.req_del_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001435
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001436.. js:function:: HTTP.req_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001437
1438 This variable replace all occurence of all header "name", by only
1439 one containing the "value".
1440
1441 :param class_http http: The related http object.
1442 :param string name: The header name.
1443 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001444 :see: :js:func:`HTTP.res_set_header`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001445
1446 This function does the same work as the folowwing code:
1447
1448.. code-block:: lua
1449
1450 function fcn(txn)
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001451 TXN.http:req_del_header("header")
1452 TXN.http:req_add_header("header", "value")
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001453 end
1454..
1455
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001456.. js:function:: HTTP.res_set_header(http, name, value)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001457
1458 This variable replace all occurence of all header "name", by only
1459 one containing the "value".
1460
1461 :param class_http http: The related http object.
1462 :param string name: The header name.
1463 :param string value: The header value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001464 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001465
Pieter Baauw386a1272015-08-16 15:26:24 +02001466.. js:function:: HTTP.req_rep_header(http, name, regex, replace)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001467
1468 Matches the regular expression in all occurrences of header field "name"
1469 according to "regex", and replaces them with the "replace" argument. The
1470 replacement value can contain back references like \1, \2, ... This
1471 function works with the request.
1472
1473 :param class_http http: The related http object.
1474 :param string name: The header name.
1475 :param string regex: The match regular expression.
1476 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001477 :see: :js:func:`HTTP.res_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001478
Pieter Baauw386a1272015-08-16 15:26:24 +02001479.. js:function:: HTTP.res_rep_header(http, name, regex, string)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001480
1481 Matches the regular expression in all occurrences of header field "name"
1482 according to "regex", and replaces them with the "replace" argument. The
1483 replacement value can contain back references like \1, \2, ... This
1484 function works with the request.
1485
1486 :param class_http http: The related http object.
1487 :param string name: The header name.
1488 :param string regex: The match regular expression.
1489 :param string replace: The replacement value.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001490 :see: :js:func:`HTTP.req_rep_header()`
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001491
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001492.. js:function:: HTTP.req_set_method(http, method)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001493
1494 Rewrites the request method with the parameter "method".
1495
1496 :param class_http http: The related http object.
1497 :param string method: The new method.
1498
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001499.. js:function:: HTTP.req_set_path(http, path)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001500
1501 Rewrites the request path with the "path" parameter.
1502
1503 :param class_http http: The related http object.
1504 :param string path: The new path.
1505
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001506.. js:function:: HTTP.req_set_query(http, query)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001507
1508 Rewrites the request's query string which appears after the first question
1509 mark ("?") with the parameter "query".
1510
1511 :param class_http http: The related http object.
1512 :param string query: The new query.
1513
Thierry FOURNIER0d79cf62015-08-26 14:20:58 +02001514.. js:function:: HTTP.req_set_uri(http, uri)
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001515
1516 Rewrites the request URI with the parameter "uri".
1517
1518 :param class_http http: The related http object.
1519 :param string uri: The new uri.
1520
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001521.. js:function:: HTTP.res_set_status(http, status [, reason])
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001522
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001523 Rewrites the response status code with the parameter "code".
1524
1525 If no custom reason is provided, it will be generated from the status.
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001526
1527 :param class_http http: The related http object.
1528 :param integer status: The new response status code.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08001529 :param string reason: The new response reason (optional).
Thierry FOURNIER35d70ef2015-08-26 16:21:56 +02001530
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001531.. _txn_class:
1532
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001533TXN class
1534=========
1535
1536.. js:class:: TXN
1537
1538 The txn class contain all the functions relative to the http or tcp
1539 transaction (Note than a tcp stream is the same than a tcp transaction, but
1540 an HTTP transaction is not the same than a tcp stream).
1541
1542 The usage of this class permits to retrieve data from the requests, alter it
1543 and forward it.
1544
1545 All the functions provided by this class are available in the context
1546 **sample-fetches** and **actions**.
1547
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001548.. js:attribute:: TXN.c
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001549
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001550 :returns: An :ref:`converters_class`.
1551
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001552 This attribute contains a Converters class object.
1553
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001554.. js:attribute:: TXN.sc
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001555
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001556 :returns: An :ref:`converters_class`.
1557
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001558 This attribute contains a Converters class object. The functions of
1559 this object returns always a string.
1560
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001561.. js:attribute:: TXN.f
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001562
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001563 :returns: An :ref:`fetches_class`.
1564
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001565 This attribute contains a Fetches class object.
1566
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001567.. js:attribute:: TXN.sf
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001568
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001569 :returns: An :ref:`fetches_class`.
1570
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001571 This attribute contains a Fetches class object. The functions of
1572 this object returns always a string.
1573
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001574.. js:attribute:: TXN.req
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001575
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001576 :returns: An :ref:`channel_class`.
1577
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001578 This attribute contains a channel class object for the request buffer.
1579
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001580.. js:attribute:: TXN.res
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001581
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001582 :returns: An :ref:`channel_class`.
1583
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001584 This attribute contains a channel class object for the response buffer.
1585
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001586.. js:attribute:: TXN.http
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001587
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001588 :returns: An :ref:`http_class`.
1589
Thierry FOURNIER08504f42015-03-16 14:17:08 +01001590 This attribute contains an HTTP class object. It is avalaible only if the
1591 proxy has the "mode http" enabled.
1592
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001593.. js:function:: TXN.log(TXN, loglevel, msg)
1594
1595 This function sends a log. The log is sent, according with the HAProxy
1596 configuration file, on the default syslog server if it is configured and on
1597 the stderr if it is allowed.
1598
1599 :param class_txn txn: The class txn object containing the data.
1600 :param integer loglevel: Is the log level asociated with the message. It is a
1601 number between 0 and 7.
1602 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001603 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
1604 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
1605 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
1606 :see: :js:func:`TXN.deflog`
1607 :see: :js:func:`TXN.Debug`
1608 :see: :js:func:`TXN.Info`
1609 :see: :js:func:`TXN.Warning`
1610 :see: :js:func:`TXN.Alert`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001611
1612.. js:function:: TXN.deflog(TXN, msg)
1613
1614 Sends a log line with the default loglevel for the proxy ssociated with the
1615 transaction.
1616
1617 :param class_txn txn: The class txn object containing the data.
1618 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001619 :see: :js:func:`TXN.log
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001620
1621.. js:function:: TXN.Debug(txn, msg)
1622
1623 :param class_txn txn: The class txn object containing the data.
1624 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001625 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001626
1627 Does the same job than:
1628
1629.. code-block:: lua
1630
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001631 function Debug(txn, msg)
1632 TXN.log(txn, core.debug, msg)
1633 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001634..
1635
1636.. js:function:: TXN.Info(txn, msg)
1637
1638 :param class_txn txn: The class txn object containing the data.
1639 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001640 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001641
1642.. code-block:: lua
1643
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001644 function Debug(txn, msg)
1645 TXN.log(txn, core.info, msg)
1646 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001647..
1648
1649.. js:function:: TXN.Warning(txn, msg)
1650
1651 :param class_txn txn: The class txn object containing the data.
1652 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001653 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001654
1655.. code-block:: lua
1656
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001657 function Debug(txn, msg)
1658 TXN.log(txn, core.warning, msg)
1659 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001660..
1661
1662.. js:function:: TXN.Alert(txn, msg)
1663
1664 :param class_txn txn: The class txn object containing the data.
1665 :param string msg: The log content.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001666 :see: :js:func:`TXN.log`
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001667
1668.. code-block:: lua
1669
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001670 function Debug(txn, msg)
1671 TXN.log(txn, core.alert, msg)
1672 end
Thierry FOURNIERc798b5d2015-03-17 01:09:57 +01001673..
1674
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001675.. js:function:: TXN.get_priv(txn)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001676
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001677 Return Lua data stored in the current transaction (with the `TXN.set_priv()`)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001678 function. If no data are stored, it returns a nil value.
1679
1680 :param class_txn txn: The class txn object containing the data.
1681 :returns: the opaque data previsously stored, or nil if nothing is
1682 avalaible.
1683
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001684.. js:function:: TXN.set_priv(txn, data)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001685
1686 Store any data in the current HAProxy transaction. This action replace the
1687 old stored data.
1688
1689 :param class_txn txn: The class txn object containing the data.
1690 :param opaque data: The data which is stored in the transaction.
1691
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001692.. js:function:: TXN.set_var(TXN, var, value)
1693
David Carlier61fdf8b2015-10-02 11:59:38 +01001694 Converts a Lua type in a HAProxy type and store it in a variable <var>.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001695
1696 :param class_txn txn: The class txn object containing the data.
1697 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER / OZON.IOb210bcc2016-12-12 16:24:16 +01001698 :param type value: The value associated to the variable. The type can be string or
1699 integer.
Christopher Faulet85d79c92016-11-09 16:54:56 +01001700
1701.. js:function:: TXN.unset_var(TXN, var)
1702
1703 Unset the variable <var>.
1704
1705 :param class_txn txn: The class txn object containing the data.
1706 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER053ba8ad2015-06-08 13:05:33 +02001707
1708.. js:function:: TXN.get_var(TXN, var)
1709
1710 Returns data stored in the variable <var> converter in Lua type.
1711
1712 :param class_txn txn: The class txn object containing the data.
1713 :param string var: The variable name according with the HAProxy variable syntax.
1714
Willy Tarreaubc183a62015-08-28 10:39:11 +02001715.. js:function:: TXN.done(txn)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001716
Willy Tarreaubc183a62015-08-28 10:39:11 +02001717 This function terminates processing of the transaction and the associated
1718 session. It can be used when a critical error is detected or to terminate
1719 processing after some data have been returned to the client (eg: a redirect).
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001720
Thierry FOURNIERab00df62016-07-14 11:42:37 +02001721 *Warning*: It not make sense to call this function from sample-fetches. In
1722 this case the behaviour of this one is the same than core.done(): it quit
1723 the Lua execution. The transaction is really aborted only from an action
1724 registered function.
1725
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001726 :param class_txn txn: The class txn object containing the data.
1727
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001728.. js:function:: TXN.set_loglevel(txn, loglevel)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001729
1730 Is used to change the log level of the current request. The "loglevel" must
1731 be an integer between 0 and 7.
1732
1733 :param class_txn txn: The class txn object containing the data.
1734 :param integer loglevel: The required log level. This variable can be one of
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01001735 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`,
1736 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`,
1737 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001738
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001739.. js:function:: TXN.set_tos(txn, tos)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001740
1741 Is used to set the TOS or DSCP field value of packets sent to the client to
1742 the value passed in "tos" on platforms which support this.
1743
1744 :param class_txn txn: The class txn object containing the data.
1745 :param integer tos: The new TOS os DSCP.
1746
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001747.. js:function:: TXN.set_mark(txn, mark)
Thierry FOURNIER2cce3532015-03-16 12:04:16 +01001748
1749 Is used to set the Netfilter MARK on all packets sent to the client to the
1750 value passed in "mark" on platforms which support it.
1751
1752 :param class_txn txn: The class txn object containing the data.
1753 :param integer mark: The mark value.
1754
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001755.. _socket_class:
1756
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001757Socket class
1758============
1759
1760.. js:class:: Socket
1761
1762 This class must be compatible with the Lua Socket class. Only the 'client'
1763 functions are available. See the Lua Socket documentation:
1764
1765 `http://w3.impa.br/~diego/software/luasocket/tcp.html
1766 <http://w3.impa.br/~diego/software/luasocket/tcp.html>`_
1767
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001768.. js:function:: Socket.close(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001769
1770 Closes a TCP object. The internal socket used by the object is closed and the
1771 local address to which the object was bound is made available to other
1772 applications. No further operations (except for further calls to the close
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001773 method) are allowed on a closed Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001774
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001775 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001776
1777 Note: It is important to close all used sockets once they are not needed,
1778 since, in many systems, each socket uses a file descriptor, which are limited
1779 system resources. Garbage-collected objects are automatically closed before
1780 destruction, though.
1781
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001782.. js:function:: Socket.connect(socket, address[, port])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001783
1784 Attempts to connect a socket object to a remote host.
1785
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001786
1787 In case of error, the method returns nil followed by a string describing the
1788 error. In case of success, the method returns 1.
1789
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001790 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001791 :param string address: can be an IP address or a host name. See below for more
1792 information.
1793 :param integer port: must be an integer number in the range [1..64K].
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001794 :returns: 1 or nil.
1795
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001796 an address field extension permits to use the connect() function to connect to
1797 other stream than TCP. The syntax containing a simpleipv4 or ipv6 address is
1798 the basically expected format. This format requires the port.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001799
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001800 Other format accepted are a socket path like "/socket/path", it permits to
1801 connect to a socket. abstract namespaces are supported with the prefix
1802 "abns@", and finaly a filedescriotr can be passed with the prefix "fd@".
1803 The prefix "ipv4@", "ipv6@" and "unix@" are also supported. The port can be
1804 passed int the string. The syntax "127.0.0.1:1234" is valid. in this case, the
Tim Duesterhus6edab862018-01-06 19:04:45 +01001805 parameter *port* must not be set.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001806
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001807.. js:function:: Socket.connect_ssl(socket, address, port)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001808
1809 Same behavior than the function socket:connect, but uses SSL.
1810
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001811 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001812 :returns: 1 or nil.
1813
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001814.. js:function:: Socket.getpeername(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001815
1816 Returns information about the remote side of a connected client object.
1817
1818 Returns a string with the IP address of the peer, followed by the port number
1819 that peer is using for the connection. In case of error, the method returns
1820 nil.
1821
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001822 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001823 :returns: a string containing the server information.
1824
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001825.. js:function:: Socket.getsockname(socket)
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001826
1827 Returns the local address information associated to the object.
1828
1829 The method returns a string with local IP address and a number with the port.
1830 In case of error, the method returns nil.
1831
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001832 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001833 :returns: a string containing the client information.
1834
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001835.. js:function:: Socket.receive(socket, [pattern [, prefix]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001836
1837 Reads data from a client object, according to the specified read pattern.
1838 Patterns follow the Lua file I/O format, and the difference in performance
1839 between all patterns is negligible.
1840
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001841 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001842 :param string|integer pattern: Describe what is required (see below).
1843 :param string prefix: A string which will be prefix the returned data.
1844 :returns: a string containing the required data or nil.
1845
1846 Pattern can be any of the following:
1847
1848 * **`*a`**: reads from the socket until the connection is closed. No
1849 end-of-line translation is performed;
1850
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001851 * **`*l`**: reads a line of text from the Socket. The line is terminated by a
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001852 LF character (ASCII 10), optionally preceded by a CR character
1853 (ASCII 13). The CR and LF characters are not included in the
1854 returned line. In fact, all CR characters are ignored by the
1855 pattern. This is the default pattern.
1856
1857 * **number**: causes the method to read a specified number of bytes from the
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001858 Socket. Prefix is an optional string to be concatenated to the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001859 beginning of any received data before return.
1860
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02001861 * **empty**: If the pattern is left empty, the default option is `*l`.
1862
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001863 If successful, the method returns the received pattern. In case of error, the
1864 method returns nil followed by an error message which can be the string
1865 'closed' in case the connection was closed before the transmission was
1866 completed or the string 'timeout' in case there was a timeout during the
1867 operation. Also, after the error message, the function returns the partial
1868 result of the transmission.
1869
1870 Important note: This function was changed severely. It used to support
1871 multiple patterns (but I have never seen this feature used) and now it
1872 doesn't anymore. Partial results used to be returned in the same way as
1873 successful results. This last feature violated the idea that all functions
1874 should return nil on error. Thus it was changed too.
1875
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001876.. js:function:: Socket.send(socket, data [, start [, end ]])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001877
1878 Sends data through client object.
1879
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001880 :param class_socket socket: Is the manipulated Socket.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001881 :param string data: The data that will be sent.
1882 :param integer start: The start position in the buffer of the data which will
1883 be sent.
1884 :param integer end: The end position in the buffer of the data which will
1885 be sent.
1886 :returns: see below.
1887
1888 Data is the string to be sent. The optional arguments i and j work exactly
1889 like the standard string.sub Lua function to allow the selection of a
1890 substring to be sent.
1891
1892 If successful, the method returns the index of the last byte within [start,
1893 end] that has been sent. Notice that, if start is 1 or absent, this is
1894 effectively the total number of bytes sent. In case of error, the method
1895 returns nil, followed by an error message, followed by the index of the last
1896 byte within [start, end] that has been sent. You might want to try again from
1897 the byte following that. The error message can be 'closed' in case the
1898 connection was closed before the transmission was completed or the string
1899 'timeout' in case there was a timeout during the operation.
1900
1901 Note: Output is not buffered. For small strings, it is always better to
1902 concatenate them in Lua (with the '..' operator) and send the result in one
1903 call instead of calling the method several times.
1904
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001905.. js:function:: Socket.setoption(socket, option [, value])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001906
1907 Just implemented for compatibility, this cal does nothing.
1908
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001909.. js:function:: Socket.settimeout(socket, value [, mode])
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001910
1911 Changes the timeout values for the object. All I/O operations are blocking.
1912 That is, any call to the methods send, receive, and accept will block
1913 indefinitely, until the operation completes. The settimeout method defines a
1914 limit on the amount of time the I/O methods can block. When a timeout time
1915 has elapsed, the affected methods give up and fail with an error code.
1916
1917 The amount of time to wait is specified as the value parameter, in seconds.
1918
Mark Lakes56cc1252018-03-27 09:48:06 +02001919 The timeout modes are not implemented, the only settable timeout is the
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001920 inactivity time waiting for complete the internal buffer send or waiting for
1921 receive data.
1922
Thierry FOURNIER486f5a02015-03-16 15:13:03 +01001923 :param class_socket socket: Is the manipulated Socket.
Mark Lakes56cc1252018-03-27 09:48:06 +02001924 :param float value: The timeout value. Use flotting point to specify
1925 milliseconds.
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01001926
Thierry FOURNIER31904272017-10-25 12:59:51 +02001927.. _regex_class:
1928
1929Regex class
1930===========
1931
1932.. js:class:: Regex
1933
1934 This class allows the usage of HAProxy regexes because classic lua doesn't
1935 provides regexes. This class inherits the HAProxy compilation options, so the
1936 regexes can be libc regex, pcre regex or pcre JIT regex.
1937
1938 The expression matching number is limited to 20 per regex. The only available
1939 option is case sensitive.
1940
1941 Because regexes compilation is a heavy process, it is better to define all
1942 your regexes in the **body context** and use it during the runtime.
1943
1944.. code-block:: lua
1945
1946 -- Create the regex
1947 st, regex = Regex.new("needle (..) (...)", true);
1948
1949 -- Check compilation errors
1950 if st == false then
1951 print "error: " .. regex
1952 end
1953
1954 -- Match the regexes
1955 print(regex:exec("Looking for a needle in the haystack")) -- true
1956 print(regex:exec("Lokking for a cat in the haystack")) -- false
1957
1958 -- Extract words
1959 st, list = regex:match("Looking for a needle in the haystack")
1960 print(st) -- true
1961 print(list[1]) -- needle in the
1962 print(list[2]) -- in
1963 print(list[3]) -- the
1964
1965.. js:function:: Regex.new(regex, case_sensitive)
1966
1967 Create and compile a regex.
1968
1969 :param string regex: The regular expression according with the libc or pcre
1970 standard
1971 :param boolean case_sensitive: Match is case sensitive or not.
1972 :returns: boolean status and :ref:`regex_class` or string containing fail reason.
1973
1974.. js:function:: Regex.exec(regex, str)
1975
1976 Execute the regex.
1977
1978 :param class_regex regex: A :ref:`regex_class` object.
1979 :param string str: The input string will be compared with the compiled regex.
1980 :returns: a boolean status according with the match result.
1981
1982.. js:function:: Regex.match(regex, str)
1983
1984 Execute the regex and return matched expressions.
1985
1986 :param class_map map: A :ref:`regex_class` object.
1987 :param string str: The input string will be compared with the compiled regex.
1988 :returns: a boolean status according with the match result, and
1989 a table containing all the string matched in order of declaration.
1990
Thierry FOURNIERdc595002015-12-21 11:13:52 +01001991.. _map_class:
1992
Thierry FOURNIER3def3932015-04-07 11:27:54 +02001993Map class
1994=========
1995
1996.. js:class:: Map
1997
1998 This class permits to do some lookup in HAProxy maps. The declared maps can
1999 be modified during the runtime throught the HAProxy management socket.
2000
2001.. code-block:: lua
2002
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002003 default = "usa"
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002004
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002005 -- Create and load map
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002006 geo = Map.new("geo.map", Map._ip);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002007
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002008 -- Create new fetch that returns the user country
2009 core.register_fetches("country", function(txn)
2010 local src;
2011 local loc;
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002012
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002013 src = txn.f:fhdr("x-forwarded-for");
2014 if (src == nil) then
2015 src = txn.f:src()
2016 if (src == nil) then
2017 return default;
2018 end
2019 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002020
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002021 -- Perform lookup
2022 loc = geo:lookup(src);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002023
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002024 if (loc == nil) then
2025 return default;
2026 end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002027
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002028 return loc;
2029 end);
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002030
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002031.. js:attribute:: Map._int
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002032
2033 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2034 samples" ans subchapter "ACL basics" to understand this pattern matching
2035 method.
2036
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002037 Note that :js:attr:`Map.int` is also available for compatibility.
2038
2039.. js:attribute:: Map._ip
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002040
2041 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2042 samples" ans subchapter "ACL basics" to understand this pattern matching
2043 method.
2044
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002045 Note that :js:attr:`Map.ip` is also available for compatibility.
2046
2047.. js:attribute:: Map._str
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002048
2049 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2050 samples" ans subchapter "ACL basics" to understand this pattern matching
2051 method.
2052
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002053 Note that :js:attr:`Map.str` is also available for compatibility.
2054
2055.. js:attribute:: Map._beg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002056
2057 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2058 samples" ans subchapter "ACL basics" to understand this pattern matching
2059 method.
2060
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002061 Note that :js:attr:`Map.beg` is also available for compatibility.
2062
2063.. js:attribute:: Map._sub
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002064
2065 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2066 samples" ans subchapter "ACL basics" to understand this pattern matching
2067 method.
2068
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002069 Note that :js:attr:`Map.sub` is also available for compatibility.
2070
2071.. js:attribute:: Map._dir
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002072
2073 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2074 samples" ans subchapter "ACL basics" to understand this pattern matching
2075 method.
2076
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002077 Note that :js:attr:`Map.dir` is also available for compatibility.
2078
2079.. js:attribute:: Map._dom
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002080
2081 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2082 samples" ans subchapter "ACL basics" to understand this pattern matching
2083 method.
2084
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002085 Note that :js:attr:`Map.dom` is also available for compatibility.
2086
2087.. js:attribute:: Map._end
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002088
2089 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2090 samples" ans subchapter "ACL basics" to understand this pattern matching
2091 method.
2092
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002093.. js:attribute:: Map._reg
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002094
2095 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching
2096 samples" ans subchapter "ACL basics" to understand this pattern matching
2097 method.
2098
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002099 Note that :js:attr:`Map.reg` is also available for compatibility.
2100
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002101
2102.. js:function:: Map.new(file, method)
2103
2104 Creates and load a map.
2105
2106 :param string file: Is the file containing the map.
2107 :param integer method: Is the map pattern matching method. See the attributes
2108 of the Map class.
2109 :returns: a class Map object.
Thierry FOURNIER4dc71972017-01-28 08:33:08 +01002110 :see: The Map attributes: :js:attr:`Map._int`, :js:attr:`Map._ip`,
2111 :js:attr:`Map._str`, :js:attr:`Map._beg`, :js:attr:`Map._sub`,
2112 :js:attr:`Map._dir`, :js:attr:`Map._dom`, :js:attr:`Map._end` and
2113 :js:attr:`Map._reg`.
Thierry FOURNIER3def3932015-04-07 11:27:54 +02002114
2115.. js:function:: Map.lookup(map, str)
2116
2117 Perform a lookup in a map.
2118
2119 :param class_map map: Is the class Map object.
2120 :param string str: Is the string used as key.
2121 :returns: a string containing the result or nil if no match.
2122
2123.. js:function:: Map.slookup(map, str)
2124
2125 Perform a lookup in a map.
2126
2127 :param class_map map: Is the class Map object.
2128 :param string str: Is the string used as key.
2129 :returns: a string containing the result or empty string if no match.
2130
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002131.. _applethttp_class:
2132
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002133AppletHTTP class
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002134================
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002135
2136.. js:class:: AppletHTTP
2137
2138 This class is used with applets that requires the 'http' mode. The http applet
2139 can be registered with the *core.register_service()* function. They are used
2140 for processing an http request like a server in back of HAProxy.
2141
2142 This is an hello world sample code:
2143
2144.. code-block:: lua
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002145
Pieter Baauw4d7f7662015-11-08 16:38:08 +01002146 core.register_service("hello-world", "http", function(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002147 local response = "Hello World !"
2148 applet:set_status(200)
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002149 applet:add_header("content-length", string.len(response))
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002150 applet:add_header("content-type", "text/plain")
Pieter Baauw2dcb9bc2015-10-01 22:47:12 +02002151 applet:start_response()
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002152 applet:send(response)
2153 end)
2154
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002155.. js:attribute:: AppletHTTP.c
2156
2157 :returns: A :ref:`converters_class`
2158
2159 This attribute contains a Converters class object.
2160
2161.. js:attribute:: AppletHTTP.sc
2162
2163 :returns: A :ref:`converters_class`
2164
2165 This attribute contains a Converters class object. The
2166 functions of this object returns always a string.
2167
2168.. js:attribute:: AppletHTTP.f
2169
2170 :returns: A :ref:`fetches_class`
2171
2172 This attribute contains a Fetches class object. Note that the
2173 applet execution place cannot access to a valid HAProxy core HTTP
2174 transaction, so some sample fecthes related to the HTTP dependant
2175 values (hdr, path, ...) are not available.
2176
2177.. js:attribute:: AppletHTTP.sf
2178
2179 :returns: A :ref:`fetches_class`
2180
2181 This attribute contains a Fetches class object. The functions of
2182 this object returns always a string. Note that the applet
2183 execution place cannot access to a valid HAProxy core HTTP
2184 transaction, so some sample fecthes related to the HTTP dependant
2185 values (hdr, path, ...) are not available.
2186
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002187.. js:attribute:: AppletHTTP.method
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002188
2189 :returns: string
2190
2191 The attribute method returns a string containing the HTTP
2192 method.
2193
2194.. js:attribute:: AppletHTTP.version
2195
2196 :returns: string
2197
2198 The attribute version, returns a string containing the HTTP
2199 request version.
2200
2201.. js:attribute:: AppletHTTP.path
2202
2203 :returns: string
2204
2205 The attribute path returns a string containing the HTTP
2206 request path.
2207
2208.. js:attribute:: AppletHTTP.qs
2209
2210 :returns: string
2211
2212 The attribute qs returns a string containing the HTTP
2213 request query string.
2214
2215.. js:attribute:: AppletHTTP.length
2216
2217 :returns: integer
2218
2219 The attribute length returns an integer containing the HTTP
2220 body length.
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002221
Thierry FOURNIER841475e2015-12-11 17:10:09 +01002222.. js:attribute:: AppletHTTP.headers
2223
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002224 :returns: table
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002225
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002226 The attribute headers returns a table containing the HTTP
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002227 headers. The header names are always in lower case. As the header name can be
2228 encountered more than once in each request, the value is indexed with 0 as
Patrick Hemmerc6a1d712018-05-01 21:30:41 -04002229 first index value. The table have this form:
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002230
2231.. code-block:: lua
2232
2233 AppletHTTP.headers['<header-name>'][<header-index>] = "<header-value>"
2234
2235 AppletHTTP.headers["host"][0] = "www.test.com"
2236 AppletHTTP.headers["accept"][0] = "audio/basic q=1"
2237 AppletHTTP.headers["accept"][1] = "audio/*, q=0.2"
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002238 AppletHTTP.headers["accept"][2] = "*/*, q=0.1"
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002239..
2240
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002241.. js:function:: AppletHTTP.set_status(applet, code [, reason])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002242
2243 This function sets the HTTP status code for the response. The allowed code are
2244 from 100 to 599.
2245
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002246 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002247 :param integer code: the status code returned to the client.
Robin H. Johnson52f5db22017-01-01 13:10:52 -08002248 :param string reason: the status reason returned to the client (optional).
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002249
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002250.. js:function:: AppletHTTP.add_header(applet, name, value)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002251
2252 This function add an header in the response. Duplicated headers are not
2253 collapsed. The special header *content-length* is used to determinate the
2254 response length. If it not exists, a *transfer-encoding: chunked* is set, and
2255 all the write from the funcion *AppletHTTP:send()* become a chunk.
2256
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002257 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002258 :param string name: the header name
2259 :param string value: the header value
2260
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002261.. js:function:: AppletHTTP.start_response(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002262
2263 This function indicates to the HTTP engine that it can process and send the
2264 response headers. After this called we cannot add headers to the response; We
2265 cannot use the *AppletHTTP:send()* function if the
2266 *AppletHTTP:start_response()* is not called.
2267
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002268 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2269
2270.. js:function:: AppletHTTP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002271
2272 This function returns a string containing one line from the http body. If the
2273 data returned doesn't contains a final '\\n' its assumed than its the last
2274 available data before the end of stream.
2275
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002276 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002277 :returns: a string. The string can be empty if we reach the end of the stream.
2278
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002279.. js:function:: AppletHTTP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002280
2281 Reads data from the HTTP body, according to the specified read *size*. If the
2282 *size* is missing, the function tries to read all the content of the stream
2283 until the end. If the *size* is bigger than the http body, it returns the
2284 amount of data avalaible.
2285
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002286 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002287 :param integer size: the required read size.
2288 :returns: always return a string,the string can be empty is the connexion is
2289 closed.
2290
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002291.. js:function:: AppletHTTP.send(applet, msg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002292
2293 Send the message *msg* on the http request body.
2294
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002295 :param class_AppletHTTP applet: An :ref:`applethttp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002296 :param string msg: the message to send.
2297
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002298.. js:function:: AppletHTTP.get_priv(applet)
2299
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002300 Return Lua data stored in the current transaction. If no data are stored,
2301 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002302
2303 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2304 :returns: the opaque data previsously stored, or nil if nothing is
2305 avalaible.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002306 :see: :js:func:`AppletHTTP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002307
2308.. js:function:: AppletHTTP.set_priv(applet, data)
2309
2310 Store any data in the current HAProxy transaction. This action replace the
2311 old stored data.
2312
2313 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2314 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002315 :see: :js:func:`AppletHTTP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002316
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002317.. js:function:: AppletHTTP.set_var(applet, var, value)
2318
2319 Converts a Lua type in a HAProxy type and store it in a variable <var>.
2320
2321 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2322 :param string var: The variable name according with the HAProxy variable syntax.
2323 :param type value: The value associated to the variable. The type ca be string or
2324 integer.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002325 :see: :js:func:`AppletHTTP.unset_var`
2326 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002327
2328.. js:function:: AppletHTTP.unset_var(applet, var)
2329
2330 Unset the variable <var>.
2331
2332 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2333 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002334 :see: :js:func:`AppletHTTP.set_var`
2335 :see: :js:func:`AppletHTTP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002336
2337.. js:function:: AppletHTTP.get_var(applet, var)
2338
2339 Returns data stored in the variable <var> converter in Lua type.
2340
2341 :param class_AppletHTTP applet: An :ref:`applethttp_class`
2342 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002343 :see: :js:func:`AppletHTTP.set_var`
2344 :see: :js:func:`AppletHTTP.unset_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002345
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002346.. _applettcp_class:
2347
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002348AppletTCP class
2349===============
2350
2351.. js:class:: AppletTCP
2352
2353 This class is used with applets that requires the 'tcp' mode. The tcp applet
2354 can be registered with the *core.register_service()* function. They are used
2355 for processing a tcp stream like a server in back of HAProxy.
2356
Thierry FOURNIERdc595002015-12-21 11:13:52 +01002357.. js:attribute:: AppletTCP.c
2358
2359 :returns: A :ref:`converters_class`
2360
2361 This attribute contains a Converters class object.
2362
2363.. js:attribute:: AppletTCP.sc
2364
2365 :returns: A :ref:`converters_class`
2366
2367 This attribute contains a Converters class object. The
2368 functions of this object returns always a string.
2369
2370.. js:attribute:: AppletTCP.f
2371
2372 :returns: A :ref:`fetches_class`
2373
2374 This attribute contains a Fetches class object.
2375
2376.. js:attribute:: AppletTCP.sf
2377
2378 :returns: A :ref:`fetches_class`
2379
2380 This attribute contains a Fetches class object.
2381
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002382.. js:function:: AppletTCP.getline(applet)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002383
2384 This function returns a string containing one line from the stream. If the
2385 data returned doesn't contains a final '\\n' its assumed than its the last
2386 available data before the end of stream.
2387
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002388 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002389 :returns: a string. The string can be empty if we reach the end of the stream.
2390
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002391.. js:function:: AppletTCP.receive(applet, [size])
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002392
2393 Reads data from the TCP stream, according to the specified read *size*. If the
2394 *size* is missing, the function tries to read all the content of the stream
2395 until the end.
2396
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002397 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002398 :param integer size: the required read size.
2399 :returns: always return a string,the string can be empty is the connexion is
2400 closed.
2401
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002402.. js:function:: AppletTCP.send(appletmsg)
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002403
2404 Send the message on the stream.
2405
Thierry FOURNIERe34a78e2015-12-25 01:31:35 +01002406 :param class_AppletTCP applet: An :ref:`applettcp_class`
Thierry FOURNIERa3bc5132015-09-25 21:43:56 +02002407 :param string msg: the message to send.
2408
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002409.. js:function:: AppletTCP.get_priv(applet)
2410
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002411 Return Lua data stored in the current transaction. If no data are stored,
2412 it returns a nil value.
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002413
2414 :param class_AppletTCP applet: An :ref:`applettcp_class`
2415 :returns: the opaque data previsously stored, or nil if nothing is
2416 avalaible.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002417 :see: :js:func:`AppletTCP.set_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002418
2419.. js:function:: AppletTCP.set_priv(applet, data)
2420
2421 Store any data in the current HAProxy transaction. This action replace the
2422 old stored data.
2423
2424 :param class_AppletTCP applet: An :ref:`applettcp_class`
2425 :param opaque data: The data which is stored in the transaction.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002426 :see: :js:func:`AppletTCP.get_priv`
Thierry FOURNIER8db004c2015-12-25 01:33:18 +01002427
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002428.. js:function:: AppletTCP.set_var(applet, var, value)
2429
2430 Converts a Lua type in a HAProxy type and stores it in a variable <var>.
2431
2432 :param class_AppletTCP applet: An :ref:`applettcp_class`
2433 :param string var: The variable name according with the HAProxy variable syntax.
2434 :param type value: The value associated to the variable. The type can be string or
2435 integer.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002436 :see: :js:func:`AppletTCP.unset_var`
2437 :see: :js:func:`AppletTCP.get_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002438
2439.. js:function:: AppletTCP.unset_var(applet, var)
2440
2441 Unsets the variable <var>.
2442
2443 :param class_AppletTCP applet: An :ref:`applettcp_class`
2444 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002445 :see: :js:func:`AppletTCP.unset_var`
2446 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002447
2448.. js:function:: AppletTCP.get_var(applet, var)
2449
2450 Returns data stored in the variable <var> converter in Lua type.
2451
2452 :param class_AppletTCP applet: An :ref:`applettcp_class`
2453 :param string var: The variable name according with the HAProxy variable syntax.
Thierry FOURNIER12a865d2016-12-14 19:40:37 +01002454 :see: :js:func:`AppletTCP.unset_var`
2455 :see: :js:func:`AppletTCP.set_var`
Thierry FOURNIER / OZON.IOc1edafe2016-12-12 16:25:30 +01002456
Thierry FOURNIER17bd1522015-03-11 20:31:00 +01002457External Lua libraries
2458======================
2459
2460A lot of useful lua libraries can be found here:
2461
2462* `https://lua-toolbox.com/ <https://lua-toolbox.com/>`_
2463
2464Redis acces:
2465
2466* `https://github.com/nrk/redis-lua <https://github.com/nrk/redis-lua>`_
2467
2468This is an example about the usage of the Redis library with HAProxy. Note that
2469each call of any function of this library can throw an error if the socket
2470connection fails.
2471
2472.. code-block:: lua
2473
2474 -- load the redis library
2475 local redis = require("redis");
2476
2477 function do_something(txn)
2478
2479 -- create and connect new tcp socket
2480 local tcp = core.tcp();
2481 tcp:settimeout(1);
2482 tcp:connect("127.0.0.1", 6379);
2483
2484 -- use the redis library with this new socket
2485 local client = redis.connect({socket=tcp});
2486 client:ping();
2487
2488 end
2489
2490OpenSSL:
2491
2492* `http://mkottman.github.io/luacrypto/index.html
2493 <http://mkottman.github.io/luacrypto/index.html>`_
2494
2495* `https://github.com/brunoos/luasec/wiki
2496 <https://github.com/brunoos/luasec/wiki>`_
Thierry FOURNIER2e4893c2015-03-18 13:37:27 +01002497