5 // Definition of non-inline non-template functions
7 //#include "HTTPConnection.hh"
8 //#include "HTTPConnection.ih"
11 #include <sys/types.h>
16 #include <boost/lexical_cast.hpp>
17 #include <boost/algorithm/string.hpp>
19 #include "Utils/membind.hh"
21 #include "SimpleHTTPServer.hh"
22 #include "StreamConnection.hh"
23 #include "MimeTypes.hh"
25 //#include "HTTPConnection.mpp"
27 ///////////////////////////////cc.p////////////////////////////////////////
29 prefix_ g0dil::mediaserv::HTTPConnection::HTTPConnection(ClientHandle client,
30 SimpleHTTPServer & server,
32 : client_(client), server_(server), logger_(logger), fileFd_(-1), bandwidth_(0)
34 senf::ReadHelper<ClientHandle>
35 ::dispatch(client_, MaxRequestSize, senf::ReadUntil("\r\n\r\n"),
36 senf::membind(&HTTPConnection::handleRequest,this));
39 prefix_ g0dil::mediaserv::HTTPConnection::~HTTPConnection()
41 // if (client_.valid())
48 g0dil::mediaserv::HTTPConnection::handleRequest(senf::ReadHelper<ClientHandle>::ptr helper)
52 helper->throw_error();
54 request_.parseRequest(helper->handle(), helper->data());
56 boost::algorithm::split_iterator<std::string::const_iterator>
57 i (request_.url(),boost::algorithm::first_finder("."));
58 boost::algorithm::split_iterator<std::string::const_iterator> i_end;
59 if (i == i_end || ++i == i_end) throw InvalidHTTPRequestException();
60 bandwidth_ = boost::lexical_cast<unsigned>(std::string(i->begin(),i->end()));
61 if (++i == i_end) throw InvalidHTTPRequestException();
62 std::string const & mimeType (MimeTypes::lookup(std::string(i->begin(), i->end())));
63 if (++i != i_end) throw InvalidHTTPRequestException();
65 fileFd_ = ::open(request_.url().c_str(),O_RDONLY);
66 if (fileFd_ < 0) throw senf::SystemException(errno);
68 if (::fstat(fileFd_,&s) < 0) throw senf::SystemException(errno);
70 std::ostringstream response;
71 response << request_.version() << (request_.version().empty() ? "" : " ") << "200 OK\r\n";
72 response << "Content-Type: " << mimeType << "\r\n";
73 response << "Content-Length: " << s.st_size << "\r\n\r\n";
75 senf::WriteHelper<ClientHandle>
76 ::dispatch(client_, response.str(),
77 senf::membind(&HTTPConnection::startStream,this));
80 catch (std::exception const & ex) {
81 logger_.invalidRequest(ex.what());
82 server_.done(ptr(this));
87 g0dil::mediaserv::HTTPConnection::startStream(senf::WriteHelper<ClientHandle>::ptr helper)
90 helper->throw_error();
92 connection_.reset(new StreamConnection(fileFd_, bandwidth_, client_, StreamBufferMSecs,
93 boost::bind(&HTTPConnection::done,this)));
96 catch (std::exception const & ex) {
97 logger_.failedRequest(request_, ex.what());
98 server_.done(ptr(this));
102 prefix_ void g0dil::mediaserv::HTTPConnection::done()
104 logger_.request(request_, connection_->bytesSent());
105 server_.done(ptr(this));
108 ///////////////////////////////cc.e////////////////////////////////////////
110 //#include "HTTPConnection.mpp"