myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [2916] Reduced `HttpHeaders::buildHTTPRequestHeaderStr


From: Giuseppe Scrivano
Subject: [myserver-commit] [2916] Reduced `HttpHeaders::buildHTTPRequestHeaderStruct' complexity extracting new methods.
Date: Mon, 27 Oct 2008 10:44:35 +0000

Revision: 2916
          http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=2916
Author:   gscrivano
Date:     2008-10-27 10:44:34 +0000 (Mon, 27 Oct 2008)

Log Message:
-----------
Reduced `HttpHeaders::buildHTTPRequestHeaderStruct' complexity extracting new 
methods.

Modified Paths:
--------------
    trunk/myserver/include/protocol/http/http_headers.h
    trunk/myserver/src/protocol/http/http_headers.cpp

Modified: trunk/myserver/include/protocol/http/http_headers.h
===================================================================
--- trunk/myserver/include/protocol/http/http_headers.h 2008-10-26 20:01:10 UTC 
(rev 2915)
+++ trunk/myserver/include/protocol/http/http_headers.h 2008-10-27 10:44:34 UTC 
(rev 2916)
@@ -48,26 +48,37 @@
 class HttpHeaders
 {
 public:
-       static int buildHTTPRequestHeaderStruct(const char* input,
-                                          u_long inputSize,
-                                          u_long* nHeaderChars,
-                                          HttpRequestHeader *request, 
-                                          Connection* connection);
-
-       static int buildHTTPResponseHeaderStruct(const char *input, 
+       static int buildHTTPRequestHeaderStruct (const char* input,
+                                           u_long inputSize,
+                                           u_long* nHeaderChars,
+                                           HttpRequestHeader *request, 
+                                           Connection* connection);
+  
+       static int buildHTTPResponseHeaderStruct (const char *input, 
                                            HttpResponseHeader *response, 
                                            u_long* nbtr);
 
-       static int validHTTPRequest(const char*, u_long, u_long*, u_long*);
-       static int validHTTPResponse(const char*, u_long*, u_long*);
+       static int validHTTPRequest (const char*, u_long, u_long*, u_long*);
+       static int validHTTPResponse (const char*, u_long*, u_long*);
 
-       static void resetHTTPRequest(HttpRequestHeader *request);
-       static void resetHTTPResponse(HttpResponseHeader *response);
+       static void resetHTTPRequest (HttpRequestHeader *request);
+       static void resetHTTPResponse (HttpResponseHeader *response);
 
-       static void buildDefaultHTTPResponseHeader(HttpResponseHeader*);
-       static void buildDefaultHTTPRequestHeader(HttpRequestHeader*);
+       static void buildDefaultHTTPResponseHeader (HttpResponseHeader*);
+       static void buildDefaultHTTPRequestHeader (HttpRequestHeader*);
 
-       static void buildHTTPResponseHeader(char *, HttpResponseHeader*);
-       static void buildHTTPRequestHeader(char *, HttpRequestHeader*);
+       static void buildHTTPResponseHeader (char *, HttpResponseHeader*);
+       static void buildHTTPRequestHeader (char *, HttpRequestHeader*);
+
+protected:
+  static int readReqAuthLine (HttpRequestHeader *request, 
+                              Connection *connection, 
+                              const char *token,
+                              int *lenOut);
+
+  static int readReqRangeLine (HttpRequestHeader *request, 
+                               Connection *connection, 
+                               const char *token,
+                               int *lenOut);
 };
 #endif

Modified: trunk/myserver/src/protocol/http/http_headers.cpp
===================================================================
--- trunk/myserver/src/protocol/http/http_headers.cpp   2008-10-26 20:01:10 UTC 
(rev 2915)
+++ trunk/myserver/src/protocol/http/http_headers.cpp   2008-10-27 10:44:34 UTC 
(rev 2916)
@@ -654,180 +654,10 @@
     /* Authorization.  */
     if(!strcmpi(command,"Authorization"))
     {
-      while(*token==' ')
-        token++;
-      tokenOff = getCharInString(token," ",HTTP_REQUEST_AUTH_DIM);
-            
-      if(tokenOff==-1)return 400;
-    
+      int ret = readReqAuthLine (request, connection, token, &tokenOff);
+      if (ret)
+        return ret;
       lineControlled = 1;
-  
-      request->auth.assign(token,tokenOff);
-      connection->setLogin("");
-      connection->setPassword("");
-      if(!request->auth.compare("Basic"))
-      {
-        u_long i;
-        const char *base64 = &token[strlen("Basic ")];
-        int len = getEndLine(base64, 64);
-        const char *tmp = base64 + len - 1;
-        const char* lsecondaryBuffer;
-        const char* keep_lsecondaryBuffer;
-        char login[32];
-        char password[32];
-        
-        if(len == -1)
-          return 400;    
-
-        login[0] = password[0] = '\0';
-
-        while (len > 0 && (*tmp == '\r' || *tmp == '\n'))
-        {
-          tmp--;
-          len--;
-        }
-        if (len <= 1)
-          return 400;
-        lsecondaryBuffer = base64Utils.Decode(base64,&len);
-        keep_lsecondaryBuffer = lsecondaryBuffer;
-   
-        for(i = 0; (*lsecondaryBuffer != ':') && (i < 32);i++)
-        {
-          login[i] = *lsecondaryBuffer++;
-          login[i+1] = '\0';
-        }
-        lsecondaryBuffer++;
-        for(i = 0; (*lsecondaryBuffer) && (i < 31); i++)
-        {
-          password[i] = *lsecondaryBuffer++;
-          password[i+1] = '\0';
-        }
-        connection->setLogin(login);
-        connection->setPassword(password);
-        tokenOff = getEndLine(token, 100);
-        delete keep_lsecondaryBuffer;
-      }
-      else if(!request->auth.compare("Digest"))
-      {
-        char *digestBuff;
-        char *digestToken;
-        token += tokenOff;
-        while(*token == ' ')
-          token++;
-        tokenOff = getEndLine(token, 1024);
-        if(tokenOff==-1)
-          return 400;    
-        digestBuff=new char[tokenOff+1];
-        if(!digestBuff)
-          return 400;
-        memcpy(digestBuff,token,tokenOff);
-        digestBuff[tokenOff]='\0';
-        digestToken = strtok( digestBuff, "=" );
-        if(!digestToken)
-          return 400;
-        do
-        {
-          StrTrim(digestToken, (char*)" ");
-          if(!strcmpi(digestToken, (char*)"nonce"))
-          {
-            digestToken = strtok( NULL, (char*)"," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)"\" ");
-              myserver_strlcpy(request->digestNonce,digestToken,48+1);
-            }
-          }
-          else if(!strcmpi(digestToken, (char*)"opaque"))
-          {
-            digestToken = strtok( NULL, (char*)"," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)"\" ");
-              myserver_strlcpy(request->digestOpaque,digestToken,48+1);
-            }
-          }
-          else if(!strcmpi(digestToken, (char*)"uri"))
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)"\" ");
-              myserver_strlcpy(request->digestUri,digestToken,1024+1);
-            }
-          }
-          else if(!strcmpi(digestToken, (char*)"method"))
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)"\" ");
-              myserver_strlcpy(request->digestMethod,digestToken,16+1);
-            }
-          }  
-          else if(!strcmpi(digestToken, (char*)"qop"))
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-            if(digestToken)
-            {
-              StrTrim(digestToken,(char*)"\" ");
-              myserver_strlcpy(request->digestQop,digestToken,16+1);
-            }
-          }          
-          else if(!strcmpi(digestToken, (char*)"realm"))
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)"\" ");
-              myserver_strlcpy(request->digestRealm,digestToken,48+1);
-            }
-          }
-          else if(!strcmpi(digestToken, (char*)"cnonce"))
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)" \"");
-              myserver_strlcpy(request->digestCnonce, digestToken, 48+1);
-            }
-          }
-          else if(!strcmpi(digestToken, (char*)"username"))
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)"\" ");
-              myserver_strlcpy(request->digestUsername, digestToken, 48+1);
-              connection->setLogin(digestToken);
-            }
-          }
-          else if(!strcmpi(digestToken, (char*)"response"))
-          {
-            digestToken = strtok( NULL, "\r\n," );
-            if(digestToken)
-             {
-               StrTrim(digestToken, (char*)"\" ");
-               myserver_strlcpy(request->digestResponse,digestToken,48+1);
-             }
-          }
-          else if(!strcmpi(digestToken, (char*)"nc"))
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-            if(digestToken)
-            {
-              StrTrim(digestToken, (char*)"\" ");
-              myserver_strlcpy(request->digestNc,digestToken,10+1);
-            }
-          }
-          else 
-          {
-            digestToken = strtok( NULL, (char*)"\r\n," );
-          }
-          /* Update digestToken.  */
-          digestToken = strtok( NULL, (char*)"=" );
-        }while(digestToken);
-        delete  [] digestBuff;
-      }
     }else
     /* Content-Length.  */
     if(!strcmpi(command, (char*)"Content-Length"))
@@ -841,71 +671,10 @@
     /* Range.  */
     if(!strcmpi(command, (char*)"Range"))
     {
-      char rangeByteBegin[13];
-      char rangeByteEnd[13];
-      const char *localToken = token;
-      int i=0;
-      rangeByteBegin[0] = '\0';
-      rangeByteEnd[0] = '\0';
+      int ret = readReqRangeLine (request, connection, token, &tokenOff);
+      if (ret)
+        return ret;
       lineControlled = 1;
-      tokenOff = getEndLine(token, HTTP_REQUEST_RANGE_TYPE_DIM+30);
-      if(tokenOff ==-1)
-        return 400;
-      do
-      {
-        i++;
-      }
-      while((*(++localToken) != '=')&&(i<HTTP_REQUEST_RANGE_TYPE_DIM));
-
-      request->rangeType.assign(token, i);
-
-      i=0;
-      localToken++;
-      do
-      {
-        rangeByteBegin[i++] = *localToken;
-        rangeByteBegin[i] = '\0';
-      }
-      while((*(++localToken) != '-') && (i<12) && (*localToken != '\r'));
-      i = 0;
-      localToken++;
-      do
-      {
-        rangeByteEnd[i++] = *localToken;
-        rangeByteEnd[i] = '\0';
-      }
-      while((*(++localToken) != '\r' )&&(i<12));
-
-      for(i=0;i < static_cast<int>(request->rangeType.length()); i++)
-        if(request->rangeType[i] == '=')
-          request->rangeType[i] = '\0';
-
-      for(i = 0; i < static_cast<int>(strlen(rangeByteBegin)); i++)
-        if(rangeByteBegin[i] == '=')
-          rangeByteBegin[i] = '\0';
-
-      for(i = 0; i < static_cast<int>(strlen(rangeByteEnd)); i++)
-        if(rangeByteEnd[i]== '=')
-          rangeByteEnd[i]='\0';
-      
-      if(rangeByteBegin[0] == 0)
-      {
-        request->rangeByteBegin=0;
-      }      
-      else
-      {
-        request->rangeByteBegin = (u_long)atol(rangeByteBegin); 
-      }
-      if(rangeByteEnd[0] == '\r')
-      {
-        request->rangeByteEnd = 0;
-      }
-      else
-      {
-        request->rangeByteEnd = (u_long)atol(rangeByteEnd);
-        if(request->rangeByteEnd < request->rangeByteBegin)
-          return 400;
-      }
     }else
     if(!lineControlled)
     {
@@ -938,8 +707,8 @@
       }
     }
     token+= tokenOff + 2;
-    tokenOff = getCharInString(token,":",maxTotchars);
-  }while(((u_long)(token-input)<maxTotchars) && token[0]!='\r');
+    tokenOff = getCharInString(token, ":", maxTotchars);
+  }while (((u_long)(token - input) < maxTotchars) && token[0] != '\r');
 
   /*
    *END REQUEST STRUCTURE BUILD.
@@ -949,6 +718,292 @@
 }
 
 /*!
+ *Parse the range line in a HTTP request.
+ *\param request HttpRequest object to fill.
+ *\param connection Pointer to a connection structure.
+ *\param token Pointer to the beginning of the authorization line.
+ *\param lenOut Pointer to an itneger to keep the line length.
+ *\return 0 on success, any other value is the HTTP error.
+ */
+int HttpHeaders::readReqRangeLine (HttpRequestHeader *request, 
+                                   Connection *connection, 
+                                   const char *token,
+                                   int *lenOut)
+{
+  char rangeByteBegin[13];
+  char rangeByteEnd[13];
+  const char *localToken = token;
+  int i = 0;
+  rangeByteBegin[0] = '\0';
+  rangeByteEnd[0] = '\0';
+
+  int tokenOff = getEndLine(token, HTTP_REQUEST_RANGE_TYPE_DIM + 30);
+  if(tokenOff ==-1)
+    return 400;
+  
+  *lenOut = tokenOff;
+
+  do
+    {
+      i++;
+    }
+  while((*(++localToken) != '=') && (i < HTTP_REQUEST_RANGE_TYPE_DIM));
+
+  request->rangeType.assign(token, i);
+
+  i = 0;
+  localToken++;
+  
+  do
+    {
+      rangeByteBegin[i++] = *localToken;
+      rangeByteBegin[i] = '\0';
+    }
+  while((*(++localToken) != '-') && (i<12) && (*localToken != '\r'));
+  
+  i = 0;
+  localToken++;
+  do
+    {
+      rangeByteEnd[i++] = *localToken;
+      rangeByteEnd[i] = '\0';
+    }
+  while((*(++localToken) != '\r' )&&(i<12));
+
+  for(i=0;i < static_cast<int>(request->rangeType.length()); i++)
+    if(request->rangeType[i] == '=')
+      request->rangeType[i] = '\0';
+  
+  for(i = 0; i < static_cast<int>(strlen(rangeByteBegin)); i++)
+    if(rangeByteBegin[i] == '=')
+      rangeByteBegin[i] = '\0';
+  
+  for(i = 0; i < static_cast<int>(strlen(rangeByteEnd)); i++)
+    if(rangeByteEnd[i]== '=')
+      rangeByteEnd[i]='\0';
+      
+  if(rangeByteBegin[0] == 0)
+    {
+      request->rangeByteBegin=0;
+    }      
+  else
+    {
+      request->rangeByteBegin = (u_long)atol(rangeByteBegin); 
+    }
+  if(rangeByteEnd[0] == '\r')
+    {
+      request->rangeByteEnd = 0;
+    }
+  else
+    {
+      request->rangeByteEnd = (u_long)atol(rangeByteEnd);
+      if(request->rangeByteEnd < request->rangeByteBegin)
+        return 400;
+    }
+
+  return 0;
+}
+
+/*!
+ *Parse the authorization line in a HTTP request.
+ *\param request HttpRequest object to fill.
+ *\param connection Pointer to a connection structure.
+ *\param token Pointer to the beginning of the authorization line.
+ *\param lenOut Pointer to an itneger to keep the line length.
+ *\return 0 on success, any other value is the HTTP error.
+ */
+int HttpHeaders::readReqAuthLine (HttpRequestHeader *request, 
+                                  Connection *connection,
+                                  const char *token,
+                                  int *lenOut)
+{
+  while(*token==' ')
+    token++;
+  int tokenOff = getCharInString(token, " ", HTTP_REQUEST_AUTH_DIM);
+  
+  if(tokenOff==-1)
+    return 400;
+
+  request->auth.assign(token, tokenOff);
+  connection->setLogin("");
+  connection->setPassword("");
+
+  if(!request->auth.compare("Basic"))
+    {
+      u_long i;
+      const char *base64 = &token[6];
+      int len = getEndLine(base64, 64);
+      const char *tmp = base64 + len - 1;
+      const char* lsecondaryBuffer;
+      const char* lsecondaryBufferOr;
+      char login[32];
+      char password[32];
+      
+      if(len == -1)
+        return 400;    
+      
+      login[0] = password[0] = '\0';
+        
+      while (len > 0 && (*tmp == '\r' || *tmp == '\n'))
+        {
+          tmp--;
+          len--;
+        }
+      if (len <= 1)
+        return 400;
+      
+      lsecondaryBuffer = base64Utils.Decode(base64,&len);
+      lsecondaryBufferOr = lsecondaryBuffer;
+   
+      for(i = 0; (*lsecondaryBuffer != ':') && (i < 32);i++)
+        {
+          login[i] = *lsecondaryBuffer++;
+        }
+      login[i] = '\0';
+      
+      lsecondaryBuffer++;
+      for(i = 0; (*lsecondaryBuffer) && (i < 31); i++)
+        {
+          password[i] = *lsecondaryBuffer++;
+        }
+      password[i] = '\0';
+      
+      connection->setLogin(login);
+      connection->setPassword(password);
+      delete lsecondaryBufferOr;
+      *lenOut = tokenOff = getEndLine(token, 100);
+    }
+  else if(!request->auth.compare("Digest"))
+    {
+      char *digestBuff;
+      char *digestToken;
+      token += tokenOff;
+      
+      while(*token == ' ')
+        token++;
+
+      *lenOut = tokenOff = getEndLine(token, 1024);
+
+      if (tokenOff == -1)
+        return 400;    
+
+      digestBuff=new char[tokenOff+1];
+
+      if (!digestBuff)
+        return 400;
+
+      memcpy(digestBuff, token, tokenOff);
+      digestBuff[tokenOff]='\0';
+      digestToken = strtok( digestBuff, "=" );
+      if(!digestToken)
+        return 400;
+      do
+        {
+          StrTrim(digestToken, (char*)" ");
+          if(!strcmpi(digestToken, (char*)"nonce"))
+            {
+              digestToken = strtok( NULL, (char*)"," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestNonce,digestToken,48+1);
+                }
+            }
+          else if(!strcmpi(digestToken, (char*)"opaque"))
+            {
+              digestToken = strtok( NULL, (char*)"," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestOpaque,digestToken,48+1);
+                }
+            }
+          else if(!strcmpi(digestToken, (char*)"uri"))
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestUri,digestToken,1024+1);
+                }
+            }
+          else if(!strcmpi(digestToken, (char*)"method"))
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestMethod,digestToken,16+1);
+                }
+            }  
+          else if(!strcmpi(digestToken, (char*)"qop"))
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken,(char*)"\" ");
+                  myserver_strlcpy(request->digestQop,digestToken,16+1);
+                }
+            }          
+          else if(!strcmpi(digestToken, (char*)"realm"))
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestRealm,digestToken,48+1);
+                }
+            }
+          else if(!strcmpi(digestToken, (char*)"cnonce"))
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)" \"");
+                  myserver_strlcpy(request->digestCnonce, digestToken, 48+1);
+                }
+            }
+          else if(!strcmpi(digestToken, (char*)"username"))
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestUsername, digestToken, 48+1);
+                  connection->setLogin(digestToken);
+                }
+            }
+          else if(!strcmpi(digestToken, (char*)"response"))
+            {
+              digestToken = strtok( NULL, "\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestResponse,digestToken,48+1);
+                }
+            }
+          else if(!strcmpi(digestToken, (char*)"nc"))
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+              if(digestToken)
+                {
+                  StrTrim(digestToken, (char*)"\" ");
+                  myserver_strlcpy(request->digestNc,digestToken,10+1);
+                }
+            }
+          else 
+            {
+              digestToken = strtok( NULL, (char*)"\r\n," );
+            }
+          /* Update digestToken.  */
+          digestToken = strtok( NULL, (char*)"=" );
+        }while(digestToken);
+      delete  [] digestBuff;
+    }
+  return 0;
+}
+
+/*!
  *Build the HTTP RESPONSE HEADER string.
  *If no input is specified the input is the main buffer of the 
  *HttpThreadContext structure.






reply via email to

[Prev in Thread] Current Thread [Next in Thread]