1
18
19 package io.undertow.server.session;
20
21 import java.util.Deque;
22 import java.util.Locale;
23
24 import io.undertow.UndertowLogger;
25 import io.undertow.server.HttpServerExchange;
26
27
32 public class PathParameterSessionConfig implements SessionConfig {
33
34 private final String name;
35
36 public PathParameterSessionConfig(final String name) {
37 this.name = name;
38 }
39
40 public PathParameterSessionConfig() {
41 this(SessionCookieConfig.DEFAULT_SESSION_ID.toLowerCase(Locale.ENGLISH));
42 }
43
44 @Override
45 public void setSessionId(final HttpServerExchange exchange, final String sessionId) {
46 exchange.getPathParameters().remove(name);
47 exchange.addPathParam(name, sessionId);
48 UndertowLogger.SESSION_LOGGER.tracef("Setting path parameter session id %s on %s", sessionId, exchange);
49 }
50
51 @Override
52 public void clearSession(final HttpServerExchange exchange, final String sessionId) {
53 UndertowLogger.SESSION_LOGGER.tracef("Clearing path parameter session id %s on %s", sessionId, exchange);
54 exchange.getPathParameters().remove(name);
55 }
56
57 @Override
58 public String findSessionId(final HttpServerExchange exchange) {
59 Deque<String> stringDeque = exchange.getPathParameters().get(name);
60 if (stringDeque == null) {
61 return null;
62 }
63 UndertowLogger.SESSION_LOGGER.tracef("Found path parameter session id %s on %s", stringDeque.getFirst(), exchange);
64 return stringDeque.getFirst();
65 }
66
67 @Override
68 public SessionCookieSource sessionCookieSource(HttpServerExchange exchange) {
69 return findSessionId(exchange) != null ? SessionCookieSource.URL : SessionCookieSource.NONE;
70 }
71
72
79 @Override
80 public String rewriteUrl(final String url, final String sessionId) {
81 if ((url == null) || (sessionId == null))
82 return (url);
83
84 String path = url;
85 String query = "";
86 String anchor = "";
87 final int question = url.indexOf('?');
88 if (question >= 0) {
89 path = url.substring(0, question);
90 query = url.substring(question);
91 }
92 final int pound = path.indexOf('#');
93 if (pound >= 0) {
94 anchor = path.substring(pound);
95 path = path.substring(0, pound);
96 }
97 final StringBuilder sb = new StringBuilder();
98
99 final int paramIndex = path.indexOf(";" + name);
100
101 if (paramIndex >= 0) {
102 sb.append(path.substring(0, paramIndex));
103 final String remainder = path.substring(paramIndex + name.length() + 1);
104 final int endIndex1 = remainder.indexOf(";");
105 final int endIndex2 = remainder.indexOf("/");
106 if (endIndex1 != -1) {
107 if (endIndex2 != -1 && endIndex2 < endIndex1) {
108 sb.append(remainder.substring(endIndex2));
109 } else {
110 sb.append(remainder.substring(endIndex1));
111 }
112 } else if (endIndex2 != -1) {
113 sb.append(remainder.substring(endIndex2));
114 }
115
116 } else {
117
118 sb.append(path);
119 }
120
121 sb.append(';');
122 sb.append(name);
123 sb.append('=');
124 sb.append(sessionId);
125
126 sb.append(anchor);
127 sb.append(query);
128 UndertowLogger.SESSION_LOGGER.tracef("Rewrote URL from %s to %s", url, sb);
129 return sb.toString();
130 }
131 }
132