Ignore:
Timestamp:
2011-01-13 12:55:11 (3 years ago)
Author:
Poul-Henning Kamp <phk@…>
Branches:
master, 3.0, 4.0, experimental-ims
Children:
bcb49e
Parents:
4f8110f
git-author:
Poul-Henning Kamp <phk@…> (2011-01-13 12:55:11)
git-committer:
Poul-Henning Kamp <phk@…> (2011-01-13 12:55:11)
Message:

Munge the esi:include src attribute as required, to produce URL and
Host: header.

Correctly unpack Host: header in esi delivery.

Now e00008.vtc is the first case to fail.

git-svn-id:  http://www.varnish-cache.org/svn/trunk/varnish-cache@5730 d4fa192b-c00b-0410-8231-f00ffab90ce4

File:
1 edited

Legend:

Unmodified
Added
Removed
  • bin/varnishd/cache_esi_parse.c

    rc5c8bb rea6090  
    6060        struct vsb              *vsb; 
    6161 
     62        struct sess             *sp; 
     63 
    6264        /* parser state */ 
    6365        const char              *state; 
     
    325327vep_do_include(struct vep_state *vep, enum dowhat what) 
    326328{ 
     329        char *p, *q, *h; 
     330        ssize_t l; 
     331        txt url; 
    327332 
    328333        printf("DO_INCLUDE(%d)\n", what); 
     
    339344                        vep_emit_verbatim(vep); 
    340345                /* XXX: what if it contains NUL bytes ?? */ 
    341                 vsb_printf(vep->vsb, "%c%s%c", 
    342                     VEC_INCL, 
    343                     vsb_data(vep->include_src), 0); 
     346                p = vsb_data(vep->include_src); 
     347                l = vsb_len(vep->include_src); 
     348                h = 0; 
     349 
     350                if (l > 7 && !memcmp(p, "http://", 7)) { 
     351                        h = p + 7; 
     352                        p = strchr(h, '/'); 
     353                        AN(p); 
     354                        printf("HOST <%.*s> PATH <%s>\n", (int)(p-h),h, p); 
     355                        vsb_printf(vep->vsb, "%c%s%cHost: %.*s%c", 
     356                            VEC_INCL, p, 0, 
     357                            (int)(p-h), h, 0); 
     358                } else if (*p == '/') { 
     359                        vsb_printf(vep->vsb, "%c%s%c%c", 
     360                            VEC_INCL, p, 0, 0); 
     361                } else { 
     362                        url = vep->sp->wrk->bereq->hd[HTTP_HDR_URL]; 
     363                        /* Look for the last / before a '?' */ 
     364                        h = NULL; 
     365                        for (q = url.b; q < url.e && *q != '?'; q++) 
     366                                if (*q == '/') 
     367                                        h = q; 
     368                        if (h == NULL) 
     369                                h = q + 1; 
     370                                 
     371                        printf("INCL:: %.*s/%s\n", 
     372                            (int)(h - url.b), url.b, p); 
     373                        vsb_printf(vep->vsb, "%c%.*s/%s%c%c", 
     374                            VEC_INCL,  
     375                            (int)(h - url.b), url.b, 
     376                            p, 0, 0); 
     377                } 
    344378 
    345379                vsb_delete(vep->include_src); 
     
    374408        while (p < e) { 
    375409                AN(vep->state); 
     410                i = e - p; 
     411                if (i > 10) 
     412                        i = 10; 
    376413                printf("EP %s %d %d (%.*s) [%.*s]\n", 
    377414                    vep->state, 
     
    379416                    vep->remove, 
    380417                    vep->tag_i, vep->tag, 
    381                     (int)(e - p), p); 
     418                    i, p); 
    382419                fflush(stdout); 
    383420                usleep(10); 
     
    416453                        vep->tag_i = 0; 
    417454                        while (p < e) { 
    418                                 if (!vep->remove) 
    419                                         vep_mark_verbatim(vep, p + 1); 
    420455                                if (*p++ == '>') { 
    421456                                        vep->state = VEP_NEXTTAG; 
     
    423458                                } 
    424459                        } 
     460                        if (!vep->remove) 
     461                                vep_mark_verbatim(vep, p + 1); 
    425462                } else if (vep->state == VEP_NEXTTAG) { 
    426463                        /* 
     
    448485                                        p++; 
    449486                                        vep->esicmt_p = vep->esicmt; 
    450                                         if (vep->esicmt_p == NULL && 
    451                                             !vep->remove) 
    452                                                 vep_mark_verbatim(vep, p); 
    453487                                } 
    454488                        } 
     489                        if (vep->esicmt_p == NULL && !vep->remove) 
     490                                vep_mark_verbatim(vep, p); 
    455491                        if (p < e) 
    456492                                vep->state = VEP_STARTTAG; 
     
    508544                                VSC_main->esi_errors++; 
    509545                                vep->state = VEP_NOTMYTAG; 
    510                                 break; 
    511                         } 
    512                         vep->skip = 1; 
    513                         vep_mark_skip(vep, p); 
    514                         vep->match = vep_match_esi; 
    515                         vep->match_l = vep_match_esi_len; 
    516                         vep->state = VEP_MATCH; 
     546                        } else { 
     547                                vep->skip = 1; 
     548                                vep_mark_skip(vep, p); 
     549                                vep->match = vep_match_esi; 
     550                                vep->match_l = vep_match_esi_len; 
     551                                vep->state = VEP_MATCH; 
     552                        } 
    517553                } else if (vep->state == VEP_ESIETAG) { 
    518554                        vep->tag_i = 0; 
     
    529565                        vep->dostuff = vep_do_nothing; 
    530566                        vep->remove = !vep->endtag; 
     567printf(">>> REMOVE %d\n", vep->remove); 
    531568                        vep->state = VEP_INTAG; 
    532569 
     
    755792        memset(vep, 0, sizeof *vep); 
    756793        vep->magic = VEP_MAGIC; 
     794        vep->sp = sp; 
    757795        vep->bytes = vfp_esi_bytes_uu; 
    758796        vep->vsb = vsb_newauto(); 
Note: See TracChangeset for help on using the changeset viewer.