ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Smersh/Daemon.cpp
(Generate patch)

Comparing Smersh/Daemon.cpp (file contents):
Revision 179 by Douglas Thrift, 2004-07-02T21:16:12-07:00 vs.
Revision 180 by Douglas Thrift, 2004-07-03T04:12:01-07:00

# Line 4 | Line 4
4   //
5   // $Id$
6  
7 #include <arpa/inet.h>
8 #include <sys/utsname.h>
9
7   #include "Daemon.hpp"
8  
9   string Daemon::crlf("\r\n");
# Line 50 | Line 47 | Daemon::Status Daemon::request(istream&
47          ostream& log)
48   {
49          string line;
50 <        Matcher request("^([A-Z]+) .*?(\\?.+)? HTTP/(\\d+)\\.(\\d+)$");
50 >        Matcher request("^([A-Z]+) (.*?)(\\?.+)? HTTP/(\\d+)\\.(\\d+)$");
51  
52          getline(sin, line);
53  
# Line 61 | Line 58 | Daemon::Status Daemon::request(istream&
58  
59          if (line == request)
60          {
61 <                if (lexical_cast<unsigned>(request[3]) > 1) return version;
61 >                if (lexical_cast<unsigned>(request[4]) > 1) return version;
62  
63                  Matcher method("^GET|HEAD|POST$");
64  
65                  if (request[1] != method) return notImplemented;
66  
67                  env.set("REQUEST_METHOD", method);
68 +                env.set("REQUEST_URI", request[2] + request[3]);
69  
70 <                if (!request[2].empty()) env.set("QUERY_STRING", request[2].substr(1));
70 >                if (!request[3].empty()) env.set("QUERY_STRING", request[3].substr(1));
71  
72                  headers(sin, env);
73  
# Line 78 | Line 76 | Daemon::Status Daemon::request(istream&
76                  return ok;
77          }
78  
79 <        return notFound;
79 >        return bad;
80   }
81  
82   void Daemon::response(ostream& sout, Status status)
# Line 88 | Line 86 | void Daemon::response(ostream& sout, Sta
86                  << "Connection: close" << crlf;
87   }
88  
89 + string Daemon::reason(Status status)
90 + {
91 +        ostringstream sout;
92 +
93 +        switch (status)
94 +        {
95 +        case ok:
96 +                sout << "OK";
97 +                break;
98 +        case found:
99 +                sout << "Found";
100 +                break;
101 +        case seeOther:
102 +                sout << "See Other";
103 +                break;
104 +        case bad:
105 +                sout << "Bad Request";
106 +                break;
107 +        case notFound:
108 +                sout << "Not Found";
109 +                break;
110 +        case lengthRequired:
111 +                sout << "Length Required";
112 +                break;
113 +        case mediaType:
114 +                sout << "Unsupported Media Type";
115 +                break;
116 +        case serverError:
117 +                sout << "Internal Server Error";
118 +                break;
119 +        case notImplemented:
120 +                sout << "Not Implemented";
121 +                break;
122 +        case version:
123 +                sout << "HTTP Version not supported";
124 +        }
125 +
126 +        return sout.str();
127 + }
128 +
129   string Daemon::server()
130   {
131          utsname system;
# Line 135 | Line 173 | int Daemon::handle(Client* client)
173          ostringstream log;
174          Status code(request(sio, env, post, log));
175  
176 +        if (env.get("REQUEST_URI") == "/favicon.ico") code = notFound;
177 +
178          response(sio, code);
179  
180          bool head(env.get("REQUEST_METHOD") == "HEAD");
# Line 142 | Line 182 | int Daemon::handle(Client* client)
182  
183          if (code == ok && !head)
184          {
185 <                ostringstream output;
186 <                Smersh smersh(post, output, env);
187 <                string content(output.str().substr(40));
185 >                ostringstream content;
186 >
187 >                if (env.get("REQUEST_URI") == "/robots.txt")
188 >                {
189 >                        content << string(40, '#') << "User-agent: *\r\nDisallow: /\r\n";
190 >                }
191 >                else Smersh smersh(post, content, env);
192  
193 <                sio << "Content-Length: " << content.length() << crlf
193 >                sio << "Content-Length: " << content.str().substr(40).length() << crlf
194                          << "Content-Type: text/html; charset=UTF-8\r\n\r\n";
195  
196 <                sio.write(content.data(), content.size());
196 >                sio.write(content.str().substr(40).data(), content.str().size() - 40);
197  
198 <                sent = content.size();
198 >                sent = content.str().size() - 40;
199          }
200          else if (head) sio << "Content-Type: text/html; charset=UTF-8\r\n\r\n";
201          else sent = error(sio, code);
202  
159        log << code << ' ' << (sent > 0 ? lexical_cast<string>(sent) : string("0"))
160                << " \"" << env.get("HTTP_REFERER") << "\" \""
161                << env.get("HTTP_USER_AGENT") << '"';
162
203          ofstream fout(this->log.c_str(), ios_base::app);
204  
205          fout << inet_ntoa(client->ip->sin_addr) << " - - " << date(true) << ' '
206 <                << log.str() << '\n';
206 >                << log.str() << code << ' ' << lexical_cast<string>(sent) << " \""
207 >                << env.get("HTTP_REFERER") << "\" \"" << env.get("HTTP_USER_AGENT")
208 >                << "\"\n";
209          sio << flush;
210  
211          client->socket.ShutdownWrite();
# Line 235 | Line 277 | Daemon::Status Daemon::message(istream&
277  
278          return ok;
279   }
238
239 string Daemon::reason(Status status)
240 {
241        ostringstream sout;
242
243        switch (status)
244        {
245        case ok:
246                sout << "OK";
247                break;
248        case found:
249                sout << "Found";
250                break;
251        case seeOther:
252                sout << "See Other";
253                break;
254        case bad:
255                sout << "Bad Request";
256                break;
257        case notFound:
258                sout << "Not Found";
259                break;
260        case lengthRequired:
261                sout << "Length Required";
262                break;
263        case mediaType:
264                sout << "Unsupported Media Type";
265                break;
266        case serverError:
267                sout << "Internal Server Error";
268                break;
269        case notImplemented:
270                sout << "Not Implemented";
271                break;
272        case version:
273                sout << "HTTP Version not supported";
274        }
275
276        return sout.str();
277 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines