1 /* This case tests basic POST method. */
2 #include    "tx_api.h"
3 #include    "nx_api.h"
4 #include    "fx_api.h"
5 #include    "nx_web_http_client.h"
6 #include    "nx_web_http_server.h"
7 
8 extern void test_control_return(UINT);
9 
10 #if !defined(NX_DISABLE_IPV4) && !defined(NX_DISABLE_PACKET_CHAIN)
11 
12 #include "test_device_cert.c"
13 #include "test_ca_cert.c"
14 #define ca_cert_der test_ca_cert_der
15 #define ca_cert_der_len test_ca_cert_der_len
16 
17 #define     DEMO_STACK_SIZE         4096
18 
19 /* Set up FileX and file memory resources. */
20 static CHAR             ram_disk_memory[4096];
21 static FX_MEDIA         ram_disk;
22 static UCHAR            media_memory[4096];
23 
24 static UCHAR            server_stack[16000];
25 
26 /* Define device drivers.  */
27 extern void _fx_ram_driver(FX_MEDIA *media_ptr);
28 extern void _nx_ram_network_driver_1024(NX_IP_DRIVER *driver_req_ptr);
29 
30 /* Set up the HTTP client global variables. */
31 
32 #define         CLIENT_PACKET_SIZE  (NX_WEB_HTTP_SERVER_MIN_PACKET_SIZE * 2)
33 
34 static TX_THREAD           client_thread;
35 static NX_PACKET_POOL      client_pool;
36 static NX_WEB_HTTP_CLIENT  my_client;
37 static NX_IP               client_ip;
38 static UINT                error_counter;
39 
40 /* Set up the HTTP server global variables */
41 
42 #define         SERVER_PACKET_SIZE  (NX_WEB_HTTP_CLIENT_MIN_PACKET_SIZE * 2)
43 
44 static NX_WEB_HTTP_SERVER  my_server;
45 static NX_PACKET_POOL      server_pool;
46 static TX_THREAD           server_thread;
47 static NX_IP               server_ip;
48 static NXD_ADDRESS         server_ip_address;
49 static UINT                http_server_start = 0;
50 static UINT                http_client_stop = 0;
51 
52 static void thread_client_entry(ULONG thread_input);
53 static void thread_server_entry(ULONG thread_input);
54 
55 #define HTTP_SERVER_ADDRESS  IP_ADDRESS(1,2,3,4)
56 #define HTTP_CLIENT_ADDRESS  IP_ADDRESS(1,2,3,5)
57 
58 #define MESSAGE_LENGTH (4 * 1024)
59 /* POST AAAAAAAAAA*/
60 static char pkt[] = {
61     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
62     'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
63     'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
64     'Y', 'Z', '0', '1', '2', '3', '4', '5',
65 };
66 
67 static UCHAR server_pool_area[SERVER_PACKET_SIZE * 16];
68 static UCHAR client_pool_area[SERVER_PACKET_SIZE * 16];
69 
70 static UINT server_request_callback(NX_WEB_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr);
71 
72 #ifdef CTEST
test_application_define(void * first_unused_memory)73 VOID test_application_define(void *first_unused_memory)
74 #else
75 void    netx_web_post_large_packet_test_application_define(void *first_unused_memory)
76 #endif
77 {
78 CHAR    *pointer;
79 UINT    status;
80 
81 
82     error_counter = 0;
83 
84     /* Setup the working pointer.  */
85     pointer =  (CHAR *) first_unused_memory;
86 
87     /* Create a helper thread for the server. */
88     tx_thread_create(&server_thread, "HTTP Server thread", thread_server_entry, 0,
89                      pointer, DEMO_STACK_SIZE,
90                      NX_WEB_HTTP_SERVER_PRIORITY, NX_WEB_HTTP_SERVER_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);
91 
92     pointer =  pointer + DEMO_STACK_SIZE;
93 
94     /* Initialize the NetX system.  */
95     nx_system_initialize();
96 
97     /* Create the server packet pool.  */
98     status =  nx_packet_pool_create(&server_pool, "HTTP Server Packet Pool", SERVER_PACKET_SIZE,
99                                     server_pool_area, sizeof(server_pool_area));
100     if (status)
101         error_counter++;
102 
103     /* Create an IP instance.  */
104     status = nx_ip_create(&server_ip, "HTTP Server IP", HTTP_SERVER_ADDRESS,
105                           0xFFFFFF00UL, &server_pool, _nx_ram_network_driver_1024,
106                           pointer, 4096, 1);
107     pointer =  pointer + 4096;
108     if (status)
109         error_counter++;
110 
111     /* Enable ARP and supply ARP cache memory for the server IP instance.  */
112     status = nx_arp_enable(&server_ip, (void *) pointer, 1024);
113     pointer = pointer + 1024;
114     if (status)
115         error_counter++;
116 
117      /* Enable TCP traffic.  */
118     status = nx_tcp_enable(&server_ip);
119     if (status)
120         error_counter++;
121 
122     /* Create the HTTP Client thread. */
123     status = tx_thread_create(&client_thread, "HTTP Client", thread_client_entry, 0,
124                               pointer, DEMO_STACK_SIZE,
125                               NX_WEB_HTTP_SERVER_PRIORITY + 2, NX_WEB_HTTP_SERVER_PRIORITY + 2, TX_NO_TIME_SLICE, TX_AUTO_START);
126     pointer =  pointer + DEMO_STACK_SIZE;
127     if (status)
128         error_counter++;
129 
130     /* Create the server packet pool.  */
131     status =  nx_packet_pool_create(&client_pool, "HTTP Server Packet Pool", SERVER_PACKET_SIZE,
132                                     client_pool_area, sizeof(client_pool_area));
133     if (status)
134         error_counter++;
135 
136     /* Create an IP instance.  */
137     status = nx_ip_create(&client_ip, "HTTP Client IP", HTTP_CLIENT_ADDRESS,
138                           0xFFFFFF00UL, &client_pool, _nx_ram_network_driver_1024,
139                           pointer, 2048, 1);
140     pointer =  pointer + 2048;
141     if (status)
142         error_counter++;
143 
144     status  = nx_arp_enable(&client_ip, (void *) pointer, 1024);
145     pointer =  pointer + 2048;
146     if (status)
147         error_counter++;
148 
149      /* Enable TCP traffic.  */
150     status = nx_tcp_enable(&client_ip);
151     if (status)
152         error_counter++;
153 }
154 
thread_client_entry(ULONG thread_input)155 void thread_client_entry(ULONG thread_input)
156 {
157 UINT            i;
158 UINT            status;
159 NX_PACKET       *send_packet;
160 NX_PACKET       *recv_packet;
161 
162 
163     /* Give IP task and driver a chance to initialize the system. */
164     tx_thread_sleep(NX_IP_PERIODIC_RATE);
165 
166     /* Set server IP address.  */
167     server_ip_address.nxd_ip_address.v4 = HTTP_SERVER_ADDRESS;
168     server_ip_address.nxd_ip_version = NX_IP_VERSION_V4;
169 
170     /* Wait HTTP server started.  */
171     while(!http_server_start)
172     {
173         tx_thread_sleep(NX_IP_PERIODIC_RATE);
174     }
175 
176     /* Create an HTTP client instance.  */
177     status = nx_web_http_client_create(&my_client, "HTTP Client", &client_ip, &client_pool, 1536);
178 
179     /* Check status.  */
180     if (status)
181         error_counter++;
182 
183     /* Post long message */
184     status = nx_web_http_client_post_start(&my_client, &server_ip_address,
185                                            NX_WEB_HTTP_SERVER_PORT,"/test.txt",
186                                            "www.abc.com", "name", "password", MESSAGE_LENGTH, NX_WAIT_FOREVER);
187 
188     /* Check status.  */
189     if (status)
190     {
191         error_counter++;
192     }
193 
194     /* Allocate a packet.  */
195     status = nx_web_http_client_request_packet_allocate(&my_client, &send_packet, 1 * NX_IP_PERIODIC_RATE);
196 
197     /* Check status.  */
198     if (status)
199         error_counter++;
200 
201     for (i = 0; i < MESSAGE_LENGTH / sizeof(pkt); i++)
202     {
203         /* Write test data into the packet payload.  */
204         status = nx_packet_data_append(send_packet, pkt, sizeof(pkt), &client_pool, NX_WAIT_FOREVER);
205     }
206 
207     /* Send the POST request.  */
208     status = nx_web_http_client_put_packet(&my_client, send_packet, 1 * NX_IP_PERIODIC_RATE);
209     if (status)
210     {
211         error_counter++;
212         nx_packet_release(send_packet);
213     }
214 
215     /* Get response from server.  */
216     while (1)
217     {
218         status = nx_web_http_client_response_body_get(&my_client, &recv_packet, 1 * NX_IP_PERIODIC_RATE);
219 
220         if (status)
221             break;
222         else
223             nx_packet_release(recv_packet);
224     }
225 
226     /* Check status.  */
227     if (status != NX_WEB_HTTP_GET_DONE)
228         error_counter++;
229     else
230         nx_packet_release(recv_packet);
231 
232     status = nx_web_http_client_delete(&my_client);
233     if (status)
234         error_counter++;
235 
236     http_client_stop = 1;
237 }
238 
239 /* Define the helper HTTP server thread.  */
thread_server_entry(ULONG thread_input)240 void    thread_server_entry(ULONG thread_input)
241 {
242 UINT            status;
243 FX_FILE         my_file;
244 UINT            server_port = NX_WEB_HTTP_SERVER_PORT;
245 
246 
247     /* Print out test information banner.  */
248     printf("NetX Test:   Web Post Long Message Test................................");
249 
250     /* Check for earlier error. */
251     if(error_counter)
252     {
253         printf("ERROR!\n");
254         test_control_return(1);
255     }
256 
257     fx_media_format(&ram_disk,
258                     _fx_ram_driver,               // Driver entry
259                     ram_disk_memory,              // RAM disk memory pointer
260                     media_memory,                 // Media buffer pointer
261                     sizeof(media_memory),         // Media buffer size
262                     "MY_RAM_DISK",                // Volume Name
263                     1,                            // Number of FATs
264                     32,                           // Directory Entries
265                     0,                            // Hidden sectors
266                     256,                          // Total sectors
267                     512,                          // Sector size
268                     8,                            // Sectors per cluster
269                     1,                            // Heads
270                     1);                           // Sectors per track
271 
272     /* Open the RAM disk.  */
273     status = fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, media_memory, sizeof(media_memory)) ;
274     status += fx_file_create(&ram_disk, "TEST.TXT");
275     status += fx_file_open(&ram_disk, &my_file, "TEST.TXT", FX_OPEN_FOR_WRITE);
276     status += fx_file_write(&my_file, "https server", 12);
277     status += fx_file_close(&my_file);
278     if(status)
279         error_counter++;
280 
281     /* Give NetX a chance to initialize the system. */
282     tx_thread_sleep(NX_IP_PERIODIC_RATE);
283 
284     /* Create the HTTP Server. */
285     status = nx_web_http_server_create(&my_server, "My HTTP Server", &server_ip, server_port, &ram_disk,
286                                        &server_stack, sizeof(server_stack), &server_pool,
287                                        NX_NULL, server_request_callback);
288     if (status)
289         error_counter++;
290 
291     /* OK to start the HTTP Server.   */
292     status = nx_web_http_server_start(&my_server);
293     if (status)
294         error_counter++;
295 
296     http_server_start = 1;
297 
298     /* Wait HTTP test finished.  */
299     while(!http_client_stop)
300     {
301         tx_thread_sleep(NX_IP_PERIODIC_RATE);
302     }
303 
304     status = nx_web_http_server_delete(&my_server);
305     if (status)
306         error_counter++;
307 
308     /* Check packet pool.  */
309     if (server_pool.nx_packet_pool_available != server_pool.nx_packet_pool_total)
310     {
311         error_counter++;
312     }
313 
314     if (client_pool.nx_packet_pool_available != client_pool.nx_packet_pool_total)
315     {
316         error_counter++;
317     }
318 
319     if(error_counter)
320     {
321         printf("ERROR!\n");
322         test_control_return(1);
323     }
324     else
325     {
326         printf("SUCCESS!\n");
327         test_control_return(0);
328     }
329 }
330 
331 /* Define the server request callback function.  */
server_request_callback(NX_WEB_HTTP_SERVER * server_ptr,UINT request_type,CHAR * resource,NX_PACKET * packet_ptr)332 static UINT server_request_callback(NX_WEB_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr)
333 {
334 ULONG      offset, total_length;
335 ULONG      length = 0;
336 UCHAR      buffer[sizeof(pkt)];
337 UINT       i = 0, actual_size;
338 UINT       status;
339 
340     /* Process multipart data.  */
341     if(request_type == NX_WEB_HTTP_SERVER_POST_REQUEST)
342     {
343 
344         nx_web_http_server_content_length_get(packet_ptr, &length);
345         if (length != MESSAGE_LENGTH)
346         {
347             error_counter++;
348         }
349 
350         total_length = 0;
351 
352         while (total_length < MESSAGE_LENGTH)
353         {
354             offset = 0;
355             while (offset != sizeof(pkt))
356             {
357                 status = nx_web_http_server_content_get_extended(server_ptr, packet_ptr, total_length + offset, &buffer[offset], sizeof(pkt) - offset, &actual_size);
358                 offset += actual_size;
359             }
360 
361             total_length += offset;
362 
363             if (actual_size == 0)
364             {
365                 break;
366             }
367         }
368 
369         if (total_length != MESSAGE_LENGTH)
370             error_counter++;
371 
372         /* Generate HTTP header.  */
373         status = nx_web_http_server_callback_response_send_extended(server_ptr, NX_WEB_HTTP_STATUS_OK, sizeof(NX_WEB_HTTP_STATUS_OK) - 1,
374                                                                     "hello", 5, NX_NULL, 0);
375         if(status)
376         {
377             error_counter++;
378         }
379     }
380     else
381     {
382         return(NX_SUCCESS);
383     }
384 
385     return(NX_WEB_HTTP_CALLBACK_COMPLETED);
386 }
387 #else
388 
389 #ifdef CTEST
test_application_define(void * first_unused_memory)390 VOID test_application_define(void *first_unused_memory)
391 #else
392 void    netx_web_post_large_packet_test_application_define(void *first_unused_memory)
393 #endif
394 {
395 
396     /* Print out test information banner.  */
397     printf("NetX Test:   Web Post Long Message Test................................N/A\n");
398 
399     test_control_return(3);
400 }
401 #endif
402