23
23
*
24
24
*/
25
25
26
+
26
27
#include " ESP8266httpUpdate.h"
27
28
28
- ESP8266HTTPUpdate::ESP8266HTTPUpdate (void ) {
29
29
30
+ ESP8266HTTPUpdate::ESP8266HTTPUpdate (void ) {
30
31
}
31
32
32
33
ESP8266HTTPUpdate::~ESP8266HTTPUpdate (void ) {
34
+ }
33
35
36
+ /* *
37
+ *
38
+ * @param url const char *
39
+ * @param current_version const char *
40
+ * @param httpsFingerprint const char *
41
+ * @return t_httpUpdate_return
42
+ */
43
+ t_httpUpdate_return ESP8266HTTPUpdate::update(const char * url, const char * current_version, const char * httpsFingerprint) {
44
+ httpClient http;
45
+ http.begin (url, httpsFingerprint);
46
+ return handleUpdate (&http, current_version);
34
47
}
35
48
36
- t_httpUpdate_return ESP8266HTTPUpdate::update(const char * host, uint16_t port, const char * url, const char * current_version) {
37
- WiFiClient tcp;
38
- DEBUG_HTTP_UPDATE (" [httpUpdate] connected to %s:%u %s .... " , host, port, url);
49
+ /* *
50
+ *
51
+ * @param host const char *
52
+ * @param port uint16_t
53
+ * @param url const char *
54
+ * @param current_version const char *
55
+ * @param httpsFingerprint const char *
56
+ * @return
57
+ */
58
+ t_httpUpdate_return ESP8266HTTPUpdate::update(const char * host, uint16_t port, const char * url, const char * current_version, bool https, const char * httpsFingerprint) {
59
+ httpClient http;
60
+ http.begin (host, port, url, https, httpsFingerprint);
61
+ return handleUpdate (&http, current_version);
62
+ }
39
63
40
- if (!tcp.connect (host, port)) {
41
- DEBUG_HTTP_UPDATE (" failed.\n " );
42
- return HTTP_UPDATE_FAILED;
43
- }
44
- DEBUG_HTTP_UPDATE (" ok.\n " );
45
- return update (tcp, host, url, current_version);
64
+ t_httpUpdate_return ESP8266HTTPUpdate::update(String host, uint16_t port, String url, String current_version, bool https, String httpsFingerprint) {
65
+ httpClient http;
66
+ http.begin (host, port, url, https, httpsFingerprint);
67
+ return handleUpdate (&http, current_version.c_str ());
46
68
}
47
69
48
- t_httpUpdate_return ESP8266HTTPUpdate::update(WiFiClient& tcp, const char * host, const char * url, const char * current_version) {
70
+ /* *
71
+ *
72
+ * @param http httpClient *
73
+ * @param current_version const char *
74
+ * @return t_httpUpdate_return
75
+ */
76
+ t_httpUpdate_return ESP8266HTTPUpdate::handleUpdate(httpClient * http, const char * current_version) {
77
+
49
78
t_httpUpdate_return ret = HTTP_UPDATE_FAILED;
50
- // set Timeout for readBytesUntil and readStringUntil
51
- tcp.setTimeout (2000 );
52
- tcp.setNoDelay (true );
53
-
54
- String req = " GET " ;
55
-
56
- req += url;
57
- req += " HTTP/1.1\r\n "
58
- " Host: " ;
59
- req += host;
60
- req += " \r\n "
61
- " Connection: close\r\n "
62
- " User-Agent: ESP8266-http-Update\r\n "
63
- " x-ESP8266-STA-MAC: " ;
64
- req += WiFi.macAddress ();
65
- req += " \r\n "
66
- " x-ESP8266-AP-MAC: " ;
67
- req += WiFi.softAPmacAddress ();
68
- req += " \r\n "
69
- " x-ESP8266-free-space: " ;
70
- req += ESP.getFreeSketchSpace ();
71
- req += " \r\n "
72
- " x-ESP8266-sketch-size: " ;
73
- req += ESP.getSketchSize ();
74
- req += " \r\n "
75
- " x-ESP8266-chip-size: " ;
76
- req += ESP.getFlashChipRealSize ();
77
- req += " \r\n "
78
- " x-ESP8266-sdk-version: " ;
79
- req += ESP.getSdkVersion ();
80
-
81
- if (current_version[0 ] != 0x00 ) {
82
- req += " \r\n "
83
- " x-ESP8266-version: " ;
84
- req += current_version;
85
- }
86
79
87
- req += " \r\n "
88
- " \r\n " ;
80
+ http->setUserAgent (" ESP8266-http-Update" );
81
+ http->addHeader (" x-ESP8266-STA-MAC" , WiFi.macAddress ());
82
+ http->addHeader (" x-ESP8266-AP-MAC" , WiFi.softAPmacAddress ());
83
+ http->addHeader (" x-ESP8266-free-space" , String (ESP.getFreeSketchSpace ()));
84
+ http->addHeader (" x-ESP8266-sketch-size" , String (ESP.getSketchSize ()));
85
+ http->addHeader (" x-ESP8266-chip-size" , String (ESP.getFlashChipRealSize ()));
86
+ http->addHeader (" x-ESP8266-sdk-version" , ESP.getSdkVersion ());
89
87
90
- tcp.write (req.c_str (), req.length ());
88
+ if (current_version && current_version[0 ] != 0x00 ) {
89
+ http->addHeader (" x-ESP8266-version" , current_version);
90
+ }
91
91
92
- uint32_t code = 0 ;
93
- size_t len = 0 ;
92
+ const char * headerkeys[] = { " x-MD5 " } ;
93
+ size_t headerkeyssize = sizeof (headerkeys) / sizeof ( char *) ;
94
94
95
- while (true ) {
96
- String headerLine = tcp.readStringUntil (' \n ' );
97
- headerLine.trim (); // remove \r
95
+ // track these headers
96
+ http->collectHeaders (headerkeys, headerkeyssize);
98
97
99
- if (headerLine.length () > 0 ) {
100
- DEBUG_HTTP_UPDATE (" [httpUpdate][Header] RX: %s\n " , headerLine.c_str ());
101
- if (headerLine.startsWith (" HTTP/1." )) {
102
- // 9 = lenght of "HTTP/1.x "
103
- code = headerLine.substring (9 , headerLine.indexOf (' ' , 9 )).toInt ();
104
- } else if (headerLine.startsWith (" Content-Length: " )) {
105
- // 16 = lenght of "Content-Length: "
106
- len = headerLine.substring (16 ).toInt ();
107
- }
108
- } else {
109
- break ;
110
- }
111
- }
98
+
99
+ int code = http->GET ();
100
+ int len = http->getSize ();
112
101
113
102
DEBUG_HTTP_UPDATE (" [httpUpdate] Header read fin.\n " );
114
103
DEBUG_HTTP_UPDATE (" [httpUpdate] Server header:\n " );
115
104
DEBUG_HTTP_UPDATE (" [httpUpdate] - code: %d\n " , code);
116
105
DEBUG_HTTP_UPDATE (" [httpUpdate] - len: %d\n " , len);
117
106
107
+ if (http->hasHeader (" x-MD5" )) {
108
+ DEBUG_HTTP_UPDATE (" [httpUpdate] - MD5: %s\n " , http->header (" x-MD5" ).c_str ());
109
+ }
110
+
118
111
DEBUG_HTTP_UPDATE (" [httpUpdate] ESP8266 info:\n " );
119
112
DEBUG_HTTP_UPDATE (" [httpUpdate] - free Space: %d\n " , ESP.getFreeSketchSpace ());
120
113
DEBUG_HTTP_UPDATE (" [httpUpdate] - current Sketch Size: %d\n " , ESP.getSketchSize ());
121
114
122
- if (current_version[0 ] != 0x00 ) {
123
- DEBUG_HTTP_UPDATE (" [httpUpdate] - current version: %s\n " , current_version);
124
- }
125
-
126
115
switch (code) {
127
116
case 200 : // /< OK (Start Update)
128
117
if (len > 0 ) {
@@ -131,15 +120,17 @@ t_httpUpdate_return ESP8266HTTPUpdate::update(WiFiClient& tcp, const char* host,
131
120
DEBUG_HTTP_UPDATE (" [httpUpdate] FreeSketchSpace to low (%d) needed: %d\n " , ESP.getFreeSketchSpace (), len);
132
121
} else {
133
122
123
+ WiFiClient * tcp = http->getStreamPtr ();
124
+
134
125
WiFiUDP::stopAll ();
135
- WiFiClient::stopAllExcept (& tcp);
126
+ WiFiClient::stopAllExcept (tcp);
136
127
137
128
delay (100 );
138
129
139
- if (ESP. updateSketch ( tcp, len, false , false )) {
130
+ if (runUpdate (* tcp, len, http-> header ( " x-MD5 " ) )) {
140
131
ret = HTTP_UPDATE_OK;
141
132
DEBUG_HTTP_UPDATE (" [httpUpdate] Update ok\n " );
142
- tcp. stop ();
133
+ http-> end ();
143
134
ESP.restart ();
144
135
} else {
145
136
ret = HTTP_UPDATE_FAILED;
@@ -148,7 +139,7 @@ t_httpUpdate_return ESP8266HTTPUpdate::update(WiFiClient& tcp, const char* host,
148
139
}
149
140
} else {
150
141
ret = HTTP_UPDATE_FAILED;
151
- DEBUG_HTTP_UPDATE (" [httpUpdate] Content-Length is 0?!\n " );
142
+ DEBUG_HTTP_UPDATE (" [httpUpdate] Content-Length is 0 or net set by Server ?!\n " );
152
143
}
153
144
break ;
154
145
case 304 :
@@ -164,11 +155,42 @@ t_httpUpdate_return ESP8266HTTPUpdate::update(WiFiClient& tcp, const char* host,
164
155
break ;
165
156
}
166
157
158
+ http->end ();
159
+
167
160
return ret;
168
161
}
169
162
170
- t_httpUpdate_return ESP8266HTTPUpdate::update(String host, uint16_t port, String url, String current_version) {
171
- return update (host.c_str (), port, url.c_str (), current_version.c_str ());
163
+ /* *
164
+ * write Update to flash
165
+ * @param in Stream&
166
+ * @param size uint32_t
167
+ * @param md5 String
168
+ * @return true if Update ok
169
+ */
170
+ bool ESP8266HTTPUpdate::runUpdate (Stream& in, uint32_t size, String md5) {
171
+
172
+ if (!Update.begin (size)) {
173
+ DEBUG_HTTP_UPDATE (" [httpUpdate] Update.begin failed!\n " );
174
+ return false ;
175
+ }
176
+
177
+ if (md5.length ()) {
178
+ Update.setMD5 (md5.c_str ());
179
+ }
180
+
181
+ if (Update.writeStream (in) != size) {
182
+ DEBUG_HTTP_UPDATE (" [httpUpdate] Update.writeStream failed!\n " );
183
+ return false ;
184
+ }
185
+
186
+ if (!Update.end ()) {
187
+ DEBUG_HTTP_UPDATE (" [httpUpdate] Update.end failed!\n " );
188
+ return false ;
189
+ }
190
+
191
+ return true ;
172
192
}
173
193
194
+
195
+
174
196
ESP8266HTTPUpdate ESPhttpUpdate;
0 commit comments