#include <string.h>
#include <ctype.h>
+#include "heritage.h"
#include "shmlog.h"
#include "cache.h"
CHECK_OBJ_NOTNULL(to, HTTP_MAGIC);
http_copyh(w, fd, to, fm, HTTP_HDR_REQ, HTTP_T_Request);
http_copyh(w, fd, to, fm, HTTP_HDR_URL, HTTP_T_URL);
- http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol);
+ if (params->backend_http11)
+ http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, "HTTP/1.1");
+ else
+ http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol);
}
CHECK_OBJ_NOTNULL(fm, HTTP_MAGIC);
CHECK_OBJ_NOTNULL(to, HTTP_MAGIC);
- http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol);
+ if (params->client_http11)
+ http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, "HTTP/1.1");
+ else
+ http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol);
http_copyh(w, fd, to, fm, HTTP_HDR_STATUS, HTTP_T_Status);
http_copyh(w, fd, to, fm, HTTP_HDR_RESPONSE, HTTP_T_Response);
}
UNLOCK(&qp->mtx);
LOCK(&tmtx);
+ if ((VSL_stats->n_wrk_overflow >
+ (params->wthread_max * params->overflow_max) / 100)) {
+ VSL_stats->n_wrk_drop++;
+ UNLOCK(&tmtx);
+ vca_close_session(sp, "dropped");
+ vca_return_session(sp);
+ return;
+ }
/*
* XXX: If there are too many requests in the overflow queue
* XXX: we should kill the request right here.
unsigned wthread_timeout;
unsigned wthread_pools;
+ unsigned overflow_max;
+
/* Memory allocation hints */
unsigned mem_workspace;
/* Srcaddr hash */
unsigned srcaddr_hash;
unsigned srcaddr_ttl;
+
+ /* HTTP proto behaviour */
+ unsigned backend_http11;
+ unsigned client_http11;
};
extern struct params *params;
/*--------------------------------------------------------------------*/
+static void
+tweak_overflow_max(struct cli *cli, struct parspec *par, const char *arg)
+{
+
+ (void)par;
+ tweak_generic_uint(cli, ¶ms->overflow_max, arg, 0, UINT_MAX);
+}
+
+/*--------------------------------------------------------------------*/
+
static void
tweak_http_workspace(struct cli *cli, struct parspec *par, const char *arg)
{
/*--------------------------------------------------------------------*/
+static void
+tweak_backend_http11(struct cli *cli, struct parspec *par, const char *arg)
+{
+ (void)par;
+ tweak_generic_bool(cli, ¶ms->backend_http11, arg);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_client_http11(struct cli *cli, struct parspec *par, const char *arg)
+{
+ (void)par;
+ tweak_generic_bool(cli, ¶ms->client_http11, arg);
+}
+
+/*--------------------------------------------------------------------*/
+
/*
* Make sure to end all lines with either a space or newline of the
* formatting will go haywire.
EXPERIMENTAL
DELAYED_EFFECT,
"120", "seconds" },
+ { "overflow_max", tweak_overflow_max,
+ "Limit on overflow queue length in percent of "
+ "thread_pool_max parameter.\n"
+ EXPERIMENTAL,
+ "100", "%" },
{ "http_workspace", tweak_http_workspace,
"Bytes of HTTP protocol workspace allocated. "
"This space must be big enough for the entire HTTP protocol "
"Zero will disable srcaddr accounting entirely.\n"
EXPERIMENTAL,
"30", "seconds" },
+ { "backend_http11", tweak_backend_http11,
+ "Force all backend requests to be HTTP/1.1.\n"
+ "By default we copy the protocol version from the "
+ "incoming client request."
+ EXPERIMENTAL,
+ "off", "bool" },
+ { "client_http11", tweak_client_http11,
+ "Force all client responses to be HTTP/1.1.\n"
+ "By default we copy the protocol version from the "
+ "backend response."
+ EXPERIMENTAL,
+ "off", "bool" },
{ NULL, NULL, NULL }
};
MAC_STAT(n_wrk_max, uint64_t, "u", "N worker threads limited")
MAC_STAT(n_wrk_queue, uint64_t, "u", "N queued work requests")
MAC_STAT(n_wrk_overflow, uint64_t, "u", "N overflowed work requests")
+MAC_STAT(n_wrk_drop, uint64_t, "u", "N dropped work requests")
MAC_STAT(n_expired, uint64_t, "u", "N expired objects")
MAC_STAT(n_deathrow, uint64_t, "u", "N objects on deathrow")