|  | @@ -25,7 +25,7 @@ class ExampleHandler : public CivetHandler
 | 
	
		
			
				|  |  |  	bool
 | 
	
		
			
				|  |  |  	handleGet(CivetServer *server, struct mg_connection *conn)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  | -		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "<html><body>\r\n");
 | 
	
		
			
				|  |  |  		mg_printf(conn,
 | 
	
		
			
				|  |  |  		          "<h2>This is an example text from a C++ handler</h2>\r\n");
 | 
	
	
		
			
				|  | @@ -51,7 +51,7 @@ class ExitHandler : public CivetHandler
 | 
	
		
			
				|  |  |  	bool
 | 
	
		
			
				|  |  |  	handleGet(CivetServer *server, struct mg_connection *conn)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  | -		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\n");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "Bye!\n");
 | 
	
		
			
				|  |  |  		exitNow = true;
 | 
	
		
			
				|  |  |  		return true;
 | 
	
	
		
			
				|  | @@ -67,7 +67,7 @@ class AHandler : public CivetHandler
 | 
	
		
			
				|  |  |  	          struct mg_connection *conn)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		std::string s = "";
 | 
	
		
			
				|  |  | -		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "<html><body>");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "<h2>This is the A handler for \"%s\" !</h2>", method);
 | 
	
		
			
				|  |  |  		if (CivetServer::getParam(conn, "param", s)) {
 | 
	
	
		
			
				|  | @@ -98,7 +98,7 @@ class ABHandler : public CivetHandler
 | 
	
		
			
				|  |  |  	bool
 | 
	
		
			
				|  |  |  	handleGet(CivetServer *server, struct mg_connection *conn)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  | -		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "<html><body>");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "<h2>This is the AB handler!!!</h2>");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "</body></html>\n");
 | 
	
	
		
			
				|  | @@ -115,15 +115,91 @@ class FooHandler : public CivetHandler
 | 
	
		
			
				|  |  |  		/* Handler may access the request info using mg_get_request_info */
 | 
	
		
			
				|  |  |  		const struct mg_request_info *req_info = mg_get_request_info(conn);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
 | 
	
		
			
				|  |  | -		mg_printf(conn, "<html><body>");
 | 
	
		
			
				|  |  | -		mg_printf(conn, "<h2>This is the Foo handler!!!</h2>");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		mg_printf(conn, "<html><body>\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "<h2>This is the Foo GET handler!!!</h2>\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn,
 | 
	
		
			
				|  |  | +		          "<p>The request was:<br><pre>%s %s HTTP/%s</pre></p>\n",
 | 
	
		
			
				|  |  | +		          req_info->request_method,
 | 
	
		
			
				|  |  | +		          req_info->uri,
 | 
	
		
			
				|  |  | +		          req_info->http_version);        
 | 
	
		
			
				|  |  | +		mg_printf(conn, "</body></html>\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return true;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	bool
 | 
	
		
			
				|  |  | +	handlePost(CivetServer *server, struct mg_connection *conn)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		/* Handler may access the request info using mg_get_request_info */
 | 
	
		
			
				|  |  | +		const struct mg_request_info *req_info = mg_get_request_info(conn);
 | 
	
		
			
				|  |  | +        size_t rlen, wlen;
 | 
	
		
			
				|  |  | +        size_t nlen = 0;
 | 
	
		
			
				|  |  | +        size_t tlen = (size_t)req_info->content_length;
 | 
	
		
			
				|  |  | +        char buf[1024];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		mg_printf(conn, "<html><body>\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "<h2>This is the Foo POST handler!!!</h2>\n");
 | 
	
		
			
				|  |  |  		mg_printf(conn,
 | 
	
		
			
				|  |  | -		          "<p>The request was:<br><pre>%s %s HTTP/%s</pre></p>",
 | 
	
		
			
				|  |  | +		          "<p>The request was:<br><pre>%s %s HTTP/%s</pre></p>\n",
 | 
	
		
			
				|  |  |  		          req_info->request_method,
 | 
	
		
			
				|  |  |  		          req_info->uri,
 | 
	
		
			
				|  |  |  		          req_info->http_version);
 | 
	
		
			
				|  |  | +        mg_printf(conn, "<p>Content Length: %li</p>\n", (long)tlen);
 | 
	
		
			
				|  |  | +        mg_printf(conn, "<pre>\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        while (nlen < tlen) {
 | 
	
		
			
				|  |  | +            rlen = tlen - nlen;
 | 
	
		
			
				|  |  | +            if (rlen>sizeof(buf)) {rlen=sizeof(buf);}           
 | 
	
		
			
				|  |  | +            rlen = mg_read(conn, buf, rlen);
 | 
	
		
			
				|  |  | +            if (rlen<=0) break;
 | 
	
		
			
				|  |  | +            wlen = mg_write(conn, buf, rlen);
 | 
	
		
			
				|  |  | +            if (rlen!=rlen) break;
 | 
	
		
			
				|  |  | +            nlen += wlen;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        mg_printf(conn, "\n</pre>\n");
 | 
	
		
			
				|  |  |  		mg_printf(conn, "</body></html>\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return true;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	bool
 | 
	
		
			
				|  |  | +	handlePut(CivetServer *server, struct mg_connection *conn)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		/* Handler may access the request info using mg_get_request_info */
 | 
	
		
			
				|  |  | +		const struct mg_request_info *req_info = mg_get_request_info(conn);
 | 
	
		
			
				|  |  | +        size_t rlen, wlen;
 | 
	
		
			
				|  |  | +        size_t nlen = 0;
 | 
	
		
			
				|  |  | +        size_t tlen = (size_t)req_info->content_length;
 | 
	
		
			
				|  |  | +        char buf[1024];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		mg_printf(conn, "<html><body>\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "<h2>This is the Foo PUT handler!!!</h2>\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn,
 | 
	
		
			
				|  |  | +		          "<p>The request was:<br><pre>%s %s HTTP/%s</pre></p>\n",
 | 
	
		
			
				|  |  | +		          req_info->request_method,
 | 
	
		
			
				|  |  | +		          req_info->uri,
 | 
	
		
			
				|  |  | +		          req_info->http_version);
 | 
	
		
			
				|  |  | +        mg_printf(conn, "<p>Content Length: %li</p>\n", (long)tlen);
 | 
	
		
			
				|  |  | +        mg_printf(conn, "<pre>\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        while (nlen < tlen) {
 | 
	
		
			
				|  |  | +            rlen = tlen - nlen;
 | 
	
		
			
				|  |  | +            if (rlen>sizeof(buf)) {rlen=sizeof(buf);}           
 | 
	
		
			
				|  |  | +            rlen = mg_read(conn, buf, rlen);
 | 
	
		
			
				|  |  | +            if (rlen<=0) break;
 | 
	
		
			
				|  |  | +            wlen = mg_write(conn, buf, rlen);
 | 
	
		
			
				|  |  | +            if (rlen!=rlen) break;
 | 
	
		
			
				|  |  | +            nlen += wlen;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        mg_printf(conn, "\n</pre>\n");
 | 
	
		
			
				|  |  | +		mg_printf(conn, "</body></html>\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		return true;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  };
 |