1 module hunt.http.codec.http.stream.HttpHandler;
2 
3 import hunt.http.codec.http.stream.HttpOutputStream;
4 import hunt.http.codec.http.stream.HttpConnection;
5 
6 import hunt.http.codec.http.model.MetaData;
7 
8 import hunt.lang.common;
9 import hunt.container.ByteBuffer;
10 
11 // alias HttpRequest = HttpRequest;
12 // alias HttpResponse = HttpResponse;
13 
14 interface HttpHandler {
15 
16     bool content(ByteBuffer item, HttpRequest request, HttpResponse response,
17                     HttpOutputStream output,
18                     HttpConnection connection);
19 
20     bool contentComplete(HttpRequest request, HttpResponse response,
21                             HttpOutputStream output,
22                             HttpConnection connection);
23 
24     bool headerComplete(HttpRequest request, HttpResponse response,
25                            HttpOutputStream output,
26                            HttpConnection connection);
27 
28     bool messageComplete(HttpRequest request, HttpResponse response,
29                             HttpOutputStream output,
30                             HttpConnection connection);
31 
32     void badMessage(int status, string reason, HttpRequest request, HttpResponse response,
33                     HttpOutputStream output, HttpConnection connection);
34 
35     void earlyEOF(HttpRequest request, HttpResponse response,
36                   HttpOutputStream output,
37                   HttpConnection connection);
38 
39 }
40 
41 
42 class HttpHandlerAdapter : HttpHandler {
43 
44     protected Func4!(HttpRequest, HttpResponse, HttpOutputStream, HttpConnection, bool) _headerComplete;
45     protected Func5!(ByteBuffer, HttpRequest, HttpResponse, HttpOutputStream, HttpConnection, bool) _content;
46     protected Func4!(HttpRequest, HttpResponse, HttpOutputStream, HttpConnection, bool) _contentComplete;
47     protected Func4!(HttpRequest, HttpResponse, HttpOutputStream, HttpConnection, bool) _messageComplete;
48     protected Action6!(int, string, HttpRequest, HttpResponse, HttpOutputStream, HttpConnection) _badMessage;
49     protected Action4!(HttpRequest, HttpResponse, HttpOutputStream, HttpConnection) _earlyEOF;
50 
51     override
52     bool headerComplete(HttpRequest request, HttpResponse response,
53                                     HttpOutputStream output,
54                                     HttpConnection connection) {
55         if (_headerComplete !is null) {
56             return _headerComplete(request, response, output, connection);
57         } else {
58             return false;
59         }
60     }
61 
62     override
63     bool content(ByteBuffer item, HttpRequest request, HttpResponse response,
64                             HttpOutputStream output,
65                             HttpConnection connection) {
66         if (_content !is null) {
67             return _content(item, request, response, output, connection);
68         } else {
69             return false;
70         }
71     }
72 
73     override
74     bool contentComplete(HttpRequest request, HttpResponse response,
75                                     HttpOutputStream output,
76                                     HttpConnection connection) {
77         if (_contentComplete !is null) {
78             return _contentComplete(request, response, output, connection);
79         } else {
80             return false;
81         }
82     }
83 
84 
85     override
86     bool messageComplete(HttpRequest request, HttpResponse response,
87                                     HttpOutputStream output,
88                                     HttpConnection connection) {
89         if (_messageComplete !is null) {
90             return _messageComplete(request, response, output, connection);
91         } else {
92             return true;
93         }
94     }
95 
96     override
97     void badMessage(int status, string reason, HttpRequest request, HttpResponse response,
98                             HttpOutputStream output,
99                             HttpConnection connection) {
100         if (_badMessage !is null) {
101             _badMessage(status, reason, request, response, output, connection);
102         }
103     }
104 
105     override
106     void earlyEOF(HttpRequest request, HttpResponse response, HttpOutputStream output, HttpConnection connection) {
107         if (_earlyEOF !is null) {
108             _earlyEOF(request, response, output, connection);
109         }
110     }
111 
112 }