Commit 095d05d9 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Generalize the transmit code, so it can be used for both req.* and

resp.*

Submitted by: jonathan.huot@thomsonreuters.com
parent 1ba11856
......@@ -2,12 +2,18 @@ varnishtest "test vtc gzip support"
server s1 {
rxreq
expect req.http.content-length == "26"
expect req.bodylen == "26"
gunzip
expect req.bodylen == "3"
expect req.http.content-encoding == "gzip"
txresp -gzipbody FOO
} -start
client c1 -connect ${s1_sock} {
txreq
txreq -gzipbody FOO
rxresp
expect resp.http.content-length == "26"
expect resp.bodylen == "26"
gunzip
expect resp.bodylen == "3"
......
......@@ -562,13 +562,14 @@ cmd_http_gunzip_body(CMD_ARGS)
char *p;
unsigned l;
(void)av;
(void)cmd;
(void)vl;
CAST_OBJ_NOTNULL(hp, priv, HTTP_MAGIC);
ONLY_CLIENT(hp, av);
memset(&vz, 0, sizeof vz);
AN(hp->body);
if (hp->body[0] != (char)0x1f || hp->body[1] != (char)0x8b)
vtc_log(hp->vl, hp->fatal,
"Gunzip error: Body lacks gzip magics");
......@@ -650,52 +651,21 @@ gzip_body(const struct http *hp, const char *txt, char **body, int *bodylen)
}
/**********************************************************************
* Transmit a response
* Handle common arguments of a transmited request or response
*/
static void
cmd_http_txresp(CMD_ARGS)
static char* const *
http_tx_parse_args(char * const *av, struct vtclog *vl, struct http *hp,
char* body)
{
struct http *hp;
const char *proto = "HTTP/1.1";
const char *status = "200";
const char *msg = "Ok";
int bodylen = 0;
char *b, *c;
char *body = NULL, *nullbody;
char *nullbody = NULL;
int nolen = 0;
(void)cmd;
(void)vl;
CAST_OBJ_NOTNULL(hp, priv, HTTP_MAGIC);
ONLY_SERVER(hp, av);
assert(!strcmp(av[0], "txresp"));
av++;
VSB_clear(hp->vsb);
/* send a "Content-Length: 0" header unless something else happens */
REPLACE(body, "");
nullbody = body;
for(; *av != NULL; av++) {
if (!strcmp(*av, "-proto")) {
proto = av[1];
av++;
} else if (!strcmp(*av, "-status")) {
status = av[1];
av++;
} else if (!strcmp(*av, "-msg")) {
msg = av[1];
av++;
continue;
} else
break;
}
VSB_printf(hp->vsb, "%s %s %s%s", proto, status, msg, nl);
for(; *av != NULL; av++) {
if (!strcmp(*av, "-nolen")) {
nolen = 1;
......@@ -750,13 +720,60 @@ cmd_http_txresp(CMD_ARGS)
} else
break;
}
if (*av != NULL)
vtc_log(hp->vl, 0, "Unknown http txresp spec: %s\n", *av);
if (body != NULL && !nolen)
VSB_printf(hp->vsb, "Content-Length: %d%s", bodylen, nl);
VSB_cat(hp->vsb, nl);
if (body != NULL)
VSB_bcat(hp->vsb, body, bodylen);
return av;
}
/**********************************************************************
* Transmit a response
*/
static void
cmd_http_txresp(CMD_ARGS)
{
struct http *hp;
const char *proto = "HTTP/1.1";
const char *status = "200";
const char *msg = "Ok";
char* body = NULL;
(void)cmd;
(void)vl;
CAST_OBJ_NOTNULL(hp, priv, HTTP_MAGIC);
ONLY_SERVER(hp, av);
assert(!strcmp(av[0], "txresp"));
av++;
VSB_clear(hp->vsb);
for(; *av != NULL; av++) {
if (!strcmp(*av, "-proto")) {
proto = av[1];
av++;
} else if (!strcmp(*av, "-status")) {
status = av[1];
av++;
} else if (!strcmp(*av, "-msg")) {
msg = av[1];
av++;
continue;
} else
break;
}
VSB_printf(hp->vsb, "%s %s %s%s", proto, status, msg, nl);
/* send a "Content-Length: 0" header unless something else happens */
REPLACE(body, "");
av = http_tx_parse_args(av, vl, hp, body);
if (*av != NULL)
vtc_log(hp->vl, 0, "Unknown http txresp spec: %s\n", *av);
http_write(hp, 4, "txresp");
}
......@@ -780,6 +797,7 @@ cmd_http_rxreq(CMD_ARGS)
vtc_log(hp->vl, 0, "Unknown http rxreq spec: %s\n", *av);
http_rxhdr(hp);
http_splitheader(hp, 1);
hp->body = hp->rxbuf + hp->prxbuf;
http_swallow_body(hp, hp->req, 0);
vtc_log(hp->vl, 4, "bodylen = %s", hp->bodylen);
}
......@@ -851,7 +869,6 @@ cmd_http_txreq(CMD_ARGS)
const char *req = "GET";
const char *url = "/";
const char *proto = "HTTP/1.1";
const char *body = NULL;
(void)cmd;
(void)vl;
......@@ -876,35 +893,10 @@ cmd_http_txreq(CMD_ARGS)
break;
}
VSB_printf(hp->vsb, "%s %s %s%s", req, url, proto, nl);
for(; *av != NULL; av++) {
if (!strcmp(*av, "-hdr")) {
VSB_printf(hp->vsb, "%s%s", av[1], nl);
av++;
} else
break;
}
for(; *av != NULL; av++) {
if (!strcmp(*av, "-body")) {
AZ(body);
body = av[1];
av++;
} else if (!strcmp(*av, "-bodylen")) {
AZ(body);
body = synth_body(av[1], 0);
av++;
} else
break;
}
av = http_tx_parse_args(av, vl, hp, NULL);
if (*av != NULL)
vtc_log(hp->vl, 0, "Unknown http txreq spec: %s\n", *av);
if (body != NULL)
VSB_printf(hp->vsb, "Content-Length: %ju%s",
(uintmax_t)strlen(body), nl);
VSB_cat(hp->vsb, nl);
if (body != NULL) {
VSB_cat(hp->vsb, body);
VSB_cat(hp->vsb, nl);
}
http_write(hp, 4, "txreq");
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment