@@ -27,53 +27,44 @@ static void fn(struct mg_connection *c, int ev, void *ev_data) {
27
27
// Send request
28
28
mg_printf (c ,
29
29
"GET %s HTTP/1.1\r\n"
30
- "Connection: keep-alive\r\n"
31
- "Keep-Alive: timeout=60\r\n"
30
+ "Connection: close\r\n"
32
31
"Host: %.*s\r\n"
33
32
"\r\n" ,
34
33
mg_url_uri (s_url ), (int ) host .len , host .ptr );
35
34
} else if (ev == MG_EV_READ ) {
36
- // Parse the incoming data ourselves. If we can parse the request,
37
- // store two size_t variables in the c->data: expected len and recv len.
38
- size_t * data = (size_t * ) c -> data ;
39
- if (data [0 ]) { // Already parsed, simply print received data
40
- data [1 ] += c -> recv .len ;
41
- fwrite (c -> recv .buf , 1 , c -> recv .len , stdout );
42
- c -> recv .len = 0 ; // And cleanup the receive buffer. Streming!
43
- if (data [1 ] >= data [0 ]) * (bool * ) c -> fn_data = true;
44
- } else {
35
+ // c->data[0] holds a flag, whether we have parsed the request already
36
+ if (c -> data [0 ] == 0 ) {
45
37
struct mg_http_message hm ;
46
38
int n = mg_http_parse ((char * ) c -> recv .buf , c -> recv .len , & hm );
47
39
if (n < 0 ) mg_error (c , "Bad response" );
48
40
if (n > 0 ) {
49
41
fwrite (c -> recv .buf + n , 1 , c -> recv .len - n , stdout ); // Print body
50
- data [0 ] = n + hm .body .len ;
51
- data [1 ] = c -> recv .len ;
52
42
c -> recv .len = 0 ; // Cleanup receive buffer
53
- if ( data [1 ] >= data [ 0 ]) * ( bool * ) c -> fn_data = true;
43
+ c -> data [0 ] = 1 ; // Request parsed, set the flag
54
44
}
45
+ } else {
46
+ fwrite (c -> recv .buf , 1 , c -> recv .len , stdout );
47
+ c -> recv .len = 0 ; // Cleanup the receive buffer
55
48
}
56
49
} else if (ev == MG_EV_CLOSE ) {
57
- * (bool * ) c -> fn_data = true; // tell event loop to stop
50
+ * (bool * ) c -> fn_data = true; // Done, tell event loop to stop
58
51
} else if (ev == MG_EV_ERROR ) {
59
- * (bool * ) c -> fn_data = true; // Error, tell event loop to stop
52
+ * (bool * ) c -> fn_data = true; // Error, Tell event loop to stop
60
53
}
61
54
(void ) ev_data ;
62
55
}
63
56
64
57
int main (int argc , char * argv []) {
65
- struct mg_mgr mgr ; // Event manager
66
- bool done = false; // Event handler flips it to true
67
- const char * log_level = getenv ("V" ); // Log level
58
+ struct mg_mgr mgr ; // Event manager
59
+ bool done = false; // Event handler flips it to true
68
60
69
- mg_mgr_init (& mgr ); // Initialise event manager
70
- if (log_level == NULL ) log_level = "2" ; // If not set, set to DEBUG
71
- mg_log_set (atoi (log_level )); // Set to 0 to disable debug log
72
- if (argc > 1 ) s_url = argv [1 ]; // Use URL from command line
61
+ mg_mgr_init (& mgr ); // Initialise event manager
62
+ mg_log_set (MG_LL_INFO ); // Set to 0 to disable debug log
73
63
74
- mg_http_connect (& mgr , s_url , fn , & done ); // Create client connection
75
- while (!done ) mg_mgr_poll (& mgr , 1000 ); // Infinite event loop
76
- mg_mgr_free (& mgr ); // Free resources
64
+ if (argc > 1 ) s_url = argv [1 ]; // Use URL from command line
65
+ mg_connect (& mgr , s_url , fn , & done ); // Create client connection
66
+ while (!done ) mg_mgr_poll (& mgr , 1000 ); // Infinite event loop
67
+ mg_mgr_free (& mgr ); // Free resources
77
68
78
69
return 0 ;
79
70
}
0 commit comments