From 263097e22bdf0a56007644e4d19605371dc79a8f Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Mon, 27 Dec 2010 18:45:20 +0100 Subject: Basic directory listing for HTTP. --- httpd.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (limited to 'httpd.cpp') diff --git a/httpd.cpp b/httpd.cpp index 5de9948..3d25a0e 100644 --- a/httpd.cpp +++ b/httpd.cpp @@ -1,6 +1,11 @@ #include "httpd.h" +#include "music.h" #include +#include +#include +#include +#include #include @@ -10,12 +15,53 @@ HTTPConnection::HTTPConnection(boost::asio::io_service& io_service) : socket(io_ void HTTPConnection::handle_write(const boost::system::error_code& error, size_t bytes_transferred) { } +void HTTPConnection::handle_read(const boost::system::error_code& error, size_t bytes_transferred) { + std::istream is(&buf); + std::string line, firstline; + std::getline(is, firstline); + std::string type, path, httpver; + + std::vector splitvec; + boost::algorithm::split(splitvec, firstline, boost::algorithm::is_space()); + + type = splitvec[0]; + path = splitvec[1]; + httpver = splitvec[2]; + std::cout << boost::format("%s %s %s\n") % type % path % httpver; + + if(boost::algorithm::ends_with(path, "/")) + path = path.substr(0, path.size()-1); + + boost::asio::streambuf b; + std::ostream os(&b); + + MusicListing *ml = music::find(path); + if(ml) { + os << "HTTP/1.1 200 OK\r\n"; + os << "content-type: text/html\r\n"; + os << "\r\n"; + + ml->render(os); + } else { + os << "HTTP/1.1 404 Not Found\r\n"; + os << "\r\n"; + } + + boost::asio::write(socket, b); + + while(is.good()) { + std::getline(is, line); + std::cout << line << std::endl; + } +} + HTTPConnection::pointer HTTPConnection::create(boost::asio::io_service& io_service) { return pointer(new HTTPConnection(io_service)); } void HTTPConnection::start() { - std::cout << "kake" << std::endl; + boost::asio::async_read_until(socket, buf, "\r\n\r\n", boost::bind(&HTTPConnection::handle_read, shared_from_this(), + boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } HTTPServer::HTTPServer(boost::asio::io_service& io_service) : acceptor_(io_service, tcp::endpoint(tcp::v4(), 8000)) { -- cgit v1.2.3