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 }