forked from premiere/premiere-libtorrent
fixed error handling and added support for relative http redirects (which aren't allowed by the standard)
This commit is contained in:
parent
031cfe09da
commit
b952d85734
|
@ -158,6 +158,7 @@ private:
|
||||||
bool m_called;
|
bool m_called;
|
||||||
std::string m_hostname;
|
std::string m_hostname;
|
||||||
std::string m_port;
|
std::string m_port;
|
||||||
|
std::string m_url;
|
||||||
|
|
||||||
// the current download limit, in bytes per second
|
// the current download limit, in bytes per second
|
||||||
// 0 is unlimited.
|
// 0 is unlimited.
|
||||||
|
|
|
@ -114,6 +114,7 @@ void http_connection::get(std::string const& url, time_duration timeout, int pri
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
sendbuffer = headers.str();
|
sendbuffer = headers.str();
|
||||||
|
m_url = url;
|
||||||
start(hostname, boost::lexical_cast<std::string>(port), timeout, prio
|
start(hostname, boost::lexical_cast<std::string>(port), timeout, prio
|
||||||
, ps, ssl, handle_redirects, bind_addr);
|
, ps, ssl, handle_redirects, bind_addr);
|
||||||
}
|
}
|
||||||
|
@ -417,17 +418,44 @@ void http_connection::on_read(error_code const& e
|
||||||
if (code >= 300 && code < 400)
|
if (code >= 300 && code < 400)
|
||||||
{
|
{
|
||||||
// attempt a redirect
|
// attempt a redirect
|
||||||
std::string const& url = m_parser.header("location");
|
std::string const& location = m_parser.header("location");
|
||||||
if (url.empty())
|
if (location.empty())
|
||||||
{
|
{
|
||||||
// missing location header
|
// missing location header
|
||||||
callback(e);
|
callback(asio::error::fault);
|
||||||
|
close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
m_sock.close(ec);
|
m_sock.close(ec);
|
||||||
get(url, m_timeout, m_priority, &m_proxy, m_redirects - 1);
|
using boost::tuples::ignore;
|
||||||
|
char const* error;
|
||||||
|
boost::tie(ignore, ignore, ignore, ignore, ignore, error)
|
||||||
|
= parse_url_components(location);
|
||||||
|
if (error == 0)
|
||||||
|
{
|
||||||
|
get(location, m_timeout, m_priority, &m_proxy, m_redirects - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// some broken web servers send out relative paths
|
||||||
|
// in the location header.
|
||||||
|
std::string url = m_url;
|
||||||
|
// remove the leaf filename
|
||||||
|
std::size_t i = url.find_last_of('/');
|
||||||
|
if (i == std::string::npos)
|
||||||
|
{
|
||||||
|
url += '/';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
url.resize(i + 1);
|
||||||
|
}
|
||||||
|
url += location;
|
||||||
|
|
||||||
|
get(url, m_timeout, m_priority, &m_proxy, m_redirects - 1);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,10 +97,11 @@ void start_web_server(int port, bool ssl)
|
||||||
"server.range-requests = \"enable\"\n"
|
"server.range-requests = \"enable\"\n"
|
||||||
"server.port = " << port << "\n"
|
"server.port = " << port << "\n"
|
||||||
"server.pid-file = \"./lighty" << port << ".pid\"\n"
|
"server.pid-file = \"./lighty" << port << ".pid\"\n"
|
||||||
"url.redirect = (\"^/redirect$\" => \""
|
"url.redirect = ("
|
||||||
<< (ssl?"https":"http") << "://127.0.0.1:" << port << "/test_file\", "
|
"\"^/redirect$\" => \"" << (ssl?"https":"http") << "://127.0.0.1:" << port << "/test_file\""
|
||||||
"\"^/infinite_redirect$\" => \""
|
", \"^/infinite_redirect$\" => \"" << (ssl?"https":"http") << "://127.0.0.1:" << port << "/infinite_redirect\""
|
||||||
<< (ssl?"https":"http") << "://127.0.0.1:" << port << "/infinite_redirect\")\n"
|
", \"^/relative/redirect$\" => \"../test_file\""
|
||||||
|
")\n"
|
||||||
"$HTTP[\"url\"] == \"/test_file.gz\" {\n"
|
"$HTTP[\"url\"] == \"/test_file.gz\" {\n"
|
||||||
" setenv.add-response-header = ( \"Content-Encoding\" => \"gzip\" )\n"
|
" setenv.add-response-header = ( \"Content-Encoding\" => \"gzip\" )\n"
|
||||||
"# mimetype.assign = ()\n"
|
"# mimetype.assign = ()\n"
|
||||||
|
|
|
@ -104,6 +104,7 @@ void run_suite(std::string const& protocol, proxy_settings const& ps)
|
||||||
<< " proxy **********************\n" << std::endl;
|
<< " proxy **********************\n" << std::endl;
|
||||||
|
|
||||||
typedef boost::optional<error_code> err;
|
typedef boost::optional<error_code> err;
|
||||||
|
run_test(protocol + "://127.0.0.1:8001/relative/redirect", 3216, 200, 2, error_code(), ps);
|
||||||
run_test(protocol + "://127.0.0.1:8001/redirect", 3216, 200, 2, error_code(), ps);
|
run_test(protocol + "://127.0.0.1:8001/redirect", 3216, 200, 2, error_code(), ps);
|
||||||
run_test(protocol + "://127.0.0.1:8001/infinite_redirect", 0, 301, 6, error_code(), ps);
|
run_test(protocol + "://127.0.0.1:8001/infinite_redirect", 0, 301, 6, error_code(), ps);
|
||||||
run_test(protocol + "://127.0.0.1:8001/test_file", 3216, 200, 1, error_code(), ps);
|
run_test(protocol + "://127.0.0.1:8001/test_file", 3216, 200, 1, error_code(), ps);
|
||||||
|
|
Loading…
Reference in New Issue