1 /+ dub.sdl:
2     name "t4"
3     dflags "-I../source"
4     #dflags "-fsanitize=address"
5     #dflags "-debug"
6     dmdflags "-check=assert=off"
7     dmdflags "-check=in=off"
8     dmdflags "-check=out=off"
9     dmdflags "-check=invariant=off"
10     dmdflags "-check=bounds=off"
11     // dflags "-profile=gc"
12     // #debugVersions "nbuff"
13     #debugVersions "timingwheels"
14     #debugVersions "cachetools"
15     lflags "-lcares"
16     buildRequirements "allowWarnings"
17     dependency "hio" version="*"
18     dependency "nbuff" version="*"
19 +/
20 
21 module tests.t4;
22 import std.experimental.logger;
23 import std.datetime;
24 import std.string;
25 import std.algorithm;
26 import std.range;
27 
28 import core.atomic;
29 
30 import hio.socket;
31 import hio.scheduler;
32 import hio.loop;
33 
34 import nbuff: Nbuff, NbuffChunk;
35 
36 
37 void server(int so)
38 {
39     auto loop = getDefaultLoop();
40     auto server_socket = new hlSocket(so);
41 
42     void acceptFunction(AsyncSocketLike s) @safe
43     {
44         if ( s is null )
45         {
46             // timeout
47             server_socket.accept(loop, 5.seconds, &acceptFunction);
48             return;
49         }
50         int requests;
51         IORequest iorq;
52         void delegate(ref IOResult) @safe ioWriteCompleted;
53         void delegate(ref IOResult) @safe ioReadCompleted;
54 
55         auto client_socket = cast(hlSocket)s;
56         ioWriteCompleted = delegate void(scope ref IOResult iores) @safe
57         {
58             if (iores.error)
59             {
60                 //throw new Exception("err");
61                 client_socket.close();
62                 return;
63             }
64             if (requests < 1000)
65             {
66                 requests++;
67                 iorq.to_read = 1024;
68                 iorq.callback = ioReadCompleted;
69                 client_socket.io(loop, iorq, 10.seconds);
70             }
71             else
72             {
73                 client_socket.close();
74             }
75         };
76 
77         ioReadCompleted = delegate void(scope ref IOResult iores) @safe
78         {
79             if ( !iores.timedout && !iores.error )
80             {
81                 IORequest iorq;
82                 iorq.output = Nbuff("HTTP/1.0 200 OK\nContent-Type: text/plain\nContent-Length: 10\n\n0123456789");
83                 iorq.callback = ioWriteCompleted;
84                 client_socket.io(loop, iorq, 10.seconds);
85             }
86             else
87             {
88                 client_socket.close();
89             }
90         };
91 
92         iorq.to_read = 1024;
93         iorq.callback = ioReadCompleted;
94         client_socket.io(loop, iorq, 10.seconds);
95     }
96     server_socket.accept(loop, 5.seconds, &acceptFunction);
97     hlSleep(60.seconds);
98 }
99 
100 immutable servers = 4;
101 
102 void main()
103 {
104     globalLogLevel = LogLevel.info;
105     auto server_socket = new HioSocket();
106     server_socket.bind("0.0.0.0:12345");
107     server_socket.listen(1024);
108     auto server_threads = iota(servers).map!(i => threaded(&server, server_socket.fileno).start).array;
109 }