HTTP GET support for ACR.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / runtime / CmsAcrHttpHandler.java
index d9fa9e751d64394f37f5651fc0349afdc4580b33..7799a8c4eea29f9f1547721ecbd1c7d431cd847c 100644 (file)
@@ -1,7 +1,43 @@
 package org.argeo.cms.internal.runtime;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Optional;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.CrName;
+import org.argeo.api.acr.spi.ProvidedRepository;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.internal.http.RemoteAuthHttpExchange;
+import org.argeo.util.StreamUtils;
 import org.argeo.util.dav.DavServerHandler;
+import org.argeo.util.http.HttpResponseStatus;
+import org.argeo.util.http.HttpServerUtils;
+
+import com.sun.net.httpserver.HttpExchange;
+
+public class CmsAcrHttpHandler extends DavServerHandler {
+       private ProvidedRepository contentRepository;
+
+       @Override
+       protected void handleGET(HttpExchange exchange) {
+               ContentSession session = RemoteAuthUtils.doAs(() -> contentRepository.get(),
+                               new RemoteAuthHttpExchange(exchange));
+               String relativePath = HttpServerUtils.relativize(exchange);
+               Content content = session.get(ContentUtils.ROOT_SLASH + relativePath);
+               Optional<Long> size = content.get(CrName.size, Long.class);
+               try (InputStream in = content.open(InputStream.class)) {
+                       exchange.sendResponseHeaders(HttpResponseStatus.OK.getStatusCode(), size.orElse(0l));
+                       StreamUtils.copy(in, exchange.getResponseBody());
+               } catch (IOException e) {
+                       throw new RuntimeException("Cannot process " + relativePath, e);
+               }
+       }
 
-public class CmsAcrHttpHandler extends DavServerHandler  {
+       public void setContentRepository(ProvidedRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
 
 }