在http请求中转义感叹号

时间:2014-03-12 05:17:11

标签: http go escaping

我有一个像

这样的网址
http://app.chat.com/avert!Callbcak.htm

要求。

我用golang

创建了请求
req, _ := http.NewRequest("GET", "http://app.chat.com/avert!Callbcak.htm", nil)
fmt.Printf("%v\n", req.URL.String())

结果是

http://app.chat.com/avert%21Callbcak.htm

这不起作用,网站需要没有转义感叹号的网址。

如何正确请求该网址?

2 个答案:

答案 0 :(得分:0)

来自http://tools.ietf.org/html/rfc3986

  

关于角色的第2节已被重写以解释什么
  保留字符,保留字符以及为什么是字符   保留,即使它们没有被通用的分隔符用作分隔符   句法。通常不安全解码的标记字符,
  包括感叹号(“!”),星号(“*”),单引号
  (“'”),打开和关闭括号(“(”和“)”)已被移动
  保留集以澄清之间的区别   保留,毫无保留,希望能回答最常见的问题   方案设计者的问题。同样,关于
的部分   百分比编码的字符已被重写,URI规范化器为
  现在获得解码任何百分比编码八位字节的许可

这意味着!是分隔符的不幸选择,因为虽然语法允许在segment中使用(作为pchar非终端的一部分),但它也是一部分reserved非终端。

在我阅读时,RFC对于! reservedness 略有矛盾,具体取决于使用它的上下文。

转义字符似乎是最安全的假设,因为收件人“被许可解码百分比编码的八位字节”。您应该考虑使用另一个分隔符或解码端点上的实体。

答案 1 :(得分:0)

最后我找到了答案here

我在发送之前处理请求:

func (s *Sender) regulateRequestURL(req *http.Request) {
    if strings.Contains(req.URL.Path, "!") {
        req.URL.Opaque = fmt.Sprintf("//%s%s", req.URL.Host, req.URL.Path)
    }
}