Эх сурвалжийг харах

add parser boundary for iap

balbekova 7 жил өмнө
parent
commit
804e6a6ded

+ 120 - 53
iap/Modules/Ethernet/httpserver.c

@@ -13,6 +13,8 @@
 #include <string.h>
 #include <string.h>
 #include "tinystdio.h"
 #include "tinystdio.h"
 
 
+#define FILENAME_MAX_LEN    30
+
 /**
 /**
   * @brief  Общая структура настроек
   * @brief  Общая структура настроек
   */
   */
@@ -34,6 +36,7 @@ static uint32_t ContentLengthOffset =0,BrowserFlag=0;
 static __IO uint32_t TotalData=0, checklogin=0;
 static __IO uint32_t TotalData=0, checklogin=0;
 static bool fEraseFlash = true;
 static bool fEraseFlash = true;
 static bool hw_validated = false;
 static bool hw_validated = false;
+static uint32_t ContentOffset = 0;
 
 
 static uint8_t reqCounter = 0;
 static uint8_t reqCounter = 0;
 static uint8_t reqTimer = 0;
 static uint8_t reqTimer = 0;
@@ -60,6 +63,7 @@ static const char Content_Length[17] =
 
 
 
 
 static uint32_t Parse_Content_Length(char *data, uint32_t len);
 static uint32_t Parse_Content_Length(char *data, uint32_t len);
+char* Parce_Boundary(const char* data, uint32_t len, char* dst, uint8_t dstlen);
 static void IAP_HTTP_writedata(char* data, uint32_t len);
 static void IAP_HTTP_writedata(char* data, uint32_t len);
 
 
 /* file must be allocated by caller and will be filled in
 /* file must be allocated by caller and will be filled in
@@ -288,62 +292,92 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		  fEraseFlash = false;
 		  fEraseFlash = false;
 		}*/
 		}*/
 
 
+    	  static char boundary[70];
+		  static char boundary_buf[70];
+		  static char *pbound = NULL;
+
         DataOffset = 0;
         DataOffset = 0;
         
         
         /* POST Packet received */
         /* POST Packet received */
-        if (DataFlag == 0)
-        { 
-          BrowserFlag = 0;
-          TotalReceived = 0;
-          
-          /* parse packet for Content-length field */
-          size = Parse_Content_Length(data, p->tot_len);
-           
-          /* parse packet for the octet-stream field */
-          for (i = 0; i < len; i++)
-          {
-             if (strncmp ((char*)(data+i), octet_stream, 13)==0)
-             {
-               DataOffset = i + 16;
-               break;
-             }
-          }  
-          /* case of MSIE8 : we do not receive data in the POST packet*/ 
-          if (DataOffset == 0)
-          {
-             DataFlag++;
-             BrowserFlag = 1;
-             pbuf_free(p);
-             return ERR_OK;
-             
-          }
-          /* case of Mozilla Firefox v3.6 : we receive data in the POST packet*/
-          else
-          {
-            TotalReceived = len - (ContentLengthOffset + 4);
-          }
-        }
+		if (DataFlag == 0)
+		{
+		  BrowserFlag = 0;
+		  TotalReceived = 0;
+
+		  /* parse packet for Content-length field */
+		  size = Parse_Content_Length(data, p->tot_len);
+
+		  pbound = Parce_Boundary(data, p->tot_len, boundary, sizeof(boundary));
+		  //printf("boundary: %s\r\n", boundary);
+
+		  /* parse packet for the octet-stream field */
+		  for (i = 0; i < len; i++)
+		  {
+			   /* TODO remove if tested */
+//             if (strncmp ((char*)(data+i), octet_stream, 13)==0)
+//             {
+//               DataOffset = i + 16;
+//               break;
+//             }
+			 if (pbound != NULL) {
+				 if (strncmp ((char*)(data+i), boundary, strlen(boundary))==0)
+				 {
+					 ContentOffset = i;
+					 /* parse packet for "\r\n\r\n" field */
+					 for (int32_t j= 0; j < len; j++) {
+						 if (strncmp ((char*)(data+i+j), "\r\n\r\n", 4)==0)
+						 {
+							DataOffset = i + j + 4;
+							break;
+						  }
+					 }
+				 }
+			 }
+		  }
+		  /* case of MSIE8 : we do not receive data in the POST packet*/
+		  if (DataOffset == 0)
+		  {
+			 DataFlag++;
+			 BrowserFlag = 1;
+			 pbuf_free(p);
+			 return ERR_OK;
+
+		  }
+		  /* case of Mozilla Firefox v3.6 : we receive data in the POST packet*/
+		  else
+		  {
+			TotalReceived = len - ContentOffset;
+		  }
+		}
         
         
-        if (((DataFlag ==1)&&(BrowserFlag==1)) || ((DataFlag ==0)&&(BrowserFlag==0)))
-        { 
-           if ((DataFlag ==0)&&(BrowserFlag==0)) 
-           {
-             DataFlag++;
-           }
-           else if ((DataFlag ==1)&&(BrowserFlag==1))
-           {
-             /* parse packet for the octet-stream field */
-             for (i = 0; i < len; i++)
-             {
-               if (strncmp ((char*)(data+i), octet_stream, 13)==0)
-               {
-                 DataOffset = i+16;
-                 break;
-               }
-             }
-             TotalReceived += len;
-             DataFlag++;
-           }  
+		if (((DataFlag ==1)&&(BrowserFlag==1)) || ((DataFlag ==0)&&(BrowserFlag==0)))
+		{
+		   if ((DataFlag ==0)&&(BrowserFlag==0))
+		   {
+			 DataFlag++;
+		   }
+		   else if ((DataFlag ==1)&&(BrowserFlag==1))
+		   {
+			 /* parse packet for the octet-stream field */
+			 for (i = 0; i < len; i++)
+			 {
+				 if (pbound != NULL) {
+					  if (strncmp ((char*)(data+i), boundary, strlen(boundary))==0)
+					  {
+						  /* parse packet for "\r\n\r\n" field */
+						  for (int32_t j= 0; j < len; j++) {
+							  if (strncmp ((char*)(data+i+j), "\r\n\r\n", 4)==0)
+							  {
+								 DataOffset = i + j + 4;
+								 break;
+							  }
+						  }
+					  }
+				  }
+			 }
+			 TotalReceived += len;
+			 DataFlag++;
+		   }
                 
                 
            /* parse packet for the filename field */
            /* parse packet for the filename field */
            FilenameOffset = 0;
            FilenameOffset = 0;
@@ -358,7 +392,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
            i = 0;
            i = 0;
            if (FilenameOffset)
            if (FilenameOffset)
            {
            {
-             while((*(data+FilenameOffset + i)!=0x22 )&&(i<13))
+        	   while((*(data+FilenameOffset + i)!=0x22 )&&(i<FILENAME_MAX_LEN))
              {
              {
                filename[i] = *(data+FilenameOffset + i);
                filename[i] = *(data+FilenameOffset + i);
                i++;
                i++;
@@ -673,6 +707,39 @@ static uint32_t Parse_Content_Length(char *data, uint32_t len)
   return size;
   return size;
 }
 }
 
 
+char* Parce_Boundary(const char* data, uint32_t len, char* dst, uint8_t dstlen) {
+    char *ptr = NULL;
+    char *boundary = NULL;
+    uint8_t i = 0;
+
+    for (uint32_t j = 0; j < len; j++) {
+        if (strncmp ((char*)(data + j), "boundary=", 9) == 0) {
+            boundary = (char*)data + j + 9;
+            break;
+        }
+    }
+
+    if (!boundary) return NULL;
+
+    *dst++ = '-';
+    *dst++ = '-';
+
+    ptr = boundary;
+    while ((*ptr != 0x0d) && (i < dstlen - 4))
+    {
+        *dst++ = *ptr++;
+        i++;
+    }
+    //*dst++ = '-';
+    //*dst++ = '-';
+    *dst = '\0';
+
+    if (i > 0)
+        return boundary;
+    else
+        return NULL;
+}
+
 /**
 /**
   * @brief  writes received data in flash    
   * @brief  writes received data in flash    
   * @param  ptr: data pointer
   * @param  ptr: data pointer