Hi Bowen, Can you send an email with the pacth in attachement ? the email encoding for inline text makes some difficulties to get the patch without modifications.
In other way, the patch its intresting, but I think that the function "http_replace_res_line" should be integrated also with the "http-response". thank you Thierry On Sun, 12 Jul 2015 22:22:22 -0700 Bowen Ni <[email protected]> wrote: > Hi, > > With Lua integration in HAProxy 1.6, one can change the request method, > path, uri, header, response header etc except response line. > I'd like to contribute the following methods to allow modification of the > response line. > > diff --git a/haproxy-ss-20150711/src/hlua.c b/haproxy-ss-20150711/src/hlua.c > index a5df204..c56de6e 100644 > --- a/haproxy-ss-20150711/src/hlua.c > +++ b/haproxy-ss-20150711/src/hlua.c > @@ -3305,6 +3305,26 @@ static int hlua_http_req_set_uri(lua_State *L) > return 1; > } > > +static int hlua_http_res_set_code(lua_State *L) > +{ > + struct hlua_txn *htxn = MAY_LJMP(hlua_checkhttp(L, 1)); > + size_t name_len; > + const char *name = MAY_LJMP(luaL_checklstring(L, 2, &name_len)); > + > + lua_pushboolean(L, http_replace_res_line(0, name, name_len, htxn->p, > htxn->s) != -1); > + return 1; > +} > + > +static int hlua_http_res_set_reason(lua_State *L) > +{ > + struct hlua_txn *htxn = MAY_LJMP(hlua_checkhttp(L, 1)); > + size_t name_len; > + const char *name = MAY_LJMP(luaL_checklstring(L, 2, &name_len)); > + > + lua_pushboolean(L, http_replace_res_line(1, name, name_len, htxn->p, > htxn->s) != -1); > + return 1; > +} > + > /* > * > * > @@ -4969,6 +4989,8 @@ void hlua_init(void) > hlua_class_function(gL.T, "res_rep_value", hlua_http_res_rep_val); > hlua_class_function(gL.T, "res_add_header", hlua_http_res_add_hdr); > hlua_class_function(gL.T, "res_set_header", hlua_http_res_set_hdr); > + hlua_class_function(gL.T, "res_set_code", hlua_http_res_set_code); > + hlua_class_function(gL.T, "res_set_reason", hlua_http_res_set_reason); > > lua_settable(gL.T, -3); > > diff --git a/haproxy-ss-20150711/src/proto_http.c > b/haproxy-ss-20150711/src/proto_http.c > index 0ebc2c4..6075f83 100644 > --- a/haproxy-ss-20150711/src/proto_http.c > +++ b/haproxy-ss-20150711/src/proto_http.c > @@ -12463,6 +12463,45 @@ int http_replace_req_line(int action, const > char *replace, int len, > return 0; > } > > +int http_replace_res_line(int action, const char *replace, int len, > struct proxy *px, struct stream *s) > +{ > + struct http_txn *txn = s->txn; > + char *cur_ptr, *cur_end; > + int offset = 0; > + int delta; > + > + switch (action) { > + case 0: // code > + cur_ptr = s->res.buf->p + txn->rsp.sl.st.c; > + cur_end = cur_ptr + txn->rsp.sl.st.c_l; > + > + /* adjust res line offsets and lengths */ > + delta = len - offset - (cur_end - cur_ptr); > + txn->rsp.sl.st.c_l += delta; > + txn->rsp.sl.st.r += delta; > + break; > + > + case 1: // reason > + cur_ptr = s->res.buf->p + txn->rsp.sl.st.r; > + cur_end = cur_ptr + txn->rsp.sl.st.r_l; > + > + /* adjust res line offsets and lengths */ > + delta = len - offset - (cur_end - cur_ptr); > + txn->rsp.sl.st.r_l += delta; > + break; > + > + default: > + return -1; > + } > + > + /* commit changes and adjust end of message */ > + delta = buffer_replace2(s->res.buf, cur_ptr, cur_end, replace + > offset, len - offset); > + txn->rsp.sl.st.l += delta; > + txn->hdr_idx.v[0].len += delta; > + http_msg_move_end(&txn->rsp, delta); > + return 0; > +} > + > > Best, > > Bowen

