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