first path segment in URL cannot contain colon

在使用Go语言的url.Parse()解析包含IP和端口的URL(如127.0.0.1:8080)时,会遇到错误:'first path segment in URL cannot contain colon'。该错误源于函数内部的解析逻辑。为解决此问题,可以在IP和端口号前添加'//',变为)//127.0.0.1:8080,这符合网络路径引用(network-path reference)的格式,如RFC 3986所述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:问题

func main(){

    url,err:= url.Parse("127.0.0.1:8080")
    if err!=nil{

        fmt.Println(err)
    }
    fmt.Println(url.Host,url.Port())
}

使用url.Parse()解析host是ip的url时(eg:127.0.0.1:8080),出现:first path segment in URL cannot contain colon

二:问题原因
报错的原因:url.Parse()里面调用的func parse(rawurl string, viaRequest bool) (*URL, error)这个函数报错

func parse(rawurl string, viaRequest bool) (*URL, error) {
//.......
if !strings.HasPrefix(rest, "/") {
        if url.Scheme != "" {
            // We consider rootless paths per RFC 3986 as opaque.
            url.Opaque = rest
            return url, nil
        }
        if viaRequest {
            return nil, errors.New("invalid URI for request")
        }

        // Avoid confusion with malformed schemes, like cache_object:foo/bar.
        // See golang.org/issue/16822.
        //
        // RFC 3986, §3.3:
        // In addition, a URI reference (Section 4.1) may be a relative-path reference,
        // in which case the first path segment cannot contain a colon (":") character.
        //报错位置
        colon := strings.Index(rest, ":")
        slash := strings.Index(rest, "/")
        if colon >= 0 && (slash < 0 || colon < slash) {
            // First path segment has colon. Not allowed in relative URL.
            return nil, errors.New("first path segment in URL cannot contain colon")
        }
    }
    //............

三.处理方法
在func parse(rawurl string, viaRequest bool) (*URL, error)中:

if (url.Scheme != "" || !viaRequest && !strings.HasPrefix(rest, "///")) && strings.HasPrefix(rest, "//") {
        var authority string
        authority, rest = split(rest[2:], "/", false)
        url.User, url.Host, err = parseAuthority(authority)
        if err != nil {
            return nil, err
        }
    }

看到这个部分,可以在127.0.0.1:8080前面加”//”解决(eg://127.0.0.1:8080)

四:补充

关于//host:port(this format is called the “network-path reference” from RFC 3986, section 4.2)
可以参考:https://stackoverflow.com/questions/3583103/network-path-reference-uri-scheme-relative-urls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值