static apr_status_t parse_xml_url_info()

in flood_round_robin.c [405:610]


static apr_status_t parse_xml_url_info(apr_xml_elem *e, url_t *url,
                                       apr_pool_t *pool)
{
    /* Grab the url from the text section. */
    if (e->first_cdata.first && e->first_cdata.first->text)
    {
        if (e->first_cdata.first->next)
        {
            apr_text *t;
            t = e->first_cdata.first; 
            url->url = apr_pstrdup(pool, t->text);
            while ((t = t->next))
            {
                url->url = apr_pstrcat(pool, url->url, t->text, NULL);
            }
        }
        else {
            url->url = apr_pstrdup(pool, e->first_cdata.first->text);
        }
    }

    /* Parse any attributes. */
    if (e->attr)
    {
        apr_xml_attr *attr = e->attr;
        while (attr)
        {
            if (strncasecmp(attr->name, XML_URLLIST_METHOD, 
                            FLOOD_STRLEN_MAX) == 0) {
                if (strncasecmp(attr->value, XML_URLLIST_METHOD_POST, 4) == 0) {
                    url->method = POST;
                    url->method_string = "POST";
                }
                else if (strncasecmp(attr->value, XML_URLLIST_METHOD_HEAD,
                                     4) == 0)
                {
                    url->method = HEAD;
                    url->method_string = "HEAD";
                }
                else if (strncasecmp(attr->value, XML_URLLIST_METHOD_GET,
                                     3) == 0) {
                    url->method = GET;
                    url->method_string = "GET";
                }
                else {
                    url->method = OTHER;
                    url->method_string = apr_pstrdup(pool, attr->value);
                }
            }
            else if (strncasecmp(attr->name, XML_URLLIST_PAYLOAD, 
                                 FLOOD_STRLEN_MAX) == 0) {
                url->payload = (char*)attr->value;
            }
            else if (strncasecmp(attr->name, XML_URLLIST_PAYLOAD_FILE,
                                 FLOOD_STRLEN_MAX) == 0) {
                apr_status_t status;
                const char *fname;
                apr_finfo_t finfo;
                apr_file_t *file;
                apr_size_t len;

                fname = attr->value;

                status = apr_stat(&finfo, fname, APR_FINFO_MIN, pool);
                if (status != APR_SUCCESS)
                    return status;
               
                status = apr_file_open(&file, fname, APR_READ, APR_OS_DEFAULT,
                                       pool);
                if (status != APR_SUCCESS)
                    return status;

                url->payload = apr_palloc(pool, finfo.size + 1);

                status = apr_file_read_full(file, url->payload, finfo.size,
                                            &len);
                if (len != finfo.size)
                    return status;

                apr_file_close(file);
            }
            else if (strncasecmp(attr->name,XML_URLLIST_CONTENT_TYPE,
                                 FLOOD_STRLEN_MAX) == 0) {
                url->contenttype = (char*)attr->value;
            }
            else if (strncasecmp(attr->name,XML_URLLIST_EXTRA_HEADERS,
                                 FLOOD_STRLEN_MAX) == 0) {
                char *last, *header;

                header = apr_strtok((char*)attr->value, ";", &last);
                while (header) {
                    apr_collapse_spaces(header, header);
                    if (url->extra_headers) {
                        url->extra_headers = apr_pstrcat(pool,
                                                         url->extra_headers,
                                                         header, CRLF, NULL);
                    }
                    else {
                        url->extra_headers = apr_pstrcat(pool,
                                                         header, CRLF, NULL);
                    }

                    header = apr_strtok(NULL, ";", &last);
                }
            }
            else if (strncasecmp(attr->name, XML_URLLIST_PREDELAY,
                                 FLOOD_STRLEN_MAX) == 0) {
                char *endptr;
                url->predelay = strtoll(attr->value, &endptr, 10);
                if (*endptr != '\0')
                {
                    apr_file_printf(local_stderr, 
                                    "Attribute %s has invalid value %s.\n",
                                    XML_URLLIST_PREDELAY, attr->value);
                    return APR_EGENERAL;
                }
                url->predelay *= APR_USEC_PER_SEC;
            }
            else if (strncasecmp(attr->name, XML_URLLIST_PREDELAYPRECISION,
                                 FLOOD_STRLEN_MAX) == 0) {
                char *endptr;
                url->predelayprecision = strtoll(attr->value, &endptr, 10);
                if (*endptr != '\0')
                {
                    apr_file_printf(local_stderr,
                                    "Attribute %s has invalid value %s.\n",
                                    XML_URLLIST_PREDELAYPRECISION, attr->value);
                    return APR_EGENERAL;
                }
                url->predelayprecision *= APR_USEC_PER_SEC;
            }
            else if (strncasecmp(attr->name, XML_URLLIST_POSTDELAY,
                                 FLOOD_STRLEN_MAX) == 0) {
                char *endptr;
                url->postdelay = strtoll(attr->value, &endptr, 10);
                if (*endptr != '\0')
                {
                    apr_file_printf(local_stderr, 
                                    "Attribute %s has invalid value %s.\n",
                                    XML_URLLIST_POSTDELAY, attr->value);
                    return APR_EGENERAL;
                }
                url->postdelay *= APR_USEC_PER_SEC;
            }
            else if (strncasecmp(attr->name, XML_URLLIST_POSTDELAYPRECISION,
                                 FLOOD_STRLEN_MAX) == 0) {
                char *endptr;
                url->postdelayprecision = strtoll(attr->value, &endptr, 10);
                if (*endptr != '\0')
                {
                    apr_file_printf(local_stderr,
                                    "Attribute %s has invalid value %s.\n",
                                    XML_URLLIST_POSTDELAYPRECISION, attr->value);
                    return APR_EGENERAL;
                }
                url->postdelayprecision *= APR_USEC_PER_SEC;
            }
            else if (strncasecmp(attr->name, 
                                 XML_URLLIST_PAYLOAD_TEMPLATE, 
                                 FLOOD_STRLEN_MAX) == 0) {
                url->payloadtemplate = (char*)attr->value;
            }
            else if (strncasecmp(attr->name, 
                                 XML_URLLIST_REQUEST_TEMPLATE, 
                                 FLOOD_STRLEN_MAX) == 0) {
                url->requesttemplate = (char*)attr->value;
            }
            else if (strncasecmp(attr->name, 
                                 XML_URLLIST_RESPONSE_TEMPLATE, 
                                 FLOOD_STRLEN_MAX) == 0) {
                url->responsetemplate = (char*)attr->value;
            }
            else if (strncasecmp(attr->name, 
                                 XML_URLLIST_RESPONSE_SCRIPT, 
                                 FLOOD_STRLEN_MAX) == 0) {
                url->responsescript = (char*)attr->value;
            }
            else if (strncasecmp(attr->name, 
                                 XML_URLLIST_RESPONSE_NAME,
                                 FLOOD_STRLEN_MAX) == 0) {
                url->responsename = (char*)attr->value;
                url->responselen = strlen((char*)attr->value);
            }
            else if (strncasecmp(attr->name, 
                                 XML_URLLIST_USER,
                                 FLOOD_STRLEN_MAX) == 0) {
                url->user = (char*)attr->value;
            }
            else if (strncasecmp(attr->name, 
                                 XML_URLLIST_PASSWORD,
                                 FLOOD_STRLEN_MAX) == 0) {
                url->password = (char*)attr->value;
            }
            attr = attr->next;
        }
    }
    else
    {
        url->method = GET;
        url->method_string = "GET";
        url->payload = NULL;
        url->contenttype = NULL;
    }

    return APR_SUCCESS;
}