package org.swellrt.server.box.servlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.waveprotocol.box.server.authentication.SessionManager;
import com.google.common.base.Preconditions;
public class ServiceUtils {
/**
* Extracts the session id string from the URL's path if present.
* For example: ";sid=fds342534sdf"
*
* This function assumes that ";sid=..." string is always at the
* end of the URL's path part.
*
* @param request the HTTP request
* @return the session string or empty string
*/
public static String getSessionIdFromPath(HttpServletRequest request) {
Preconditions.checkNotNull(request, "Request can't be null");
if (request.getPathInfo() == null || request.getPathInfo().isEmpty()) return "";
// The ';sid=' syntax is jetty specific.
int indexSid = request.getPathInfo().indexOf(";"+SessionManager.SESSION_URL_PARAM+"=");
if (indexSid >= 0) {
return request.getPathInfo().substring(indexSid, request.getPathInfo().length());
}
return "";
}
public static Cookie getCookie(HttpServletRequest request, String name) {
Preconditions.checkNotNull(request, "Request can't be null");
Preconditions.checkNotNull(name, "Cookie name can't be null");
Cookie[] cookies = request.getCookies();
if (cookies != null)
for (Cookie c: cookies) {
if (c.getName().equalsIgnoreCase(name))
return c;
}
return null;
}
public static String getSessionUrlRewrite(HttpServletRequest request) {
return getCookie(request, SessionManager.SESSION_COOKIE_NAME) != null ? "" : getSessionIdFromPath(request);
}
public static UrlBuilder getUrlBuilder(final HttpServletRequest request) {
return getUrlBuilder(request, SwellRtServlet.SERVLET_CONTEXT);
}
public static UrlBuilder getUrlBuilder(final HttpServletRequest request, final String context) {
return new UrlBuilder() {
@Override
public String build(String relativePath, String queryString) {
Preconditions.checkNotNull(relativePath, "Path can't be null");
String scheme;
if (request.getHeader("X-Forwarded-Proto") != null) {
scheme = request.getHeader("X-Forwarded-Proto");
} else {
scheme = request.getScheme();
}
String port =
request.getServerPort() == 80 || request.getServerPort() == 443 ? "" : ":"
+ request.getServerPort();
String base = scheme + "://" + request.getServerName() + port;
String sessionRewrite = getSessionUrlRewrite(request);
if (!relativePath.startsWith("/")) relativePath = "/" + relativePath;
if (queryString == null) queryString = "";
String absolute =
base + context + relativePath + sessionRewrite + queryString;
return absolute;
}
};
}
public static void completeRelativeUrls(StringBuilder sb, String urlFieldName,
UrlBuilder urlBuilder) {
int st = sb.indexOf("\"" + urlFieldName + "\"", 0);
while (st >= 0) {
int su = sb.indexOf("\"", st + urlFieldName.length() + 2);
int eu = sb.indexOf("\"", su + 1);
String u = sb.substring(su + 1, eu);
String nu = urlBuilder.build(u, null);
sb.replace(su, eu + 1, "\"" + nu + "\"");
st = sb.indexOf("\"" + urlFieldName + "\"", su + nu.length() + 2);
}
}
}