Re: tcp options

2015-08-02 Thread Willy Tarreau
Hello,

On Sat, Aug 01, 2015 at 09:23:27AM +, zaafar.ta...@gmail.com wrote:
 Hello,
 
 
 If client send few additional TCP options (during TCP handshake) to haproxy
 would HAPROXY respect those options and forward them to the backend server?
 Is it possible to enable this feature from the configuration file?

No it is not possible. HAProxy is a TCP proxy meaning that it uses two
separate and independant TCP connections. The options you have on one
side may not even be relevant to the other side (eg: MSS values, etc).
What do you have in mind, is there a specific option you're interested
in ?

Regards,
Willy




Re: [PATCH] Add log-format variable %HQ, to log HTTP query strings

2015-08-02 Thread Aleksandar Lazic

Hi Andrew.

Am 31-07-2015 18:21, schrieb Andrew Hayworth:

Since this came up in another thread, it seems reasonable to add a
patch that implements %HQ as a log-format variable to record the HTTP
query string. Leaving the initial '?' is intentional, but I don't feel
strongly one way or another.


How about to use the same function as haproxy?

http://git.haproxy.org/?p=haproxy-1.5.git;a=blob;f=src/proto_http.c;h=5db64b5bf6b0c02dc8d501087bbb94ec320c2c43;hb=HEAD#l11004

find_param_list()


Which is used in find_url_param_value()

http://git.haproxy.org/?p=haproxy-1.5.git;a=blob;f=src/proto_http.c;h=5db64b5bf6b0c02dc8d501087bbb94ec320c2c43;hb=HEAD#l11053


qmark = find_param_list(uri , strlen(uri), '?');


I would also suggest to check


if (!txn-uri) {


before you go further due to the fact that a seach on BADREQ could 
never match ;-)


jm2c

Cheers Aleks


--
- Andrew Hayworth


From b87770d5e513fc923d0d94d2b1d0de00d88acb98 Mon Sep 17 00:00:00 2001
From: Andrew Hayworth andrew.haywo...@getbraintree.com
Date: Fri, 31 Jul 2015 16:14:16 +
Subject: [PATCH 1/1] Add log-format variable %HQ, to log HTTP query 
strings


Since sample fetches are not always available in the response phase,
this patch implements %HQ such that:

  GET /foo?bar=baz HTTP/1.0

...would be logged as:

  ?bar=baz
---
 doc/configuration.txt |  1 +
 include/types/log.h   |  1 +
 src/log.c | 38 ++
 3 files changed, 40 insertions(+)

diff --git a/doc/configuration.txt b/doc/configuration.txt
index db97cc7..b3ba8a0 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -13987,6 +13987,7 @@ Please refer to the table below for currently
defined variables :
   |   | %H   | hostname  | string  
|
   | H | %HM  | HTTP method (ex: POST)| string  
|
   | H | %HP  | HTTP request URI without query string (path)  | string  
|
+  | H | %HQ  | HTTP request URI query string (ex: ?bar=baz)  | string  
|
   | H | %HU  | HTTP request URI (ex: /foo?bar=baz)   | string  
|
   | H | %HV  | HTTP version (ex: HTTP/1.0)   | string  
|
   |   | %ID  | unique-id | string  
|

diff --git a/include/types/log.h b/include/types/log.h
index bbfe020..d0fb966 100644
--- a/include/types/log.h
+++ b/include/types/log.h
@@ -96,6 +96,7 @@ enum {
  LOG_FMT_HTTP_METHOD,
  LOG_FMT_HTTP_URI,
  LOG_FMT_HTTP_PATH,
+ LOG_FMT_HTTP_QUERY,
  LOG_FMT_HTTP_VERSION,
  LOG_FMT_HOSTNAME,
  LOG_FMT_UNIQUEID,
diff --git a/src/log.c b/src/log.c
index ffd8f10..1112f8a 100644
--- a/src/log.c
+++ b/src/log.c
@@ -111,6 +111,7 @@ static const struct logformat_type 
logformat_keywords[] = {

  { hsl, LOG_FMT_HDRRESPONSLIST, PR_MODE_TCP, LW_RSPHDR, NULL },  /*
header response list */
  { HM, LOG_FMT_HTTP_METHOD, PR_MODE_HTTP, LW_REQ, NULL },  /* HTTP 
method */
  { HP, LOG_FMT_HTTP_PATH, PR_MODE_HTTP, LW_REQ, NULL },  /* HTTP 
path */
+ { HQ, LOG_FMT_HTTP_QUERY, PR_MODE_HTTP, LW_REQ, NULL },  /* HTTP 
query */
  { HU, LOG_FMT_HTTP_URI, PR_MODE_HTTP, LW_REQ, NULL },  /* HTTP full 
URI */

  { HV, LOG_FMT_HTTP_VERSION, PR_MODE_HTTP, LW_REQ, NULL },  /* HTTP
version */
  { lc, LOG_FMT_LOGCNT, PR_MODE_TCP, LW_INIT, NULL }, /* log counter 
*/

@@ -937,6 +938,7 @@ int build_logline(struct stream *s, char *dst,
size_t maxsize, struct list *list
  struct chunk chunk;
  char *uri;
  char *spc;
+ char *qmark;
  char *end;
  struct tm tm;
  int t_request;
@@ -1578,6 +1580,42 @@ int build_logline(struct stream *s, char *dst,
size_t maxsize, struct list *list
last_isspace = 0;
break;

+ case LOG_FMT_HTTP_QUERY: // %HQ
+   uri = txn-uri ? txn-uri : BADREQ;
+
+   if (tmp-options  LOG_OPT_QUOTE)
+ LOGCHAR('');
+
+   end = uri + strlen(uri);
+   // look for the first question mark
+   while (uri  end  *uri != '?')
+ uri++;
+
+   qmark = uri;
+
+   // look for first space or question mark after url
+   while (uri  end  !HTTP_IS_SPHT(*uri))
+ uri++;
+
+   if (!txn-uri) {
+ chunk.str = BADREQ;
+ chunk.len = strlen(BADREQ);
+   } else {
+ chunk.str = qmark;
+ chunk.len = uri - qmark;
+   }
+
+   ret = encode_chunk(tmplog, dst + maxsize, '#', url_encode_map, 
chunk);

+   if (ret == NULL || *ret != '\0')
+ goto out;
+
+   tmplog = ret;
+   if (tmp-options  LOG_OPT_QUOTE)
+ LOGCHAR('');
+
+   last_isspace = 0;
+   break;
+
  case LOG_FMT_HTTP_URI: // %HU
uri = txn-uri ? txn-uri : BADREQ;

--
2.1.3




[PATCH] Lua tasks fail to start.

2015-08-02 Thread Camilo Lopez
Dearest HAProxy people,

I've been trying out 1.6 dev3 with lua support, and trying to start
lua tasks seems to not be working.

Using this configuration

global
  lua-load /lua/lol.lua
  debug
  maxconn 4096

backend shard_b
  server db01 mysql_shard_b:3306

backend shard_a
  server db01 mysql_shard_a:3306


listen mysql-cluster
  bind 0.0.0.0:8001
  mode tcp
  balance roundrobin
  use_backend shard_b


And this lua function

  core.register_task(function()
while true do
  core.Alert(LOLOLOLOLOL)
end
  end)

I'd always get a timeout error starting the registered function.

The problem lies as far as I can tell in the fact that is possible for
now_ms to not change (is this maybe a problem on my config/system?)
until the expiration check happens, in the resume function that
actually kickstarts the lua task, making HAProxy think that expiration
time for the task is up, if I understand correctly tasks are meant to
never really timeout.

I'm attaching a tiny patch that fixes it for me, but seems rather
naive. It exploits the fact that hlua_timeout_task is set to
TICK_ETERNITY, which might or might not be an okay assumption to make
moving forward.


luapatch.patch
Description: Binary data