25
25
#define SECURITY_PROFILE_PREFIX_LENGTH 11
26
26
#define HTTPS_SECURITY_PROFILE_NUMBER ' 3'
27
27
28
- #define HTTP_SEND " AT+SQNHTTPSND=0,%u,\" %s\" ,%lu,\"\" ,\" %s\" "
28
+ #define HTTP_SEND " AT+SQNHTTPSND=0,%u,\" %s\" ,%lu,\" %s \" ,\" %s\" "
29
29
#define HTTP_RECEIVE " AT+SQNHTTPRCV=0,%lu"
30
30
#define HTTP_QUERY " AT+SQNHTTPQRY=0,%u,\" %s\" ,\" %s\" "
31
31
37
37
#define HTTP_HEAD_METHOD 1
38
38
#define HTTP_DELETE_METHOD 2
39
39
40
+ // Content type specifiers for POST requests for the AT+SQNHTTPSND command
41
+ #define HTTP_CONTENT_TYPE_APPLICATION_X_WWW_FORM_URLENCODED " 0"
42
+ #define HTTP_CONTENT_TYPE_TEXT_PLAIN " 1"
43
+ #define HTTP_CONTENT_TYPE_APPLICATION_OCTET_STREAM " 2"
44
+ #define HTTP_CONTENT_TYPE_APPLICATION_MULTIPART_FORM_DATA " 3"
45
+ #define HTTP_CONTENT_TYPE_APPLICATION_APPLICATION_JSON " 4"
46
+
40
47
#define HTTP_RECEIVE_LENGTH 32
41
48
#define HTTP_RECEIVE_START_CHARACTER ' <'
42
49
#define HTTP_SEND_START_CHARACTER ' >'
@@ -74,7 +81,12 @@ static HttpResponse sendData(const char* endpoint,
74
81
const uint32_t data_length,
75
82
const uint8_t method,
76
83
const uint8_t * header = NULL ,
77
- const uint32_t header_length = 0 ) {
84
+ const uint32_t header_length = 0 ,
85
+ const char * content_type = " " ) {
86
+
87
+ // The modem could hang if several HTTP requests are done quickly after each
88
+ // other, this alleviates this
89
+ SequansController.writeCommand (" AT" );
78
90
79
91
HttpResponse http_response = {0 , 0 };
80
92
@@ -94,6 +106,7 @@ static HttpResponse sendData(const char* endpoint,
94
106
method,
95
107
endpoint,
96
108
(unsigned long )data_length,
109
+ content_type,
97
110
header == NULL ? " " : (const char *)header);
98
111
99
112
SequansController.writeBytes ((uint8_t *)command, command_length, true );
@@ -170,6 +183,10 @@ static HttpResponse queryData(const char* endpoint,
170
183
const uint8_t * header,
171
184
const uint32_t header_length) {
172
185
186
+ // The modem could hang if several HTTP requests are done quickly after each
187
+ // other, this alleviates this
188
+ SequansController.writeCommand (" AT" );
189
+
173
190
HttpResponse http_response = {0 , 0 };
174
191
175
192
// Set up and send the query
@@ -279,23 +296,64 @@ HttpResponse HttpClientClass::post(const char* endpoint,
279
296
const uint8_t * data_buffer,
280
297
const uint32_t data_length,
281
298
const uint8_t * header_buffer,
282
- const uint32_t header_length) {
299
+ const uint32_t header_length,
300
+ const ContentType content_type) {
301
+
302
+ // The content type within the Sequans modem is classified by a single
303
+ // character (+1 for NULL termination)
304
+ char content_type_buffer[2 ] = " " ;
305
+
306
+ switch (content_type) {
307
+ case CONTENT_TYPE_APPLICATION_X_WWW_FORM_URLENCODED:
308
+ strncpy (content_type_buffer,
309
+ HTTP_CONTENT_TYPE_APPLICATION_X_WWW_FORM_URLENCODED,
310
+ sizeof (content_type_buffer));
311
+ break ;
312
+
313
+ case CONTENT_TYPE_APPLICATION_OCTET_STREAM:
314
+ strncpy (content_type_buffer,
315
+ HTTP_CONTENT_TYPE_APPLICATION_OCTET_STREAM,
316
+ sizeof (content_type_buffer));
317
+ break ;
318
+
319
+ case CONTENT_TYPE_MULTIPART_FORM_DATA:
320
+ strncpy (content_type_buffer,
321
+ HTTP_CONTENT_TYPE_APPLICATION_MULTIPART_FORM_DATA,
322
+ sizeof (content_type_buffer));
323
+ break ;
324
+
325
+ case CONTENT_TYPE_APPLICATION_JSON:
326
+ strncpy (content_type_buffer,
327
+ HTTP_CONTENT_TYPE_APPLICATION_APPLICATION_JSON,
328
+ sizeof (content_type_buffer));
329
+ break ;
330
+
331
+ default :
332
+ strncpy (content_type_buffer,
333
+ HTTP_CONTENT_TYPE_TEXT_PLAIN,
334
+ sizeof (content_type_buffer));
335
+ break ;
336
+ }
337
+
283
338
return sendData (endpoint,
284
339
data_buffer,
285
340
data_length,
286
341
HTTP_POST_METHOD,
287
342
header_buffer,
288
- header_length);
343
+ header_length,
344
+ content_type_buffer);
289
345
}
290
346
291
347
HttpResponse HttpClientClass::post (const char * endpoint,
292
348
const char * data,
293
- const char * header) {
349
+ const char * header,
350
+ const ContentType content_type) {
294
351
return post (endpoint,
295
352
(uint8_t *)data,
296
353
strlen (data),
297
354
(uint8_t *)header,
298
- strlen (header));
355
+ header == NULL ? 0 : strlen (header),
356
+ content_type);
299
357
}
300
358
301
359
HttpResponse HttpClientClass::put (const char * endpoint,
@@ -318,7 +376,7 @@ HttpResponse HttpClientClass::put(const char* endpoint,
318
376
(uint8_t *)message,
319
377
strlen (message),
320
378
(uint8_t *)header,
321
- strlen (header));
379
+ header == NULL ? 0 : strlen (header));
322
380
}
323
381
324
382
HttpResponse HttpClientClass::get (const char * endpoint, const char * header) {
0 commit comments