From: Michal Voců Date: Wed, 7 Mar 2007 09:34:30 +0000 (+0000) Subject: * some work X-Git-Tag: glite-lb-server-bones_R_2_2_4_1~15 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=6cf979150c788a0a59931f7f1a36d6cbbb71e5bc;p=jra1mw.git * some work --- diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.H b/org.glite.lb.logger/src-nt/HTTPTransport.H index 0148254..d5bf700 100644 --- a/org.glite.lb.logger/src-nt/HTTPTransport.H +++ b/org.glite.lb.logger/src-nt/HTTPTransport.H @@ -4,6 +4,8 @@ #include "ThreadPool.H" #include "Transport.H" +#include + class HTTPTransport: public Transport { @@ -11,14 +13,19 @@ public: 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(); @@ -28,6 +35,16 @@ public: 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; }; diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.cpp b/org.glite.lb.logger/src-nt/HTTPTransport.cpp index afd4df1..61d67f2 100644 --- a/org.glite.lb.logger/src-nt/HTTPTransport.cpp +++ b/org.glite.lb.logger/src-nt/HTTPTransport.cpp @@ -1,6 +1,7 @@ #include "HTTPTransport.H" #include +#include HTTPTransport::Factory HTTPTransport::theFactory; @@ -8,25 +9,49 @@ 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; } + } @@ -40,3 +65,5 @@ void HTTPTransport::onError() { } + +