int http_replace_stline(struct htx *htx, const struct ist p1, const struct ist p2, const struct ist p3);
int http_replace_req_meth(struct htx *htx, const struct ist meth);
int http_replace_req_uri(struct htx *htx, const struct ist uri);
-int http_replace_req_path(struct htx *htx, const struct ist path);
+int http_replace_req_path(struct htx *htx, const struct ist path, int with_qs);
int http_replace_req_query(struct htx *htx, const struct ist query);
int http_replace_res_status(struct htx *htx, const struct ist status);
int http_replace_res_reason(struct htx *htx, const struct ist reason);
break;
case 1: // path
- if (!http_replace_req_path(htx, ist2(replace, len)))
+ if (!http_replace_req_path(htx, ist2(replace, len), 0))
return -1;
break;
return 0;
}
-/* Replace the request path in the HTX message <htx> by <path>. The host part
- * and the query string are preserved. It returns 1 on success, otherwise 0.
+/* Replace the request path in the HTX message <htx> by <path>. The host part is
+ * preserverd. if <with_qs> is set, the query string is evaluated as part of the
+ * path and replaced. Otherwise, it is preserved too. It returns 1 on success,
+ * otherwise 0.
*/
-int http_replace_req_path(struct htx *htx, const struct ist path)
+int http_replace_req_path(struct htx *htx, const struct ist path, int with_qs)
{
struct buffer *temp = get_trash_chunk();
struct htx_sl *sl = http_get_stline(htx);
p = http_get_path(uri);
if (!isttest(p))
p = uri;
- while (plen < p.len && *(p.ptr + plen) != '?')
- plen++;
+ if (with_qs)
+ plen = p.len;
+ else {
+ while (plen < p.len && *(p.ptr + plen) != '?')
+ plen++;
+ }
/* Start by copying old method and version and create the new uri */
chunk_memcat(temp, HTX_SL_REQ_MPTR(sl), HTX_SL_REQ_MLEN(sl)); /* meth */