]> err.no Git - varnish/commitdiff
Implement the "error" VCL keyword:
authordes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 13 Aug 2006 11:38:13 +0000 (11:38 +0000)
committerdes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 13 Aug 2006 11:38:13 +0000 (11:38 +0000)
 - add fields to struct sess where VRT_error can store the error code and
   message
 - modify cnt_error() to pass these fields to RES_Error(), then clear them
 - modify RES_Error() (and the entire chain) to accept a third argument
   giving an explanation of the error.
 - have RES_Error() reset the worker before writing the error document, to
   make sure wfd is set.

fixes: #4

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

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_center.c
varnish-cache/bin/varnishd/cache_response.c
varnish-cache/bin/varnishd/cache_vrt.c
varnish-cache/include/vrt.h
varnish-cache/include/vrt_obj.h
varnish-cache/lib/libvcl/vcc_compile.c
varnish-cache/lib/libvcl/vcc_fixed_token.c

index 0af8339771ee971703dc838a031c3ba349fbafe9..4d8d0784b4f2ebe7da0107e8c2309d6477314bd0 100644 (file)
@@ -253,6 +253,9 @@ struct sess {
        enum step               step;
        unsigned                handling;
        unsigned char           wantbody;
+       int                     err_code;
+       const char              *err_msg;
+       const char              *err_expl;
 
        TAILQ_ENTRY(sess)       list;
 
@@ -402,7 +405,7 @@ void VSL(enum shmlogtag tag, unsigned id, const char *fmt, ...);
 #endif
 
 /* cache_response.c */
-void RES_Error(struct sess *sp, int error, const char *msg);
+void RES_Error(struct sess *sp, int code, const char *msg, const char *expl);
 void RES_WriteObj(struct sess *sp);
 
 /* cache_vcl.c */
index 11070cfcb05104283fc3df56b1375811fb61fe79..761bae043d698c8cc868e5ba8a41fa3a3fe9fe48 100644 (file)
@@ -130,7 +130,17 @@ DOT }
 DOT error -> DONE
  */
 
-static int cnt_error(struct sess *sp) { (void)sp; INCOMPL(); }
+static int
+cnt_error(struct sess *sp)
+{
+
+       RES_Error(sp, sp->err_code, sp->err_msg, sp->err_expl);
+       sp->err_code = 0;
+       sp->err_msg = NULL;
+       sp->err_expl = NULL;
+       sp->step = STP_DONE;
+       return (0);
+}
 
 
 /*--------------------------------------------------------------------
@@ -550,7 +560,7 @@ cnt_recv(struct sess *sp)
        sp->wrk->acct.req++;
        done = http_DissectRequest(sp->http, sp->fd);
        if (done != 0) {
-               RES_Error(sp, done, NULL);
+               RES_Error(sp, done, NULL, NULL);
                sp->step = STP_DONE;
                return (0);
        }
index 46f5c5d5fa6b4320ae1f6372a697670ee96d43ec..91abcf97b9150e488016b0d1faf4b768a07b9895 100644 (file)
 /*--------------------------------------------------------------------*/
 
 void
-RES_Error(struct sess *sp, int error, const char *msg)
+RES_Error(struct sess *sp, int code, const char *msg, const char *expl)
 {
        char buf[40];
        struct vsb *sb;
 
        sb = vsb_new(NULL, NULL, 0, VSB_AUTOEXTEND);
        assert(sb != NULL);
+       assert(code >= 100 && code <= 999);
 
        if (msg == NULL) {
-               switch (error) {
+               switch (code) {
                case 400:       msg = "Bad Request"; break;
                case 500:       msg = "Internal Error"; break;
                default:        msg = "HTTP request error"; break;
                }
        }
+       if (expl == NULL) {
+               switch (code) {
+               case 400:       expl = "Your HTTP protocol request did not make sense."; break;
+               case 404:       expl = "The document you requested was not found."; break;
+               default:        expl = "Something unexpected happened."; break;
+               }
+       }
 
        vsb_clear(sb);
-       vsb_printf(sb, "HTTP/1.1 %03d %s\r\n", error, msg);
+       vsb_printf(sb, "HTTP/1.1 %03d %s\r\n", code, msg);
        TIM_format(sp->t_req.tv_sec, buf);
        vsb_printf(sb, "Date: %s\r\n", buf);
        vsb_cat(sb,
@@ -42,29 +50,18 @@ RES_Error(struct sess *sp, int error, const char *msg)
                "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n"
                "<HTML>\r\n"
                "  <HEAD>\r\n");
-       vsb_printf(sb, "    <TITLE>%03d %s</TITLE>\r\n", error, msg);
+       vsb_printf(sb, "    <TITLE>%03d %s</TITLE>\r\n", code, msg);
        vsb_cat(sb,
                "  </HEAD>\r\n"
                "  <BODY>\r\n");
-       vsb_printf(sb, "    <H1>Error %03d %s</H1>\r\n", error, msg);
-       switch(error) {
-       case 400:
-               vsb_cat(sb,
-                   "    Your HTTP protocol request did not make sense.\r\n");
-               break;
-       case 500:
-       default:
-               vsb_cat(sb,
-                   "    Something unexpected happened.\r\n");
-               break;
-       }
+       vsb_printf(sb, "    <H1>Error %03d %s</H1>\r\n", code, msg);
+       vsb_printf(sb, "    <P>%s</P>\r\n", expl);
        vsb_cat(sb,
-               "    <P>\r\n"
-               "    <I>\r\n"
-               "    <A href=\"http://varnish.linpro.no/\">Varnish</A>\r\n"
+               "    <I><A href=\"http://varnish.linpro.no/\">Varnish</A></I>\r\n"
                "  </BODY>\r\n"
                "</HTML>\r\n");
        vsb_finish(sb);
+       WRK_Reset(sp->wrk, &sp->fd);
        WRK_Write(sp->wrk, vsb_data(sb), vsb_len(sb));
        WRK_Flush(sp->wrk);
        vca_close_session(sp, msg);
index bf84a2539177d6bbee2b742860ad0ec2ca008f3c..12de85fad82866e41d1dd788ddd2ac45d4d46d99 100644 (file)
 /*--------------------------------------------------------------------*/
 
 void
-VRT_error(struct sess *sp, unsigned err, const char *str)
+VRT_error(struct sess *sp, unsigned code, const char *msg, const char *expl)
 { 
 
        CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-       VSL(SLT_Debug, 0, "VCL_error(%u, %s)", err, str);
+       VSL(SLT_Debug, 0, "VCL_error(%u, %s, %s)", code, msg, expl);
+       sp->err_code = code;
+       sp->err_msg = msg;
+       sp->err_expl = expl;
 }
 
 /*--------------------------------------------------------------------*/
index 1915a0df47bd875d79b6921e411cc5d5e31f48cd..2d2fc9f08dc74abcf6310aa7cf2c58659859508d 100644 (file)
@@ -42,7 +42,7 @@ int VRT_re_test(struct vsb *, const char *);
 
 void VRT_count(struct sess *, unsigned);
 int VRT_rewrite(const char *, const char *);
-void VRT_error(struct sess *, unsigned, const char *);
+void VRT_error(struct sess *, unsigned, const char *, const char *);
 int VRT_switch_config(const char *);
 
 char *VRT_GetHdr(struct sess *, const char *);
index e2a8aa5cadcefe44e28bc22fa696b7f38579db33..a859b44c5e1757529e4226e31e4ddc44f0471d94 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: /mirror/varnish/trunk/varnish-cache/lib/libvcl/vcc_gen_obj.tcl 30495 2006-07-22T08:02:47.026287Z phk  $
+ * $Id: /mirror/varnish/trunk/varnish-cache/lib/libvcl/vcc_gen_obj.tcl 30980 2006-08-09T11:24:39.011200Z des  $
  *
  * NB:  This file is machine generated, DO NOT EDIT!
  *
index 3b546932f2cd104a9266da0ce679147b7aad1289..b723a49370290fa40e38ed2e8d4bb428e59da2c2 100644 (file)
@@ -708,6 +708,7 @@ Action(struct tokenlist *tl)
        unsigned a;
        struct var *vp;
        struct token *at;
+       int i;
 
        at = tl->t;
        vcc_NextToken(tl);
@@ -730,12 +731,16 @@ Action(struct tokenlist *tl)
                        a = UintVal(tl);
                else
                        a = 0;
-               Fc(tl, 1, "VRT_error(sp, %u, ", a);
-               if (tl->t->tok == CSTR) {
-                       Fc(tl, 0, "%.*s);\n", PF(tl->t));
-                       vcc_NextToken(tl);
-               } else
-                       Fc(tl, 0, "(const char *)0);\n");
+               Fc(tl, 1, "VRT_error(sp, %u", a);
+               for (i = 0; i < 2; ++i) {
+                       if (tl->t->tok == CSTR) {
+                               Fc(tl, 0, ", %.*s", PF(tl->t));
+                               vcc_NextToken(tl);
+                       } else {
+                               Fc(tl, 0, ", (const char *)0");
+                       }
+               }
+               Fc(tl, 0, ");\n");
                Fc(tl, 1, "VRT_done(sp, VCL_RET_ERROR);\n");
                return;
        case T_SWITCH_CONFIG:
index 721dad3513bfb538b9338c71f3798fceb95df707..79c647aed9e397d7cabb6aa172a7efb4c8eb4835 100644 (file)
@@ -510,7 +510,7 @@ vcl_output_lang_h(FILE *f)
        fputs("\n", f);
        fputs("void VRT_count(struct sess *, unsigned);\n", f);
        fputs("int VRT_rewrite(const char *, const char *);\n", f);
-       fputs("void VRT_error(struct sess *, unsigned, const char *);\n", f);
+       fputs("void VRT_error(struct sess *, unsigned, const char *, const char *);\n", f);
        fputs("int VRT_switch_config(const char *);\n", f);
        fputs("\n", f);
        fputs("char *VRT_GetHdr(struct sess *, const char *);\n", f);