1.. 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 302. The Lua **init context**. It is a Lua function executed just after the 31 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 383. The Lua **task context**. It is a Lua function executed after the start 39 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 454. The **action context**. It is a Lua function conditionally executed. These 46 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)`. 49 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:: 59 It is possible that this function cannot found the required data in the 60 original HAProxy sample-fetches, in this case, it cannot return the 61 result. This case is not yet supported 62 636. The **converter context**. It is a Lua function that takes a string as input 64 and returns another string as output. These types of function are stateless, 65 it cannot access to any context. They don't execute any blocking function. 66 The call prototype is `function string fcn(string)`. This function can be 67 registered with the Lua function `core.register_converters()`. Each declared 68 converter is prefixed by the string "lua.". 69 70HAProxy Lua Hello world 71----------------------- 72 73HAProxy configuration file (`hello_world.conf`): 74 75:: 76 77 global 78 lua-load hello_world.lua 79 80 listen proxy 81 bind 127.0.0.1:10001 82 tcp-request inspect-delay 1s 83 tcp-request content use-service lua.hello_world 84 85HAProxy Lua file (`hello_world.lua`): 86 87.. code-block:: lua 88 89 core.register_service("hello_world", "tcp", function(applet) 90 applet:send("hello world\n") 91 end) 92 93How to start HAProxy for testing this configuration: 94 95:: 96 97 ./haproxy -f hello_world.conf 98 99On other terminal, you can test with telnet: 100 101:: 102 103 #:~ telnet 127.0.0.1 10001 104 hello world 105 106Core class 107========== 108 109.. js:class:: core 110 111 The "core" class contains all the HAProxy core functions. These function are 112 useful for the controlling the execution flow, registering hooks, manipulating 113 global maps or ACL, ... 114 115 "core" class is basically provided with HAProxy. No `require` line is 116 required to uses these function. 117 118 The "core" class is static, it is not possible to create a new object of this 119 type. 120 121.. js:attribute:: core.emerg 122 123 :returns: integer 124 125 This attribute is an integer, it contains the value of the loglevel "emergency" (0). 126 127.. js:attribute:: core.alert 128 129 :returns: integer 130 131 This attribute is an integer, it contains the value of the loglevel "alert" (1). 132 133.. js:attribute:: core.crit 134 135 :returns: integer 136 137 This attribute is an integer, it contains the value of the loglevel "critical" (2). 138 139.. js:attribute:: core.err 140 141 :returns: integer 142 143 This attribute is an integer, it contains the value of the loglevel "error" (3). 144 145.. js:attribute:: core.warning 146 147 :returns: integer 148 149 This attribute is an integer, it contains the value of the loglevel "warning" (4). 150 151.. js:attribute:: core.notice 152 153 :returns: integer 154 155 This attribute is an integer, it contains the value of the loglevel "notice" (5). 156 157.. js:attribute:: core.info 158 159 :returns: integer 160 161 This attribute is an integer, it contains the value of the loglevel "info" (6). 162 163.. js:attribute:: core.debug 164 165 :returns: integer 166 167 This attribute is an integer, it contains the value of the loglevel "debug" (7). 168 169.. js:attribute:: core.proxies 170 171 **context**: task, action, sample-fetch, converter 172 173 This attribute is a table of declared proxies (frontend and backends). Each 174 proxy give an access to his list of listeners and servers. The table is 175 indexed by proxy name, and each entry is of type :ref:`proxy_class`. 176 177 .. Warning:: 178 if you are declared frontend and backend with the same name, only one of 179 these are listed. 180 181 :see: :js:attr:`core.backends` 182 :see: :js:attr:`core.frontends` 183 184.. js:attribute:: core.backends 185 186 **context**: task, action, sample-fetch, converter 187 188 This attribute is a table of declared proxies with backend capability. Each 189 proxy give an access to his list of listeners and servers. The table is 190 indexed by the backend name, and each entry is of type :ref:`proxy_class`. 191 192 :see: :js:attr:`core.proxies` 193 :see: :js:attr:`core.frontends` 194 195.. js:attribute:: core.frontends 196 197 **context**: task, action, sample-fetch, converter 198 199 This attribute is a table of declared proxies with frontend capability. Each 200 proxy give an access to his list of listeners and servers. The table is 201 indexed by the frontend name, and each entry is of type :ref:`proxy_class`. 202 203 :see: :js:attr:`core.proxies` 204 :see: :js:attr:`core.backends` 205 206.. js:attribute:: core.thread 207 208 **context**: task, action, sample-fetch, converter, applet 209 210 This variable contains the executing thread number starting at 1. 0 is a 211 special case for the common lua context. So, if thread is 0, Lua scope is 212 shared by all threads, otherwise the scope is dedicated to a single thread. 213 A program which needs to execute some parts exactly once regardless of the 214 number of threads can check that core.thread is 0 or 1. 215 216.. js:function:: core.log(loglevel, msg) 217 218 **context**: body, init, task, action, sample-fetch, converter 219 220 This function sends a log. The log is sent, according with the HAProxy 221 configuration file, on the default syslog server if it is configured and on 222 the stderr if it is allowed. 223 224 :param integer loglevel: Is the log level associated with the message. It is a 225 number between 0 and 7. 226 :param string msg: The log content. 227 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`, 228 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`, 229 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions) 230 :see: :js:func:`core.Debug` 231 :see: :js:func:`core.Info` 232 :see: :js:func:`core.Warning` 233 :see: :js:func:`core.Alert` 234 235.. js:function:: core.Debug(msg) 236 237 **context**: body, init, task, action, sample-fetch, converter 238 239 :param string msg: The log content. 240 :see: :js:func:`core.log` 241 242 Does the same job than: 243 244.. code-block:: lua 245 246 function Debug(msg) 247 core.log(core.debug, msg) 248 end 249.. 250 251.. js:function:: core.Info(msg) 252 253 **context**: body, init, task, action, sample-fetch, converter 254 255 :param string msg: The log content. 256 :see: :js:func:`core.log` 257 258.. code-block:: lua 259 260 function Info(msg) 261 core.log(core.info, msg) 262 end 263.. 264 265.. js:function:: core.Warning(msg) 266 267 **context**: body, init, task, action, sample-fetch, converter 268 269 :param string msg: The log content. 270 :see: :js:func:`core.log` 271 272.. code-block:: lua 273 274 function Warning(msg) 275 core.log(core.warning, msg) 276 end 277.. 278 279.. js:function:: core.Alert(msg) 280 281 **context**: body, init, task, action, sample-fetch, converter 282 283 :param string msg: The log content. 284 :see: :js:func:`core.log` 285 286.. code-block:: lua 287 288 function Alert(msg) 289 core.log(core.alert, msg) 290 end 291.. 292 293.. js:function:: core.add_acl(filename, key) 294 295 **context**: init, task, action, sample-fetch, converter 296 297 Add the ACL *key* in the ACLs list referenced by the file *filename*. 298 299 :param string filename: the filename that reference the ACL entries. 300 :param string key: the key which will be added. 301 302.. js:function:: core.del_acl(filename, key) 303 304 **context**: init, task, action, sample-fetch, converter 305 306 Delete the ACL entry referenced by the key *key* in the list of ACLs 307 referenced by *filename*. 308 309 :param string filename: the filename that reference the ACL entries. 310 :param string key: the key which will be deleted. 311 312.. js:function:: core.del_map(filename, key) 313 314 **context**: init, task, action, sample-fetch, converter 315 316 Delete the map entry indexed with the specified key in the list of maps 317 referenced by his filename. 318 319 :param string filename: the filename that reference the map entries. 320 :param string key: the key which will be deleted. 321 322.. js:function:: core.get_info() 323 324 **context**: body, init, task, action, sample-fetch, converter 325 326 Returns HAProxy core information. We can found information like the uptime, 327 the pid, memory pool usage, tasks number, ... 328 329 These information are also returned by the management socket via the command 330 "show info". See the management socket documentation for more information 331 about the content of these variables. 332 333 :returns: an array of values. 334 335.. js:function:: core.now() 336 337 **context**: body, init, task, action 338 339 This function returns the current time. The time returned is fixed by the 340 HAProxy core and assures than the hour will be monotonic and that the system 341 call 'gettimeofday' will not be called too. The time is refreshed between each 342 Lua execution or resume, so two consecutive call to the function "now" will 343 probably returns the same result. 344 345 :returns: a table which contains two entries "sec" and "usec". "sec" 346 contains the current at the epoch format, and "usec" contains the 347 current microseconds. 348 349.. js:function:: core.http_date(date) 350 351 **context**: body, init, task, action 352 353 This function take a string representing http date, and returns an integer 354 containing the corresponding date with a epoch format. A valid http date 355 me respect the format IMF, RFC850 or ASCTIME. 356 357 :param string date: a date http-date formatted 358 :returns: integer containing epoch date 359 :see: :js:func:`core.imf_date`. 360 :see: :js:func:`core.rfc850_date`. 361 :see: :js:func:`core.asctime_date`. 362 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1 363 364.. js:function:: core.imf_date(date) 365 366 **context**: body, init, task, action 367 368 This function take a string representing IMF date, and returns an integer 369 containing the corresponding date with a epoch format. 370 371 :param string date: a date IMF formatted 372 :returns: integer containing epoch date 373 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1 374 375 The IMF format is like this: 376 377.. code-block:: text 378 379 Sun, 06 Nov 1994 08:49:37 GMT 380.. 381 382.. js:function:: core.rfc850_date(date) 383 384 **context**: body, init, task, action 385 386 This function take a string representing RFC850 date, and returns an integer 387 containing the corresponding date with a epoch format. 388 389 :param string date: a date RFC859 formatted 390 :returns: integer containing epoch date 391 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1 392 393 The RFC850 format is like this: 394 395.. code-block:: text 396 397 Sunday, 06-Nov-94 08:49:37 GMT 398.. 399 400.. js:function:: core.asctime_date(date) 401 402 **context**: body, init, task, action 403 404 This function take a string representing ASCTIME date, and returns an integer 405 containing the corresponding date with a epoch format. 406 407 :param string date: a date ASCTIME formatted 408 :returns: integer containing epoch date 409 :see: https://tools.ietf.org/html/rfc7231#section-7.1.1.1 410 411 The ASCTIME format is like this: 412 413.. code-block:: text 414 415 Sun Nov 6 08:49:37 1994 416.. 417 418.. js:function:: core.rfc850_date(date) 419 420 **context**: body, init, task, action 421 422 This function take a string representing http date, and returns an integer 423 containing the corresponding date with a epoch format. 424 425 :param string date: a date http-date formatted 426 427.. js:function:: core.asctime_date(date) 428 429 **context**: body, init, task, action 430 431 This function take a string representing http date, and returns an integer 432 containing the corresponding date with a epoch format. 433 434 :param string date: a date http-date formatted 435 436.. js:function:: core.msleep(milliseconds) 437 438 **context**: body, init, task, action 439 440 The `core.msleep()` stops the Lua execution between specified milliseconds. 441 442 :param integer milliseconds: the required milliseconds. 443 444.. js:attribute:: core.proxies 445 446 **context**: body, init, task, action, sample-fetch, converter 447 448 Proxies is a table containing the list of all proxies declared in the 449 configuration file. The table is indexed by the proxy name, and each entry 450 of the proxies table is an object of type :ref:`proxy_class`. 451 452 .. warning:: 453 if you have declared a frontend and backend with the same name, only one of 454 these are listed. 455 456.. js:function:: core.register_action(name, actions, func [, nb_args]) 457 458 **context**: body 459 460 Register a Lua function executed as action. All the registered action can be 461 used in HAProxy with the prefix "lua.". An action gets a TXN object class as 462 input. 463 464 :param string name: is the name of the converter. 465 :param table actions: is a table of string describing the HAProxy actions who 466 want to register to. The expected actions are 'tcp-req', 467 'tcp-res', 'http-req' or 'http-res'. 468 :param integer nb_args: is the expected number of argument for the action. 469 By default the value is 0. 470 :param function func: is the Lua function called to work as converter. 471 472 The prototype of the Lua function used as argument is: 473 474.. code-block:: lua 475 476 function(txn [, arg1 [, arg2]]) 477.. 478 479 * **txn** (:ref:`txn_class`): this is a TXN object used for manipulating the 480 current request or TCP stream. 481 482 * **argX**: this is argument provided through the HAProxy configuration file. 483 484 Here, an example of action registration. The action just send an 'Hello world' 485 in the logs. 486 487.. code-block:: lua 488 489 core.register_action("hello-world", { "tcp-req", "http-req" }, function(txn) 490 txn:Info("Hello world") 491 end) 492.. 493 494 This example code is used in HAProxy configuration like this: 495 496:: 497 498 frontend tcp_frt 499 mode tcp 500 tcp-request content lua.hello-world 501 502 frontend http_frt 503 mode http 504 http-request lua.hello-world 505.. 506 507 A second example using arguments 508 509.. code-block:: lua 510 511 function hello_world(txn, arg) 512 txn:Info("Hello world for " .. arg) 513 end 514 core.register_action("hello-world", { "tcp-req", "http-req" }, hello_world, 2) 515.. 516 517 This example code is used in HAProxy configuration like this: 518 519:: 520 521 frontend tcp_frt 522 mode tcp 523 tcp-request content lua.hello-world everybody 524.. 525.. js:function:: core.register_converters(name, func) 526 527 **context**: body 528 529 Register a Lua function executed as converter. All the registered converters 530 can be used in HAProxy with the prefix "lua.". An converter get a string as 531 input and return a string as output. The registered function can take up to 9 532 values as parameter. All the value are strings. 533 534 :param string name: is the name of the converter. 535 :param function func: is the Lua function called to work as converter. 536 537 The prototype of the Lua function used as argument is: 538 539.. code-block:: lua 540 541 function(str, [p1 [, p2 [, ... [, p5]]]]) 542.. 543 544 * **str** (*string*): this is the input value automatically converted in 545 string. 546 * **p1** .. **p5** (*string*): this is a list of string arguments declared in 547 the HAProxy configuration file. The number of arguments doesn't exceed 5. 548 The order and the nature of these is conventionally choose by the 549 developer. 550 551.. js:function:: core.register_fetches(name, func) 552 553 **context**: body 554 555 Register a Lua function executed as sample fetch. All the registered sample 556 fetch can be used in HAProxy with the prefix "lua.". A Lua sample fetch 557 return a string as output. The registered function can take up to 9 values as 558 parameter. All the value are strings. 559 560 :param string name: is the name of the converter. 561 :param function func: is the Lua function called to work as sample fetch. 562 563 The prototype of the Lua function used as argument is: 564 565.. code-block:: lua 566 567 string function(txn, [p1 [, p2 [, ... [, p5]]]]) 568.. 569 570 * **txn** (:ref:`txn_class`): this is the txn object associated with the current 571 request. 572 * **p1** .. **p5** (*string*): this is a list of string arguments declared in 573 the HAProxy configuration file. The number of arguments doesn't exceed 5. 574 The order and the nature of these is conventionally choose by the 575 developer. 576 * **Returns**: A string containing some data, or nil if the value cannot be 577 returned now. 578 579 lua example code: 580 581.. code-block:: lua 582 583 core.register_fetches("hello", function(txn) 584 return "hello" 585 end) 586.. 587 588 HAProxy example configuration: 589 590:: 591 592 frontend example 593 http-request redirect location /%[lua.hello] 594 595.. js:function:: core.register_service(name, mode, func) 596 597 **context**: body 598 599 Register a Lua function executed as a service. All the registered service can 600 be used in HAProxy with the prefix "lua.". A service gets an object class as 601 input according with the required mode. 602 603 :param string name: is the name of the converter. 604 :param string mode: is string describing the required mode. Only 'tcp' or 605 'http' are allowed. 606 :param function func: is the Lua function called to work as converter. 607 608 The prototype of the Lua function used as argument is: 609 610.. code-block:: lua 611 612 function(applet) 613.. 614 615 * **applet** *applet* will be a :ref:`applettcp_class` or a 616 :ref:`applethttp_class`. It depends the type of registered applet. An applet 617 registered with the 'http' value for the *mode* parameter will gets a 618 :ref:`applethttp_class`. If the *mode* value is 'tcp', the applet will gets 619 a :ref:`applettcp_class`. 620 621 .. warning:: 622 Applets of type 'http' cannot be called from 'tcp-*' rulesets. Only the 623 'http-*' rulesets are authorized, this means that is not possible to call 624 an HTTP applet from a proxy in tcp mode. Applets of type 'tcp' can be 625 called from anywhere. 626 627 Here, an example of service registration. The service just send an 'Hello world' 628 as an http response. 629 630.. code-block:: lua 631 632 core.register_service("hello-world", "http", function(applet) 633 local response = "Hello World !" 634 applet:set_status(200) 635 applet:add_header("content-length", string.len(response)) 636 applet:add_header("content-type", "text/plain") 637 applet:start_response() 638 applet:send(response) 639 end) 640.. 641 642 This example code is used in HAProxy configuration like this: 643 644:: 645 646 frontend example 647 http-request use-service lua.hello-world 648 649.. js:function:: core.register_init(func) 650 651 **context**: body 652 653 Register a function executed after the configuration parsing. This is useful 654 to check any parameters. 655 656 :param function func: is the Lua function called to work as initializer. 657 658 The prototype of the Lua function used as argument is: 659 660.. code-block:: lua 661 662 function() 663.. 664 665 It takes no input, and no output is expected. 666 667.. js:function:: core.register_task(func) 668 669 **context**: body, init, task, action, sample-fetch, converter 670 671 Register and start independent task. The task is started when the HAProxy 672 main scheduler starts. For example this type of tasks can be executed to 673 perform complex health checks. 674 675 :param function func: is the Lua function called to work as initializer. 676 677 The prototype of the Lua function used as argument is: 678 679.. code-block:: lua 680 681 function() 682.. 683 684 It takes no input, and no output is expected. 685 686.. js:function:: core.register_cli([path], usage, func) 687 688 **context**: body 689 690 Register and start independent task. The task is started when the HAProxy 691 main scheduler starts. For example this type of tasks can be executed to 692 perform complex health checks. 693 694 :param array path: is the sequence of word for which the cli execute the Lua 695 binding. 696 :param string usage: is the usage message displayed in the help. 697 :param function func: is the Lua function called to handle the CLI commands. 698 699 The prototype of the Lua function used as argument is: 700 701.. code-block:: lua 702 703 function(AppletTCP, [arg1, [arg2, [...]]]) 704.. 705 706 I/O are managed with the :ref:`applettcp_class` object. Args are given as 707 parameter. The args embed the registered path. If the path is declared like 708 this: 709 710.. code-block:: lua 711 712 core.register_cli({"show", "ssl", "stats"}, "Display SSL stats..", function(applet, arg1, arg2, arg3, arg4, arg5) 713 end) 714.. 715 716 And we execute this in the prompt: 717 718.. code-block:: text 719 720 > prompt 721 > show ssl stats all 722.. 723 724 Then, arg1, arg2 and arg3 will contains respectively "show", "ssl" and "stats". 725 arg4 will contain "all". arg5 contains nil. 726 727.. js:function:: core.set_nice(nice) 728 729 **context**: task, action, sample-fetch, converter 730 731 Change the nice of the current task or current session. 732 733 :param integer nice: the nice value, it must be between -1024 and 1024. 734 735.. js:function:: core.set_map(filename, key, value) 736 737 **context**: init, task, action, sample-fetch, converter 738 739 Set the value *value* associated to the key *key* in the map referenced by 740 *filename*. 741 742 :param string filename: the Map reference 743 :param string key: the key to set or replace 744 :param string value: the associated value 745 746.. js:function:: core.sleep(int seconds) 747 748 **context**: body, init, task, action 749 750 The `core.sleep()` functions stop the Lua execution between specified seconds. 751 752 :param integer seconds: the required seconds. 753 754.. js:function:: core.tcp() 755 756 **context**: init, task, action 757 758 This function returns a new object of a *socket* class. 759 760 :returns: A :ref:`socket_class` object. 761 762.. js:function:: core.concat() 763 764 **context**: body, init, task, action, sample-fetch, converter 765 766 This function returns a new concat object. 767 768 :returns: A :ref:`concat_class` object. 769 770.. js:function:: core.done(data) 771 772 **context**: body, init, task, action, sample-fetch, converter 773 774 :param any data: Return some data for the caller. It is useful with 775 sample-fetches and sample-converters. 776 777 Immediately stops the current Lua execution and returns to the caller which 778 may be a sample fetch, a converter or an action and returns the specified 779 value (ignored for actions and init). It is used when the LUA process finishes 780 its work and wants to give back the control to HAProxy without executing the 781 remaining code. It can be seen as a multi-level "return". 782 783.. js:function:: core.yield() 784 785 **context**: task, action, sample-fetch, converter 786 787 Give back the hand at the HAProxy scheduler. It is used when the LUA 788 processing consumes a lot of processing time. 789 790.. js:function:: core.parse_addr(address) 791 792 **context**: body, init, task, action, sample-fetch, converter 793 794 :param network: is a string describing an ipv4 or ipv6 address and optionally 795 its network length, like this: "127.0.0.1/8" or "aaaa::1234/32". 796 :returns: a userdata containing network or nil if an error occurs. 797 798 Parse ipv4 or ipv6 addresses and its facultative associated network. 799 800.. js:function:: core.match_addr(addr1, addr2) 801 802 **context**: body, init, task, action, sample-fetch, converter 803 804 :param addr1: is an address created with "core.parse_addr". 805 :param addr2: is an address created with "core.parse_addr". 806 :returns: boolean, true if the network of the addresses match, else returns 807 false. 808 809 Match two networks. For example "127.0.0.1/32" matches "127.0.0.0/8". The order 810 of network is not important. 811 812.. js:function:: core.tokenize(str, separators [, noblank]) 813 814 **context**: body, init, task, action, sample-fetch, converter 815 816 This function is useful for tokenizing an entry, or splitting some messages. 817 :param string str: The string which will be split. 818 :param string separators: A string containing a list of separators. 819 :param boolean noblank: Ignore empty entries. 820 :returns: an array of string. 821 822 For example: 823 824.. code-block:: lua 825 826 local array = core.tokenize("This function is useful, for tokenizing an entry.", "., ", true) 827 print_r(array) 828.. 829 830 Returns this array: 831 832.. code-block:: text 833 834 (table) table: 0x21c01e0 [ 835 1: (string) "This" 836 2: (string) "function" 837 3: (string) "is" 838 4: (string) "useful" 839 5: (string) "for" 840 6: (string) "tokenizing" 841 7: (string) "an" 842 8: (string) "entry" 843 ] 844.. 845 846.. _proxy_class: 847 848Proxy class 849============ 850 851.. js:class:: Proxy 852 853 This class provides a way for manipulating proxy and retrieving information 854 like statistics. 855 856.. js:attribute:: Proxy.name 857 858 Contain the name of the proxy. 859 860.. js:attribute:: Proxy.uuid 861 862 Contain the unique identifier of the proxy. 863 864.. js:attribute:: Proxy.servers 865 866 Contain a table with the attached servers. The table is indexed by server 867 name, and each server entry is an object of type :ref:`server_class`. 868 869.. js:attribute:: Proxy.stktable 870 871 Contains a stick table object attached to the proxy. 872 873.. js:attribute:: Proxy.listeners 874 875 Contain a table with the attached listeners. The table is indexed by listener 876 name, and each each listeners entry is an object of type 877 :ref:`listener_class`. 878 879.. js:function:: Proxy.pause(px) 880 881 Pause the proxy. See the management socket documentation for more information. 882 883 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated 884 proxy. 885 886.. js:function:: Proxy.resume(px) 887 888 Resume the proxy. See the management socket documentation for more 889 information. 890 891 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated 892 proxy. 893 894.. js:function:: Proxy.stop(px) 895 896 Stop the proxy. See the management socket documentation for more information. 897 898 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated 899 proxy. 900 901.. js:function:: Proxy.shut_bcksess(px) 902 903 Kill the session attached to a backup server. See the management socket 904 documentation for more information. 905 906 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated 907 proxy. 908 909.. js:function:: Proxy.get_cap(px) 910 911 Returns a string describing the capabilities of the proxy. 912 913 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated 914 proxy. 915 :returns: a string "frontend", "backend", "proxy" or "ruleset". 916 917.. js:function:: Proxy.get_mode(px) 918 919 Returns a string describing the mode of the current proxy. 920 921 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated 922 proxy. 923 :returns: a string "tcp", "http", "health" or "unknown" 924 925.. js:function:: Proxy.get_stats(px) 926 927 Returns a table containing the proxy statistics. The statistics returned are 928 not the same if the proxy is frontend or a backend. 929 930 :param class_proxy px: A :ref:`proxy_class` which indicates the manipulated 931 proxy. 932 :returns: a key/value table containing stats 933 934.. _server_class: 935 936Server class 937============ 938 939.. js:class:: Server 940 941 This class provides a way for manipulating servers and retrieving information. 942 943.. js:attribute:: Server.name 944 945 Contain the name of the server. 946 947.. js:attribute:: Server.puid 948 949 Contain the proxy unique identifier of the server. 950 951.. js:function:: Server.is_draining(sv) 952 953 Return true if the server is currently draining sticky connections. 954 955 :param class_server sv: A :ref:`server_class` which indicates the manipulated 956 server. 957 :returns: a boolean 958 959.. js:function:: Server.set_maxconn(sv, weight) 960 961 Dynamically change the maximum connections of the server. See the management 962 socket documentation for more information about the format of the string. 963 964 :param class_server sv: A :ref:`server_class` which indicates the manipulated 965 server. 966 :param string maxconn: A string describing the server maximum connections. 967 968.. js:function:: Server.get_maxconn(sv, weight) 969 970 This function returns an integer representing the server maximum connections. 971 972 :param class_server sv: A :ref:`server_class` which indicates the manipulated 973 server. 974 :returns: an integer. 975 976.. js:function:: Server.set_weight(sv, weight) 977 978 Dynamically change the weight of the server. See the management socket 979 documentation for more information about the format of the string. 980 981 :param class_server sv: A :ref:`server_class` which indicates the manipulated 982 server. 983 :param string weight: A string describing the server weight. 984 985.. js:function:: Server.get_weight(sv) 986 987 This function returns an integer representing the server weight. 988 989 :param class_server sv: A :ref:`server_class` which indicates the manipulated 990 server. 991 :returns: an integer. 992 993.. js:function:: Server.set_addr(sv, addr[, port]) 994 995 Dynamically change the address of the server. See the management socket 996 documentation for more information about the format of the string. 997 998 :param class_server sv: A :ref:`server_class` which indicates the manipulated 999 server. 1000 :param string addr: A string describing the server address. 1001 1002.. js:function:: Server.get_addr(sv) 1003 1004 Returns a string describing the address of the server. 1005 1006 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1007 server. 1008 :returns: A string 1009 1010.. js:function:: Server.get_stats(sv) 1011 1012 Returns server statistics. 1013 1014 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1015 server. 1016 :returns: a key/value table containing stats 1017 1018.. js:function:: Server.shut_sess(sv) 1019 1020 Shutdown all the sessions attached to the server. See the management socket 1021 documentation for more information about this function. 1022 1023 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1024 server. 1025 1026.. js:function:: Server.set_drain(sv) 1027 1028 Drain sticky sessions. See the management socket documentation for more 1029 information about this function. 1030 1031 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1032 server. 1033 1034.. js:function:: Server.set_maint(sv) 1035 1036 Set maintenance mode. See the management socket documentation for more 1037 information about this function. 1038 1039 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1040 server. 1041 1042.. js:function:: Server.set_ready(sv) 1043 1044 Set normal mode. See the management socket documentation for more information 1045 about this function. 1046 1047 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1048 server. 1049 1050.. js:function:: Server.check_enable(sv) 1051 1052 Enable health checks. See the management socket documentation for more 1053 information about this function. 1054 1055 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1056 server. 1057 1058.. js:function:: Server.check_disable(sv) 1059 1060 Disable health checks. See the management socket documentation for more 1061 information about this function. 1062 1063 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1064 server. 1065 1066.. js:function:: Server.check_force_up(sv) 1067 1068 Force health-check up. See the management socket documentation for more 1069 information about this function. 1070 1071 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1072 server. 1073 1074.. js:function:: Server.check_force_nolb(sv) 1075 1076 Force health-check nolb mode. See the management socket documentation for more 1077 information about this function. 1078 1079 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1080 server. 1081 1082.. js:function:: Server.check_force_down(sv) 1083 1084 Force health-check down. See the management socket documentation for more 1085 information about this function. 1086 1087 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1088 server. 1089 1090.. js:function:: Server.agent_enable(sv) 1091 1092 Enable agent check. See the management socket documentation for more 1093 information about this function. 1094 1095 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1096 server. 1097 1098.. js:function:: Server.agent_disable(sv) 1099 1100 Disable agent check. See the management socket documentation for more 1101 information about this function. 1102 1103 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1104 server. 1105 1106.. js:function:: Server.agent_force_up(sv) 1107 1108 Force agent check up. See the management socket documentation for more 1109 information about this function. 1110 1111 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1112 server. 1113 1114.. js:function:: Server.agent_force_down(sv) 1115 1116 Force agent check down. See the management socket documentation for more 1117 information about this function. 1118 1119 :param class_server sv: A :ref:`server_class` which indicates the manipulated 1120 server. 1121 1122.. _listener_class: 1123 1124Listener class 1125============== 1126 1127.. js:function:: Listener.get_stats(ls) 1128 1129 Returns server statistics. 1130 1131 :param class_listener ls: A :ref:`listener_class` which indicates the 1132 manipulated listener. 1133 :returns: a key/value table containing stats 1134 1135.. _concat_class: 1136 1137Concat class 1138============ 1139 1140.. js:class:: Concat 1141 1142 This class provides a fast way for string concatenation. The way using native 1143 Lua concatenation like the code below is slow for some reasons. 1144 1145.. code-block:: lua 1146 1147 str = "string1" 1148 str = str .. ", string2" 1149 str = str .. ", string3" 1150.. 1151 1152 For each concatenation, Lua: 1153 * allocate memory for the result, 1154 * catenate the two string copying the strings in the new memory block, 1155 * free the old memory block containing the string which is no longer used. 1156 This process does many memory move, allocation and free. In addition, the 1157 memory is not really freed, it is just mark mark as unused and wait for the 1158 garbage collector. 1159 1160 The Concat class provide an alternative way to concatenate strings. It uses 1161 the internal Lua mechanism (it does not allocate memory), but it doesn't copy 1162 the data more than once. 1163 1164 On my computer, the following loops spends 0.2s for the Concat method and 1165 18.5s for the pure Lua implementation. So, the Concat class is about 1000x 1166 faster than the embedded solution. 1167 1168.. code-block:: lua 1169 1170 for j = 1, 100 do 1171 c = core.concat() 1172 for i = 1, 20000 do 1173 c:add("#####") 1174 end 1175 end 1176.. 1177 1178.. code-block:: lua 1179 1180 for j = 1, 100 do 1181 c = "" 1182 for i = 1, 20000 do 1183 c = c .. "#####" 1184 end 1185 end 1186.. 1187 1188.. js:function:: Concat.add(concat, string) 1189 1190 This function adds a string to the current concatenated string. 1191 1192 :param class_concat concat: A :ref:`concat_class` which contains the currently 1193 built string. 1194 :param string string: A new string to concatenate to the current built 1195 string. 1196 1197.. js:function:: Concat.dump(concat) 1198 1199 This function returns the concatenated string. 1200 1201 :param class_concat concat: A :ref:`concat_class` which contains the currently 1202 built string. 1203 :returns: the concatenated string 1204 1205.. _fetches_class: 1206 1207Fetches class 1208============= 1209 1210.. js:class:: Fetches 1211 1212 This class contains a lot of internal HAProxy sample fetches. See the 1213 HAProxy "configuration.txt" documentation for more information about her 1214 usage. They are the chapters 7.3.2 to 7.3.6. 1215 1216 .. warning:: 1217 some sample fetches are not available in some context. These limitations 1218 are specified in this documentation when they're useful. 1219 1220 :see: :js:attr:`TXN.f` 1221 :see: :js:attr:`TXN.sf` 1222 1223 Fetches are useful for: 1224 1225 * get system time, 1226 * get environment variable, 1227 * get random numbers, 1228 * known backend status like the number of users in queue or the number of 1229 connections established, 1230 * client information like ip source or destination, 1231 * deal with stick tables, 1232 * Established SSL information, 1233 * HTTP information like headers or method. 1234 1235.. code-block:: lua 1236 1237 function action(txn) 1238 -- Get source IP 1239 local clientip = txn.f:src() 1240 end 1241.. 1242 1243.. _converters_class: 1244 1245Converters class 1246================ 1247 1248.. js:class:: Converters 1249 1250 This class contains a lot of internal HAProxy sample converters. See the 1251 HAProxy documentation "configuration.txt" for more information about her 1252 usage. Its the chapter 7.3.1. 1253 1254 :see: :js:attr:`TXN.c` 1255 :see: :js:attr:`TXN.sc` 1256 1257 Converters provides statefull transformation. They are useful for: 1258 1259 * converting input to base64, 1260 * applying hash on input string (djb2, crc32, sdbm, wt6), 1261 * format date, 1262 * json escape, 1263 * extracting preferred language comparing two lists, 1264 * turn to lower or upper chars, 1265 * deal with stick tables. 1266 1267.. _channel_class: 1268 1269Channel class 1270============= 1271 1272.. js:class:: Channel 1273 1274 HAProxy uses two buffers for the processing of the requests. The first one is 1275 used with the request data (from the client to the server) and the second is 1276 used for the response data (from the server to the client). 1277 1278 Each buffer contains two types of data. The first type is the incoming data 1279 waiting for a processing. The second part is the outgoing data already 1280 processed. Usually, the incoming data is processed, after it is tagged as 1281 outgoing data, and finally it is sent. The following functions provides tools 1282 for manipulating these data in a buffer. 1283 1284 The following diagram shows where the channel class function are applied. 1285 1286 **Warning**: It is not possible to read from the response in request action, 1287 and it is not possible to read for the request channel in response action. 1288 1289 **Warning**: It is forbidden to alter the Channels buffer from HTTP contexts. 1290 So only :js:func:`Channel.get_in_length`, :js:func:`Channel.get_out_length` 1291 and :js:func:`Channel.is_full` can be called from an HTTP conetext. 1292 1293.. image:: _static/channel.png 1294 1295.. js:function:: Channel.dup(channel) 1296 1297 This function returns a string that contain the entire buffer. The data is 1298 not remove from the buffer and can be reprocessed later. 1299 1300 If the buffer can't receive more data, a 'nil' value is returned. 1301 1302 :param class_channel channel: The manipulated Channel. 1303 :returns: a string containing all the available data or nil. 1304 1305.. js:function:: Channel.get(channel) 1306 1307 This function returns a string that contain the entire buffer. The data is 1308 consumed from the buffer. 1309 1310 If the buffer can't receive more data, a 'nil' value is returned. 1311 1312 :param class_channel channel: The manipulated Channel. 1313 :returns: a string containing all the available data or nil. 1314 1315.. js:function:: Channel.getline(channel) 1316 1317 This function returns a string that contain the first line of the buffer. The 1318 data is consumed. If the data returned doesn't contains a final '\n' its 1319 assumed than its the last available data in the buffer. 1320 1321 If the buffer can't receive more data, a 'nil' value is returned. 1322 1323 :param class_channel channel: The manipulated Channel. 1324 :returns: a string containing the available line or nil. 1325 1326.. js:function:: Channel.set(channel, string) 1327 1328 This function replace the content of the buffer by the string. The function 1329 returns the copied length, otherwise, it returns -1. 1330 1331 The data set with this function are not send. They wait for the end of 1332 HAProxy processing, so the buffer can be full. 1333 1334 :param class_channel channel: The manipulated Channel. 1335 :param string string: The data which will sent. 1336 :returns: an integer containing the amount of bytes copied or -1. 1337 1338.. js:function:: Channel.append(channel, string) 1339 1340 This function append the string argument to the content of the buffer. The 1341 function returns the copied length, otherwise, it returns -1. 1342 1343 The data set with this function are not send. They wait for the end of 1344 HAProxy processing, so the buffer can be full. 1345 1346 :param class_channel channel: The manipulated Channel. 1347 :param string string: The data which will sent. 1348 :returns: an integer containing the amount of bytes copied or -1. 1349 1350.. js:function:: Channel.send(channel, string) 1351 1352 This function required immediate send of the data. Unless if the connection 1353 is close, the buffer is regularly flushed and all the string can be sent. 1354 1355 :param class_channel channel: The manipulated Channel. 1356 :param string string: The data which will sent. 1357 :returns: an integer containing the amount of bytes copied or -1. 1358 1359.. js:function:: Channel.get_in_length(channel) 1360 1361 This function returns the length of the input part of the buffer. 1362 1363 :param class_channel channel: The manipulated Channel. 1364 :returns: an integer containing the amount of available bytes. 1365 1366.. js:function:: Channel.get_out_length(channel) 1367 1368 This function returns the length of the output part of the buffer. 1369 1370 :param class_channel channel: The manipulated Channel. 1371 :returns: an integer containing the amount of available bytes. 1372 1373.. js:function:: Channel.forward(channel, int) 1374 1375 This function transfer bytes from the input part of the buffer to the output 1376 part. 1377 1378 :param class_channel channel: The manipulated Channel. 1379 :param integer int: The amount of data which will be forwarded. 1380 1381.. js:function:: Channel.is_full(channel) 1382 1383 This function returns true if the buffer channel is full. 1384 1385 :returns: a boolean 1386 1387.. _http_class: 1388 1389HTTP class 1390========== 1391 1392.. js:class:: HTTP 1393 1394 This class contain all the HTTP manipulation functions. 1395 1396.. js:function:: HTTP.req_get_headers(http) 1397 1398 Returns a table containing all the request headers. 1399 1400 :param class_http http: The related http object. 1401 :returns: table of headers. 1402 :see: :js:func:`HTTP.res_get_headers` 1403 1404 This is the form of the returned table: 1405 1406.. code-block:: lua 1407 1408 HTTP:req_get_headers()['<header-name>'][<header-index>] = "<header-value>" 1409 1410 local hdr = HTTP:req_get_headers() 1411 hdr["host"][0] = "www.test.com" 1412 hdr["accept"][0] = "audio/basic q=1" 1413 hdr["accept"][1] = "audio/*, q=0.2" 1414 hdr["accept"][2] = "*/*, q=0.1" 1415.. 1416 1417.. js:function:: HTTP.res_get_headers(http) 1418 1419 Returns a table containing all the response headers. 1420 1421 :param class_http http: The related http object. 1422 :returns: table of headers. 1423 :see: :js:func:`HTTP.req_get_headers` 1424 1425 This is the form of the returned table: 1426 1427.. code-block:: lua 1428 1429 HTTP:res_get_headers()['<header-name>'][<header-index>] = "<header-value>" 1430 1431 local hdr = HTTP:req_get_headers() 1432 hdr["host"][0] = "www.test.com" 1433 hdr["accept"][0] = "audio/basic q=1" 1434 hdr["accept"][1] = "audio/*, q=0.2" 1435 hdr["accept"][2] = "*.*, q=0.1" 1436.. 1437 1438.. js:function:: HTTP.req_add_header(http, name, value) 1439 1440 Appends an HTTP header field in the request whose name is 1441 specified in "name" and whose value is defined in "value". 1442 1443 :param class_http http: The related http object. 1444 :param string name: The header name. 1445 :param string value: The header value. 1446 :see: :js:func:`HTTP.res_add_header` 1447 1448.. js:function:: HTTP.res_add_header(http, name, value) 1449 1450 Appends an HTTP header field in the response whose name is 1451 specified in "name" and whose value is defined in "value". 1452 1453 :param class_http http: The related http object. 1454 :param string name: The header name. 1455 :param string value: The header value. 1456 :see: :js:func:`HTTP.req_add_header` 1457 1458.. js:function:: HTTP.req_del_header(http, name) 1459 1460 Removes all HTTP header fields in the request whose name is 1461 specified in "name". 1462 1463 :param class_http http: The related http object. 1464 :param string name: The header name. 1465 :see: :js:func:`HTTP.res_del_header` 1466 1467.. js:function:: HTTP.res_del_header(http, name) 1468 1469 Removes all HTTP header fields in the response whose name is 1470 specified in "name". 1471 1472 :param class_http http: The related http object. 1473 :param string name: The header name. 1474 :see: :js:func:`HTTP.req_del_header` 1475 1476.. js:function:: HTTP.req_set_header(http, name, value) 1477 1478 This variable replace all occurrence of all header "name", by only 1479 one containing the "value". 1480 1481 :param class_http http: The related http object. 1482 :param string name: The header name. 1483 :param string value: The header value. 1484 :see: :js:func:`HTTP.res_set_header` 1485 1486 This function does the same work as the following code: 1487 1488.. code-block:: lua 1489 1490 function fcn(txn) 1491 TXN.http:req_del_header("header") 1492 TXN.http:req_add_header("header", "value") 1493 end 1494.. 1495 1496.. js:function:: HTTP.res_set_header(http, name, value) 1497 1498 This variable replace all occurrence of all header "name", by only 1499 one containing the "value". 1500 1501 :param class_http http: The related http object. 1502 :param string name: The header name. 1503 :param string value: The header value. 1504 :see: :js:func:`HTTP.req_rep_header()` 1505 1506.. js:function:: HTTP.req_rep_header(http, name, regex, replace) 1507 1508 Matches the regular expression in all occurrences of header field "name" 1509 according to "regex", and replaces them with the "replace" argument. The 1510 replacement value can contain back references like \1, \2, ... This 1511 function works with the request. 1512 1513 :param class_http http: The related http object. 1514 :param string name: The header name. 1515 :param string regex: The match regular expression. 1516 :param string replace: The replacement value. 1517 :see: :js:func:`HTTP.res_rep_header()` 1518 1519.. js:function:: HTTP.res_rep_header(http, name, regex, string) 1520 1521 Matches the regular expression in all occurrences of header field "name" 1522 according to "regex", and replaces them with the "replace" argument. The 1523 replacement value can contain back references like \1, \2, ... This 1524 function works with the request. 1525 1526 :param class_http http: The related http object. 1527 :param string name: The header name. 1528 :param string regex: The match regular expression. 1529 :param string replace: The replacement value. 1530 :see: :js:func:`HTTP.req_rep_header()` 1531 1532.. js:function:: HTTP.req_set_method(http, method) 1533 1534 Rewrites the request method with the parameter "method". 1535 1536 :param class_http http: The related http object. 1537 :param string method: The new method. 1538 1539.. js:function:: HTTP.req_set_path(http, path) 1540 1541 Rewrites the request path with the "path" parameter. 1542 1543 :param class_http http: The related http object. 1544 :param string path: The new path. 1545 1546.. js:function:: HTTP.req_set_query(http, query) 1547 1548 Rewrites the request's query string which appears after the first question 1549 mark ("?") with the parameter "query". 1550 1551 :param class_http http: The related http object. 1552 :param string query: The new query. 1553 1554.. js:function:: HTTP.req_set_uri(http, uri) 1555 1556 Rewrites the request URI with the parameter "uri". 1557 1558 :param class_http http: The related http object. 1559 :param string uri: The new uri. 1560 1561.. js:function:: HTTP.res_set_status(http, status [, reason]) 1562 1563 Rewrites the response status code with the parameter "code". 1564 1565 If no custom reason is provided, it will be generated from the status. 1566 1567 :param class_http http: The related http object. 1568 :param integer status: The new response status code. 1569 :param string reason: The new response reason (optional). 1570 1571.. _txn_class: 1572 1573TXN class 1574========= 1575 1576.. js:class:: TXN 1577 1578 The txn class contain all the functions relative to the http or tcp 1579 transaction (Note than a tcp stream is the same than a tcp transaction, but 1580 an HTTP transaction is not the same than a tcp stream). 1581 1582 The usage of this class permits to retrieve data from the requests, alter it 1583 and forward it. 1584 1585 All the functions provided by this class are available in the context 1586 **sample-fetches** and **actions**. 1587 1588.. js:attribute:: TXN.c 1589 1590 :returns: An :ref:`converters_class`. 1591 1592 This attribute contains a Converters class object. 1593 1594.. js:attribute:: TXN.sc 1595 1596 :returns: An :ref:`converters_class`. 1597 1598 This attribute contains a Converters class object. The functions of 1599 this object returns always a string. 1600 1601.. js:attribute:: TXN.f 1602 1603 :returns: An :ref:`fetches_class`. 1604 1605 This attribute contains a Fetches class object. 1606 1607.. js:attribute:: TXN.sf 1608 1609 :returns: An :ref:`fetches_class`. 1610 1611 This attribute contains a Fetches class object. The functions of 1612 this object returns always a string. 1613 1614.. js:attribute:: TXN.req 1615 1616 :returns: An :ref:`channel_class`. 1617 1618 This attribute contains a channel class object for the request buffer. 1619 1620.. js:attribute:: TXN.res 1621 1622 :returns: An :ref:`channel_class`. 1623 1624 This attribute contains a channel class object for the response buffer. 1625 1626.. js:attribute:: TXN.http 1627 1628 :returns: An :ref:`http_class`. 1629 1630 This attribute contains an HTTP class object. It is available only if the 1631 proxy has the "mode http" enabled. 1632 1633.. js:function:: TXN.log(TXN, loglevel, msg) 1634 1635 This function sends a log. The log is sent, according with the HAProxy 1636 configuration file, on the default syslog server if it is configured and on 1637 the stderr if it is allowed. 1638 1639 :param class_txn txn: The class txn object containing the data. 1640 :param integer loglevel: Is the log level associated with the message. It is a 1641 number between 0 and 7. 1642 :param string msg: The log content. 1643 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`, 1644 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`, 1645 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions) 1646 :see: :js:func:`TXN.deflog` 1647 :see: :js:func:`TXN.Debug` 1648 :see: :js:func:`TXN.Info` 1649 :see: :js:func:`TXN.Warning` 1650 :see: :js:func:`TXN.Alert` 1651 1652.. js:function:: TXN.deflog(TXN, msg) 1653 1654 Sends a log line with the default loglevel for the proxy associated with the 1655 transaction. 1656 1657 :param class_txn txn: The class txn object containing the data. 1658 :param string msg: The log content. 1659 :see: :js:func:`TXN.log 1660 1661.. js:function:: TXN.Debug(txn, msg) 1662 1663 :param class_txn txn: The class txn object containing the data. 1664 :param string msg: The log content. 1665 :see: :js:func:`TXN.log` 1666 1667 Does the same job than: 1668 1669.. code-block:: lua 1670 1671 function Debug(txn, msg) 1672 TXN.log(txn, core.debug, msg) 1673 end 1674.. 1675 1676.. js:function:: TXN.Info(txn, msg) 1677 1678 :param class_txn txn: The class txn object containing the data. 1679 :param string msg: The log content. 1680 :see: :js:func:`TXN.log` 1681 1682.. code-block:: lua 1683 1684 function Debug(txn, msg) 1685 TXN.log(txn, core.info, msg) 1686 end 1687.. 1688 1689.. js:function:: TXN.Warning(txn, msg) 1690 1691 :param class_txn txn: The class txn object containing the data. 1692 :param string msg: The log content. 1693 :see: :js:func:`TXN.log` 1694 1695.. code-block:: lua 1696 1697 function Debug(txn, msg) 1698 TXN.log(txn, core.warning, msg) 1699 end 1700.. 1701 1702.. js:function:: TXN.Alert(txn, msg) 1703 1704 :param class_txn txn: The class txn object containing the data. 1705 :param string msg: The log content. 1706 :see: :js:func:`TXN.log` 1707 1708.. code-block:: lua 1709 1710 function Debug(txn, msg) 1711 TXN.log(txn, core.alert, msg) 1712 end 1713.. 1714 1715.. js:function:: TXN.get_priv(txn) 1716 1717 Return Lua data stored in the current transaction (with the `TXN.set_priv()`) 1718 function. If no data are stored, it returns a nil value. 1719 1720 :param class_txn txn: The class txn object containing the data. 1721 :returns: the opaque data previously stored, or nil if nothing is 1722 available. 1723 1724.. js:function:: TXN.set_priv(txn, data) 1725 1726 Store any data in the current HAProxy transaction. This action replace the 1727 old stored data. 1728 1729 :param class_txn txn: The class txn object containing the data. 1730 :param opaque data: The data which is stored in the transaction. 1731 1732.. js:function:: TXN.set_var(TXN, var, value[, ifexist]) 1733 1734 Converts a Lua type in a HAProxy type and store it in a variable <var>. 1735 1736 :param class_txn txn: The class txn object containing the data. 1737 :param string var: The variable name according with the HAProxy variable syntax. 1738 :param type value: The value associated to the variable. The type can be string or 1739 integer. 1740 :param boolean ifexist: If this parameter is set to a truthy value the variable 1741 will only be set if it was defined elsewhere (i.e. used 1742 within the configuration). It is highly recommended to 1743 always set this to true. 1744 1745.. js:function:: TXN.unset_var(TXN, var) 1746 1747 Unset the variable <var>. 1748 1749 :param class_txn txn: The class txn object containing the data. 1750 :param string var: The variable name according with the HAProxy variable syntax. 1751 1752.. js:function:: TXN.get_var(TXN, var) 1753 1754 Returns data stored in the variable <var> converter in Lua type. 1755 1756 :param class_txn txn: The class txn object containing the data. 1757 :param string var: The variable name according with the HAProxy variable syntax. 1758 1759.. js:function:: TXN.reply([reply]) 1760 1761 Return a new reply object 1762 1763 :param table reply: A table containing info to initialize the reply fields. 1764 :returns: A :ref:`reply_class` object. 1765 1766 The table used to initialized the reply object may contain following entries : 1767 1768 * status : The reply status code. the code 200 is used by default. 1769 * reason : The reply reason. The reason corresponding to the status code is 1770 used by default. 1771 * headers : An list of headers, indexed by header name. Empty by default. For 1772 a given name, multiple values are possible, stored in an ordered list. 1773 * body : The reply body, empty by default. 1774 1775.. code-block:: lua 1776 1777 local reply = txn:reply{ 1778 status = 400, 1779 reason = "Bad request", 1780 headers = { 1781 ["content-type"] = { "text/html" }, 1782 ["cache-control"] = {"no-cache", "no-store" } 1783 }, 1784 body = "<html><body><h1>invalid request<h1></body></html>" 1785 } 1786.. 1787 :see: :js:class:`Reply` 1788 1789.. js:function:: TXN.done(txn[, reply]) 1790 1791 This function terminates processing of the transaction and the associated 1792 session and optionally reply to the client for HTTP sessions. 1793 1794 :param class_txn txn: The class txn object containing the data. 1795 :param class_reply reply: The class reply object to return to the client. 1796 1797 This functions can be used when a critical error is detected or to terminate 1798 processing after some data have been returned to the client (eg: a redirect). 1799 To do so, a reply may be provided. This object is optional and may contain a 1800 status code, a reason, a header list and a body. All these fields are 1801 optional. When not provided, the default values are used. By default, with an 1802 empty reply object, an empty HTTP 200 response is returned to the client. If 1803 no reply object is provided, the transaction is terminated without any 1804 reply. If a reply object is provided, it must not exceed the buffer size once 1805 converted into the internal HTTP representing. Because for now there is no 1806 easy way to be sure it fits, it is probably better to keep it reasonably 1807 small. 1808 1809 The reply object may be fully created in lua or the class Reply may be used to 1810 create it. 1811 1812.. code-block:: lua 1813 1814 local reply = txn:reply() 1815 reply:set_status(400, "Bad request") 1816 reply:add_header("content-type", "text/html") 1817 reply:add_header("cache-control", "no-cache") 1818 reply:add_header("cache-control", "no-store") 1819 reply:set_body("<html><body><h1>invalid request<h1></body></html>") 1820 txn:done(reply) 1821.. 1822 1823.. code-block:: lua 1824 1825 txn:done{ 1826 status = 400, 1827 reason = "Bad request", 1828 headers = { 1829 ["content-type"] = { "text/html" }, 1830 ["cache-control"] = { "no-cache", "no-store" }, 1831 }, 1832 body = "<html><body><h1>invalid request<h1></body></html>" 1833 } 1834.. 1835 1836 .. warning:: 1837 It not make sense to call this function from sample-fetches. In this case 1838 the behaviour of this one is the same than core.done(): it quit the Lua 1839 execution. The transaction is really aborted only from an action registered 1840 function. 1841 1842 :see: :js:func:`TXN.reply`, :js:class:`Reply` 1843 1844.. js:function:: TXN.set_loglevel(txn, loglevel) 1845 1846 Is used to change the log level of the current request. The "loglevel" must 1847 be an integer between 0 and 7. 1848 1849 :param class_txn txn: The class txn object containing the data. 1850 :param integer loglevel: The required log level. This variable can be one of 1851 :see: :js:attr:`core.emerg`, :js:attr:`core.alert`, :js:attr:`core.crit`, 1852 :js:attr:`core.err`, :js:attr:`core.warning`, :js:attr:`core.notice`, 1853 :js:attr:`core.info`, :js:attr:`core.debug` (log level definitions) 1854 1855.. js:function:: TXN.set_tos(txn, tos) 1856 1857 Is used to set the TOS or DSCP field value of packets sent to the client to 1858 the value passed in "tos" on platforms which support this. 1859 1860 :param class_txn txn: The class txn object containing the data. 1861 :param integer tos: The new TOS os DSCP. 1862 1863.. js:function:: TXN.set_mark(txn, mark) 1864 1865 Is used to set the Netfilter MARK on all packets sent to the client to the 1866 value passed in "mark" on platforms which support it. 1867 1868 :param class_txn txn: The class txn object containing the data. 1869 :param integer mark: The mark value. 1870 1871.. js:function:: TXN.set_priority_class(txn, prio) 1872 1873 This function adjusts the priority class of the transaction. The value should 1874 be within the range -2047..2047. Values outside this range will be 1875 truncated. 1876 1877 See the HAProxy configuration.txt file keyword "http-request" action 1878 "set-priority-class" for details. 1879 1880.. js:function:: TXN.set_priority_offset(txn, prio) 1881 1882 This function adjusts the priority offset of the transaction. The value 1883 should be within the range -524287..524287. Values outside this range will be 1884 truncated. 1885 1886 See the HAProxy configuration.txt file keyword "http-request" action 1887 "set-priority-offset" for details. 1888 1889.. _reply_class: 1890 1891Reply class 1892============ 1893 1894.. js:class:: Reply 1895 1896 **context**: action 1897 1898 This class represents an HTTP response message. It provides some methods to 1899 enrich it. Once converted into the internal HTTP representation, the response 1900 message must not exceed the buffer size. Because for now there is no 1901 easy way to be sure it fits, it is probably better to keep it reasonably 1902 small. 1903 1904 See tune.bufsize in the configuration manual for dettails. 1905 1906.. code-block:: lua 1907 1908 local reply = txn:reply({status = 400}) -- default HTTP 400 reason-phase used 1909 reply:add_header("content-type", "text/html") 1910 reply:add_header("cache-control", "no-cache") 1911 reply:add_header("cache-control", "no-store") 1912 reply:set_body("<html><body><h1>invalid request<h1></body></html>") 1913.. 1914 1915 :see: :js:func:`TXN.reply` 1916 1917.. js:attribute:: Reply.status 1918 1919 The reply status code. By default, the status code is set to 200. 1920 1921 :returns: integer 1922 1923.. js:attribute:: Reply.reason 1924 1925 The reason string describing the status code. 1926 1927 :returns: string 1928 1929.. js:attribute:: Reply.headers 1930 1931 A table indexing all reply headers by name. To each name is associated an 1932 ordered list of values. 1933 1934 :returns: Lua table 1935 1936.. code-block:: lua 1937 1938 { 1939 ["content-type"] = { "text/html" }, 1940 ["cache-control"] = {"no-cache", "no-store" }, 1941 x_header_name = { "value1", "value2", ... } 1942 ... 1943 } 1944.. 1945 1946.. js:attribute:: Reply.body 1947 1948 The reply payload. 1949 1950 :returns: string 1951 1952.. js:function:: Reply.set_status(REPLY, status[, reason]) 1953 1954 Set the reply status code and optionally the reason-phrase. If the reason is 1955 not provided, the default reason corresponding to the status code is used. 1956 1957 :param class_reply reply: The related Reply object. 1958 :param integer status: The reply status code. 1959 :param string reason: The reply status reason (optional). 1960 1961.. js:function:: Reply.add_header(REPLY, name, value) 1962 1963 Add a header to the reply object. If the header does not already exist, a new 1964 entry is created with its name as index and a one-element list containing its 1965 value as value. Otherwise, the header value is appended to the ordered list of 1966 values associated to the header name. 1967 1968 :param class_reply reply: The related Reply object. 1969 :param string name: The header field name. 1970 :param string value: The header field value. 1971 1972.. js:function:: Reply.del_header(REPLY, name) 1973 1974 Remove all occurrences of a header name from the reply object. 1975 1976 :param class_reply reply: The related Reply object. 1977 :param string name: The header field name. 1978 1979.. js:function:: Reply.set_body(REPLY, body) 1980 1981 Set the reply payload. 1982 1983 :param class_reply reply: The related Reply object. 1984 :param string body: The reply payload. 1985 1986.. _socket_class: 1987 1988Socket class 1989============ 1990 1991.. js:class:: Socket 1992 1993 This class must be compatible with the Lua Socket class. Only the 'client' 1994 functions are available. See the Lua Socket documentation: 1995 1996 `http://w3.impa.br/~diego/software/luasocket/tcp.html 1997 <http://w3.impa.br/~diego/software/luasocket/tcp.html>`_ 1998 1999.. js:function:: Socket.close(socket) 2000 2001 Closes a TCP object. The internal socket used by the object is closed and the 2002 local address to which the object was bound is made available to other 2003 applications. No further operations (except for further calls to the close 2004 method) are allowed on a closed Socket. 2005 2006 :param class_socket socket: Is the manipulated Socket. 2007 2008 Note: It is important to close all used sockets once they are not needed, 2009 since, in many systems, each socket uses a file descriptor, which are limited 2010 system resources. Garbage-collected objects are automatically closed before 2011 destruction, though. 2012 2013.. js:function:: Socket.connect(socket, address[, port]) 2014 2015 Attempts to connect a socket object to a remote host. 2016 2017 2018 In case of error, the method returns nil followed by a string describing the 2019 error. In case of success, the method returns 1. 2020 2021 :param class_socket socket: Is the manipulated Socket. 2022 :param string address: can be an IP address or a host name. See below for more 2023 information. 2024 :param integer port: must be an integer number in the range [1..64K]. 2025 :returns: 1 or nil. 2026 2027 An address field extension permits to use the connect() function to connect to 2028 other stream than TCP. The syntax containing a simpleipv4 or ipv6 address is 2029 the basically expected format. This format requires the port. 2030 2031 Other format accepted are a socket path like "/socket/path", it permits to 2032 connect to a socket. Abstract namespaces are supported with the prefix 2033 "abns@", and finally a file descriptor can be passed with the prefix "fd@". 2034 The prefix "ipv4@", "ipv6@" and "unix@" are also supported. The port can be 2035 passed int the string. The syntax "127.0.0.1:1234" is valid. In this case, the 2036 parameter *port* must not be set. 2037 2038.. js:function:: Socket.connect_ssl(socket, address, port) 2039 2040 Same behavior than the function socket:connect, but uses SSL. 2041 2042 :param class_socket socket: Is the manipulated Socket. 2043 :returns: 1 or nil. 2044 2045.. js:function:: Socket.getpeername(socket) 2046 2047 Returns information about the remote side of a connected client object. 2048 2049 Returns a string with the IP address of the peer, followed by the port number 2050 that peer is using for the connection. In case of error, the method returns 2051 nil. 2052 2053 :param class_socket socket: Is the manipulated Socket. 2054 :returns: a string containing the server information. 2055 2056.. js:function:: Socket.getsockname(socket) 2057 2058 Returns the local address information associated to the object. 2059 2060 The method returns a string with local IP address and a number with the port. 2061 In case of error, the method returns nil. 2062 2063 :param class_socket socket: Is the manipulated Socket. 2064 :returns: a string containing the client information. 2065 2066.. js:function:: Socket.receive(socket, [pattern [, prefix]]) 2067 2068 Reads data from a client object, according to the specified read pattern. 2069 Patterns follow the Lua file I/O format, and the difference in performance 2070 between all patterns is negligible. 2071 2072 :param class_socket socket: Is the manipulated Socket. 2073 :param string|integer pattern: Describe what is required (see below). 2074 :param string prefix: A string which will be prefix the returned data. 2075 :returns: a string containing the required data or nil. 2076 2077 Pattern can be any of the following: 2078 2079 * **`*a`**: reads from the socket until the connection is closed. No 2080 end-of-line translation is performed; 2081 2082 * **`*l`**: reads a line of text from the Socket. The line is terminated by a 2083 LF character (ASCII 10), optionally preceded by a CR character 2084 (ASCII 13). The CR and LF characters are not included in the 2085 returned line. In fact, all CR characters are ignored by the 2086 pattern. This is the default pattern. 2087 2088 * **number**: causes the method to read a specified number of bytes from the 2089 Socket. Prefix is an optional string to be concatenated to the 2090 beginning of any received data before return. 2091 2092 * **empty**: If the pattern is left empty, the default option is `*l`. 2093 2094 If successful, the method returns the received pattern. In case of error, the 2095 method returns nil followed by an error message which can be the string 2096 'closed' in case the connection was closed before the transmission was 2097 completed or the string 'timeout' in case there was a timeout during the 2098 operation. Also, after the error message, the function returns the partial 2099 result of the transmission. 2100 2101 Important note: This function was changed severely. It used to support 2102 multiple patterns (but I have never seen this feature used) and now it 2103 doesn't anymore. Partial results used to be returned in the same way as 2104 successful results. This last feature violated the idea that all functions 2105 should return nil on error. Thus it was changed too. 2106 2107.. js:function:: Socket.send(socket, data [, start [, end ]]) 2108 2109 Sends data through client object. 2110 2111 :param class_socket socket: Is the manipulated Socket. 2112 :param string data: The data that will be sent. 2113 :param integer start: The start position in the buffer of the data which will 2114 be sent. 2115 :param integer end: The end position in the buffer of the data which will 2116 be sent. 2117 :returns: see below. 2118 2119 Data is the string to be sent. The optional arguments i and j work exactly 2120 like the standard string.sub Lua function to allow the selection of a 2121 substring to be sent. 2122 2123 If successful, the method returns the index of the last byte within [start, 2124 end] that has been sent. Notice that, if start is 1 or absent, this is 2125 effectively the total number of bytes sent. In case of error, the method 2126 returns nil, followed by an error message, followed by the index of the last 2127 byte within [start, end] that has been sent. You might want to try again from 2128 the byte following that. The error message can be 'closed' in case the 2129 connection was closed before the transmission was completed or the string 2130 'timeout' in case there was a timeout during the operation. 2131 2132 Note: Output is not buffered. For small strings, it is always better to 2133 concatenate them in Lua (with the '..' operator) and send the result in one 2134 call instead of calling the method several times. 2135 2136.. js:function:: Socket.setoption(socket, option [, value]) 2137 2138 Just implemented for compatibility, this cal does nothing. 2139 2140.. js:function:: Socket.settimeout(socket, value [, mode]) 2141 2142 Changes the timeout values for the object. All I/O operations are blocking. 2143 That is, any call to the methods send, receive, and accept will block 2144 indefinitely, until the operation completes. The settimeout method defines a 2145 limit on the amount of time the I/O methods can block. When a timeout time 2146 has elapsed, the affected methods give up and fail with an error code. 2147 2148 The amount of time to wait is specified as the value parameter, in seconds. 2149 2150 The timeout modes are not implemented, the only settable timeout is the 2151 inactivity time waiting for complete the internal buffer send or waiting for 2152 receive data. 2153 2154 :param class_socket socket: Is the manipulated Socket. 2155 :param float value: The timeout value. Use floating point to specify 2156 milliseconds. 2157 2158.. _regex_class: 2159 2160Regex class 2161=========== 2162 2163.. js:class:: Regex 2164 2165 This class allows the usage of HAProxy regexes because classic lua doesn't 2166 provides regexes. This class inherits the HAProxy compilation options, so the 2167 regexes can be libc regex, pcre regex or pcre JIT regex. 2168 2169 The expression matching number is limited to 20 per regex. The only available 2170 option is case sensitive. 2171 2172 Because regexes compilation is a heavy process, it is better to define all 2173 your regexes in the **body context** and use it during the runtime. 2174 2175.. code-block:: lua 2176 2177 -- Create the regex 2178 st, regex = Regex.new("needle (..) (...)", true); 2179 2180 -- Check compilation errors 2181 if st == false then 2182 print "error: " .. regex 2183 end 2184 2185 -- Match the regexes 2186 print(regex:exec("Looking for a needle in the haystack")) -- true 2187 print(regex:exec("Lokking for a cat in the haystack")) -- false 2188 2189 -- Extract words 2190 st, list = regex:match("Looking for a needle in the haystack") 2191 print(st) -- true 2192 print(list[1]) -- needle in the 2193 print(list[2]) -- in 2194 print(list[3]) -- the 2195 2196.. js:function:: Regex.new(regex, case_sensitive) 2197 2198 Create and compile a regex. 2199 2200 :param string regex: The regular expression according with the libc or pcre 2201 standard 2202 :param boolean case_sensitive: Match is case sensitive or not. 2203 :returns: boolean status and :ref:`regex_class` or string containing fail reason. 2204 2205.. js:function:: Regex.exec(regex, str) 2206 2207 Execute the regex. 2208 2209 :param class_regex regex: A :ref:`regex_class` object. 2210 :param string str: The input string will be compared with the compiled regex. 2211 :returns: a boolean status according with the match result. 2212 2213.. js:function:: Regex.match(regex, str) 2214 2215 Execute the regex and return matched expressions. 2216 2217 :param class_map map: A :ref:`regex_class` object. 2218 :param string str: The input string will be compared with the compiled regex. 2219 :returns: a boolean status according with the match result, and 2220 a table containing all the string matched in order of declaration. 2221 2222.. _map_class: 2223 2224Map class 2225========= 2226 2227.. js:class:: Map 2228 2229 This class permits to do some lookup in HAProxy maps. The declared maps can 2230 be modified during the runtime through the HAProxy management socket. 2231 2232.. code-block:: lua 2233 2234 default = "usa" 2235 2236 -- Create and load map 2237 geo = Map.new("geo.map", Map._ip); 2238 2239 -- Create new fetch that returns the user country 2240 core.register_fetches("country", function(txn) 2241 local src; 2242 local loc; 2243 2244 src = txn.f:fhdr("x-forwarded-for"); 2245 if (src == nil) then 2246 src = txn.f:src() 2247 if (src == nil) then 2248 return default; 2249 end 2250 end 2251 2252 -- Perform lookup 2253 loc = geo:lookup(src); 2254 2255 if (loc == nil) then 2256 return default; 2257 end 2258 2259 return loc; 2260 end); 2261 2262.. js:attribute:: Map._int 2263 2264 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2265 samples" and subchapter "ACL basics" to understand this pattern matching 2266 method. 2267 2268 Note that :js:attr:`Map.int` is also available for compatibility. 2269 2270.. js:attribute:: Map._ip 2271 2272 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2273 samples" and subchapter "ACL basics" to understand this pattern matching 2274 method. 2275 2276 Note that :js:attr:`Map.ip` is also available for compatibility. 2277 2278.. js:attribute:: Map._str 2279 2280 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2281 samples" and subchapter "ACL basics" to understand this pattern matching 2282 method. 2283 2284 Note that :js:attr:`Map.str` is also available for compatibility. 2285 2286.. js:attribute:: Map._beg 2287 2288 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2289 samples" and subchapter "ACL basics" to understand this pattern matching 2290 method. 2291 2292 Note that :js:attr:`Map.beg` is also available for compatibility. 2293 2294.. js:attribute:: Map._sub 2295 2296 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2297 samples" and subchapter "ACL basics" to understand this pattern matching 2298 method. 2299 2300 Note that :js:attr:`Map.sub` is also available for compatibility. 2301 2302.. js:attribute:: Map._dir 2303 2304 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2305 samples" and subchapter "ACL basics" to understand this pattern matching 2306 method. 2307 2308 Note that :js:attr:`Map.dir` is also available for compatibility. 2309 2310.. js:attribute:: Map._dom 2311 2312 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2313 samples" and subchapter "ACL basics" to understand this pattern matching 2314 method. 2315 2316 Note that :js:attr:`Map.dom` is also available for compatibility. 2317 2318.. js:attribute:: Map._end 2319 2320 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2321 samples" and subchapter "ACL basics" to understand this pattern matching 2322 method. 2323 2324.. js:attribute:: Map._reg 2325 2326 See the HAProxy configuration.txt file, chapter "Using ACLs and fetching 2327 samples" and subchapter "ACL basics" to understand this pattern matching 2328 method. 2329 2330 Note that :js:attr:`Map.reg` is also available for compatibility. 2331 2332 2333.. js:function:: Map.new(file, method) 2334 2335 Creates and load a map. 2336 2337 :param string file: Is the file containing the map. 2338 :param integer method: Is the map pattern matching method. See the attributes 2339 of the Map class. 2340 :returns: a class Map object. 2341 :see: The Map attributes: :js:attr:`Map._int`, :js:attr:`Map._ip`, 2342 :js:attr:`Map._str`, :js:attr:`Map._beg`, :js:attr:`Map._sub`, 2343 :js:attr:`Map._dir`, :js:attr:`Map._dom`, :js:attr:`Map._end` and 2344 :js:attr:`Map._reg`. 2345 2346.. js:function:: Map.lookup(map, str) 2347 2348 Perform a lookup in a map. 2349 2350 :param class_map map: Is the class Map object. 2351 :param string str: Is the string used as key. 2352 :returns: a string containing the result or nil if no match. 2353 2354.. js:function:: Map.slookup(map, str) 2355 2356 Perform a lookup in a map. 2357 2358 :param class_map map: Is the class Map object. 2359 :param string str: Is the string used as key. 2360 :returns: a string containing the result or empty string if no match. 2361 2362.. _applethttp_class: 2363 2364AppletHTTP class 2365================ 2366 2367.. js:class:: AppletHTTP 2368 2369 This class is used with applets that requires the 'http' mode. The http applet 2370 can be registered with the *core.register_service()* function. They are used 2371 for processing an http request like a server in back of HAProxy. 2372 2373 This is an hello world sample code: 2374 2375.. code-block:: lua 2376 2377 core.register_service("hello-world", "http", function(applet) 2378 local response = "Hello World !" 2379 applet:set_status(200) 2380 applet:add_header("content-length", string.len(response)) 2381 applet:add_header("content-type", "text/plain") 2382 applet:start_response() 2383 applet:send(response) 2384 end) 2385 2386.. js:attribute:: AppletHTTP.c 2387 2388 :returns: A :ref:`converters_class` 2389 2390 This attribute contains a Converters class object. 2391 2392.. js:attribute:: AppletHTTP.sc 2393 2394 :returns: A :ref:`converters_class` 2395 2396 This attribute contains a Converters class object. The 2397 functions of this object returns always a string. 2398 2399.. js:attribute:: AppletHTTP.f 2400 2401 :returns: A :ref:`fetches_class` 2402 2403 This attribute contains a Fetches class object. Note that the 2404 applet execution place cannot access to a valid HAProxy core HTTP 2405 transaction, so some sample fetches related to the HTTP dependent 2406 values (hdr, path, ...) are not available. 2407 2408.. js:attribute:: AppletHTTP.sf 2409 2410 :returns: A :ref:`fetches_class` 2411 2412 This attribute contains a Fetches class object. The functions of 2413 this object returns always a string. Note that the applet 2414 execution place cannot access to a valid HAProxy core HTTP 2415 transaction, so some sample fetches related to the HTTP dependent 2416 values (hdr, path, ...) are not available. 2417 2418.. js:attribute:: AppletHTTP.method 2419 2420 :returns: string 2421 2422 The attribute method returns a string containing the HTTP 2423 method. 2424 2425.. js:attribute:: AppletHTTP.version 2426 2427 :returns: string 2428 2429 The attribute version, returns a string containing the HTTP 2430 request version. 2431 2432.. js:attribute:: AppletHTTP.path 2433 2434 :returns: string 2435 2436 The attribute path returns a string containing the HTTP 2437 request path. 2438 2439.. js:attribute:: AppletHTTP.qs 2440 2441 :returns: string 2442 2443 The attribute qs returns a string containing the HTTP 2444 request query string. 2445 2446.. js:attribute:: AppletHTTP.length 2447 2448 :returns: integer 2449 2450 The attribute length returns an integer containing the HTTP 2451 body length. 2452 2453.. js:attribute:: AppletHTTP.headers 2454 2455 :returns: table 2456 2457 The attribute headers returns a table containing the HTTP 2458 headers. The header names are always in lower case. As the header name can be 2459 encountered more than once in each request, the value is indexed with 0 as 2460 first index value. The table have this form: 2461 2462.. code-block:: lua 2463 2464 AppletHTTP.headers['<header-name>'][<header-index>] = "<header-value>" 2465 2466 AppletHTTP.headers["host"][0] = "www.test.com" 2467 AppletHTTP.headers["accept"][0] = "audio/basic q=1" 2468 AppletHTTP.headers["accept"][1] = "audio/*, q=0.2" 2469 AppletHTTP.headers["accept"][2] = "*/*, q=0.1" 2470.. 2471 2472.. js:function:: AppletHTTP.set_status(applet, code [, reason]) 2473 2474 This function sets the HTTP status code for the response. The allowed code are 2475 from 100 to 599. 2476 2477 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2478 :param integer code: the status code returned to the client. 2479 :param string reason: the status reason returned to the client (optional). 2480 2481.. js:function:: AppletHTTP.add_header(applet, name, value) 2482 2483 This function add an header in the response. Duplicated headers are not 2484 collapsed. The special header *content-length* is used to determinate the 2485 response length. If it not exists, a *transfer-encoding: chunked* is set, and 2486 all the write from the function *AppletHTTP:send()* become a chunk. 2487 2488 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2489 :param string name: the header name 2490 :param string value: the header value 2491 2492.. js:function:: AppletHTTP.start_response(applet) 2493 2494 This function indicates to the HTTP engine that it can process and send the 2495 response headers. After this called we cannot add headers to the response; We 2496 cannot use the *AppletHTTP:send()* function if the 2497 *AppletHTTP:start_response()* is not called. 2498 2499 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2500 2501.. js:function:: AppletHTTP.getline(applet) 2502 2503 This function returns a string containing one line from the http body. If the 2504 data returned doesn't contains a final '\\n' its assumed than its the last 2505 available data before the end of stream. 2506 2507 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2508 :returns: a string. The string can be empty if we reach the end of the stream. 2509 2510.. js:function:: AppletHTTP.receive(applet, [size]) 2511 2512 Reads data from the HTTP body, according to the specified read *size*. If the 2513 *size* is missing, the function tries to read all the content of the stream 2514 until the end. If the *size* is bigger than the http body, it returns the 2515 amount of data available. 2516 2517 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2518 :param integer size: the required read size. 2519 :returns: always return a string,the string can be empty is the connection is 2520 closed. 2521 2522.. js:function:: AppletHTTP.send(applet, msg) 2523 2524 Send the message *msg* on the http request body. 2525 2526 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2527 :param string msg: the message to send. 2528 2529.. js:function:: AppletHTTP.get_priv(applet) 2530 2531 Return Lua data stored in the current transaction. If no data are stored, 2532 it returns a nil value. 2533 2534 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2535 :returns: the opaque data previously stored, or nil if nothing is 2536 available. 2537 :see: :js:func:`AppletHTTP.set_priv` 2538 2539.. js:function:: AppletHTTP.set_priv(applet, data) 2540 2541 Store any data in the current HAProxy transaction. This action replace the 2542 old stored data. 2543 2544 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2545 :param opaque data: The data which is stored in the transaction. 2546 :see: :js:func:`AppletHTTP.get_priv` 2547 2548.. js:function:: AppletHTTP.set_var(applet, var, value[, ifexist]) 2549 2550 Converts a Lua type in a HAProxy type and store it in a variable <var>. 2551 2552 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2553 :param string var: The variable name according with the HAProxy variable syntax. 2554 :param type value: The value associated to the variable. The type ca be string or 2555 integer. 2556 :param boolean ifexist: If this parameter is set to a truthy value the variable 2557 will only be set if it was defined elsewhere (i.e. used 2558 within the configuration). It is highly recommended to 2559 always set this to true. 2560 :see: :js:func:`AppletHTTP.unset_var` 2561 :see: :js:func:`AppletHTTP.get_var` 2562 2563.. js:function:: AppletHTTP.unset_var(applet, var) 2564 2565 Unset the variable <var>. 2566 2567 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2568 :param string var: The variable name according with the HAProxy variable syntax. 2569 :see: :js:func:`AppletHTTP.set_var` 2570 :see: :js:func:`AppletHTTP.get_var` 2571 2572.. js:function:: AppletHTTP.get_var(applet, var) 2573 2574 Returns data stored in the variable <var> converter in Lua type. 2575 2576 :param class_AppletHTTP applet: An :ref:`applethttp_class` 2577 :param string var: The variable name according with the HAProxy variable syntax. 2578 :see: :js:func:`AppletHTTP.set_var` 2579 :see: :js:func:`AppletHTTP.unset_var` 2580 2581.. _applettcp_class: 2582 2583AppletTCP class 2584=============== 2585 2586.. js:class:: AppletTCP 2587 2588 This class is used with applets that requires the 'tcp' mode. The tcp applet 2589 can be registered with the *core.register_service()* function. They are used 2590 for processing a tcp stream like a server in back of HAProxy. 2591 2592.. js:attribute:: AppletTCP.c 2593 2594 :returns: A :ref:`converters_class` 2595 2596 This attribute contains a Converters class object. 2597 2598.. js:attribute:: AppletTCP.sc 2599 2600 :returns: A :ref:`converters_class` 2601 2602 This attribute contains a Converters class object. The 2603 functions of this object returns always a string. 2604 2605.. js:attribute:: AppletTCP.f 2606 2607 :returns: A :ref:`fetches_class` 2608 2609 This attribute contains a Fetches class object. 2610 2611.. js:attribute:: AppletTCP.sf 2612 2613 :returns: A :ref:`fetches_class` 2614 2615 This attribute contains a Fetches class object. 2616 2617.. js:function:: AppletTCP.getline(applet) 2618 2619 This function returns a string containing one line from the stream. If the 2620 data returned doesn't contains a final '\\n' its assumed than its the last 2621 available data before the end of stream. 2622 2623 :param class_AppletTCP applet: An :ref:`applettcp_class` 2624 :returns: a string. The string can be empty if we reach the end of the stream. 2625 2626.. js:function:: AppletTCP.receive(applet, [size]) 2627 2628 Reads data from the TCP stream, according to the specified read *size*. If the 2629 *size* is missing, the function tries to read all the content of the stream 2630 until the end. 2631 2632 :param class_AppletTCP applet: An :ref:`applettcp_class` 2633 :param integer size: the required read size. 2634 :returns: always return a string,the string can be empty is the connection is 2635 closed. 2636 2637.. js:function:: AppletTCP.send(appletmsg) 2638 2639 Send the message on the stream. 2640 2641 :param class_AppletTCP applet: An :ref:`applettcp_class` 2642 :param string msg: the message to send. 2643 2644.. js:function:: AppletTCP.get_priv(applet) 2645 2646 Return Lua data stored in the current transaction. If no data are stored, 2647 it returns a nil value. 2648 2649 :param class_AppletTCP applet: An :ref:`applettcp_class` 2650 :returns: the opaque data previously stored, or nil if nothing is 2651 available. 2652 :see: :js:func:`AppletTCP.set_priv` 2653 2654.. js:function:: AppletTCP.set_priv(applet, data) 2655 2656 Store any data in the current HAProxy transaction. This action replace the 2657 old stored data. 2658 2659 :param class_AppletTCP applet: An :ref:`applettcp_class` 2660 :param opaque data: The data which is stored in the transaction. 2661 :see: :js:func:`AppletTCP.get_priv` 2662 2663.. js:function:: AppletTCP.set_var(applet, var, value[, ifexist]) 2664 2665 Converts a Lua type in a HAProxy type and stores it in a variable <var>. 2666 2667 :param class_AppletTCP applet: An :ref:`applettcp_class` 2668 :param string var: The variable name according with the HAProxy variable syntax. 2669 :param type value: The value associated to the variable. The type can be string or 2670 integer. 2671 :param boolean ifexist: If this parameter is set to a truthy value the variable 2672 will only be set if it was defined elsewhere (i.e. used 2673 within the configuration). It is highly recommended to 2674 always set this to true. 2675 :see: :js:func:`AppletTCP.unset_var` 2676 :see: :js:func:`AppletTCP.get_var` 2677 2678.. js:function:: AppletTCP.unset_var(applet, var) 2679 2680 Unsets the variable <var>. 2681 2682 :param class_AppletTCP applet: An :ref:`applettcp_class` 2683 :param string var: The variable name according with the HAProxy variable syntax. 2684 :see: :js:func:`AppletTCP.unset_var` 2685 :see: :js:func:`AppletTCP.set_var` 2686 2687.. js:function:: AppletTCP.get_var(applet, var) 2688 2689 Returns data stored in the variable <var> converter in Lua type. 2690 2691 :param class_AppletTCP applet: An :ref:`applettcp_class` 2692 :param string var: The variable name according with the HAProxy variable syntax. 2693 :see: :js:func:`AppletTCP.unset_var` 2694 :see: :js:func:`AppletTCP.set_var` 2695 2696StickTable class 2697================ 2698 2699.. js:class:: StickTable 2700 2701 **context**: task, action, sample-fetch 2702 2703 This class can be used to access the HAProxy stick tables from Lua. 2704 2705.. js:function:: StickTable.info() 2706 2707 Returns stick table attributes as a Lua table. See HAProxy documentation for 2708 "stick-table" for canonical info, or check out example below. 2709 2710 :returns: Lua table 2711 2712 Assume our table has IPv4 key and gpc0 and conn_rate "columns": 2713 2714.. code-block:: lua 2715 2716 { 2717 expire=<int>, # Value in ms 2718 size=<int>, # Maximum table size 2719 used=<int>, # Actual number of entries in table 2720 data={ # Data columns, with types as key, and periods as values 2721 (-1 if type is not rate counter) 2722 conn_rate=<int>, 2723 gpc0=-1 2724 }, 2725 length=<int>, # max string length for string table keys, key length 2726 # otherwise 2727 nopurge=<boolean>, # purge oldest entries when table is full 2728 type="ip" # can be "ip", "ipv6", "integer", "string", "binary" 2729 } 2730 2731.. js:function:: StickTable.lookup(key) 2732 2733 Returns stick table entry for given <key> 2734 2735 :param string key: Stick table key (IP addresses and strings are supported) 2736 :returns: Lua table 2737 2738.. js:function:: StickTable.dump([filter]) 2739 2740 Returns all entries in stick table. An optional filter can be used 2741 to extract entries with specific data values. Filter is a table with valid 2742 comparison operators as keys followed by data type name and value pairs. 2743 Check out the HAProxy docs for "show table" for more details. For the 2744 reference, the supported operators are: 2745 "eq", "ne", "le", "lt", "ge", "gt" 2746 2747 For large tables, execution of this function can take a long time (for 2748 HAProxy standards). That's also true when filter is used, so take care and 2749 measure the impact. 2750 2751 :param table filter: Stick table filter 2752 :returns: Stick table entries (table) 2753 2754 See below for example filter, which contains 4 entries (or comparisons). 2755 (Maximum number of filter entries is 4, defined in the source code) 2756 2757.. code-block:: lua 2758 2759 local filter = { 2760 {"gpc0", "gt", 30}, {"gpc1", "gt", 20}}, {"conn_rate", "le", 10} 2761 } 2762 2763.. _action_class: 2764 2765Action class 2766============= 2767 2768.. js:class:: Act 2769 2770 **context**: action 2771 2772 This class contains all return codes an action may return. It is the lua 2773 equivalent to HAProxy "ACT_RET_*" code. 2774 2775.. code-block:: lua 2776 2777 core.register_action("deny", { "http-req" }, function (txn) 2778 return act.DENY 2779 end) 2780.. 2781.. js:attribute:: act.CONTINUE 2782 2783 This attribute is an integer (0). It instructs HAProxy to continue the current 2784 ruleset processing on the message. It is the default return code for a lua 2785 action. 2786 2787 :returns: integer 2788 2789.. js:attribute:: act.STOP 2790 2791 This attribute is an integer (1). It instructs HAProxy to stop the current 2792 ruleset processing on the message. 2793 2794.. js:attribute:: act.YIELD 2795 2796 This attribute is an integer (2). It instructs HAProxy to temporarily pause 2797 the message processing. It will be resumed later on the same rule. The 2798 corresponding lua script is re-executed for the start. 2799 2800.. js:attribute:: act.ERROR 2801 2802 This attribute is an integer (3). It triggers an internal errors The message 2803 processing is stopped and the transaction is terminated. For HTTP streams, an 2804 HTTP 500 error is returned to the client. 2805 2806 :returns: integer 2807 2808.. js:attribute:: act.DONE 2809 2810 This attribute is an integer (4). It instructs HAProxy to stop the message 2811 processing. 2812 2813 :returns: integer 2814 2815.. js:attribute:: act.DENY 2816 2817 This attribute is an integer (5). It denies the current message. The message 2818 processing is stopped and the transaction is terminated. For HTTP streams, an 2819 HTTP 403 error is returned to the client if the deny is returned during the 2820 request analysis. During the response analysis, an HTTP 502 error is returned 2821 and the server response is discarded. 2822 2823 :returns: integer 2824 2825.. js:attribute:: act.ABORT 2826 2827 This attribute is an integer (6). It aborts the current message. The message 2828 processing is stopped and the transaction is terminated. For HTTP streams, 2829 HAProxy assumes a response was already sent to the client. From the Lua 2830 actions point of view, when this code is used, the transaction is terminated 2831 with no reply. 2832 2833 :returns: integer 2834 2835.. js:attribute:: act.INVALID 2836 2837 This attribute is an integer (7). It triggers an internal errors. The message 2838 processing is stopped and the transaction is terminated. For HTTP streams, an 2839 HTTP 400 error is returned to the client if the error is returned during the 2840 request analysis. During the response analysis, an HTTP 502 error is returned 2841 and the server response is discarded. 2842 2843 :returns: integer 2844 2845.. js:function:: act:wake_time(milliseconds) 2846 2847 **context**: action 2848 2849 Set the script pause timeout to the specified time, defined in 2850 milliseconds. 2851 2852 :param integer milliseconds: the required milliseconds. 2853 2854 This function may be used when a lua action returns `act.YIELD`, to force its 2855 wake-up at most after the specified number of milliseconds. 2856 2857External Lua libraries 2858====================== 2859 2860A lot of useful lua libraries can be found here: 2861 2862* `https://lua-toolbox.com/ <https://lua-toolbox.com/>`_ 2863 2864Redis client library: 2865 2866* `https://github.com/nrk/redis-lua <https://github.com/nrk/redis-lua>`_ 2867 2868This is an example about the usage of the Redis library with HAProxy. Note that 2869each call of any function of this library can throw an error if the socket 2870connection fails. 2871 2872.. code-block:: lua 2873 2874 -- load the redis library 2875 local redis = require("redis"); 2876 2877 function do_something(txn) 2878 2879 -- create and connect new tcp socket 2880 local tcp = core.tcp(); 2881 tcp:settimeout(1); 2882 tcp:connect("127.0.0.1", 6379); 2883 2884 -- use the redis library with this new socket 2885 local client = redis.connect({socket=tcp}); 2886 client:ping(); 2887 2888 end 2889 2890OpenSSL: 2891 2892* `http://mkottman.github.io/luacrypto/index.html 2893 <http://mkottman.github.io/luacrypto/index.html>`_ 2894 2895* `https://github.com/brunoos/luasec/wiki 2896 <https://github.com/brunoos/luasec/wiki>`_ 2897