5 // Definition of non-inline non-template functions
7 #include "HTTPRequest.hh"
8 //#include "HTTPRequest.ih"
11 #include <boost/algorithm/string.hpp>
12 #include <boost/range.hpp>
13 #include "Socket/ClientSocketHandle.hh"
14 #include "Socket/Protocols/INet/INetAddressing.hh"
15 #include "Socket/CommunicationPolicy.hh"
17 //#include "HTTPRequest.mpp"
19 ///////////////////////////////cc.p////////////////////////////////////////
21 prefix_ g0dil::mediaserv::HTTPRequest::HTTPRequest()
24 prefix_ g0dil::mediaserv::HTTPRequest::HTTPRequest(senf::FileHandle handle,
25 std::string const & request)
27 parseRequest(handle,request);
30 prefix_ void g0dil::mediaserv::HTTPRequest::parseRequest(senf::FileHandle handle,
31 std::string const & request)
33 typedef senf::ClientSocketHandle< senf::MakeSocketPolicy<
34 senf::INet4AddressingPolicy,
35 senf::ConnectedCommunicationPolicy >::policy> IPHandle;
37 host_ = senf::dynamic_socket_cast<IPHandle>(handle).peer().host();
39 catch (std::bad_cast const *) {
40 host_ = "(unidentified address)";
42 boost::algorithm::split_iterator<std::string::const_iterator>
43 line (request, boost::algorithm::first_finder("\n"));
44 boost::algorithm::split_iterator<std::string::const_iterator> line_end;
45 if (line == line_end) return;
46 parseRequestURL(*line);
47 for (++line; line != line_end; ++line)
48 parseRequestHeader(*line);
51 prefix_ void g0dil::mediaserv::HTTPRequest::
52 parseRequestURL(boost::iterator_range<std::string::const_iterator> line)
54 boost::algorithm::split_iterator<std::string::const_iterator>
55 token (line, boost::algorithm::first_finder(" "));
56 boost::algorithm::split_iterator<std::string::const_iterator> token_end;
58 if (token == token_end)
59 throw InvalidHTTPRequestException();
60 method_ = std::string(token->begin(),token->end());
62 throw InvalidHTTPRequestException();
63 if (++token == token_end)
64 throw InvalidHTTPRequestException();
65 url_ = std::string(token->begin(),token->end());
66 if (++token == token_end)
68 version_ = std::string(token->begin(),token->end());
69 boost::trim(version_);
70 if (! boost::starts_with(version_,"HTTP/"))
71 throw InvalidHTTPRequestException();
72 if (++token != token_end)
73 throw InvalidHTTPRequestException();
76 prefix_ void g0dil::mediaserv::HTTPRequest::
77 parseRequestHeader(boost::iterator_range<std::string::const_iterator> line)
79 boost::iterator_range<std::string::const_iterator> i (boost::find_first(line,":"));
81 throw InvalidHTTPRequestException();
82 std::string key (line.begin(),i.begin());
83 std::string value (i.end(),line.end());
86 headers_.insert(std::make_pair(key,value));
89 prefix_ std::string const & g0dil::mediaserv::HTTPRequest::operator[](std::string const & key)
92 static std::string empty;
93 Headers::const_iterator i (headers_.find(key));
94 if (i == headers_.end()) return empty;
98 ///////////////////////////////cc.e////////////////////////////////////////
100 //#include "HTTPRequest.mpp"