001package org.fbsql.servlet;
002
003import static org.fbsql.servlet.StringUtils.q;
004
005import java.sql.SQLException;
006import java.util.Base64;
007import java.util.Enumeration;
008
009import javax.servlet.http.Cookie;
010import javax.servlet.http.HttpServletRequest;
011import javax.servlet.http.HttpSession;
012
013public class HttpRequestUtils {
014
015        /**
016         * Converts HTTP headers to JSON-formatted string
017         *
018         * @param request
019         * @return
020         */
021        public static CharSequence getHttpHeadersJson(HttpServletRequest request) {
022                StringBuilder sb    = new StringBuilder();
023                boolean       first = true;
024                sb.append('{');
025                for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();) {
026                        String header = e.nextElement();
027                        String value  = request.getHeader(header);
028                        if (first)
029                                first = false;
030                        else
031                                sb.append(',');
032                        sb.append(q(header) + ':' + q(value));
033                }
034                sb.append('}');
035                return sb;
036        }
037
038        /**
039         * Converts cookies array to JSON-formatted string
040         *
041         * @param request
042         * @return
043         */
044        public static CharSequence getCookiesJson(Cookie[] cookies) {
045                if (cookies == null)
046                        return "[]";
047                StringBuilder sb = new StringBuilder();
048                sb.append('[');
049                for (int i = 0; i < cookies.length; i++) {
050                        if (i != 0)
051                                sb.append(',');
052                        Cookie cookie = cookies[i];
053                        sb.append("{");
054                        sb.append(q("name")).append(':').append(cookie.getName() == null ? "null" : q(cookie.getName())).append(',');
055                        sb.append(q("value")).append(':').append(cookie.getValue() == null ? "null" : q(cookie.getValue()));
056                        sb.append("}");
057                }
058                sb.append(']');
059                return sb;
060        }
061
062        /**
063         * Converts session attributes to JSON-formatted string
064         *
065         * @param request
066         * @param encoder
067         * @return
068         * @throws SQLException
069         */
070        public static CharSequence generateSessionInfoJson(HttpServletRequest request, Base64.Encoder encoder) throws SQLException {
071                HttpSession session                 = request.getSession(false);
072                String      sessionId               = session.getId();
073                long        sessionCreationTime     = session.getCreationTime();
074                long        sessionLastAccessedTime = session.getLastAccessedTime();
075
076                final char COLON = ':';
077                final char COMMA = ',';
078
079                Enumeration<String> attributeNames = session.getAttributeNames();
080                StringBuilder       sb             = new StringBuilder();
081                sb.append('{');
082                sb.append(q("id")).append(COLON).append(q(sessionId)).append(COMMA);
083                sb.append(q("creationTime")).append(COLON).append(Long.toString(sessionCreationTime)).append(COMMA);
084                sb.append(q("lastAccessedTime")).append(COLON).append(Long.toString(sessionLastAccessedTime)).append(COMMA);
085                sb.append(q("attributes")).append(COLON);
086                sb.append('{');
087                boolean first = true;
088                while (attributeNames.hasMoreElements()) {
089                        String name   = attributeNames.nextElement();
090                        Object value  = session.getAttribute(name);
091                        String svalue = QueryUtils.valueToJsonString(value, encoder);
092                        if (first)
093                                first = false;
094                        else
095                                sb.append(COMMA);
096                        sb.append(q(name) + COLON + svalue);
097                }
098                sb.append('}');
099                sb.append('}');
100                return sb;
101        }
102
103}