char *host_ip_addr_str; /**< String with dotted decimal representation
of host's IP. NULL before connect_to() */
-#ifndef FEATURE_EXTENDED_HOST_PATTERNS
char *dbuffer; /**< Buffer with '\0'-delimited domain name. */
char **dvec; /**< List of pointers to the strings in dbuffer. */
int dcount; /**< How many parts to this domain? (length of dvec) */
-#endif /* ndef FEATURE_EXTENDED_HOST_PATTERNS */
#ifdef FEATURE_HTTPS_INSPECTION
int client_ssl; /**< Flag if we should communicate with client over ssl */
{
#ifdef FEATURE_EXTENDED_HOST_PATTERNS
regex_t *host_regex;/**< Regex for host matching */
-#else
+ enum host_regex_type { VANILLA_HOST_PATTERN, EXTENDED_HOST_PATTERN } host_regex_type;
+#endif /* defined FEATURE_EXTENDED_HOST_PATTERNS */
char *dbuffer; /**< Buffer with '\0'-delimited domain name, or NULL to match all hosts. */
char **dvec; /**< List of pointers to the strings in dbuffer. */
int dcount; /**< How many parts to this domain? (length of dvec) */
int unanchored; /**< Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT. */
-#endif /* defined FEATURE_EXTENDED_HOST_PATTERNS */
char *port_list; /**< List of acceptable ports, or NULL to match all ports */
RIGHT_ANCHORED,
RIGHT_ANCHORED_HOST
};
-static jb_err compile_host_pattern(struct pattern_spec *url, const char *host_pattern);
+static jb_err compile_vanilla_host_pattern(struct pattern_spec *url, const char *host_pattern);
+#ifdef FEATURE_EXTENDED_HOST_PATTERNS
+static jb_err compile_pcre_host_pattern(struct pattern_spec *url, const char *host_pattern);
+#endif
/*********************************************************************
*
freez(http->path);
freez(http->version);
freez(http->host_ip_addr_str);
-#ifndef FEATURE_EXTENDED_HOST_PATTERNS
freez(http->dbuffer);
freez(http->dvec);
http->dcount = 0;
-#endif
}
-#ifndef FEATURE_EXTENDED_HOST_PATTERNS
/*********************************************************************
*
* Function : init_domain_components
return JB_ERR_OK;
}
-#endif /* ndef FEATURE_EXTENDED_HOST_PATTERNS */
/*********************************************************************
freez(buf);
}
-#ifdef FEATURE_EXTENDED_HOST_PATTERNS
- return JB_ERR_OK;
-#else
/* Split domain name so we can compare it against wildcards */
return init_domain_components(http);
-#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
}
{
char *p;
+#ifdef FEATURE_EXTENDED_HOST_PATTERNS
+ const size_t prefix_length = 18;
+ if (strncmpic(buf, "PCRE-HOST-PATTERN:", prefix_length) == 0)
+ {
+ url->pattern.url_spec.host_regex_type = EXTENDED_HOST_PATTERN;
+ /* Overwrite the "PCRE-HOST-PATTERN:" prefix */
+ memmove(buf, buf+prefix_length, strlen(buf+prefix_length)+1);
+ }
+ else
+ {
+ url->pattern.url_spec.host_regex_type = VANILLA_HOST_PATTERN;
+ }
+#endif
+
p = strchr(buf, '/');
if (NULL != p)
{
if (buf[0] != '\0')
{
- return compile_host_pattern(url, buf);
+#ifdef FEATURE_EXTENDED_HOST_PATTERNS
+ if (url->pattern.url_spec.host_regex_type == EXTENDED_HOST_PATTERN)
+ {
+ return compile_pcre_host_pattern(url, buf);
+ }
+ else
+#endif
+ {
+ return compile_vanilla_host_pattern(url, buf);
+ }
}
return JB_ERR_OK;
#ifdef FEATURE_EXTENDED_HOST_PATTERNS
/*********************************************************************
*
- * Function : compile_host_pattern
+ * Function : compile_pcre_host_pattern
*
- * Description : Parses and compiles a host pattern.
+ * Description : Parses and compiles a pcre host pattern.
*
* Parameters :
* 1 : url = Target pattern_spec to be filled in.
* JB_ERR_PARSE - Cannot parse regex
*
*********************************************************************/
-static jb_err compile_host_pattern(struct pattern_spec *url, const char *host_pattern)
+static jb_err compile_pcre_host_pattern(struct pattern_spec *url, const char *host_pattern)
{
return compile_pattern(host_pattern, RIGHT_ANCHORED_HOST, url, &url->pattern.url_spec.host_regex);
}
+#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
-#else
/*********************************************************************
*
- * Function : compile_host_pattern
+ * Function : compile_vanilla_host_pattern
*
* Description : Parses and "compiles" an old-school host pattern.
*
* JB_ERR_PARSE - Cannot parse regex
*
*********************************************************************/
-static jb_err compile_host_pattern(struct pattern_spec *url, const char *host_pattern)
+static jb_err compile_vanilla_host_pattern(struct pattern_spec *url, const char *host_pattern)
{
char *v[150];
size_t size;
}
}
-#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
/*********************************************************************
regfree(pattern->pattern.url_spec.host_regex);
freez(pattern->pattern.url_spec.host_regex);
}
-#else
+#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
freez(pattern->pattern.url_spec.dbuffer);
freez(pattern->pattern.url_spec.dvec);
pattern->pattern.url_spec.dcount = 0;
-#endif /* ndef FEATURE_EXTENDED_HOST_PATTERNS */
freez(pattern->pattern.url_spec.port_list);
if (pattern->pattern.url_spec.preg)
{
{
assert(http->host != NULL);
#ifdef FEATURE_EXTENDED_HOST_PATTERNS
- return ((NULL == pattern->pattern.url_spec.host_regex)
- || (0 == regexec(pattern->pattern.url_spec.host_regex, http->host, 0, NULL, 0)));
-#else
- return ((NULL == pattern->pattern.url_spec.dbuffer) || (0 == domain_match(pattern, http)));
+ if (pattern->pattern.url_spec.host_regex_type == EXTENDED_HOST_PATTERN) {
+ return ((NULL == pattern->pattern.url_spec.host_regex)
+ || (0 == regexec(pattern->pattern.url_spec.host_regex,
+ http->host, 0, NULL, 0)));
+ }
#endif
+ return ((NULL == pattern->pattern.url_spec.dbuffer) || (0 == domain_match(pattern, http)));
}