in modules/http/http.hpp [577:645]
const failable<value> responseValue(const list<list<string> > res) {
// Parse the returned content
const string ct = contentType(car(res));
debug(ct, "http::responseValue::contentType");
const list<string> ls(reverse(cadr(res)));
debug(ls, "http::responseValue::content");
if (contains(ct, "text/x-scheme")) {
// Read a Scheme value
ostringstream os;
write(ls, os);
istringstream is(str(os));
const value val(content(scheme::readValue(is)));
debug(val, "http::responseValue::result");
return val;
}
if (atom::isATOMEntry(ls)) {
// Read an ATOM entry
const value val(elementsToValues(content(atom::readATOMEntry(ls))));
debug(val, "http::responseValue::result");
return val;
}
if (contains(ct, "application/atom+xml") || atom::isATOMFeed(ls)) {
// Read an ATOM feed
const value val(elementsToValues(content(atom::readATOMFeed(ls))));
debug(val, "http::responseValue::result");
return val;
}
if (contains(ct, "application/rss+xml") || rss::isRSSFeed(ls)) {
// Read an RSS feed
const value val(elementsToValues(content(rss::readRSSFeed(ls))));
debug(val, "http::responseValue::result");
return val;
}
if (contains(ct, "text/javascript") || contains(ct, "application/json") || json::isJSON(ls)) {
// Read a JSON document
const value val(content(json::readValue(ls)));
debug(val, "http::responseValue::result");
return val;
}
if (contains(ct, "application/x-javascript")) {
// Read a JSON document enclosed in a javascript function call
// Extract the JSON out of the enclosing parenthesis
ostringstream os;
write(ls, os);
const string s = str(os);
const size_t fp = find(s, '(');
const size_t lp = find_last(s, ')');
const list<string> jls = mklist<string>(substr(s, fp + 1, lp - (fp + 1)));
debug(jls, "http::responseValue::javascript::content");
const value val(content(json::readValue(jls)));
debug(val, "http::responseValue::result");
return val;
}
if (contains(ct, "text/xml") || contains(ct, "application/xml") || xml::isXML(ls)) {
// Read an XML document
const value val(elementsToValues(content(xml::readElements(ls))));
debug(val, "http::responseValue::result");
return val;
}
// Return the content type and a content list
const value val(mklist<value>(ct, mkvalues(ls)));
debug(val, "http::responseValue::result");
return val;
}