Ver Fonte

BT6706: fix load log from web and rewrite post request

balbekova há 7 anos atrás
pai
commit
589495043a
1 ficheiros alterados com 235 adições e 205 exclusões
  1. 235 205
      modules/HTTP_Server/http_server.c

+ 235 - 205
modules/HTTP_Server/http_server.c

@@ -179,72 +179,160 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		  /* Cut received string */
 		  receiveBuf[receivedBufLen] = '\0';
 		  if (strncmp(data, "GET /setProdate.cgi", 19) == 0 && strncmp(sSettings.sFlags.testState, "T2OK", 4))
-		  		  {
-		  	        HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
-
-		  			hs->file = sendBuf;
-		  	        hs->left = sendBufLoadLen;
-		  			send_data(pcb, hs);
-		  			tcp_sent(pcb, http_sent);
-		  		  }
-		  else{
-		  Cockie();
-		  getAuthenticatedState();
-
-		  if (!Authenticated)
 		  {
-			  hs->file = AuthenticatedFalseRoutine(&sendBufLoadLen);
-			  hs->left = sendBufLoadLen;
-			  send_data(pcb, hs);
-			  tcp_sent(pcb, http_sent);
+			HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
+
+			hs->file = sendBuf;
+			hs->left = sendBufLoadLen;
+			send_data(pcb, hs);
+			tcp_sent(pcb, http_sent);
 		  }
-		  else
-		  {
-			  HTTPTypeAnswer = COMMON_ANSWER;
-			  hs->file = AuthenticatedTrueRoutine(&sendBufLoadLen);
-			  hs->left = sendBufLoadLen;
-			  send_data(pcb, hs);
-			  tcp_sent(pcb, http_sent);
-			  switch(HTTPTypeAnswer){
-			  case HISTORY_ANSWER:
-				  while(sendBufLoadLen != 0){
-					 hs->file = HTTP_SendHistory(&sendBufLoadLen);
-					  hs->left = sendBufLoadLen;
-					  if(sendBufLoadLen == 0){
-						  close_conn(pcb,hs);
-						  break;
-					  }
+		  else{
+			  Cockie();
+			  if( DataFlag == 0 && DataFlag2 == 0 ){
+				  getAuthenticatedState();
+			  }
+			  if (DataFlag >= 1)
+				 Authenticated = true;
+			  else if(DataFlag2 >= 1)
+				 Authenticated = true;
+
+			  if (!Authenticated)
+			  {
+				  hs->file = AuthenticatedFalseRoutine(&sendBufLoadLen);
+				  hs->left = sendBufLoadLen;
+				  send_data(pcb, hs);
+				  tcp_sent(pcb, http_sent);
+			  }
+			  else
+			  {
+				  HTTPTypeAnswer = COMMON_ANSWER;
+				  hs->file = AuthenticatedTrueRoutine(&sendBufLoadLen);
+				  hs->left = sendBufLoadLen;
+				  if(hs->file != 0){
 					  send_data(pcb, hs);
-					  tcp_sent(pcb, http_sent);
-				  }
-				  break;
-			  case UPS_HISTORY_ANSWER:
-				  while(sendBufLoadLen != 0){
-					  hs->file = HTTP_SendLog(&sendBufLoadLen);
-					  hs->left = sendBufLoadLen;
-					  if(sendBufLoadLen == 0){
-						  close_conn(pcb,hs);
+					  switch(HTTPTypeAnswer){
+					  case HISTORY_ANSWER:
+						  tcp_sent(pcb, http_sent_history);
+						  break;
+					  case UPS_HISTORY_ANSWER:
+						  tcp_sent(pcb, http_sent_log);
+						  break;
+					  default:
+						  tcp_sent(pcb, http_sent);
 						  break;
 					  }
-					  send_data(pcb, hs);
-					  tcp_sent(pcb, http_sent);
 				  }
-			  	  break;
 			  }
 		  }
-		  }
 
 		}
 	    pbuf_free(p);
-	    close_conn(pcb,hs);
-	  }
-	  if (err == ERR_OK && p == NULL)
-	  {
-	    close_conn(pcb, hs);
 	  }
 	  return ERR_OK;
 }
 
+/**
+  * @brief Sent callback for log file transfer (messages as is, not ordered)
+  */
+static err_t http_sent_history(void *arg, struct tcp_pcb *pcb, u16_t len)
+{
+  struct http_state *hs;
+  uint32_t nbytes = 0;
+  static bool start = true;
+  (void)len;
+
+  hs = arg;
+
+  if (hs->left > 0)
+  {
+    send_data(pcb, hs);
+  }
+  else
+  {
+	  memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
+      if (log_ptr + FILE_BUF_MAX_LEN <= log_size) {
+          nbytes = History_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN, start);
+      }
+      else if (log_ptr < log_size) {
+          nbytes = History_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
+      }
+      else {
+          nbytes = 0;
+      }
+      log_ptr += nbytes;
+
+      start = false;
+      if (nbytes == 0) {
+          /* File transfer finished. */
+          start = true;
+          close_conn(pcb, hs);
+
+          /* Clear file transfer in progress flag */
+          fLogTransInprog = false;
+
+          return ERR_OK;
+      }
+
+      hs->file = logFileBuf;
+      hs->left = nbytes;
+      send_data(pcb, hs);
+      tcp_sent(pcb, http_sent_history);
+
+  }
+  return ERR_OK;
+}
+
+/**
+  * @brief Sent callback for log file transfer (messages as is, not ordered)
+  */
+static err_t http_sent_log(void *arg, struct tcp_pcb *pcb, u16_t len)
+{
+  struct http_state *hs;
+  uint32_t nbytes = 0;
+  static bool start = true;
+  (void)len;
+
+  hs = arg;
+
+  if (hs->left > 0)
+  {
+    send_data(pcb, hs);
+  }
+  else
+  {
+	  memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
+      if (log_ptr + FILE_BUF_MAX_LEN_LOG <= log_size) {
+          nbytes = LOG_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN_LOG, start);
+      }
+      else if (log_ptr < log_size) {
+          nbytes = LOG_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
+      }
+      else {
+          nbytes = 0;
+      }
+      log_ptr += nbytes;
+
+      start = false;
+      if (nbytes == 0) {
+          /* File transfer finished. */
+          start = true;
+          close_conn(pcb, hs);
+
+          /* Clear file transfer in progress flag */
+          fLogTransInprog = false;
+
+          return ERR_OK;
+      }
+
+      hs->file = logFileBuf;
+      hs->left = nbytes;
+      send_data(pcb, hs);
+      tcp_sent(pcb, http_sent_log);
+
+  }
+  return ERR_OK;
+}
 
 /**
   * @brief Error callback for log file transfer
@@ -290,7 +378,7 @@ static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
   }
   else
   {
-    close_conn(pcb, hs);      
+    close_conn(pcb, hs);
   }
   return ERR_OK;
 }
@@ -1543,7 +1631,6 @@ char* AuthenticatedFalseRoutine(uint16_t* sendLen)
 char* AuthenticatedTrueRoutine(uint16_t* sendLen)
 {
     char *DataOffset;
-    char *ptr;
     
  if (strncmp(receiveBuf, "GET /getJson.cgi", 16) == 0) // +
     {
@@ -1568,41 +1655,53 @@ char* AuthenticatedTrueRoutine(uint16_t* sendLen)
         {
             DataOffset = 0;
             // POST Packet received 
-            TotalReceived = 0;
-            TotalData = 0;
-            memset(sendBuf, 0, strlen(sendBuf));
-
-            // parse packet for Content-length field
-            size = Parse_Content_Length(receiveBuf, receivedBufLen);
-            DataOffset = strstr(receiveBuf, "managerIP");
-
-            /* case of MSIE8 : we do not receive data in the POST packet*/
-            if (DataOffset == 0)
+            if (DataFlag2 == 0)
             {
-                //ssl_server_read();
-        //        SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
-                DataOffset = strstr(receiveBuf, "managerIP");
-            }           
-
-            TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
-            TotalData += TotalReceived;
-            strncat(sendBuf,  DataOffset, TotalReceived);
-
-            for (int i = TotalData; i < size; i ++)
-            {
-                //ssl_server_read();
-             //   SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
-                strncat(sendBuf,  receiveBuf, receivedBufLen);
-                TotalData += receivedBufLen;
+				TotalReceived = 0;
+				memset(sendBuf, 0, strlen(sendBuf));
+				// parse packet for Content-length field
+				size = Parse_Content_Length(receiveBuf, receivedBufLen);
+				DataOffset = strstr(receiveBuf, "managerIP");
+
+				// case of MSIE8 : we do not receive data in the POST packet
+				if (DataOffset == 0)
+				{
+					 DataFlag2++;
+					return 0;
+				}
+				else{
+					TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
+					strncat(sendBuf,  DataOffset, TotalReceived);
+				}
             }
+
+            if (DataFlag2 == 0)
+			{
+			 DataFlag2++;
+			}
+			else if (DataFlag2 == 1)
+			{
+			 /* parse packet for the octet-stream field */
+			   DataOffset = strstr(receiveBuf, "managerIP");
+			   TotalReceived += receivedBufLen;
+			   strncat(sendBuf,  DataOffset, TotalReceived);
+			   DataFlag2++;
+			}
+			 /* DataFlag >1 => the packet is data only  */
+			 else
+			 {
+			   TotalReceived +=receivedBufLen;
+			   strncat(sendBuf,  receiveBuf, receivedBufLen);
+			 }
             // check if last data packet 
-            if (TotalData == size)
+            if (TotalReceived == size)
             {
                 DBG printf("State: Received %d bytes\r\n", (int)TotalData);
                 //  printf("receive %s \r\n", sendBuf);
                 strncat(sendBuf,  " ", 1);
                 HTTP_SetSettings(sendBuf, strlen(sendBuf));
                 memset(sendBuf, 0, size);
+                DataFlag2 = 0;
                 strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
                 strcat(sendBuf, "\r\n\r\n");
                 strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/settings.html\"/></head></html>\r\n\r\n");
@@ -1610,9 +1709,9 @@ char* AuthenticatedTrueRoutine(uint16_t* sendLen)
                 *sendLen = sendBufLoadLen;
                 return sendBuf;
             }
-        }  
+        }
         return 0;
-    } 
+    }
     else if (strncmp(receiveBuf, "GET /info.cgi", 13) == 0) // +
     {
         if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, sendLen) == SEND_REQUIRED_YES)
@@ -1622,55 +1721,62 @@ char* AuthenticatedTrueRoutine(uint16_t* sendLen)
     }
     else if (strncmp(receiveBuf, "POST /info.cgi", 14) == 0)
     {
-        if (seclevel == 0) 
-        {
-            DataOffset = 0;
-            // POST Packet received
-            TotalReceived = 0;
-            TotalData = 0;
-            memset(sendBuf, 0, strlen(sendBuf));
-            // parse packet for Content-length field
-            size = Parse_Content_Length(receiveBuf, receivedBufLen);
-            DataOffset = strstr(receiveBuf, "owner");
-
-            // case of MSIE8 : we do not receive data in the POST packet
-            if (DataOffset == 0)
-            {
-               // SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
-                DataOffset = strstr(receiveBuf, "owner");
-            }
+		DataOffset = 0;
+		// POST Packet received
+		if (DataFlag == 0)
+		{
+			TotalReceived = 0;
+			memset(sendBuf, 0, strlen(sendBuf));
+			// parse packet for Content-length field
+			size = Parse_Content_Length(receiveBuf, receivedBufLen);
+			DataOffset = strstr(receiveBuf, "owner");
+
+			// case of MSIE8 : we do not receive data in the POST packet
+			if (DataOffset == 0)
+			{
+				 DataFlag++;
+				return 0;
+			}
+			else{
+				TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
+				strncat(sendBuf,  DataOffset, TotalReceived);
+			}
+		}
 
-            TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
-            TotalData += TotalReceived;
-            strncat(sendBuf,  DataOffset, TotalReceived);
+		if (DataFlag == 0)
+		{
+		 DataFlag++;
+		}
+		else if (DataFlag == 1)
+		{
+		 /* parse packet for the octet-stream field */
+		   DataOffset = strstr(receiveBuf, "owner");
+		   TotalReceived += receivedBufLen;
+		   strncat(sendBuf,  DataOffset, TotalReceived);
+		   DataFlag++;
+		}
+		 /* DataFlag >1 => the packet is data only  */
+		 else
+		 {
+		   TotalReceived +=receivedBufLen;
+		   strncat(sendBuf,  receiveBuf, receivedBufLen);
+		 }
+
+		// check if last data packet
+		if (TotalReceived == size)
+		{
+			strncat(sendBuf,  " ", 1);
+			HTTP_SetInfo(sendBuf, strlen(sendBuf));
+			DataFlag = 0;
+			memset(sendBuf, 0, size);
 
-            // check if last data packet 
-            if (TotalReceived == size)
-            {
-                strncat(sendBuf,  " ", 1);
-                HTTP_SetInfo(sendBuf, strlen(sendBuf));
-                DataFlag = 0;
-                BrowserFlag = 0;
-                memset(sendBuf, 0, size);
+			strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
+			strcat(sendBuf, "\r\n\r\n");
+			strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/info.html\"/></head></html>\r\n\r\n");
 
-                strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
-                strcat(sendBuf, "\r\n\r\n");
-                strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/info.html\"/></head></html>\r\n\r\n");
-                
-                *sendLen = strlen(sendBuf);
-                return sendBuf;
-            }
-            // not last data packet 
-            else
-            {
-                // write data in flash 
-                if(receivedBufLen)
-                {
-                    strncat(sendBuf,  ptr, receivedBufLen);
-                    //memcpy(receiveBufTemp, ptr, receivedBufLen);
-                }
-            }
-        }
+			*sendLen = strlen(sendBuf);
+			return sendBuf;
+		}
     }
     else if (strncmp(receiveBuf, "GET /history.cgi", 16) == 0)
     {
@@ -1680,7 +1786,7 @@ char* AuthenticatedTrueRoutine(uint16_t* sendLen)
         if (res == SEND_REQUIRED_FILE)
         {
         	HTTPTypeAnswer = HISTORY_ANSWER;
-            return HTTP_SendHistory(sendLen);
+           return sendBuf;
         }
         else if (res == SEND_REQUIRED_YES) 
         {
@@ -1696,7 +1802,7 @@ char* AuthenticatedTrueRoutine(uint16_t* sendLen)
         if (res == SEND_REQUIRED_FILE)
         {
         	HTTPTypeAnswer = UPS_HISTORY_ANSWER;
-            return HTTP_SendLog(sendLen);
+        	return sendBuf;
         }
         else if (res == SEND_REQUIRED_YES) 
         {
@@ -1782,82 +1888,6 @@ char* AuthenticatedTrueRoutine(uint16_t* sendLen)
     return 0;
 }
 
-/**
-  * @brief Send callback for log file transfer (messages as is, not ordered)
-  */
-char* HTTP_SendHistory(uint16_t *Len)
-{
-	struct http_state *hs;
-    uint32_t nbytes = 0;
-    static bool start = true;
-
-    memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
-    
-    if (log_ptr + FILE_BUF_MAX_LEN <= log_size) {
-        nbytes = History_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN, start);
-    }
-    else if (log_ptr < log_size) {
-        nbytes = History_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
-    }
-    else {
-        nbytes = 0;
-    }
-    log_ptr += nbytes;
-
-    start = false;
-    
-    *Len = nbytes;
-    if (nbytes == 0) {
-        // File transfer finished. 
-        start = true;
-        // Clear file transfer in progress flag 
-        fLogTransInprog = false;
-        return 0;
-    }
-    return logFileBuf;
-  //  hs->file = logFileBuf;
-	// hs->left = nbytes;
-	// send_data(pcb, hs);
- //  SSL_SendFrames(&ssl, logFileBuf, nbytes);
-  //  HTTP_SendHistory();
-}
-
-/**
-  * @brief Sent callback for log file transfer (messages as is, not ordered)
-  */
-char* HTTP_SendLog(uint16_t *Len)
-{
-    uint32_t nbytes = 0;
-    static bool start = true;
-
-	memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
-    if (log_ptr + FILE_BUF_MAX_LEN_LOG <= log_size) {
-        nbytes = LOG_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN_LOG, start);
-    }
-    else if (log_ptr < log_size) {
-        nbytes = LOG_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
-    }
-    else {
-        nbytes = 0;
-    }
-    log_ptr += nbytes;
-
-    start = false;
-    *Len = nbytes;
-    if (nbytes == 0) {
-        // File transfer finished. 
-        start = true;
-        // Clear file transfer in progress flag 
-        fLogTransInprog = false;
-        return 0;
-    }
-
- //   SSL_SendFrames(&ssl, logFileBuf, nbytes);
-  //  HTTP_SendLog();
-  
-    return logFileBuf;
-}
-
 /**
   * @brief  sends file from flash FS
   * @param  filename: pointer to the file name to send