#include "ThreadPool.H"
#include "Transport.H"
+#include <string>
+
class HTTPTransport:
public Transport
{
class Factory: public Transport::Factory {
public:
virtual Transport *newTransport(Connection *conn) const {
- return(new HTTPTransport(conn));
+ if(conn)
+ return(new HTTPTransport(conn));
+ else
+ return NULL;
}
};
static Factory theFactory;
HTTPTransport(Connection *conn)
- : Transport(conn)
+ : Transport(conn),
+ state(NONE),
+ request(), headers(), body(NULL), pos(NULL)
{}
virtual ~HTTPTransport();
virtual void onTimeout();
virtual void onError();
+protected:
+ enum { NONE,
+ IN_REQUEST,
+ IN_HEADERS,
+ IN_BODY } state;
+ string request;
+ string headers;
+ char *body;
+ char buffer[256];
+ char *pos;
};
#include "HTTPTransport.H"
#include <iostream>
+#include <string.h>
HTTPTransport::Factory HTTPTransport::theFactory;
HTTPTransport::~HTTPTransport()
{
+ if(body) free(body);
}
void
HTTPTransport::onReady()
{
- char buffer[256];
- int len;
-
- len = conn->read(buffer, sizeof(buffer));
- if(len < 0) {
- std::cout << "error on receive - closing connection" << std::endl;
- } else if ( len > 0) {
- std::cout.write(buffer, len);
- std::cout.flush();
- ThreadPool::theThreadPool.queueWorkRead(this);
- } else {
- std::cout << "no more data" << std::endl;
+ switch(state) {
+ case NONE:
+ state = IN_REQUEST;
+ pos = buffer;
+
+ case IN_REQUEST:
+ case IN_HEADERS:
+ len = conn->read(buffer, sizeof(buffer));
+ if(len < 0) {
+ // error during request
+ } else if(len == 0) {
+ // other side closed connection
+ } else {
+ char *cr;
+
+ // parse buffer, look for CRLF
+ cr = memchr(buffer, '\r', len);
+ if(cr) {
+ if((cr < buffer + len - 1) &&
+ (cr[1] == '\n')) {
+ // found CRLF
+
+ } else
+ cr = buffer + len;
+ }
+ // append everything up to the cr into appropriate variable
+ if(state == IN_REQUEST)
+ request.append(buffer, cr - buffer);
+ else
+ headers.append(buffer, cr - buffer);
+ }
+
+ case IN_BODY:
+ break;
}
+
}
HTTPTransport::onError()
{
}
+
+