@@ -31,10 +31,109 @@ pub fn main() !void {
31
31
.prng = & prng ,
32
32
};
33
33
34
- server = try httpz .ServerApp (* endpoints .Global ).init (allocator , .{ .port = 3000 , .address = "0.0.0.0" , .workers = .{
35
- .count = @truncate (cpu_count ),
36
- .max_conn = 4096 ,
37
- }, .thread_pool = .{ .count = @truncate (cpu_count * 2 ) } }, & global );
34
+ var httpz_port : []u8 = undefined ;
35
+ var arg_string = try std .fmt .allocPrint (allocator , "{s}" , .{"0" });
36
+ defer allocator .free (arg_string );
37
+
38
+ var args = try std .process .argsWithAllocator (allocator );
39
+ defer args .deinit ();
40
+ while (args .next ()) | arg | {
41
+ arg_string = try std .fmt .allocPrint (allocator , "{s}" , .{arg });
42
+
43
+ httpz_port = arg_string ; // use arg
44
+ }
45
+
46
+ var port = try std .fmt .parseInt (u16 ,httpz_port , 0 );
47
+
48
+ if (port == 0 ) {
49
+ port = 3000 ;
50
+ }
51
+
52
+ const workers = @as (u16 , @intCast (16 * cpu_count ));
53
+
54
+ server = try httpz .ServerApp (* endpoints .Global ).init (allocator , .{
55
+ .port = port ,
56
+ .address = "0.0.0.0" ,
57
+ .workers = .{
58
+ // Number of worker threads
59
+ // (blocking mode: handled differently)
60
+ .count = workers ,
61
+
62
+ // Maximum number of concurrent connection each worker can handle
63
+ // (blocking mode: currently ignored)
64
+ .max_conn = 8_192 ,
65
+
66
+ // Minimum number of connection states each worker should maintain
67
+ // (blocking mode: currently ignored)
68
+ .min_conn = 64 ,
69
+
70
+ // A pool of larger buffers that can be used for any data larger than configured
71
+ // static buffers. For example, if response headers don't fit in in
72
+ // $response.header_buffer_size, a buffer will be pulled from here.
73
+ // This is per-worker.
74
+ .large_buffer_count = 16 ,
75
+
76
+ // The size of each large buffer.
77
+ .large_buffer_size = 65536 ,
78
+
79
+ // Size of bytes retained for the connection arena between use. This will
80
+ // result in up to `count * min_conn * retain_allocated_bytes` of memory usage.
81
+ .retain_allocated_bytes = 4096 ,
82
+ },
83
+
84
+ // configures the threadpool which processes requests. The threadpool is
85
+ // where your application code runs.
86
+ .thread_pool = .{
87
+ // Number threads. If you're handlers are doing a lot of i/o, a higher
88
+ // number might provide better throughput
89
+ // (blocking mode: handled differently)
90
+ .count = 256 ,
91
+
92
+ // The maximum number of pending requests that the thread pool will accept
93
+ // This applies back pressure to the above workers and ensures that, under load
94
+ // pending requests get precedence over processing new requests.
95
+ .backlog = 2048 ,
96
+
97
+ // Size of the static buffer to give each thread. Memory usage will be
98
+ // `count * buffer_size`. If you're making heavy use of either `req.arena` or
99
+ // `res.arena`, this is likely the single easiest way to gain performance.
100
+ .buffer_size = 8192 ,
101
+ },
102
+ .request = .{
103
+ // Maximum request body size that we'll process. We can allocate up
104
+ // to this much memory per request for the body. Internally, we might
105
+ // keep this memory around for a number of requests as an optimization.
106
+ .max_body_size = 1_048_576 ,
107
+
108
+ // This memory is allocated upfront. The request header _must_ fit into
109
+ // this space, else the request will be rejected.
110
+ .buffer_size = 4_096 ,
111
+
112
+ // Maximum number of headers to accept.
113
+ // Additional headers will be silently ignored.
114
+ .max_header_count = 32 ,
115
+
116
+ // Maximum number of URL parameters to accept.
117
+ // Additional parameters will be silently ignored.
118
+ .max_param_count = 10 ,
119
+
120
+ // Maximum number of query string parameters to accept.
121
+ // Additional parameters will be silently ignored.
122
+ .max_query_count = 32 ,
123
+
124
+ // Maximum number of x-www-form-urlencoded fields to support.
125
+ // Additional parameters will be silently ignored. This must be
126
+ // set to a value greater than 0 (the default) if you're going
127
+ // to use the req.formData() method.
128
+ .max_form_count = 0 ,
129
+
130
+ // Maximum number of multipart/form-data fields to support.
131
+ // Additional parameters will be silently ignored. This must be
132
+ // set to a value greater than 0 (the default) if you're going
133
+ // to use the req.multiFormData() method.
134
+ .max_multiform_count = 0 ,
135
+ },
136
+ }, & global );
38
137
defer server .deinit ();
39
138
40
139
// now that our server is up, we register our intent to handle SIGINT
@@ -50,7 +149,7 @@ pub fn main() !void {
50
149
router .get ("/db" , endpoints .db );
51
150
router .get ("/fortunes" , endpoints .fortune );
52
151
53
- std .debug .print ("Httpz listening at 0.0.0.0:{d}\n " , .{3000 });
152
+ std .debug .print ("Httpz using {d} workers listening at 0.0.0.0:{d}\n " , .{ workers , port });
54
153
55
154
try server .listen ();
56
155
}
0 commit comments