Skip to content

Commit

Permalink
Added work-in-progress http_workers, still not tied in to flamethrower
Browse files Browse the repository at this point in the history
  • Loading branch information
Janitha Karunaratne committed Feb 26, 2014
1 parent cf0efca commit 263fad5
Show file tree
Hide file tree
Showing 2 changed files with 228 additions and 0 deletions.
161 changes: 161 additions & 0 deletions http_worker.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
#include "http_worker.h"

////////////////////////////////////////////////////////////////////////////////
HttpWorker::HttpWorker()
: http_state(HttpState::START),
firstline_crlf_mh("\r\n", 2),
header_crlfcrlf_mh("\r\n\r\n", 4) {

// TODO(Janitha): BROKEN WORK IN PROGRESS

}

HttpWorker::~HttpWorker() {

}

HttpWorker::HttpState HttpWorker::consume(char *recvbuf, size_t recvlen, size_t &remlen) {
debug_print("called\n");

// TODO(Janitha): BROKEN WORK IN PROGRESS

remlen = recvlen;

switch(http_state) {
case HttpState::START:

http_state = HttpState::FIRSTLINE;
firstline_state = FirstlineState::START;

case HttpState::FIRSTLINE:
consume_firstline(recvbuf, recvlen, remlen);
if(!remlen) break;

recvbuf += recvlen - remlen;
recvlen = remlen;
http_state = HttpState::HEADERS;
header_state = HeaderState::START;

case HttpState::HEADERS:
consume_header(recvbuf, recvlen, remlen);
if(!remlen) break;

recvbuf += recvlen - remlen;
recvlen = remlen;
http_state = HttpState::BODY;
body_state = BodyState::START;

case HttpState::BODY:
consume_body(recvbuf, recvlen, remlen);
if(!remlen) break;

recvbuf += recvlen - remlen;
recvlen = remlen;
http_state= HttpState::DONE;

case HttpState::DONE:
default:
break;
}

if(remlen) {
perror("error: unconsumed data in http");
exit(EXIT_FAILURE);
}

return http_state;

}

void HttpWorker::consume_firstline(char *recvbuf, size_t recvlen, size_t &remlen) {
debug_print("called\n");

// TODO(Janitha): BROKEN WORK IN PROGRESS

remlen = recvlen;
char *end;

switch(firstline_state) {
case FirstlineState::START:
firstline_state = FirstlineState::DATA;

case FirstlineState::DATA:
end = firstline_crlf_mh.findend(recvbuf, recvlen);
if(!end) {
remlen = 0;
break;
}

remlen = end - recvbuf;
recvbuf = end;
recvlen = remlen;
firstline_state = FirstlineState::DONE;

case FirstlineState::DONE:
default:
break;
}

}

void HttpWorker::consume_header(char *recvbuf, size_t recvlen, size_t &remlen) {
debug_print("called\n");

// TODO(Janitha): BROKEN WORK IN PROGRESS

remlen = recvlen;
char *end;

switch(header_state) {
case HeaderState::START:
header_state = HeaderState::DATA;

case HeaderState::DATA:
end = header_crlfcrlf_mh.findend(recvbuf, recvlen);
if(!end) {
remlen = 0;
break;
}

remlen = end - recvbuf;
recvbuf = end;
recvlen = remlen;
header_state = HeaderState::DONE;

case HeaderState::DONE:
default:
break;
}
}

void HttpWorker::consume_body(char *recvbuf, size_t recvlen, size_t &remlen) {
debug_print("called\n");

// TODO(Janitha): BROKEN WORK IN PROGRESS

remlen = recvlen;

switch(body_state) {
case BodyState::START:
body_state = BodyState::DATA;

case BodyState::DATA:
// TODO(Janitha): What do?
remlen = 0;
break;

case BodyState::DONE:
default:
break;

}

}

////////////////////////////////////////////////////////////////////////////////
HttpServerWorker::HttpServerWorker()
: HttpWorker() {
}

HttpServerWorker::~HttpServerWorker() {
}
67 changes: 67 additions & 0 deletions http_worker.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#ifndef HTTP_WORKER_H
#define HTTP_WORKER_H

#include <iostream>

#include "common.h"
#include "memhunter.h"



class HttpWorker {

// TODO(Janitha): BROKEN WORK IN PROGRESS

private:
public:

enum class HttpState {
START,
FIRSTLINE,
HEADERS,
BODY,
DONE
} http_state;

enum class FirstlineState {
START,
DATA,
DONE
} firstline_state;

MemHunter firstline_crlf_mh;

enum class HeaderState {
START,
DATA,
DONE
} header_state;

MemHunter header_crlfcrlf_mh;

enum class BodyState {
START,
DATA,
DONE
} body_state;

HttpWorker();
virtual ~HttpWorker();

virtual HttpState consume(char *recvbuf, size_t recvlen, size_t &remlen) = 0;
virtual void consume_firstline(char *recvbuf, size_t recvlen, size_t &remlen) = 0;
virtual void consume_header(char *recvbuf, size_t recvlen, size_t &remlen) = 0;
virtual void consume_body(char *recvbuf, size_t recvlen, size_t &remlen) = 0;

};


class HttpServerWorker : public HttpWorker {

HttpServerWorker();
virtual ~HttpServerWorker();

};


#endif

0 comments on commit 263fad5

Please sign in to comment.