* some work
authorMichal Voců <michal@ruk.cuni.cz>
Wed, 7 Mar 2007 09:34:30 +0000 (09:34 +0000)
committerMichal Voců <michal@ruk.cuni.cz>
Wed, 7 Mar 2007 09:34:30 +0000 (09:34 +0000)
org.glite.lb.logger/src-nt/HTTPTransport.H
org.glite.lb.logger/src-nt/HTTPTransport.cpp

index 0148254..d5bf700 100644 (file)
@@ -4,6 +4,8 @@
 #include "ThreadPool.H"
 #include "Transport.H"
 
+#include <string>
+
 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;
 };
 
 
index afd4df1..61d67f2 100644 (file)
@@ -1,6 +1,7 @@
 #include "HTTPTransport.H"
 
 #include <iostream>
+#include <string.h>
 
 
 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()
 {
 }
+
+