HI,

I received URL from which i need to extract several parameters, I do that using 
urlp in lua. Values of parameters are urlencoded.
And I notice something strange : urlp seems to get only the first part of the 
value when the 2 char “;+” or “+;” are in the value of the parameter.

From the php point of view, using 
http://php.net/manual/en/function.urlencode.php , the 2 char “;+” or “+;” is 
valid in an urlencoded string.


Here are 2 tests URL and the dumped value from lua:
/dump_headers.php?p1=value1&ua=word1+;word2&otherparam=test
[info] 341/090330 (130491) : ua=word1+
The dumped value should be : word1+;word2

/dump_headers.php?p1=value1&ua=word1;+word2&otherparam=test
[info] 341/090951 (130491) : ua=word1
The dumped value should be : word1;+word2

Here is the haproxy config file (I removed everything not related to my 
question) :
global
    debug
    # lua file
    lua-load url.lua

defaults
    mode            http

frontend fe
    bind :80
    acl testurl url_beg /dump_headers.php
    http-request lua.logValue if testurl
    use_backend beok

backend beok
    server mysrv 127.0.0.1:8080 check inter 1000ms fall 3 rise 1 weight 100


Here is the lua file :
core.register_action("logValue", {"http-req"}, function(txn)
    local var = txn.f:urlp("ua");
    core.Info("ua=" .. var);
end)



haproxy -vv
HA-Proxy version 1.6.2 2015/11/03
Copyright 2000-2015 Willy Tarreau <[email protected]>

Build options :
  TARGET  = linux2628
  CPU     = generic
  CC      = gcc
  CFLAGS  = -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement
  OPTIONS = USE_ZLIB=1 USE_OPENSSL=1 USE_LUA=yes USE_DEVICEATLAS=1 USE_PCRE=1

Default settings :
  maxconn = 2000, bufsize = 16384, maxrewrite = 1024, maxpollevents = 200

Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.3
Compression algorithms supported : identity("identity"), deflate("deflate"), 
raw-deflate("deflate"), gzip("gzip")
Built with OpenSSL version : OpenSSL 1.0.2d 9 Jul 2015
Running on OpenSSL version : OpenSSL 1.0.2d 9 Jul 2015
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 7.8 2008-09-05
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with Lua version : Lua 5.3.1
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT 
IP_FREEBIND

Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 3 (3 usable), will use epoll.

Running on centos 6.
I notice the same thing with haproxy 1.6.1 and lua 5.3.1 or 5.3.0

Note : in the frontend, if I use :     http-request set-header X-debugua 
%[urlp(ua)]
I get the same value as I get from Lua.


Can you tell me if I do something the wrong way or if it is a bug or if it is 
intended ?

Best regards
Laurent



Reply via email to