+ rule = newrule(pat);
+ if(!strcmp(s->argv[0], "point"))
+ rule->type = PAT_REST;
+ else if(!strcmp(s->argv[0], "url"))
+ rule->type = PAT_URL;
+ else if(!strcmp(s->argv[0], "method"))
+ rule->type = PAT_METHOD;
+ rule->pattern = regex;
+ if(s->argc >= 3) {
+ if(strchr(s->argv[2], 's'))
+ rule->fl |= PATFL_MSS;
+ if(strchr(s->argv[2], 'q'))
+ rule->fl |= PATFL_UNQ;
+ }
+ } else if(!strcmp(s->argv[0], "header")) {
+ if(s->argc < 3) {
+ flog(LOG_WARNING, "%s:%i: missing header name or pattern for `header' match", s->file, s->lno);
+ continue;
+ }
+ rxfl = 0;
+ if(s->argc >= 4) {
+ if(strchr(s->argv[3], 'i'))
+ rxfl |= REG_ICASE;
+ }
+ if((regex = regalloc(s->argv[2], rxfl)) == NULL) {
+ flog(LOG_WARNING, "%s:%i: invalid regex for `header' match", s->file, s->lno);
+ continue;
+ }
+ rule = newrule(pat);
+ rule->type = PAT_HEADER;
+ rule->header = sstrdup(s->argv[1]);
+ rule->pattern = regex;
+ if(s->argc >= 4) {
+ if(strchr(s->argv[3], 's'))
+ rule->fl |= PATFL_MSS;
+ }
+ } else if(!strcmp(s->argv[0], "all")) {
+ newrule(pat)->type = PAT_ALL;
+ } else if(!strcmp(s->argv[0], "default")) {
+ newrule(pat)->type = PAT_ALL;
+ pat->prio = -10;
+ } else if(!strcmp(s->argv[0], "order") || !strcmp(s->argv[0], "priority")) {
+ if(s->argc < 2) {
+ flog(LOG_WARNING, "%s:%i: missing specification for `%s' directive", s->file, s->lno, s->argv[0]);
+ continue;
+ }
+ pat->prio = atoi(s->argv[1]);
+ } else if(!strcmp(s->argv[0], "handler")) {
+ if(s->argc < 2) {
+ flog(LOG_WARNING, "%s:%i: missing child name for `handler' directive", s->file, s->lno);
+ continue;
+ }
+ if(pat->childnm != NULL)
+ free(pat->childnm);
+ pat->childnm = sstrdup(s->argv[1]);
+ } else if(!strcmp(s->argv[0], "restpat")) {
+ if(s->argc < 2) {
+ flog(LOG_WARNING, "%s:%i: missing pattern for `restpat' directive", s->file, s->lno);
+ continue;
+ }
+ if(pat->restpat != NULL)
+ free(pat->restpat);
+ pat->restpat = sstrdup(s->argv[1]);
+ } else if(!strcmp(s->argv[0], "set") || !strcmp(s->argv[0], "xset")) {
+ if(s->argc < 3) {
+ flog(LOG_WARNING, "%s:%i: missing header name or pattern for `%s' directive", s->file, s->lno, s->argv[0]);
+ continue;
+ }
+ omalloc(head);
+ if(!strcmp(s->argv[0], "xset"))
+ head->name = sprintf2("X-Ash-%s", s->argv[1]);
+ else
+ head->name = sstrdup(s->argv[1]);
+ head->value = sstrdup(s->argv[2]);
+ head->next = pat->headers;
+ pat->headers = head;
+ } else if(!strcmp(s->argv[0], "end") || !strcmp(s->argv[0], "eof")) {
+ break;
+ } else {
+ flog(LOG_WARNING, "%s:%i: unknown directive `%s' in pattern declaration", s->file, s->lno, s->argv[0]);