1 module hunt.http.codec.http.model.CookieParser;
2 
3 import hunt.http.codec.http.model.Cookie;
4 
5 import hunt.lang.exception;
6 import hunt.string;
7 
8 // import hunt.container.ArrayList;
9 // import hunt.container.List;
10 
11 import std.array;
12 import std.container.array;
13 import std.conv;
14 import std.string;
15 
16 abstract class CookieParser {
17 
18     // interface CookieParserCallback {
19     //     void cookie(string name, string value);
20     // }
21     alias CookieParserCallback = void delegate(string name, string value);
22 
23     static void parseCookies(string cookieStr, CookieParserCallback callback) {
24         if (empty(cookieStr)) {
25             throw new IllegalArgumentException("the cookie string is empty");
26         } else {
27             string[] cookieKeyValues = StringUtils.split(cookieStr, ";");
28             foreach (string cookieKeyValue ; cookieKeyValues) {
29                 string[] kv = StringUtils.split(cookieKeyValue, "=", 2);
30                 if (kv != null) {
31                     if (kv.length == 2) {
32                         callback(kv[0].strip(), kv[1].strip());
33                     } else if (kv.length == 1) {
34                         callback(kv[0].strip(), "");
35                     } else {
36                         throw new IllegalStateException("the cookie string format error");
37                     }
38                 } else {
39                     throw new IllegalStateException("the cookie string format error");
40                 }
41             }
42         }
43     }
44 
45     static Cookie parseSetCookie(string cookieStr) {
46         Cookie cookie = new Cookie();
47         parseCookies(cookieStr, (name, value) {
48             if ("Comment".equalsIgnoreCase(name)) {
49                 cookie.setComment(value);
50             } else if ("Domain".equalsIgnoreCase(name)) {
51                 cookie.setDomain(value);
52             } else if ("Max-Age".equalsIgnoreCase(name)) {
53                 cookie.setMaxAge(to!int(value));
54             } else if ("Path".equalsIgnoreCase(name)) {
55                 cookie.setPath(value);
56             } else if ("Secure".equalsIgnoreCase(name)) {
57                 cookie.setSecure(true);
58             } else if ("Version".equalsIgnoreCase(name)) {
59                 cookie.setVersion(to!int(value));
60             } else {
61                 cookie.setName(name);
62                 cookie.setValue(value);
63             }
64 
65         });
66         return cookie;
67     }
68 
69     static Cookie[] parseCookie(string cookieStr) {
70         Array!(Cookie) list;
71         parseCookies(cookieStr, (name, value) { list.insertBack(new Cookie(name, value)); });
72         return list.array();
73     }
74 
75     // static List<javax.servlet.http.Cookie> parserServletCookie(string cookieStr) {
76     //     List<javax.servlet.http.Cookie> list = new ArrayList<>();
77     //     parseCookies(cookieStr, (name, value) -> list.add(new javax.servlet.http.Cookie(name, value)));
78     //     return list;
79     // }
80 }