首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,如何在URL/URI中对默认的vhost %2F进行编码,使其不被更改为斜杠而无法工作

在Java中,如何在URL/URI中对默认的vhost %2F进行编码,使其不被更改为斜杠而无法工作
EN

Stack Overflow用户
提问于 2015-11-24 05:25:15
回答 1查看 862关注 0票数 1

要使用admin,根据文档:第2段,这里,默认的vhost "/“必须编码为%2F。

我不得不让java.net.URI类(大多数http-requestish (例如,org.apache.http.client.methods.HttpRequestBase)都使用)来发出该表单的字符串。

也就是说,我希望new URI("http", null, "localhost", 8080, "/api/exchanges/%2F", "", null).toASCIIString()成为http://localhost:8080/api/exchanges/%2F?,但它不是,而是http://localhost:8080/api/exchanges/%252F?

如果路径是/api/exchanges// (双斜杠,其中第二个斜杠应该是默认的vhost,这是错误的,但没关系),那么结果是http://localhost:8800/api/exchanges//? (它不工作RabbitMQ管理服务,它认为它是http://localhost:8800/api/exchanges/ (一个斜杠),然后返回所有vhost上的所有交换。

那么,有什么秘密?

(顺便说一句,这个问题不是一个骗局:它都是从一个File开始的,它确实应该对路径中的"/“有专门的知识。我在这里说的只是简简单单的乌里斯。)

FYI,显示各种排列的代码墙TestNG测试--这些测试都通过了,这表明我无法以这种方式获得%2F

代码语言:javascript
复制
package com.bakins_bits;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import org.testng.annotations.Test;

public class TestSingleSlashURIPaths
{
    @Test(enabled = true)
    public void does_URI_or_URL_mangle_single_slash_paths_example_1()
        throws MalformedURLException, UnsupportedEncodingException, URISyntaxException {
        // ARRANGE
        String sut = "http://localhost:8800/api/exchanges//";

        // ACT
        URL url = new URL(sut);
        String path = "/api/exchanges//";
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), path, "", url.getRef());
        String result = uri.toURL().toString();

        // ASSERT
        assertThat(url.toString()).isEqualTo("http://localhost:8800/api/exchanges//");
        assertThat(uri.getPath()).isEqualTo("/api/exchanges//");
        assertThat(uri.toString()).isEqualTo("http://localhost:8800/api/exchanges//?");
        assertThat(uri.toASCIIString()).isEqualTo("http://localhost:8800/api/exchanges//?");
        assertThat(result).isEqualTo("http://localhost:8800/api/exchanges//?");
    }

    @Test(enabled = true)
    public void does_URI_or_URL_mangle_single_slash_paths_example_2()
        throws MalformedURLException, UnsupportedEncodingException, URISyntaxException {
        // ARRANGE
        String sut = "http://localhost:8800/api/exchanges/%2F";

        // ACT
        URL url = new URL(sut);
        String path = "/api/exchanges/%2F";
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), path, "", url.getRef());
        String result = uri.toURL().toString();

        // ASSERT
        assertThat(url.toString()).isEqualTo("http://localhost:8800/api/exchanges/%2F");
        assertThat(uri.getPath()).isEqualTo("/api/exchanges/%2F");
        assertThat(uri.toString()).isEqualTo("http://localhost:8800/api/exchanges/%252F?");
        assertThat(uri.toASCIIString()).isEqualTo("http://localhost:8800/api/exchanges/%252F?");
        assertThat(result).isEqualTo("http://localhost:8800/api/exchanges/%252F?");
    }

    @Test(enabled = true)
    public void does_URI_or_URL_mangle_single_slash_paths_example_3()
        throws MalformedURLException, UnsupportedEncodingException, URISyntaxException {
        // ARRANGE
        String sut = "http://localhost:8800/api/exchanges/%252F";

        // ACT
        URL url = new URL(sut);
        String path = "/api/exchanges/%252F"; // try pre-encoding the '%'
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), path, "", url.getRef());
        String result = uri.toURL().toString();

        // ASSERT
        assertThat(url.toString()).isEqualTo("http://localhost:8800/api/exchanges/%252F");
        assertThat(uri.getPath()).isEqualTo("/api/exchanges/%252F");
        assertThat(uri.toString()).isEqualTo("http://localhost:8800/api/exchanges/%25252F?");
        assertThat(uri.toASCIIString()).isEqualTo("http://localhost:8800/api/exchanges/%25252F?");
        assertThat(result).isEqualTo("http://localhost:8800/api/exchanges/%25252F?");
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 14:37:47

令人着迷。@dave_thompson_085和@亚优在上面的评论中给出了答案(不知道如何给他们代表信用,因为这些不是答案)。(我当时正经历着一种隧道式的幻觉,我自己也没有尝试过。)

问题显然出现在构造函数URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)中,因为构造函数URI(String str)可以工作。

注意,即使在这种情况下(请参阅下面的测试),URI::getPath()也不会返回您期望的%2F (因为这是您的输入),而是返回/

尽管如此,我还是很高兴,因为这意味着问题可以在我使用的客户端库中解决(它使用的是7参数构造函数,而不是1参数构造函数)。所以我会在那里归档一个窃听器。(不幸的是,具有此构造函数调用的库中的方法是助手类中的private static,它在另一个静态方法中被调用(并放入一个消耗的数据结构),因此我无法制作简单/明显的运行时修补程序(例如,子类)。I讨厌实用程序类。我必须自己构建这个库的副本来修复它。)

谢谢!

代码语言:javascript
复制
    @Test(enabled = true)
    public void does_URI_or_URL_mangle_single_slash_paths_example_4()
        throws MalformedURLException, UnsupportedEncodingException, URISyntaxException {
        // ARRANGE
        String sut = "http://localhost:8800/api/exchanges/%2F?";

        // ACT
        URI uri = new URI(sut);
        String result = uri.toURL().toString();

        // ASSERT
        assertThat(uri.getPath()).isEqualTo("/api/exchanges//"); // <== this seems wrong!
        assertThat(uri.toString()).isEqualTo("http://localhost:8800/api/exchanges/%2F?");
        assertThat(uri.toASCIIString()).isEqualTo("http://localhost:8800/api/exchanges/%2F?");
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33886037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档