1 /* This case tests basic GET 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)
11 
12 #define     DEMO_STACK_SIZE         4096
13 
14 /* Set up FileX and file memory resources. */
15 static CHAR             ram_disk_memory[4096];
16 static FX_MEDIA         ram_disk;
17 static UCHAR            media_memory[4096];
18 
19 static UCHAR            server_stack[16000];
20 
21 /* Define device drivers.  */
22 extern void _fx_ram_driver(FX_MEDIA *media_ptr);
23 extern void _nx_ram_network_driver_1024(NX_IP_DRIVER *driver_req_ptr);
24 
25 /* Set up the HTTP client global variables. */
26 
27 #define         CLIENT_PACKET_SIZE  (NX_WEB_HTTP_CLIENT_MIN_PACKET_SIZE * 2)
28 
29 static TX_THREAD           client_thread;
30 static NX_PACKET_POOL      client_pool;
31 static NX_WEB_HTTP_CLIENT  my_client;
32 static NX_IP               client_ip;
33 static UINT                error_counter;
34 
35 /* Set up the HTTP server global variables */
36 
37 #define         SERVER_PACKET_SIZE  (NX_WEB_HTTP_SERVER_MIN_PACKET_SIZE * 2)
38 
39 static NX_WEB_HTTP_SERVER  my_server;
40 static NX_PACKET_POOL      server_pool;
41 static TX_THREAD           server_thread;
42 static NX_IP               server_ip;
43 static NXD_ADDRESS         server_ip_address;
44 static UINT                http_server_start = 0;
45 static UINT                http_client_stop = 0;
46 
47 static void thread_client_entry(ULONG thread_input);
48 static void thread_server_entry(ULONG thread_input);
49 
50 #define HTTP_SERVER_ADDRESS  IP_ADDRESS(1,2,3,4)
51 #define HTTP_CLIENT_ADDRESS  IP_ADDRESS(1,2,3,5)
52 
53 static UINT loop = 1;
54 
55 #ifdef CTEST
test_application_define(void * first_unused_memory)56 VOID test_application_define(void *first_unused_memory)
57 #else
58 void    netx_web_one_session_test_application_define(void *first_unused_memory)
59 #endif
60 {
61 CHAR    *pointer;
62 UINT    status;
63 
64 
65     error_counter = 0;
66 
67     /* Setup the working pointer.  */
68     pointer =  (CHAR *) first_unused_memory;
69 
70     /* Create a helper thread for the server. */
71     tx_thread_create(&server_thread, "HTTP Server thread", thread_server_entry, 0,
72                      pointer, DEMO_STACK_SIZE,
73                      NX_WEB_HTTP_SERVER_PRIORITY, NX_WEB_HTTP_SERVER_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);
74 
75     pointer =  pointer + DEMO_STACK_SIZE;
76 
77     /* Initialize the NetX system.  */
78     nx_system_initialize();
79 
80     /* Create the server packet pool.  */
81     status =  nx_packet_pool_create(&server_pool, "HTTP Server Packet Pool", SERVER_PACKET_SIZE,
82                                     pointer, SERVER_PACKET_SIZE*8);
83     pointer = pointer + SERVER_PACKET_SIZE * 8;
84     if (status)
85         error_counter++;
86 
87     /* Create an IP instance.  */
88     status = nx_ip_create(&server_ip, "HTTP Server IP", HTTP_SERVER_ADDRESS,
89                           0xFFFFFF00UL, &server_pool, _nx_ram_network_driver_1024,
90                           pointer, 4096, 1);
91     pointer =  pointer + 4096;
92     if (status)
93         error_counter++;
94 
95     /* Enable ARP and supply ARP cache memory for the server IP instance.  */
96     status = nx_arp_enable(&server_ip, (void *) pointer, 1024);
97     pointer = pointer + 1024;
98     if (status)
99         error_counter++;
100 
101 
102      /* Enable TCP traffic.  */
103     status = nx_tcp_enable(&server_ip);
104     if (status)
105         error_counter++;
106 
107     /* Create the HTTP Client thread. */
108     status = tx_thread_create(&client_thread, "HTTP Client", thread_client_entry, 0,
109                               pointer, DEMO_STACK_SIZE,
110                               NX_WEB_HTTP_SERVER_PRIORITY + 2, NX_WEB_HTTP_SERVER_PRIORITY + 2, TX_NO_TIME_SLICE, TX_AUTO_START);
111     pointer =  pointer + DEMO_STACK_SIZE;
112     if (status)
113         error_counter++;
114 
115     /* Create the Client packet pool.  */
116     status =  nx_packet_pool_create(&client_pool, "HTTP Client Packet Pool", CLIENT_PACKET_SIZE,
117                                     pointer, CLIENT_PACKET_SIZE*8);
118     pointer = pointer + CLIENT_PACKET_SIZE * 8;
119     if (status)
120         error_counter++;
121 
122     /* Create an IP instance.  */
123     status = nx_ip_create(&client_ip, "HTTP Client IP", HTTP_CLIENT_ADDRESS,
124                           0xFFFFFF00UL, &client_pool, _nx_ram_network_driver_1024,
125                           pointer, 2048, 1);
126     pointer =  pointer + 2048;
127     if (status)
128         error_counter++;
129 
130     status  = nx_arp_enable(&client_ip, (void *) pointer, 1024);
131     pointer =  pointer + 2048;
132     if (status)
133         error_counter++;
134 
135      /* Enable TCP traffic.  */
136     status = nx_tcp_enable(&client_ip);
137     if (status)
138         error_counter++;
139 }
140 
141 
thread_client_entry(ULONG thread_input)142 void thread_client_entry(ULONG thread_input)
143 {
144 UINT            status;
145 NX_PACKET       *recv_packet;
146 
147 
148     /* Give IP task and driver a chance to initialize the system.  */
149     tx_thread_sleep(NX_IP_PERIODIC_RATE);
150 
151     /* Set server IP address.  */
152     server_ip_address.nxd_ip_address.v4 = HTTP_SERVER_ADDRESS;
153     server_ip_address.nxd_ip_version = NX_IP_VERSION_V4;
154 
155 
156     /* Wait HTTP server started.  */
157     while (!http_server_start)
158     {
159         tx_thread_sleep(NX_IP_PERIODIC_RATE);
160     }
161 
162     /* Create an HTTP client instance.  */
163     status = nx_web_http_client_create(&my_client, "HTTP Client", &client_ip, &client_pool, 1536);
164 
165     /* Check status.  */
166     if (status)
167         error_counter++;
168 
169     /* Connect to server.  */
170     status = nx_web_http_client_connect(&my_client, &server_ip_address, NX_WEB_HTTP_SERVER_PORT, NX_WAIT_FOREVER);
171 
172     /* Check status.  */
173     if (status)
174         error_counter++;
175 
176     /* Initialize the request.  */
177     status = nx_web_http_client_request_initialize(&my_client, NX_WEB_HTTP_METHOD_GET, "/test.txt", "1.2.3.4",
178                                                    0, NX_FALSE, "name", "password", NX_WAIT_FOREVER);
179 
180     /* Check status.  */
181     if (status)
182         error_counter++;
183 
184     status = nx_web_http_client_request_header_add(&my_client, "Connection", 10, "close", 5, 1 * NX_IP_PERIODIC_RATE);
185 
186     /* Check status.  */
187     if (status)
188         error_counter++;
189 
190     /* Send the request.  */
191     status = nx_web_http_client_request_send(&my_client, NX_WAIT_FOREVER);
192 
193     /* Check status.  */
194     if (status)
195         error_counter++;
196 
197     tx_thread_sleep(11 * NX_IP_PERIODIC_RATE);
198 
199     /* Get response from server.  */
200     while (1)
201     {
202         status = nx_web_http_client_response_body_get(&my_client, &recv_packet, 1 * NX_IP_PERIODIC_RATE);
203 
204         if (status)
205             break;
206         else
207             nx_packet_release(recv_packet);
208     }
209 
210     /* Check status.  */
211     if (status != NX_WEB_HTTP_GET_DONE)
212         error_counter++;
213     else
214         nx_packet_release(recv_packet);
215 
216     /* Send a GET request.  */
217     status = nx_web_http_client_get_start(&my_client, &server_ip_address,
218                                           NX_WEB_HTTP_SERVER_PORT, "http://1.2.3.4/test.txt",
219                                           "1.2.3.4", "name", "password", NX_WAIT_FOREVER);
220 
221     /* Check status.  */
222     if (status)
223         error_counter++;
224 
225     /* Get response from server.  */
226     while (1)
227     {
228         status = nx_web_http_client_response_body_get(&my_client, &recv_packet, 1 * NX_IP_PERIODIC_RATE);
229 
230         if (status)
231             break;
232         else
233             nx_packet_release(recv_packet);
234     }
235 
236     /* Check status.  */
237     if (status != NX_WEB_HTTP_GET_DONE)
238         error_counter++;
239     else
240         nx_packet_release(recv_packet);
241 
242     status = nx_web_http_client_delete(&my_client);
243     if (status)
244         error_counter++;
245 
246     /* Set the flag.  */
247     http_client_stop = 1;
248 }
249 
250 /* Define the helper HTTP server thread.  */
thread_server_entry(ULONG thread_input)251 void    thread_server_entry(ULONG thread_input)
252 {
253 UINT            i;
254 UINT            status;
255 FX_FILE         my_file;
256 UINT            server_port = NX_WEB_HTTP_SERVER_PORT;
257 
258 
259     /* Print out test information banner.  */
260     printf("NetX Test:   Web One Session Test......................................");
261 
262     /* Check for earlier error.  */
263     if(error_counter)
264     {
265         printf("ERROR!\n");
266         test_control_return(1);
267     }
268 
269     fx_media_format(&ram_disk,
270                     _fx_ram_driver,               // Driver entry
271                     ram_disk_memory,              // RAM disk memory pointer
272                     media_memory,                 // Media buffer pointer
273                     sizeof(media_memory),         // Media buffer size
274                     "MY_RAM_DISK",                // Volume Name
275                     1,                            // Number of FATs
276                     32,                           // Directory Entries
277                     0,                            // Hidden sectors
278                     256,                          // Total sectors
279                     512,                          // Sector size
280                     8,                            // Sectors per cluster
281                     1,                            // Heads
282                     1);                           // Sectors per track
283 
284     /* Open the RAM disk.  */
285     status = fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, media_memory, sizeof(media_memory)) ;
286     status += fx_file_create(&ram_disk, "TEST.TXT");
287     status += fx_file_open(&ram_disk, &my_file, "TEST.TXT", FX_OPEN_FOR_WRITE);
288     status += fx_file_write(&my_file, "https server", 12);
289     status += fx_file_close(&my_file);
290     if(status)
291         error_counter++;
292 
293     /* Give NetX a chance to initialize the system.  */
294     tx_thread_sleep(NX_IP_PERIODIC_RATE);
295 
296     /* Create the HTTP Server. */
297     status = nx_web_http_server_create(&my_server, "My HTTP Server", &server_ip, server_port, &ram_disk,
298                                        &server_stack, sizeof(server_stack), &server_pool,
299                                        NX_NULL, NX_NULL);
300     if (status)
301         error_counter++;
302 
303     my_server.nx_web_http_server_tcpserver.nx_tcpserver_sessions_count = 1;
304 
305     /* OK to start the HTTP Server.  */
306     status = nx_web_http_server_start(&my_server);
307     if (status)
308         error_counter++;
309 
310     /* Set the flag.  */
311     http_server_start = 1;
312 
313     /* Wait HTTP test finished.  */
314     while (!http_client_stop)
315     {
316         tx_thread_sleep(NX_IP_PERIODIC_RATE);
317     }
318 
319     status = nx_web_http_server_delete(&my_server);
320     if (status)
321         error_counter++;
322 
323     /* Check packet pool.  */
324     if (server_pool.nx_packet_pool_available != server_pool.nx_packet_pool_total)
325     {
326         error_counter++;
327     }
328 
329     if (client_pool.nx_packet_pool_available != client_pool.nx_packet_pool_total)
330     {
331         error_counter++;
332     }
333 
334     if(error_counter)
335     {
336         printf("ERROR!\n");
337         test_control_return(1);
338     }
339     else
340     {
341         printf("SUCCESS!\n");
342         test_control_return(0);
343     }
344 }
345 #else
346 
347 #ifdef CTEST
test_application_define(void * first_unused_memory)348 VOID test_application_define(void *first_unused_memory)
349 #else
350 void    netx_web_one_session_test_application_define(void *first_unused_memory)
351 #endif
352 {
353 
354     /* Print out test information banner.  */
355     printf("NetX Test:   Web One Session Test......................................N/A\n");
356 
357     test_control_return(3);
358 }
359 #endif
360 
361