X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fhttp%2Fserver%2FHttpServerUtils.java;h=9d2c1930ae09e7cfd0f400553b5372054bca2508;hb=c7b612ca9bd7df43b0bec37c8abcae846587c978;hp=ab033f0ce068fa36a383769b84f56367e4e5fc37;hpb=bd515365c78edfdabc700f31f29629455bbe2b86;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/http/server/HttpServerUtils.java b/org.argeo.cms/src/org/argeo/cms/http/server/HttpServerUtils.java index ab033f0ce..9d2c1930a 100644 --- a/org.argeo.cms/src/org/argeo/cms/http/server/HttpServerUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/http/server/HttpServerUtils.java @@ -1,8 +1,25 @@ package org.argeo.cms.http.server; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UncheckedIOException; import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Objects; +import org.argeo.api.acr.ContentRepository; +import org.argeo.api.acr.ContentSession; +import org.argeo.cms.auth.RemoteAuthUtils; +import org.argeo.cms.http.HttpMethod; +import org.argeo.cms.http.RemoteAuthHttpExchange; + import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpExchange; @@ -39,6 +56,64 @@ public class HttpServerUtils { return extractPathWithingContext(httpContext, uri.getPath(), true); } + /** Returns content session consistent with this HTTP context. */ + public static ContentSession getContentSession(ContentRepository contentRepository, HttpExchange exchange) { + ContentSession session = RemoteAuthUtils.doAs(() -> contentRepository.get(), + new RemoteAuthHttpExchange(exchange)); + return session; + } + + /* + * QUERY PARAMETERS + */ + /** Returns the HTTP parameters form an {@link HttpExchange}. */ + public static Map> parseParameters(HttpExchange exchange) { + // TODO check encoding? + Charset encoding = StandardCharsets.UTF_8; + + Map> parameters = new HashMap<>(); + URI requestedUri = exchange.getRequestURI(); + String query = requestedUri.getRawQuery(); + parseQuery(query, parameters, encoding); + + // TODO do we really want to support POST? + if (HttpMethod.POST.name().equalsIgnoreCase(exchange.getRequestMethod())) { + String postQuery; + try { + // We do not close the stream on purpose, since the body still needs to be read + BufferedReader br = new BufferedReader(new InputStreamReader(exchange.getRequestBody(), encoding)); + postQuery = br.readLine(); + } catch (IOException e) { + throw new UncheckedIOException("Cannot read exchange body", e); + } + parseQuery(postQuery, parameters, encoding); + } + return parameters; + } + + private static void parseQuery(String query, Map> parameters, Charset encoding) { + if (query == null) + return; + String pairs[] = query.split("[&]"); + for (String pair : pairs) { + String param[] = pair.split("[=]"); + + String key = null; + String value = null; + if (param.length > 0) { + key = URLDecoder.decode(param[0], encoding); + } + + if (param.length > 1) { + value = URLDecoder.decode(param[1], encoding); + } + + if (!parameters.containsKey(key)) + parameters.put(key, new ArrayList<>()); + parameters.get(key).add(value); + } + } + /** singleton */ private HttpServerUtils() {