X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Server%2FHTTPConnection.cc;fp=Server%2FHTTPConnection.cc;h=33a4e1c9f55d64ff1199e7f9937a56569c039d9f;hb=c05982737183fe02022b3e5e7948d58bc13bf953;hp=0000000000000000000000000000000000000000;hpb=3c4b5e4e5f828331621e3c2d816a245cf731aa0f;p=mediaserv.git diff --git a/Server/HTTPConnection.cc b/Server/HTTPConnection.cc new file mode 100644 index 0000000..33a4e1c --- /dev/null +++ b/Server/HTTPConnection.cc @@ -0,0 +1,115 @@ +// $Id$ +// +// Copyright (C) 2006 + +// Definition of non-inline non-template functions + +//#include "HTTPConnection.hh" +//#include "HTTPConnection.ih" + +// Custom includes +#include +#include +#include +#include + +#include +#include + +#include "Utils/membind.hh" + +#include "SimpleHTTPServer.hh" +#include "StreamConnection.hh" +#include "MimeTypes.hh" + +//#include "HTTPConnection.mpp" +#define prefix_ +///////////////////////////////cc.p//////////////////////////////////////// + +prefix_ g0dil::mediaserv::HTTPConnection::HTTPConnection(ClientHandle client, + SimpleHTTPServer & server, + HTTPLogger & logger) + : client_(client), server_(server), logger_(logger), fileFd_(-1), bandwidth_(0) +{ + satcom::lib::ReadHelper + ::dispatch(client_, MaxRequestSize, satcom::lib::ReadUntil("\r\n\r\n"), + satcom::lib::membind(&HTTPConnection::handleRequest,this)); +} + +prefix_ g0dil::mediaserv::HTTPConnection::~HTTPConnection() +{ +// if (client_.valid()) +// client_.close(); + if (fileFd_ != -1) + ::close(fileFd_); +} + +prefix_ void +g0dil::mediaserv::HTTPConnection::handleRequest(satcom::lib::ReadHelper::ptr helper) +{ + + try { + helper->throw_error(); + + request_.parseRequest(helper->handle(), helper->data()); + + boost::algorithm::split_iterator + i (request_.url(),boost::algorithm::first_finder(".")); + boost::algorithm::split_iterator i_end; + if (i == i_end || ++i == i_end) throw InvalidHTTPRequestException(); + bandwidth_ = boost::lexical_cast(std::string(i->begin(),i->end())); + if (++i == i_end) throw InvalidHTTPRequestException(); + std::string const & mimeType (MimeTypes::lookup(std::string(i->begin(), i->end()))); + if (++i != i_end) throw InvalidHTTPRequestException(); + + fileFd_ = ::open(request_.url().c_str(),O_RDONLY); + if (fileFd_ < 0) throw satcom::lib::SystemException(errno); + struct ::stat s; + if (::fstat(fileFd_,&s) < 0) throw satcom::lib::SystemException(errno); + + std::ostringstream response; + response << request_.version() << (request_.version().empty() ? "" : " ") << "200 OK\r\n"; + response << "Content-Type: " << mimeType << "\r\n"; + response << "Content-Length: " << s.st_size << "\r\n\r\n"; + + satcom::lib::WriteHelper + ::dispatch(client_, response.str(), + satcom::lib::membind(&HTTPConnection::startStream,this)); + + } + catch (std::exception const & ex) { + logger_.invalidRequest(ex.what()); + server_.done(ptr(this)); + } +} + +prefix_ void +g0dil::mediaserv::HTTPConnection::startStream(satcom::lib::WriteHelper::ptr helper) +{ + try { + helper->throw_error(); + + connection_.reset(new StreamConnection(fileFd_, bandwidth_, client_, StreamBufferMSecs, + boost::bind(&HTTPConnection::done,this))); + connection_->start(); + } + catch (std::exception const & ex) { + logger_.failedRequest(request_, ex.what()); + server_.done(ptr(this)); + } +} + +prefix_ void g0dil::mediaserv::HTTPConnection::done() +{ + logger_.request(request_, connection_->bytesSent()); + server_.done(ptr(this)); +} + +///////////////////////////////cc.e//////////////////////////////////////// +#undef prefix_ +//#include "HTTPConnection.mpp" + + +// Local Variables: +// mode: c++ +// End: