Jelajahi Sumber

fix post/info.cgi

balbekova 7 tahun lalu
induk
melakukan
37a2c664e9
1 mengubah file dengan 116 tambahan dan 18 penghapusan
  1. 116 18
      modules/HTTP_Server/http_server.c

+ 116 - 18
modules/HTTP_Server/http_server.c

@@ -87,6 +87,7 @@ bool Authenticated = false;
 uint8_t seclevel = 0xFF;
 
 static volatile uint32_t DataFlag2=0;
+static volatile uint32_t DataFlag=0;
 static volatile uint32_t size =0;
 static uint32_t TotalReceived=0;
 static volatile uint32_t TotalData=0;
@@ -187,7 +188,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 	   /* Id of currently logged-in user */
 	   uint8_t user_id;
 
-	   if(DataFlag2 == 0){
+	   if( DataFlag == 0 && DataFlag2 == 0 ){
 	   /* Level of currently logged-in user */
 	   seclevel = 0xFF;
 	   for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
@@ -201,7 +202,9 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		   seclevel = 0xFF;
 	   }
 	   }
-	   if(DataFlag2 >= 1)
+	   if (DataFlag >= 1)
+		 Authenticated = true;
+	   else if(DataFlag2 >= 1)
 	      Authenticated = true;
 
 	   if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
@@ -592,6 +595,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 				 HTTP_SetSettings(sendBuf, strlen(&sendBuf));
 
 				 DataFlag2=0;
+				 BrowserFlag = 0;
 				 memset(sendBuf, 0, size);
 
 				 strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
@@ -638,22 +642,116 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 			  tcp_sent(pcb, http_sent);
 			}*/
 	  }
-	  else if (strncmp(data, "POST /info.cgi", 14) == 0)
+	  else if (strncmp(data, "POST /info.cgi", 14) == 0 || (DataFlag >= 1))
 	  {
-		  //strncat(&receiveBuf,  " ", 1);
-          strncat(receiveBuf,  " ", 1);
-		  HTTP_SetInfo(receiveBuf, receivedBufLen);
-		  memset(sendBuf, 0, SEND_BUF_MAX_LEN);
+		  if (seclevel == 0) {
+			DataOffset = 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=/info.html\"/></head></html>\r\n\r\n");
+			/* POST Packet received */
+			if (DataFlag == 0)
+			{
+			  BrowserFlag = 0;
+			  TotalReceived = 0;
+			  memset(sendBuf, 0, strlen(sendBuf));
+
+			  /* 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 < receivedBufLen; i++)
+			  {
+				  if (strncmp ((char*)(data+i), "owner", 5)==0)
+				 {
+				   DataOffset = i;
+				   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 = receivedBufLen - (ContentLengthOffset + 4);
+				TotalReceived = receivedBufLen - DataOffset;
+			  }
+			}
+			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 < receivedBufLen; i++)
+				 {
+					 if (strncmp ((char*)(data+i), "owner", 5)==0)
+					 {
+					   DataOffset = i;
+					   break;
+					 }
+				 }
+				 TotalReceived += receivedBufLen;
+				 DataFlag++;
+			   }
+			   TotalData =0 ;
+			 }
+			 /* DataFlag >1 => the packet is data only  */
+			 else
+			 {
+			   TotalReceived +=receivedBufLen;
+			 }
+
+			 ptr = (char*)(data + DataOffset);
+			 receivedBufLen-= DataOffset;
+
+			 /* update Total data received counter */
+			 TotalData +=receivedBufLen;
+
+			 /* check if last data packet */
+			 if (TotalReceived == size)
+			 {
+
+				 strncat(&sendBuf,  ptr, receivedBufLen);
+				 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");
+
+				  sendBufLoadLen = strlen(sendBuf);
+				  hs->file = sendBuf;
+				  hs->left = sendBufLoadLen;
+					send_data(pcb, hs);
+
+				   /* Tell TCP that we wish be to informed of data that has been
+					  successfully sent by a call to the http_sent() function. */
+				   tcp_sent(pcb, http_sent);
+			}
+			 /* not last data packet */
+			 else
+			 {
+			   /* write data in flash */
+			   if(receivedBufLen)
+			   {
+
+				 strncat(&sendBuf,  ptr, receivedBufLen);
+				 //memcpy(receiveBufTemp, ptr, receivedBufLen);
+			   }
+			 }
+		  }
 
-		  sendBufLoadLen = strlen(sendBuf);
-		  hs->file = sendBuf;
-		  hs->left = sendBufLoadLen;
-		  send_data(pcb, hs);
-		  tcp_sent(pcb, http_sent);
 	  }
 	  else if (strncmp(data, "GET /history.cgi", 16) == 0)
 		{
@@ -698,7 +796,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 	  }
 	}
 	  /* Тест  АКБ ИБП */
-	  else if (strncmp(data, "POST /bat_test.cgi", 18) == 0)
+	  else if (strncmp(data, "GET /bat_test.cgi", 18) == 0)
 	  {
 		HTTP_UPSTest(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
 
@@ -708,7 +806,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		tcp_sent(pcb, http_sent);
 	  }
 	  /* Выключение ИБП */
-	  else if (strncmp(data, "POST /ups_power.cgi", 19) == 0)
+	  else if (strncmp(data, "GET /ups_power.cgi", 19) == 0)
 	  {
 		HTTP_UPSshutdown(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
 
@@ -757,7 +855,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		tcp_sent(pcb, http_sent);
 	  }
 	  /* Смена пароля пользователя */
-	  else if (strncmp(data, "POST /changepwd.cgi", 19) == 0)
+	  else if (strncmp(data, "GET /changepwd.cgi", 19) == 0)
 	  {
 		  HTTP_ChangeUserPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);