Httpserver.h: Single header library for writing non-blocking HTTP servers in C
source link: https://github.com/jeremycw/httpserver.h
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
See httpserver.h
for API documentation
Description
httpserver.h is a single header C library for building event driven non-blocking HTTP servers
Supports Linux with epoll and BSD/Mac with kqueue.
Example
#define HTTPSERVER_IMPL #include "httpserver.h" #define RESPONSE "Hello, World!" void handle_request(struct http_request_s* request) { struct http_response_s* response = http_response_init(); http_response_status(response, 200); http_response_header(response, "Content-Type", "text/plain"); http_response_body(response, RESPONSE, sizeof(RESPONSE) - 1); http_respond(request, response); } int main() { struct http_server_s* server = http_server_init(8080, handle_request); http_server_listen(server); }
See full documentation in httpserver.h
Benchmark
I ran some micro-benchmarks with httpserver.h and NGINX serving a simple Hello, World! The purpose here was just to get a performance reference point, not to try and make any statement of superiority since httpserver.h is not a competitor or replacement for NGINX.
With keep-alive
ab -k -c 200 -n 100000 http://localhost:8080/
NGINX 74441.26 requests/sec
Server Software: nginx/1.14.0 Server Hostname: localhost Server Port: 8000 Document Path: / Document Length: 13 bytes Concurrency Level: 200 Time taken for tests: 1.343 seconds Complete requests: 100000 Failed requests: 0 Keep-Alive requests: 99052 Total transferred: 20995260 bytes HTML transferred: 1300000 bytes Requests per second: 74441.26 [#/sec] (mean) Time per request: 2.687 [ms] (mean) Time per request: 0.013 [ms] (mean, across all concurrent requests) Transfer rate: 15262.83 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 17.8 0 1029 Processing: 0 2 8.8 1 148 Waiting: 0 2 8.8 1 148 Total: 0 3 21.4 1 1150 Percentage of the requests served within a certain time (ms) 50% 1 66% 2 75% 2 80% 2 90% 2 95% 2 98% 3 99% 35 100% 1150 (longest request)
httpserver.h 123907.91 requests/sec
Server Software: Server Hostname: localhost Server Port: 8080 Document Path: / Document Length: 13 bytes Concurrency Level: 200 Time taken for tests: 0.807 seconds Complete requests: 100000 Failed requests: 0 Keep-Alive requests: 100000 Total transferred: 13400000 bytes HTML transferred: 1300000 bytes Requests per second: 123907.91 [#/sec] (mean) Time per request: 1.614 [ms] (mean) Time per request: 0.008 [ms] (mean, across all concurrent requests) Transfer rate: 16214.51 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 4 Processing: 1 2 0.3 2 6 Waiting: 1 2 0.3 2 6 Total: 1 2 0.4 2 6 Percentage of the requests served within a certain time (ms) 50% 2 66% 2 75% 2 80% 2 90% 2 95% 2 98% 3 99% 3 100% 6 (longest request)
With Connection: close
ab -c 200 -n 100000 http://localhost:8080/
NGINX 15773.47 requests/sec
Server Software: nginx/1.14.0 Server Hostname: localhost Server Port: 8000 Document Path: / Document Length: 13 bytes Concurrency Level: 200 Time taken for tests: 6.340 seconds Complete requests: 100000 Failed requests: 0 Total transferred: 20500000 bytes HTML transferred: 1300000 bytes Requests per second: 15773.47 [#/sec] (mean) Time per request: 12.680 [ms] (mean) Time per request: 0.063 [ms] (mean, across all concurrent requests) Transfer rate: 3157.77 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 4 40.6 3 1123 Processing: 1 8 46.7 4 508 Waiting: 1 7 46.7 3 508 Total: 3 12 64.5 6 1460 Percentage of the requests served within a certain time (ms) 50% 6 66% 7 75% 7 80% 8 90% 8 95% 9 98% 10 99% 503 100% 1460 (longest request)
httpserver.h 27605.45 requests/sec
Server Software: Server Hostname: localhost Server Port: 8080 Document Path: / Document Length: 13 bytes Concurrency Level: 200 Time taken for tests: 3.622 seconds Complete requests: 100000 Failed requests: 0 Total transferred: 12900000 bytes HTML transferred: 1300000 bytes Requests per second: 27605.45 [#/sec] (mean) Time per request: 7.245 [ms] (mean) Time per request: 0.036 [ms] (mean, across all concurrent requests) Transfer rate: 3477.64 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 2 3 0.5 3 6 Processing: 1 4 0.7 4 8 Waiting: 1 3 0.8 3 7 Total: 4 7 0.6 7 11 Percentage of the requests served within a certain time (ms) 50% 7 66% 7 75% 8 80% 8 90% 8 95% 8 98% 9 99% 9 100% 11 (longest request)
NGINX conf
worker_processes 1; http { server { listen 8000; location / { add_header Content-Type text/plain; return 200 'Hello, World!'; } } }
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK