]> err.no Git - varnish/commitdiff
Determine our backend (using the director) before we filter the req
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 15 Feb 2008 08:54:20 +0000 (08:54 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 15 Feb 2008 08:54:20 +0000 (08:54 +0000)
into the bereq, in order to be able to assign a default Host: header
if there is none.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2464 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_backend.c
varnish-cache/bin/varnishd/cache_center.c
varnish-cache/bin/varnishd/cache_http.c

index dce0f8eb5e677e55ec5d132658f911efba3113b4..1234aaff14b8d239259d3066a7109611162b80d9 100644 (file)
@@ -415,6 +415,8 @@ void VBE_free_bereq(struct bereq *bereq);
 void VBE_DropRef(struct backend *);
 struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb);
 void VBE_UpdateHealth(const struct sess *sp, const struct vbe_conn *, int);
+void VBE_AddHostHeader(struct sess *sp);
+void VBE_SelectBackend(struct sess *sp);
 
 /* cache_ban.c */
 void AddBan(const char *, int hash);
index 81820e58549de5ca1499061065ba2fe7c9c1d6e0..2e4072523c6eb767944ddb0b931c83b5d815eefd 100644 (file)
@@ -122,6 +122,21 @@ static VTAILQ_HEAD(,bereq) bereq_head = VTAILQ_HEAD_INITIALIZER(bereq_head);
 static VTAILQ_HEAD(, backend) backends =
     VTAILQ_HEAD_INITIALIZER(backends);
 
+/*--------------------------------------------------------------------
+ * Create default Host: header for backend request
+ */
+void
+VBE_AddHostHeader(struct sess *sp)
+{
+
+       CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+       CHECK_OBJ_NOTNULL(sp->bereq, BEREQ_MAGIC);
+       CHECK_OBJ_NOTNULL(sp->bereq->http, HTTP_MAGIC);
+       CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC);
+       http_PrintfHeader(sp->wrk, sp->fd, sp->bereq->http,
+           "Host: %s", sp->backend->vrt->hostname);
+}
+
 /*--------------------------------------------------------------------
  * Attempt to connect to a given addrinfo entry.
  *
@@ -406,17 +421,28 @@ bes_conn_try(const struct sess *sp, struct backend *bp)
 
 /*--------------------------------------------------------------------*/
 
-struct vbe_conn *
-VBE_GetFd(struct sess *sp)
+void
+VBE_SelectBackend(struct sess *sp)
 {
        struct backend *bp;
-       struct vbe_conn *vc;
 
        CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
        CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC);
        bp = sp->director->choose(sp);
        CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC);
        sp->backend = bp;
+}
+
+/*--------------------------------------------------------------------*/
+
+struct vbe_conn *
+VBE_GetFd(struct sess *sp)
+{
+       struct backend *bp;
+       struct vbe_conn *vc;
+
+       CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+       bp = sp->backend;
 
        /* first look for vbe_conn's we can recycle */
        while (1) {
index a30d2dea8d2f8a338a61380b137871cf4aac3f32..94b52f1aa16b8f599b75561fdb57c80485fcd5d9 100644 (file)
@@ -617,6 +617,7 @@ cnt_miss(struct sess *sp)
        CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
        CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC);
 
+       VBE_SelectBackend(sp);
        http_FilterHeader(sp, HTTPH_R_FETCH);
        VCL_miss_method(sp);
        if (sp->handling == VCL_RET_ERROR) {
@@ -680,6 +681,7 @@ cnt_pass(struct sess *sp)
        CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC);
        AZ(sp->obj);
 
+       VBE_SelectBackend(sp);
        http_FilterHeader(sp, HTTPH_R_PASS);
 
        VCL_pass_method(sp);
@@ -729,6 +731,7 @@ cnt_pipe(struct sess *sp)
        CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC);
 
        sp->wrk->acct.pipe++;
+       VBE_SelectBackend(sp);
        http_FilterHeader(sp, HTTPH_R_PIPE);
 
        VCL_pipe_method(sp);
index ea7e4db705de6ba7295033c261385a61f55f9848..c5e2a517eec0a1a8c2161e5ef0090e5671443c40 100644 (file)
@@ -649,15 +649,11 @@ http_FilterHeader(struct sess *sp, unsigned how)
        http_PrintfHeader(sp->wrk, sp->fd, hp,
            "X-Forwarded-for: %s", sp->addr);
 
-       /* XXX: This really ought to go into the default VCL */
-       if (!http_GetHdr(hp, H_Host, &b)) {
-#if 0
-               http_PrintfHeader(sp->wrk, sp->fd, hp, "Host: %s",
-                   sp->backend->method->gethostname(sp->backend));
-#endif
-               INCOMPL();
-       }
        sp->bereq = bereq;
+
+       /* XXX: This possibly ought to go into the default VCL */
+       if (!http_GetHdr(hp, H_Host, &b)) 
+               VBE_AddHostHeader(sp);
 }
 
 /*--------------------------------------------------------------------