Разбор URL с портом и без схемы - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь разобрать URL-адрес в Go и получить хост и схему из URL-адреса. Но при разборе URL-адреса с портом и без схемы я получаю неожиданный результат.

u, err := url.ParseRequestURI("hello.com:81")
fmt.Println("host :",u.Host)
fmt.Println("scheme :",u.Scheme)

Я получаю неожиданный результат

host :
scheme: hello.com

Я хотел это вместо

host : hello.com:80
scheme:

Ответы [ 4 ]

1 голос
/ 29 мая 2020

Попытка синтаксического анализа имени хоста и пути без схемы недопустима, но может не обязательно возвращать ошибку из-за неоднозначности синтаксического анализа.

- документация для net / url. Разбор

То, что вы передали в ParseRequestURI, не является URI или, по крайней мере, не означает то, что вы думаете. Если бы вы пропустили http://hello.com:81/, то хост был бы установлен должным образом.

1 голос
/ 29 мая 2020

Согласно go do c, общая форма URL-адреса представлена:

[scheme:][//[userinfo@]host][/]path[?query][#fragment]

URL-адреса, которые не начинаются с sla sh после схемы, интерпретируются как:

scheme:opaque[?query][#fragment]

Ваш URL анализируется как второй формат.

Вы можете использовать этот метод, чтобы получить ожидаемый результат как ваш. В функции, если в URL-адресе нет схемы, мы добавляем ее, а затем снова анализируем, чтобы получить ожидаемый результат.

func parseRawURL(rawurl string) (domain string, scheme string, err error) {
    u, err := url.ParseRequestURI(rawurl)
    if err != nil || u.Host == "" {
        u, repErr := url.ParseRequestURI("https://" + rawurl)
        if repErr != nil {
            fmt.Printf("Could not parse raw url: %s, error: %v", rawurl, err)
            return
        }
        domain = u.Host
        err = nil
        return
    }

    domain = u.Host
    scheme = u.Scheme
    return
}

Вы можете попробовать это на go на игровой площадке

0 голосов
/ 29 мая 2020

Формат, определенный в net .URL документах , является одним из следующих:

  • [scheme:][//[userinfo@]host][/]path[?query][#fragment]
  • scheme:opaque[?query][#fragment]

scheme: является необязательным, но двойной sla sh является частью поля host. Это означает, что допустимая строка для вашего ввода будет: //hello.com:81, что приведет к:

u, _ := url.Parse("//hello.com:81")
fmt.Println("host:", u.Host)
// Output: host: hello.com:81

Вам нужно будет преобразовать ваш ввод во что-то действительное. Если вы знаете, что строка никогда не включает схему, вы можете просто добавить //. Если у вас только иногда указывается схема, вы можете попробовать условно манипулировать вводом.

0 голосов
/ 29 мая 2020

Вам нужно добавить схему, если вы хотите проанализировать ее с помощью `ParseRequestURI`

согласно документу:

ParseRequestURI анализирует rawurl в структуру URL. Предполагается, что rawurl был получен в HTTP-запросе, поэтому rawurl интерпретируется только как абсолютный URI или абсолютный путь . Предполагается, что строка rawurl не имеет суффикса #fragment. (Веб-браузеры удаляют #fragment перед отправкой URL-адреса на веб-сервер.)

Значит, hostname:81 недопустимый URL.

поэтому попробуйте сделать это:

u, err := url.ParseRequestURI("http://" + "hello.com:80")
fmt.Println("err:",err)
fmt.Println("host :",u.Host)
fmt.Println("scheme :",u.Scheme)

или даже в вашем случае более правильный Parse:

u, err := url.Parse("http://" + "hello.com:80")
fmt.Println("err:",err)
fmt.Println("host :",u.Host)
fmt.Println("scheme :",u.Scheme)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...