diff --git a/nim/jpacrepo.nim b/nim/jpacrepo.nim index cd2c765..7aa83c0 100644 --- a/nim/jpacrepo.nim +++ b/nim/jpacrepo.nim @@ -7,13 +7,13 @@ import strutils import sets from sequtils import map, apply -var pkgMap : OrderedTable[string, JsonNode] +var pkgMap : JsonNode type DownloadPanel = ref object badge : Node listgroup : Node pkgs : HashSet[string] - body : Node + footer : Node proc newDownloadPanel(parent : Node) : DownloadPanel = let dp = DownloadPanel() @@ -26,7 +26,6 @@ proc newDownloadPanel(parent : Node) : DownloadPanel = "h3": class ["panel-title"] "a": - #attrs {"data-toggle": "collapse", "href": "#dlist"} text "Package list " "span": class ["badge", "pull-right"] @@ -39,7 +38,7 @@ proc newDownloadPanel(parent : Node) : DownloadPanel = cb: dp.listgroup = node "div": - class ["panel-body"] + class ["panel-footer"] style { "text-align" : "right", "display" :"none" @@ -51,14 +50,33 @@ proc newDownloadPanel(parent : Node) : DownloadPanel = class ["glyphicon", "glyphicon-download"] cb: node.appendChild(document.createTextNode(" Download")) + let clickHandler = proc(e : Event) = + let pkglist : seq[string] = sequtils.toSeq(dp.pkgs.items()) + let r = newXMLHTTPRequest() + let load_cb = proc(e : Event) = + var blob : Blob = r.responseAsBlob #newBlob(r.response, "application/x-tar") + let anchor = document.createElement("a") + let url = createObjectURL(blob) + anchor.setAttribute("href", url) + anchor.setAttribute("download", "archive.tar") + anchor.click() + revokeObjectURL(url) + r.addEventListener("load", load_cb) + r.open("post", "rest/pkg/downloadTar") + r.responseType = "blob" + r.setRequestHeader("Accept", "application/x-tar") + r.setRequestHeader("Content-Type", "application/json") + r.send($(%*pkglist)) + + node.addEventListener("click", clickHandler) cb: - dp.body = node + dp.footer = node dp proc updateBadge(dp : DownloadPanel) = let st = if dp.pkgs.len() > 0: "block" else: "none" - dp.body.style.display = st + dp.footer.style.display = st dp.badge.style.display = st dp.badge.textContent = $dp.pkgs.len() @@ -257,13 +275,8 @@ htmlDocument document, document.body: let r = newXMLHTTPRequest() let load_cb = proc(e : Event) = - let response = parseJson($r.responseText) - pkgMap = response.getFields() - # var keys = newSeq[string]() - # for key in response.getFields().keys(): - # keys.add(key) - # echo keys + pkgMap = parseJson($r.responseText) r.addEventListener("load", load_cb) -r.open("get", "http://oggio88.soon.it/jpacrepo/rest/pkg/map") +r.open("get", "rest/pkg/map") r.setRequestHeader("Accept", "application/json") r.send() diff --git a/src/main/java/com/oggio88/jpacrepo/service/CORSFilter.java b/src/main/java/com/oggio88/jpacrepo/service/CORSFilter.java index c591d77..d92a7fc 100644 --- a/src/main/java/com/oggio88/jpacrepo/service/CORSFilter.java +++ b/src/main/java/com/oggio88/jpacrepo/service/CORSFilter.java @@ -8,6 +8,7 @@ import javax.inject.Inject; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.Provider; import java.io.IOException; import java.util.logging.Logger; @@ -28,7 +29,9 @@ public class CORSFilter implements ContainerResponseFilter { if (!ctx.cors_enabled) { - containerResponseContext.getHeaders().add("Access-Control-Allow-Origin", "*"); + MultivaluedMap headers = containerResponseContext.getHeaders(); + headers.add("Access-Control-Allow-Origin", "*"); + headers.add("Access-Control-Allow-Headers", "Accept, Accept-Language, Content-Language, Content-Type"); } } } diff --git a/src/main/java/com/oggio88/jpacrepo/service/PacmanWebService.java b/src/main/java/com/oggio88/jpacrepo/service/PacmanWebService.java index 0d1c257..dab3fae 100644 --- a/src/main/java/com/oggio88/jpacrepo/service/PacmanWebService.java +++ b/src/main/java/com/oggio88/jpacrepo/service/PacmanWebService.java @@ -293,7 +293,6 @@ public class PacmanWebService } @GET - @CORSManaged @Path("/search") public List searchPackage( @QueryParam("name") String name, @@ -354,6 +353,13 @@ public class PacmanWebService return query.getResultList(); } + @OPTIONS + @Path("/downloadTar") + @Produces("text/plain; charset=UTF-8") + public Response options() { + return Response.ok("POST, OPTIONS").build(); + } + @POST @Path("/downloadTar") @Produces("application/x-tar") @@ -389,7 +395,6 @@ public class PacmanWebService taos.closeArchiveEntry(); } taos.close(); - output.close(); } catch (Exception e) { @@ -398,7 +403,6 @@ public class PacmanWebService finally { taos.close(); - output.close(); } } };