* Add <proxyurl> child element to <urllist> to request against a proxy.
* Accept HTTP/1.0 responses to HTTP/1.1 requests.


git-svn-id: https://svn.apache.org/repos/asf/httpd/test/trunk/flood@104459 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES b/CHANGES
index 3a3ccfa..7911857 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,10 @@
 Changes since 1.0:
 
+* Add <proxyurl> child element to <urllist> to request against a proxy.
+  [Justin Erenkrantz]
+
+* Accept HTTP/1.0 responses to HTTP/1.1 requests.  [Justin Erenkrantz]
+
 * Use APR's bundled mkdir script.  [Justin Erenkrantz]
 
 * Support VPATH builds again.  [Justin Erenkrantz]
diff --git a/config.h.in b/config.h.in
index ac2f754..6515ed3 100644
--- a/config.h.in
+++ b/config.h.in
@@ -16,6 +16,7 @@
 #define XML_URLLIST_SEQUENCE_NAME "sequencename"
 #define XML_URLLIST_SEQUENCE_LIST "sequencelist"
 #define XML_URLLIST_BASE_URL "baseurl"
+#define XML_URLLIST_PROXY_URL "proxyurl"
 #define XML_URLLIST_URL "url"
 #define XML_URLLIST_METHOD "method"
 #define XML_URLLIST_METHOD_GET "get"
diff --git a/flood_net.c b/flood_net.c
index e9acd27..3e60500 100644
--- a/flood_net.c
+++ b/flood_net.c
@@ -26,11 +26,18 @@
     apr_status_t rv = 0;
     apr_sockaddr_t *destsa;
     flood_socket_t* fs;
+    apr_uri_t *u;
     
     fs = apr_palloc(pool, sizeof(flood_socket_t));
+    if (r->parsed_proxy_uri) {
+        u = r->parsed_proxy_uri;
+    }
+    else {
+        u = r->parsed_uri;
+    }
 
-    if ((rv = apr_sockaddr_info_get(&destsa, r->parsed_uri->hostname, APR_INET, 
-                                    r->parsed_uri->port, 0, pool)) 
+    if ((rv = apr_sockaddr_info_get(&destsa, u->hostname, APR_INET,
+                                    u->port, 0, pool)) 
                                     != APR_SUCCESS) {
         if (status) {
             *status = rv;
diff --git a/flood_profile.h b/flood_profile.h
index 21719cb..65dc723 100644
--- a/flood_profile.h
+++ b/flood_profile.h
@@ -61,7 +61,6 @@
 struct request_t {
     /* The basic components to connect to the server */
     char * uri;
-    char * proxy_url;
 
     method_e method;
     int keepalive; /* a boolean */
@@ -74,6 +73,7 @@
     char * contenttype;
     
     apr_uri_t *parsed_uri;
+    apr_uri_t *parsed_proxy_uri;
 
     /* Raw buffer connection 
      * FIXME: apr_bucket_t? */ 
diff --git a/flood_round_robin.c b/flood_round_robin.c
index 5492d7c..26cb52c 100644
--- a/flood_round_robin.c
+++ b/flood_round_robin.c
@@ -103,6 +103,7 @@
     int urls;
     url_t *url;
     char *baseurl;
+    apr_uri_t *proxy_url;
 
     cookie_t *cookie;
 
@@ -214,7 +215,7 @@
 apr_status_t round_robin_create_req(profile_t *profile, request_t *r)
 {
     round_robin_profile_t *p;
-    char *cookies;
+    char *cookies, *path;
     char *enc_credtls, *credtls, *authz_hdr = NULL;
     cookie_t *cook;
    
@@ -261,6 +262,15 @@
         }
     }
 
+    if (p->proxy_url != NULL) {
+        path = apr_pstrcat(r->pool, r->parsed_uri->scheme, "://",
+                                    r->parsed_uri->hostinfo,
+                                    r->parsed_uri->path, NULL);
+    }
+    else {
+        path = r->parsed_uri->path;
+    }
+
     switch (r->method)
     {
     case GET:
@@ -271,7 +281,7 @@
                                "Host: %s" CRLF 
                                "%s"
                                "%s" CRLF,
-                               r->parsed_uri->path, 
+                               path,
                                r->parsed_uri->query ? "?" : "",
                                r->parsed_uri->query ? r->parsed_uri->query : "",
                                r->keepalive ? "Keep-Alive" : "Close",
@@ -289,7 +299,7 @@
                                "Host: %s" CRLF 
                                "%s"
                                "%s" CRLF,
-                               r->parsed_uri->path, 
+                               path, 
                                r->parsed_uri->query ? "?" : "",
                                r->parsed_uri->query ? r->parsed_uri->query : "",
                                r->keepalive ? "Keep-Alive" : "Close",
@@ -312,7 +322,7 @@
                                    "%s"
                                    "%s" CRLF
                                    "%s",
-                                   r->parsed_uri->path, 
+                                   path, 
                                    r->parsed_uri->query ? "?" : "",
                                    r->parsed_uri->query ? r->parsed_uri->query : "",
                                    r->keepalive ? "Keep-Alive" : "Close",
@@ -331,7 +341,7 @@
 
                                    "%s"
                                    "%s" CRLF "",
-                                   r->parsed_uri->path, 
+                                   path, 
                                    r->parsed_uri->query ? "?" : "",
                                    r->parsed_uri->query ? r->parsed_uri->query : "",
                                    r->keepalive ? "Keep-Alive" : "Close",
@@ -642,7 +652,8 @@
     apr_status_t rv;
     int i;
     struct apr_xml_elem *root_elem, *profile_elem,
-           *urllist_elem, *count_elem, *useurllist_elem, *baseurl_elem, *e;
+           *urllist_elem, *count_elem, *useurllist_elem, *baseurl_elem,
+           *proxyurl_elem, *e;
     round_robin_profile_t *p;
     char *xml_profile, *xml_urllist, *urllist_name;
 
@@ -719,6 +730,17 @@
         p->baseurl = NULL;
     }
 
+    /* do we have proxy url? */
+    if ((rv = retrieve_xml_elem_child(
+             &proxyurl_elem, urllist_elem, XML_URLLIST_PROXY_URL)) == APR_SUCCESS) {
+        /* yes we do */
+        p->proxy_url = apr_pcalloc(p->pool, sizeof(apr_uri_t));
+        apr_uri_parse(p->pool, proxyurl_elem->first_cdata.first->text,
+                      p->proxy_url);
+    } else {
+        p->proxy_url = NULL;
+    }
+
     p->urls = 0;
     /* Include sequences.  We'll expand them later. */
     p->urls = count_xml_seq_child(urllist_elem);
@@ -819,7 +841,7 @@
 
     }
 
-    r->parsed_uri = apr_pcalloc(rp->pool, sizeof(apr_uri_t));
+    r->parsed_uri = apr_palloc(rp->pool, sizeof(apr_uri_t));
 
     if (rp->baseurl != NULL) {
         r->uri = apr_pstrcat(rp->pool, rp->baseurl, r->uri, NULL);
@@ -857,6 +879,8 @@
     if (!r->parsed_uri->path) /* If / is not there, be nice.  */
         r->parsed_uri->path = "/";
 
+    r->parsed_proxy_uri = rp->proxy_url;
+
 #ifdef PROFILE_DEBUG
     apr_file_printf(local_stdout, "Generating request to: %s\n", r->uri);
 #endif /* PROFILE_DEBUG */
@@ -1077,6 +1101,8 @@
         *verified = FLOOD_VALID;
     else if (memcmp(resp->rbuf + 9, "3", 1) == 0) /* Accept 3xx as okay. */
         *verified = FLOOD_VALID;
+    else if (memcmp(resp->rbuf, "HTTP/1.0 2", 10) == 0) /* HTTP/1.0 is ok. */
+        *verified = FLOOD_VALID;
     else
         *verified = FLOOD_INVALID;