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;
}