Do not encode file path in URL

If the file path is encoded relative links cannot be resolved, e.g.
a file 'foo/bar.md' which contains a relative link to 'foo/other.md'
as '[other](other.md)' would be resolved to 'other.md' instead of
'foo/other.md' (because '/' in the URL of 'foo/bar.md' is encoded as
'%2F').

Change-Id: I6eecdec621caa88893f98f5b1330138f861b1f8c
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
index 28d30f7..2b981cb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
@@ -370,7 +370,7 @@
       redirectUrl.append(key.revision);
       redirectUrl.append("/");
     }
-    redirectUrl.append(IdString.fromDecoded(cfg.getIndexFile()).encoded());
+    redirectUrl.append(cfg.getIndexFile());
     return redirectUrl.toString();
   }
 
@@ -406,13 +406,13 @@
             i = rest.indexOf('/');
             if (i != -1 && i != path.length() - 1) {
               revision = IdString.fromUrl(rest.substring(0, i)).get();
-              file = IdString.fromUrl(rest.substring(i + 1)).get();
+              file = rest.substring(i + 1);
             } else {
               revision = IdString.fromUrl(rest).get();
             }
           }
         } else {
-          file = IdString.fromUrl(rest).get();
+          file = rest;
         }
 
       } else {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
index 05a0e7d..1d7cf4e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
@@ -136,7 +136,7 @@
             url.append(Url.encode(revision));
           }
           url.append("/");
-          url.append(Url.encode(fileName));
+          url.append(fileName);
           return url.toString();
         } else {
           return null;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocApi.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocApi.java
index e8de4ab..e7cde1c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocApi.java
@@ -36,7 +36,7 @@
       url.append(URL.encodeQueryString(revision));
     }
     url.append("/");
-    url.append(URL.encodeQueryString(path));
+    url.append(path);
     return url.toString();
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocScreen.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocScreen.java
index f60e140..40ea088 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocScreen.java
@@ -30,7 +30,7 @@
     public void onLoad(Screen screen) {
       String projectName = URL.decode(screen.getToken(1));
       String revision = URL.decode(screen.getToken(2));
-      String path = URL.decode(screen.getToken(3));
+      String path = screen.getToken(3);
       screen.show(new XDocScreen(projectName, revision, path));
       screen.setWindowTitle(FileInfo.getFileName(path));
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocSideBySideDiffScreen.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocSideBySideDiffScreen.java
index d96c6ab..5f1930c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocSideBySideDiffScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocSideBySideDiffScreen.java
@@ -28,7 +28,7 @@
     public void onLoad(Screen screen) {
       String change = URL.decode(screen.getToken(1));
       String patchSet = URL.decode(screen.getToken(2));
-      String path = URL.decode(screen.getToken(4));
+      String path = screen.getToken(4);
       screen.show(new XDocSideBySideDiffScreen(change, patchSet, path));
       screen.setWindowTitle(FileInfo.getFileName(path));
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocUnifiedDiffScreen.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocUnifiedDiffScreen.java
index f97f527..42df4d0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocUnifiedDiffScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocUnifiedDiffScreen.java
@@ -28,7 +28,7 @@
     public void onLoad(Screen screen) {
       String change = URL.decode(screen.getToken(1));
       String patchSet = URL.decode(screen.getToken(2));
-      String path = URL.decode(screen.getToken(4));
+      String path = screen.getToken(4);
       screen.show(new XDocUnifiedDiffScreen(change, patchSet, path));
       screen.setWindowTitle(FileInfo.getFileName(path));
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocsPlugin.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocsPlugin.java
index 3d62ac3..4d09480 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocsPlugin.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocsPlugin.java
@@ -24,13 +24,13 @@
 
   @Override
   public void onPluginLoad() {
-    Plugin.get().screenRegex("project/(.*)/rev/(.*)/(.*)",
+    Plugin.get().screenRegex("project/([^/]*)/rev/([^/]*)/(.*)",
         new XDocScreen.Factory());
-    Plugin.get().screenRegex("project/(.*)/(.*)",
+    Plugin.get().screenRegex("project/([^/]*)/(.*)",
         new XDocScreen.HeadFactory());
-    Plugin.get().screenRegex("c/(.*)/([0-9]+(\\.{2}[0-9]+)?)/(.*),unified",
+    Plugin.get().screenRegex("c/([^/]*)/([0-9]+(\\.{2}[0-9]+)?)/(.*),unified",
         new XDocUnifiedDiffScreen.Factory());
-    Plugin.get().screenRegex("c/(.*)/([0-9]+(\\.{2}[0-9]+)?)/(.*)",
+    Plugin.get().screenRegex("c/([^/]*)/([0-9]+(\\.{2}[0-9]+)?)/(.*)",
         new XDocSideBySideDiffScreen.Factory());
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/ImageFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/ImageFormatter.java
index 3bdc8af..901f900 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/ImageFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/ImageFormatter.java
@@ -57,7 +57,7 @@
       url.append(Url.encode(revision));
     }
     url.append("/");
-    url.append(Url.encode(path));
+    url.append(path);
     return url.toString();
   }
 }
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index 7337f64..f59aa46 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -2,15 +2,15 @@
 
 If projects contain documentation, e.g. as Markdown files, the plugin
 automatically serves the generated HTML under
-`/@PLUGIN@/project/<project-name>/<file-name>`. The project name and
-the file name must be URL encoded.
+`/@PLUGIN@/project/<project-name>/<file-name>`. The project name must
+be URL encoded.
 
 The file is served from the branch/commit to which `HEAD` points unless
 a revision is specified in the URL as
 `/@PLUGIN@/project/<project-name>/rev/<rev>/<file-name>`.
 
 ```
-  /@PLUGIN@/project/external%2Fopenssl/rev/stable-1.3/docs%2Ffaq.md
+  /@PLUGIN@/project/external%2Fopenssl/rev/stable-1.3/docs/faq.md
 ```
 
 `rev` can be any ref or commit that is visible to the calling user.
@@ -22,7 +22,7 @@
 unformatted text.
 
 ```
-  /@PLUGIN@/project/external%2Fopenssl/rev/stable-1.3/docs%2Ffaq.md?raw
+  /@PLUGIN@/project/external%2Fopenssl/rev/stable-1.3/docs/faq.md?raw
 ```
 
 The `raw` parameter cannot be used for binary files.
diff --git a/src/main/resources/Documentation/user.md b/src/main/resources/Documentation/user.md
index 32473e6..5c47321 100644
--- a/src/main/resources/Documentation/user.md
+++ b/src/main/resources/Documentation/user.md
@@ -41,8 +41,7 @@
 
 The URL scheme of the plugin allows to access the HTML of all project
 documentation files in the project from any revision (branch or
-commit). The project name, the revision and the file name must be URL
-encoded.
+commit). The project name and the revision must be URL encoded.
 
 ```
   /@PLUGIN@/project/<project>/rev/<revision>/<file>
@@ -51,7 +50,7 @@
 E.g.:
 
 ```
-  /@PLUGIN@/project/dev%2Ftools%2Fcode-checks/rev/stable-1.3/docs%2Ffaq.md
+  /@PLUGIN@/project/dev%2Ftools%2Fcode-checks/rev/stable-1.3/docs/faq.md
 ```
 
 A project documentation file can contain links to other project