* 20070823.0 (2.3.0-dev) Removed ap_all_available_mutexes_string,
* ap_available_mutexes_string for macros
* 20070823.1 (2.3.0-dev) add ap_send_interim_response()
+ * 20070823.2 (2.3.0-dev) add ap_proxy_isvalidenc()
*
*/
PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r);
PROXY_DECLARE(int) ap_proxy_hex2c(const char *x);
PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x);
+PROXY_DECLARE(apr_status_t)ap_proxy_isvalidenc(const char *url, const char *allowed);
PROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
int forcedec, int proxyreq);
PROXY_DECLARE(char *)ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
const char *err;
const char *scheme;
apr_port_t port, def_port;
- const char *p;
- const char *allowed = "~$-_.+!*'(),;:@&=/"; /* allowed+reserved from
- ap_proxy_canonenc */
/* ap_port_of_scheme() */
if (strncasecmp(url, "http:", 5) == 0) {
path = ap_proxy_canonenc(r->pool, url, strlen(url), enc_path, 0, r->proxyreq);
break;
case PROXYREQ_PROXY:
- for (p = url; *p; ++p) {
- if (!apr_isalnum(*p) && !strchr(allowed, *p)) {
- if (*p == '%' && apr_isxdigit(p[1]) && apr_isxdigit(p[2])) {
- p += 2; /* an encoded char */
- }
- else {
- return HTTP_BAD_REQUEST; /* reject bad char in URL */
- }
- }
+ if (ap_proxy_isvalidenc(url, NULL) != APR_SUCCESS) {
+ return HTTP_BAD_REQUEST;
}
path = url;
break;
#endif /*APR_CHARSET_EBCDIC*/
}
+/*
+ * Confirm that a URL-encoded string only contains
+ * valid encoding, valid chars are passed in allowed.
+ * If allowed is NULL, we use useful default.
+ */
+PROXY_DECLARE(apr_status_t)ap_proxy_isvalidenc(const char *url,
+ const char *allowed)
+
+{
+ if (!allowed) {
+ allowed = "~$-_.+!*'(),;:@&=/"; /* allowed+reserved from
+ ap_proxy_canonenc */
+ }
+
+ for ( ; *url; ++url) {
+ if (!apr_isalnum(*url) && !ap_strchr_c(allowed, *url)) {
+ if (*url == '%' && apr_isxdigit(url[1]) && apr_isxdigit(url[2])) {
+ url += 2; /* an encoded char */
+ }
+ else {
+ return APR_EGENERAL; /* reject bad char in URL */
+ }
+ }
+ }
+ return APR_SUCCESS;
+}
+
/*
* canonicalise a URL-encoded string
*/