Author: toad
Date: 2009-01-06 21:34:01 +0000 (Tue, 06 Jan 2009)
New Revision: 24940
Modified:
trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
trunk/freenet/src/freenet/clients/http/StaticToadlet.java
trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java
trunk/freenet/src/freenet/node/NodeClientCore.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java
Log:
Fix links within freesites.
URL-encode some parts of the URI that were just appended.
Pass static CSS through the content filter to fix the links.
Make the content filter support this (support relative links when the passed-in
base URI is inside the static toadlet).
Modified: trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FProxyToadlet.java 2009-01-06
21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/FProxyToadlet.java 2009-01-06
21:34:01 UTC (rev 24940)
@@ -133,7 +133,7 @@
Bucket toFree = null;
try {
if((!force) && (!forceDownload)) {
- FilterOutput fo = ContentFilter.filter(data,
bucketFactory, mimeType, key.toURI(basePath), container.enableInlinePrefetch()
? prefetchHook : null);
+ FilterOutput fo = ContentFilter.filter(data,
bucketFactory, mimeType, key.toURI(basePath), container.enableInlinePrefetch()
? prefetchHook : null, ctx);
if(data != fo.data) toFree = fo.data;
data = fo.data;
mimeType = fo.type;
Modified: trunk/freenet/src/freenet/clients/http/StaticToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/StaticToadlet.java 2009-01-06
21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/StaticToadlet.java 2009-01-06
21:34:01 UTC (rev 24940)
@@ -9,6 +9,8 @@
import java.util.Date;
import freenet.client.DefaultMIMETypes;
+import freenet.clients.http.filter.ContentFilter;
+import freenet.clients.http.filter.ContentFilter.FilterOutput;
import freenet.l10n.L10n;
import freenet.support.api.Bucket;
import freenet.support.api.HTTPRequest;
@@ -62,10 +64,18 @@
strm.close();
os.close();
+ String mimeType = DefaultMIMETypes.guessMIMEType(path, false);
+
+ if(mimeType.equals("text/css")) {
+ // Easiest way to fix the links is just to pass it
through the content filter.
+ FilterOutput fo = ContentFilter.filter(data,
ctx.getBucketFactory(), mimeType, uri, null, ctx);
+ data = fo.data;
+ }
+
URL url = getClass().getResource(ROOT_PATH+path);
Date mTime = getUrlMTime(url);
- ctx.sendReplyHeaders(200, "OK", null,
DefaultMIMETypes.guessMIMEType(path, false), data.size(), mTime);
+ ctx.sendReplyHeaders(200, "OK", null, mimeType, data.size(),
mTime);
ctx.writeData(data);
data.free();
Modified: trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java
2009-01-06 21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java
2009-01-06 21:34:01 UTC (rev 24940)
@@ -12,6 +12,7 @@
import java.util.HashMap;
import java.util.Hashtable;
+import freenet.clients.http.LinkFixer;
import freenet.l10n.L10n;
import freenet.support.Logger;
import freenet.support.api.Bucket;
@@ -136,7 +137,7 @@
* @throws IllegalStateException
* If data is invalid (e.g. corrupted file) and the filter
have no way to recover.
*/
- public static FilterOutput filter(Bucket data, BucketFactory bf, String
typeName, URI baseURI, FoundURICallback cb) throws UnsafeContentTypeException,
IOException {
+ public static FilterOutput filter(Bucket data, BucketFactory bf, String
typeName, URI baseURI, FoundURICallback cb, LinkFixer fixer) throws
UnsafeContentTypeException, IOException {
if(Logger.shouldLog(Logger.MINOR, ContentFilter.class))
Logger.minor(ContentFilter.class,
"filter(data.size="+data.size()+" typeName="+typeName);
String type = typeName;
@@ -184,7 +185,7 @@
charset = detectCharset(data, handler);
}
- Bucket outputData =
handler.readFilter.readFilter(data, bf, charset, otherParams, new
GenericReadFilterCallback(baseURI, cb));
+ Bucket outputData =
handler.readFilter.readFilter(data, bf, charset, otherParams, new
GenericReadFilterCallback(baseURI, cb, fixer));
if(charset != null)
type = type + "; charset="+charset;
return new FilterOutput(outputData, type);
Modified:
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
===================================================================
---
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
2009-01-06 21:22:31 UTC (rev 24939)
+++
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
2009-01-06 21:34:01 UTC (rev 24940)
@@ -11,6 +11,7 @@
import java.util.HashSet;
import freenet.clients.http.HTTPRequestImpl;
+import freenet.clients.http.LinkFixer;
import freenet.clients.http.StaticToadlet;
import freenet.keys.FreenetURI;
import freenet.l10n.L10n;
@@ -40,18 +41,21 @@
private URI baseURI;
private URI strippedBaseURI;
private final FoundURICallback cb;
+ private final LinkFixer fixer;
- public GenericReadFilterCallback(URI uri, FoundURICallback cb) {
+ public GenericReadFilterCallback(URI uri, FoundURICallback cb,
LinkFixer fixer) {
+ this.fixer = fixer;
this.baseURI = uri;
this.cb = cb;
setStrippedURI(uri.toString());
}
- public GenericReadFilterCallback(FreenetURI uri, FoundURICallback cb) {
+ public GenericReadFilterCallback(FreenetURI uri, FoundURICallback cb,
LinkFixer fixer) {
try {
this.baseURI = uri.toRelativeURI();
setStrippedURI(baseURI.toString());
this.cb = cb;
+ this.fixer = fixer;
} catch (URISyntaxException e) {
throw new Error(e);
}
@@ -131,10 +135,10 @@
bookmark_activelink =
HTMLEncoder.encode(bookmark_activelink);
url = url+"&hasAnActivelink=true";
}
- return url;
+ return fixer.fixLink(url);
} else if(path.startsWith(StaticToadlet.ROOT_URL)) {
// @see bug #2297
- return path;
+ return fixer.fixLink(path);
}
}
@@ -175,6 +179,11 @@
// Relative URI
rpath = resolved.getPath();
+
+ if(rpath.startsWith(StaticToadlet.ROOT_URL)) {
+ return fixer.fixLink(rpath);
+ }
+
if(rpath == null) throw new CommentException("No URI");
if(logMINOR) Logger.minor(this, "Resolved URI (rpath
relative): "+rpath);
@@ -197,7 +206,7 @@
}
if(GenericReadFilterCallback.allowedProtocols.contains(uri.getScheme()))
- return
"/?"+GenericReadFilterCallback.magicHTTPEscapeString+ '=' +uri;
+ return
fixer.fixLink("/?"+GenericReadFilterCallback.magicHTTPEscapeString+ '='
+freenet.support.URLEncoder.encode(uri.toString(), false));
else {
if(uri.getScheme() == null) {
throw new CommentException(reason);
@@ -237,15 +246,17 @@
sb.append(path);
if(typeOverride != null) {
sb.append("?type=");
- sb.append(typeOverride);
+
sb.append(freenet.support.URLEncoder.encode(typeOverride, false));
}
if(u.getFragment() != null) {
sb.append('#');
- sb.append(u.getRawFragment());
+
sb.append(freenet.support.URLEncoder.encode(u.getRawFragment(), false));
}
URI uri = new URI(sb.toString());
+ uri = fixer.fixLink(uri);
+
if(!noRelative)
uri = strippedBaseURI.relativize(uri);
if(Logger.shouldLog(Logger.MINOR, this))
@@ -255,7 +266,7 @@
Logger.error(this, "Could not parse own URI:
path="+path+", typeOverride="+typeOverride+", frag="+u.getFragment()+" : "+e,
e);
String p = path;
if(typeOverride != null)
- p += "?type="+typeOverride;
+ p +=
"?type="+freenet.support.URLEncoder.encode(typeOverride, false);
if(u.getFragment() != null){
try{
// FIXME encode it properly
@@ -345,7 +356,7 @@
}
public static String escapeURL(String uri) {
- return "/?" + magicHTTPEscapeString + '=' + uri;
+ return "/?" + magicHTTPEscapeString + '=' +
freenet.support.URLEncoder.encode(uri, false);
}
}
Modified: trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java
2009-01-06 21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java
2009-01-06 21:34:01 UTC (rev 24940)
@@ -304,7 +304,7 @@
final Bucket out = new FileBucket(fout, false, true, false,
false, false);
try {
Logger.setupStdoutLogging(Logger.MINOR, "");
- ContentFilter.FilterOutput output =
ContentFilter.filter(data, new ArrayBucketFactory(), "image/png", new
URI("http://127.0.0.1:8888/"), null);
+ ContentFilter.FilterOutput output =
ContentFilter.filter(data, new ArrayBucketFactory(), "image/png", new
URI("http://127.0.0.1:8888/"), null, null);
BucketTools.copy(output.data, out);
} catch(IOException e) {
System.out.println("Bucket error?: " + e.getMessage());
Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java 2009-01-06 21:22:31 UTC
(rev 24939)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java 2009-01-06 21:34:01 UTC
(rev 24940)
@@ -15,6 +15,7 @@
import freenet.client.async.USKManager;
import freenet.client.events.SimpleEventProducer;
import freenet.clients.http.FProxyToadlet;
+import freenet.clients.http.LinkFixer;
import freenet.clients.http.SimpleToadletServer;
import freenet.clients.http.filter.FilterCallback;
import freenet.clients.http.filter.FoundURICallback;
@@ -1143,10 +1144,10 @@
return node.getMyName();
}
- public FilterCallback createFilterCallback(URI uri, FoundURICallback
cb) {
+ public FilterCallback createFilterCallback(URI uri, FoundURICallback
cb, LinkFixer fixer) {
if(logMINOR)
- Logger.minor(this, "Creating filter callback: " + uri +
", " + cb);
- return new GenericReadFilterCallback(uri, cb);
+ Logger.minor(this, "Creating filter callback: " + uri +
", " + cb+" , "+fixer);
+ return new GenericReadFilterCallback(uri, cb, fixer);
}
public int maxBackgroundUSKFetchers() {
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2009-01-06
21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2009-01-06
21:34:01 UTC (rev 24940)
@@ -31,6 +31,8 @@
import freenet.client.InsertBlock;
import freenet.client.InsertException;
import freenet.client.events.EventDumper;
+import freenet.clients.http.LinkFixer;
+import freenet.clients.http.NullLinkFixer;
import freenet.clients.http.filter.ContentFilter;
import freenet.clients.http.filter.ContentFilter.FilterOutput;
import freenet.crypt.RandomSource;
@@ -351,7 +353,9 @@
final String content = readLines(reader, false);
final Bucket data = new ArrayBucket(content.getBytes("UTF-8"));
try {
- FilterOutput output = ContentFilter.filter(data, new
ArrayBucketFactory(), "text/html", new URI("http://127.0.0.1:8888/"), null);
+ LinkFixer fixer = n.clientCore.toadletContainer;
+ if(fixer == null) fixer = new NullLinkFixer();
+ FilterOutput output = ContentFilter.filter(data, new
ArrayBucketFactory(), "text/html", new URI("http://127.0.0.1:8888/"), null, new
NullLinkFixer());
BufferedInputStream bis = new
BufferedInputStream(output.data.getInputStream());
while(bis.available() > 0){
Modified: trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java
2009-01-06 21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java
2009-01-06 21:34:01 UTC (rev 24940)
@@ -3,6 +3,7 @@
import java.net.URISyntaxException;
import freenet.client.HighLevelSimpleClient;
+import freenet.clients.http.NullLinkFixer;
import freenet.clients.http.PageMaker;
import freenet.clients.http.filter.FilterCallback;
import freenet.node.Node;
@@ -39,7 +40,7 @@
public FilterCallback makeFilterCallback(String path) {
try {
- return
node.clientCore.createFilterCallback(URIPreEncoder.encodeURI(path), null);
+ return
node.clientCore.createFilterCallback(URIPreEncoder.encodeURI(path), null, new
NullLinkFixer());
} catch (URISyntaxException e) {
throw new Error(e);
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs