在golang中如何拆分URL并从解码的组件编码回URL。任何套餐?

时间:2014-05-29 14:19:46

标签: url go

在golang中如何拆分URL并从解码的组件编码回URL。任何完成这项工作的包裹?

net/url仅对解码网址有帮助。我想修改HOSTPORT并重新创建网址。我的问题源于我收到IPV6:port而没有方括号的情况。我们假设我的格式为IPV6:port

aaa:abbb:cccc:dddd:0000:0000:00aa:bbbb:8080/static/silly.html

我想用括号arround IPV6地址重建URL。

2 个答案:

答案 0 :(得分:4)

我认为这是不可能的。例如,如果你得到:

2001:db8::1:80

如何判断IP地址是否

2001:db8::1

或者:

2001:db8::1:80

这就是RFC 5952建议使用括号(或其他一些字符)来区分IP地址和端口号的原因。

因此,如果可能的话,我建议你忽略这种模棱两可的格式。


<强>更新

实际上,如果您确定能够区分这两个部分,那么就可以做到你想要的,也就是说,你可以对角色:中出现的8个事件进行详细计算。

if strings.Count(url, ":") == 8 {
    split := strings.Split(url, ":")
    url = "[" + strings.Join(split[:8], ":") + "]:" + split[8]
}

但是,这可能不是处理这种网址格式的最佳方法......

答案 1 :(得分:0)

您可以使用标准net包来帮助完成[Playground] [http://play.golang.org/p/wz0g7rgdU4]

我使用net.ParseIPnet.JoinHostPort

package main

import (
    "fmt"
    "net"
    "strings"
)

func splitLastColumn(host string) (string, string, string) {
    idx := strings.Index(host, "/")
    col_idx := strings.LastIndex(host[:idx], ":")
    return host[:col_idx], host[col_idx+1 : idx], host[idx:]
}

func main() {
    ipstr := "aaa:abbb:cccc:dddd:0000:0000:00aa:bbbb:8080/static/silly.html"

    host, port, path := splitLastColumn(ipstr)
    ip := net.ParseIP(host)
    if ip == nil {
      fmt.Println("invalid addr ")
    }
    fmt.Println(ip, host, port, path)
    fmt.Println(net.JoinHostPort(host, port))
}