|
@@ -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
|