This is an automated email from the ASF dual-hosted git repository.

rnewson pushed a commit to branch dropwizard-5
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit ed2746685063c10671deb867984af983db71ac13
Author: Robert Newson <[email protected]>
AuthorDate: Wed Dec 10 20:43:57 2025 +0000

    upgrade to dropwizard 5
    
    ServletSpec 6.0 prohibits using encoded forward slash, which
    nouveau (and couchdb more generally) has used on purpose.
    
    For now I swap it for : and back again but will need to ponder this
    more before merging this.
---
 extra/nouveau/build.gradle                             |  2 +-
 .../org/apache/couchdb/nouveau/core/IndexManager.java  |  5 ++---
 .../couchdb/nouveau/resources/IndexResource.java       | 18 +++++++++++-------
 src/nouveau/src/nouveau_api.erl                        | 11 +++++++----
 4 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/extra/nouveau/build.gradle b/extra/nouveau/build.gradle
index a91555971..c6008be12 100644
--- a/extra/nouveau/build.gradle
+++ b/extra/nouveau/build.gradle
@@ -16,7 +16,7 @@ repositories {
 }
 
 dependencies {
-    implementation platform('io.dropwizard:dropwizard-dependencies:4.0.12')
+    implementation platform('io.dropwizard:dropwizard-dependencies:5.0.0')
     implementation 'io.dropwizard:dropwizard-core'
     implementation 'io.dropwizard:dropwizard-http2'
     implementation 'io.dropwizard.metrics:metrics-core'
diff --git 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
index 4067716ee..9f4ffc3df 100644
--- 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
+++ 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
@@ -102,8 +102,7 @@ public final class IndexManager implements Managed {
 
     private StripedLock<String> createLock;
 
-    public <R> R with(final String name, final IndexFunction<Index, R> 
indexFun)
-            throws IOException, InterruptedException {
+    public <R> R with(String name, final IndexFunction<Index, R> indexFun) 
throws IOException, InterruptedException {
         evictIfOverCapacity();
 
         retry:
@@ -214,7 +213,7 @@ public final class IndexManager implements Managed {
         }
     }
 
-    public void create(final String name, IndexDefinition indexDefinition) 
throws IOException {
+    public void create(String name, IndexDefinition indexDefinition) throws 
IOException {
         if (exists(name)) {
             assertSame(indexDefinition, loadIndexDefinition(name));
             return;
diff --git 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
index 9ba382109..0e09a1c57 100644
--- 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
+++ 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
@@ -63,7 +63,7 @@ public final class IndexResource {
             throw new WebApplicationException(
                     "Cannot create a new version " + 
indexDefinition.getLuceneVersion() + " index", Status.BAD_REQUEST);
         }
-        indexManager.create(name, indexDefinition);
+        indexManager.create(fix(name), indexDefinition);
         return Ok.INSTANCE;
     }
 
@@ -74,7 +74,7 @@ public final class IndexResource {
             @PathParam("docId") String docId,
             @NotNull @Valid DocumentDeleteRequest request)
             throws Exception {
-        return indexManager.with(name, (index) -> {
+        return indexManager.with(fix(name), (index) -> {
             index.delete(docId, request);
             return Ok.INSTANCE;
         });
@@ -82,20 +82,20 @@ public final class IndexResource {
 
     @DELETE
     public Ok deletePath(@PathParam("name") String path, @Valid final 
List<String> exclusions) throws IOException {
-        indexManager.deleteAll(path, exclusions);
+        indexManager.deleteAll(fix(path), exclusions);
         return Ok.INSTANCE;
     }
 
     @GET
     public IndexInfo getIndexInfo(@PathParam("name") String name) throws 
Exception {
-        return indexManager.with(name, (index) -> {
+        return indexManager.with(fix(name), (index) -> {
             return index.info();
         });
     }
 
     @POST
     public Ok setIndexInfo(@PathParam("name") String name, @NotNull @Valid 
IndexInfoRequest request) throws Exception {
-        return indexManager.with(name, (index) -> {
+        return indexManager.with(fix(name), (index) -> {
             if (request.getMatchUpdateSeq().isPresent()
                     && request.getUpdateSeq().isPresent()) {
                 index.setUpdateSeq(
@@ -115,7 +115,7 @@ public final class IndexResource {
     @Path("/search")
     public SearchResults searchIndex(@PathParam("name") String name, @NotNull 
@Valid SearchRequest request)
             throws Exception {
-        return indexManager.with(name, (index) -> {
+        return indexManager.with(fix(name), (index) -> {
             return index.search(request);
         });
     }
@@ -127,9 +127,13 @@ public final class IndexResource {
             @PathParam("docId") String docId,
             @NotNull @Valid DocumentUpdateRequest request)
             throws Exception {
-        return indexManager.with(name, (index) -> {
+        return indexManager.with(fix(name), (index) -> {
             index.update(docId, request);
             return Ok.INSTANCE;
         });
     }
+
+    private String fix(final String path) {
+        return path.replaceAll(":", "/");
+    }
 }
diff --git a/src/nouveau/src/nouveau_api.erl b/src/nouveau/src/nouveau_api.erl
index 2d140e580..b58a0de32 100644
--- a/src/nouveau/src/nouveau_api.erl
+++ b/src/nouveau/src/nouveau_api.erl
@@ -230,18 +230,21 @@ supported_lucene_versions() ->
 %% private functions
 
 index_path(Path) when is_binary(Path) ->
-    [<<"/index/">>, couch_util:url_encode(Path)];
+    [<<"/index/">>, disambiguate_path(Path)];
 index_path(#index{} = Index) ->
-    [<<"/index/">>, couch_util:url_encode(nouveau_util:index_name(Index))].
+    [<<"/index/">>, disambiguate_path(nouveau_util:index_name(Index))].
 
 doc_path(#index{} = Index, DocId) ->
     [
         <<"/index/">>,
-        couch_util:url_encode(nouveau_util:index_name(Index)),
+        disambiguate_path(nouveau_util:index_name(Index)),
         <<"/doc/">>,
-        couch_util:url_encode(DocId)
+        DocId
     ].
 
+disambiguate_path(Path) ->
+    re:replace(Path, "/", ":", [global]).
+
 search_path(#index{} = Index) ->
     [index_path(Index), <<"/search">>].
 

Reply via email to