0
#include "MessageChannel.h"
0
using namespace Passenger;
0
-handleRequest(MessageChannel &reader, MessageChannel &writer) {
0
- vector<string> headers;
0
+typedef vector< pair<string, string> > HeaderSet;
0
- P_TRACE("Reading request headers");
0
- if (!reader.read(headers)) {
0
+readHeaders(int reader, HeaderSet &headers) {
0
+ char buffer2[1024 * 32];
0
+ buffer.reserve(1024 * 32);
0
+ ssize_t ret = read(reader, buffer2, sizeof(buffer2));
0
+ buffer.append(buffer2, ret);
0
+ string::size_type start = 0;
0
+ string::size_type pos;
0
+ pos = buffer.find('\0', start);
0
+ if (pos != string::npos) {
0
+ string name(buffer.substr(start, pos - start));
0
+ pos = buffer.find('\0', start);
0
+ string value(buffer.substr(start, pos - start));
0
+ headers.push_back(make_pair(name, value));
0
- P_TRACE("Done reading request headers");
0
+writeString(int writer, const string &str) {
0
+ unsigned int written = 0;
0
+ ret = write(writer, str.c_str() + written, str.size() - written);
0
+ } while (ret == -1 && errno == EINTR);
0
+ } while (written < str.size());
0
+processRequest(int reader, int writer) {
0
+ readHeaders(reader, headers);
0
content.reserve(1024 * 7);
0
content += "<b>Using C++ DummyRequestHandler</b><br>\n";
0
- for (i = 0; i < headers.size(); i += 2) {
0
- content += headers[i];
0
- content += headers[i + 1];
0
- content += "</tt><br>\n";
0
+ for (HeaderSet::const_iterator it(headers.begin()); it != headers.end(); it++) {
0
+ content.append("<tt>");
0
+ content.append(it->first);
0
+ content.append(" = ");
0
+ content.append(it->second);
0
+ content.append("</tt><br>\n");
0
- header
+= "Status: 200 OK\r\n"
0
+ header
.append("Status: 200 OK\r\n"
0
"Content-Type: text/html\r\n"
0
- header += toString(content.size());
0
- P_TRACE("Sending response header");
0
- writer.writeScalar(header);
0
- P_TRACE("Sending response content");
0
- writer.writeScalar(content);
0
- writer.writeScalar("", 0);
0
+ header.append(toString(content.size()));
0
+ header.append("\r\n\r\n");
0
+ writeString(writer, header);
0
+ writeString(writer, content);
0
+acceptNextRequest(int fd) {
0
+ if (read(fd, &c, 1) == 0) {
0
+ MessageChannel listener(fd);
0
+ listener.writeFileDescriptor(fd1[0]);
0
+ listener.writeFileDescriptor(fd2[1]);
0
+ processRequest(fd2[0], fd1[1]);
0
- MessageChannel reader(STDIN_FILENO);
0
- MessageChannel writer(STDOUT_FILENO);
0
- done =
handleRequest(reader, writer);
0
+ done =
acceptNextRequest(STDIN_FILENO);
Comments
No one has commented yet.