33#include "communication_config.h"
44#include "binary_download.h"
55#include "errno.h"
6+ #include "yuarel.h"
7+ #include "FreeRTOS.h"
68
79
8- static void download_error (target_instance_t * targetP , int err , int socket ) {
10+
11+ static void download_error (target_instance_t * targetP , int err , int socket , char * url_str ) {
912 targetP -> download_state = DOWNLOAD_ERROR ;
1013 targetP -> download_error = err ;
11- if (err != SOCKET_ERROR ){
14+ if (err != SOCKET_ERROR && err != ERROR_PARSING_URL ){
1215 lwip_close (socket );
1316 }
17+ lwm2m_free (url_str );
1418 vTaskDelete (NULL );
1519}
1620
1721int startDownload (target_instance_t * targetP ) {
18-
22+ struct yuarel url ;
23+ char * url_str = lwm2m_strdup (targetP -> firmware_url );
24+ if (yuarel_parse (& url , url_str ) != 0 ) {
25+ printf ("Error parsing URL\r\n" );
26+ download_error (targetP , ERROR_PARSING_URL , 0 , url_str );
27+ }
1928 int socket ;
2029 socket = lwip_socket (AF_INET , SOCK_STREAM , 0 );
2130 if (socket < 0 ) {
2231 printf ("cannot create socket: %d\r\n" , errno );
23- download_error (targetP , SOCKET_ERROR , socket );
32+ download_error (targetP , SOCKET_ERROR , socket , url_str );
33+ }
34+
35+ ip_addr_t * addr = NULL ;
36+ if (netconn_gethostbyname (url .host , & addr ) != ERR_OK ) {
37+ printf ("cannot resolve hostname\r\n" );
38+ download_error (targetP , HOST_UNKNOWN_ERROR , socket , url_str );
2439 }
2540
26- struct sockaddr_in clientAddress ;
27- clientAddress .sin_family = AF_INET ;
28- clientAddress .sin_port = htons (80 );
29- clientAddress .sin_addr .s_addr = inet_addr ( SERVER_IP ) ;
41+ struct sockaddr_in clientAddressv4 ;
42+ clientAddressv4 .sin_family = AF_INET ;
43+ clientAddressv4 .sin_port = htons (80 );
44+ clientAddressv4 .sin_addr .s_addr = addr ;
3045
31- int result = lwip_connect (socket , (struct sockaddr * ) & clientAddress , sizeof (clientAddress ));
46+ int result = lwip_connect (socket , (struct sockaddr * ) & clientAddressv4 , sizeof (struct sockaddr_in ));
3247 if (result < 0 ) {
3348 printf ("cannot connect to server, err: %d\r\n" , result );
3449 lwip_close (socket );
35- download_error (targetP ,CONNECTION_ERROR , socket );
50+ download_error (targetP ,CONNECTION_ERROR , socket , url_str );
3651 }
3752
3853 char message [200 ];
39- sprintf (message , "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n Connection: keep-alive\r\n\r\n Keep-Alive: 300\r\n" , targetP -> firmware_url , SERVER_IP );
54+ sprintf (message , "GET / %s HTTP/1.1\r\nHost: %s\r\n\r\n Connection: keep-alive\r\n\r\n Keep-Alive: 300\r\n" , url . path , url . host );
4055
4156 if ( lwip_send (socket , message , strlen (message ) , 0 ) < 0 ) {
4257 printf ("Send failed\r\n" );
43- download_error (targetP ,REQUEST_ERROR , socket );
58+ download_error (targetP ,REQUEST_ERROR , socket , url_str );
4459 }
4560
4661 int server_response_length = 300 ;
@@ -52,7 +67,7 @@ int startDownload(target_instance_t *targetP) {
5267 int received_len = lwip_recv (socket , server_reply , sizeof server_reply - 1 , 0 );
5368 if ( received_len < 0 ){
5469 printf ("recv failed\r\n" );
55- download_error (targetP ,RECEIVE_ERROR , socket );
70+ download_error (targetP ,RECEIVE_ERROR , socket , url_str );
5671 }
5772
5873 if (!lwm2m_strncmp (server_reply , "HTTP/1.1 200 OK" , 15 ) == 0 ){
@@ -61,10 +76,10 @@ int startDownload(target_instance_t *targetP) {
6176 asd = server_reply + 9 ;
6277 if (xatoi (& asd , & response_code ) != 1 ) {
6378 printf ("Error reading Server response code\r\n" );
64- download_error (targetP ,UNKNOWN_ERROR , socket );
79+ download_error (targetP ,UNKNOWN_ERROR , socket , url_str );
6580 }
66- printf ("Server Response status:%d \r\n" , response_code );
67- download_error (targetP , response_code , socket );
81+ printf ("Server Response status:%ld \r\n" , response_code );
82+ download_error (targetP , response_code , socket , url_str );
6883 }
6984 printf ("Server responded with 200!\r\n" );
7085 for (int i = 15 ; i < received_len ; i ++ ) {
@@ -73,7 +88,7 @@ int startDownload(target_instance_t *targetP) {
7388 asd = server_reply + i + 15 ;
7489 if (xatoi (& asd , & payload_len ) != 1 ) {
7590 printf ("Error reading Content-Length\r\n" );
76- download_error (targetP , UNKNOWN_ERROR , socket );
91+ download_error (targetP , UNKNOWN_ERROR , socket , url_str );
7792 }
7893 break ;
7994 }
@@ -84,7 +99,7 @@ int startDownload(target_instance_t *targetP) {
8499
85100 if ( received_len < 0 ){
86101 printf ("recv failed\r\n" );
87- download_error (targetP , RECEIVE_ERROR , socket );
102+ download_error (targetP , RECEIVE_ERROR , socket , url_str );
88103 }
89104
90105
@@ -96,7 +111,7 @@ int startDownload(target_instance_t *targetP) {
96111 if (get_usb_ready ()) {
97112 usb_write (server_reply , targetP -> binary_filename , received_len );
98113 } else {
99- download_error (targetP , USB_ERROR , socket );
114+ download_error (targetP , USB_ERROR , socket , url_str );
100115 }
101116
102117 if ( total_received_len >= payload_len ){
@@ -108,6 +123,7 @@ int startDownload(target_instance_t *targetP) {
108123 targetP -> download_progress = 100 ;
109124 targetP -> download_error = NO_ERROR ;
110125 lwip_close (socket );
126+ lwm2m_free (url_str );
111127 vTaskDelete ();
112128
113129}
0 commit comments