X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2Fpage%2FPageToadlet.java;h=2b223777b66992fbdd908769d965c5a55079645d;hp=57a34395ee78f4855bfd05f795de2ffd294d206f;hb=c28013c8a4bcb9776a1e2d82ffd6c4c8297ffb62;hpb=13bc2f6ae2379dd9f81edb4848971c8b4e91aabd diff --git a/src/main/java/net/pterodactylus/sone/web/page/PageToadlet.java b/src/main/java/net/pterodactylus/sone/web/page/PageToadlet.java index 57a3439..2b22377 100644 --- a/src/main/java/net/pterodactylus/sone/web/page/PageToadlet.java +++ b/src/main/java/net/pterodactylus/sone/web/page/PageToadlet.java @@ -1,5 +1,5 @@ /* - * shortener - PageToadlet.java - Copyright © 2010 David Roden + * Sone - PageToadlet.java - Copyright © 2010–2019 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,41 +18,47 @@ package net.pterodactylus.sone.web.page; import java.io.IOException; +import java.io.OutputStream; import java.net.URI; -import java.util.Map.Entry; -import net.pterodactylus.sone.web.page.Page.Request.Method; +import net.pterodactylus.sone.utils.AutoCloseableBucket; +import net.pterodactylus.util.web.Header; +import net.pterodactylus.util.web.Method; +import net.pterodactylus.util.web.Page; +import net.pterodactylus.util.web.Response; + import freenet.client.HighLevelSimpleClient; import freenet.clients.http.LinkEnabledCallback; +import freenet.clients.http.LinkFilterExceptedToadlet; +import freenet.clients.http.SessionManager; import freenet.clients.http.Toadlet; import freenet.clients.http.ToadletContext; import freenet.clients.http.ToadletContextClosedException; +import freenet.l10n.NodeL10n; import freenet.support.MultiValueTable; -import freenet.support.api.Bucket; import freenet.support.api.HTTPRequest; -import freenet.support.io.BucketTools; -import freenet.support.io.Closer; /** * {@link Toadlet} implementation that is wrapped around a {@link Page}. - * - * @author David ‘Bombe’ Roden */ -public class PageToadlet extends Toadlet implements LinkEnabledCallback { +public class PageToadlet extends Toadlet implements LinkEnabledCallback, LinkFilterExceptedToadlet { + + private final SessionManager sessionManager; /** The name of the menu item. */ private final String menuName; /** The page that handles processing. */ - private final Page page; + private final Page page; /** The path prefix for the page. */ private final String pathPrefix; /** * Creates a new toadlet that hands off processing to a {@link Page}. - * + * * @param highLevelSimpleClient + * The high-level simple client * @param menuName * The name of the menu item * @param page @@ -61,8 +67,9 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { * Prefix that is prepended to all {@link Page#getPath()} return * values */ - protected PageToadlet(HighLevelSimpleClient highLevelSimpleClient, String menuName, Page page, String pathPrefix) { + protected PageToadlet(HighLevelSimpleClient highLevelSimpleClient, SessionManager sessionManager, String menuName, Page page, String pathPrefix) { super(highLevelSimpleClient); + this.sessionManager = sessionManager; this.menuName = menuName; this.page = page; this.pathPrefix = pathPrefix; @@ -70,7 +77,7 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { /** * Returns the name to display in the menu. - * + * * @return The name in the menu */ public String getMenuName() { @@ -87,7 +94,7 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { /** * Handles a HTTP GET request. - * + * * @param uri * The URI of the request * @param httpRequest @@ -100,12 +107,12 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { * if the toadlet context is closed */ public void handleMethodGET(URI uri, HTTPRequest httpRequest, ToadletContext toadletContext) throws IOException, ToadletContextClosedException { - handleRequest(new Page.Request(uri, Method.GET, httpRequest, toadletContext)); + handleRequest(new FreenetRequest(uri, Method.GET, httpRequest, toadletContext, NodeL10n.getBase(), sessionManager)); } /** * Handles a HTTP POST request. - * + * * @param uri * The URI of the request * @param httpRequest @@ -118,7 +125,7 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { * if the toadlet context is closed */ public void handleMethodPOST(URI uri, HTTPRequest httpRequest, ToadletContext toadletContext) throws IOException, ToadletContextClosedException { - handleRequest(new Page.Request(uri, Method.POST, httpRequest, toadletContext)); + handleRequest(new FreenetRequest(uri, Method.POST, httpRequest, toadletContext, NodeL10n.getBase(), sessionManager)); } /** @@ -131,7 +138,7 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { /** * Handles a HTTP request. - * + * * @param pageRequest * The request to handle * @throws IOException @@ -139,32 +146,19 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { * @throws ToadletContextClosedException * if the toadlet context is closed */ - private void handleRequest(Page.Request pageRequest) throws IOException, ToadletContextClosedException { - Bucket data = null; - try { - Page.Response pageResponse = page.handleRequest(pageRequest); - MultiValueTable headers = new MultiValueTable(); + private void handleRequest(FreenetRequest pageRequest) throws IOException, ToadletContextClosedException { + try (AutoCloseableBucket pageBucket = new AutoCloseableBucket(pageRequest.getToadletContext().getBucketFactory().makeBucket(-1)); + OutputStream pageBucketOutputStream = pageBucket.getBucket().getOutputStream()) { + Response pageResponse = page.handleRequest(pageRequest, new Response(pageBucketOutputStream)); + MultiValueTable headers = new MultiValueTable<>(); if (pageResponse.getHeaders() != null) { - for (Entry headerEntry : pageResponse.getHeaders().entrySet()) { - headers.put(headerEntry.getKey(), headerEntry.getValue()); - } - } - data = pageRequest.getToadletContext().getBucketFactory().makeBucket(-1); - if (pageResponse.getContent() != null) { - try { - BucketTools.copyFrom(data, pageResponse.getContent(), -1); - } finally { - Closer.close(pageResponse.getContent()); + for (Header header : pageResponse.getHeaders()) { + for (String value : header) { + headers.put(header.getName(), value); + } } - } else { - /* get an OutputStream and close it immediately. */ - Closer.close(data.getOutputStream()); } - writeReply(pageRequest.getToadletContext(), pageResponse.getStatusCode(), pageResponse.getContentType(), pageResponse.getStatusText(), headers, data); - } catch (Throwable t1) { - writeInternalError(t1, pageRequest.getToadletContext()); - } finally { - Closer.close(data); + writeReply(pageRequest.getToadletContext(), pageResponse.getStatusCode(), pageResponse.getContentType(), pageResponse.getStatusText(), headers, pageBucket.getBucket()); } } @@ -173,7 +167,22 @@ public class PageToadlet extends Toadlet implements LinkEnabledCallback { */ @Override public boolean isEnabled(ToadletContext toadletContext) { + if (page instanceof LinkEnabledCallback) { + return ((LinkEnabledCallback) page).isEnabled(toadletContext); + } return true; } + // + // LINKFILTEREXCEPTEDTOADLET METHODS + // + + /** + * {@inheritDoc} + */ + @Override + public boolean isLinkExcepted(URI link) { + return (page instanceof FreenetPage) && ((FreenetPage) page).isLinkExcepted(link); + } + }