goaで指定するホスト名はRFC1035に準拠させること

goaのコード読んでて気づいたのでメモ。

DSLのHost

APIが想定しているホスト名を指定するためのDSL(func)で、以下のように実装されている。

// Regular expression used to validate RFC1035 hostnames*/
var hostnameRegex = regexp.MustCompile(`^[[:alnum:]][[:alnum:]\-]{0,61}[[:alnum:]]|[[:alpha:]]$`)

// Host sets the API hostname.
func Host(host string) {
    if !hostnameRegex.MatchString(host) {
        dslengine.ReportError(`invalid hostname value "%s"`, host)
        return
    }

    if a, ok := apiDefinition(); ok {
        a.Host = host
    }
}

入力されたホスト名に対して hostnameRegex正規表現にマッチするかのチェックを行っている。

RFC1035 とは

DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION ということで色々書いてある。

2.3.1. Preferred name syntax では以下のように言及されている。

They must start with a letter, end with a letter or digit,
and have as interior characters only letters, digits, and hyphen.
There are also some restrictions on the length.
Labels must be 63 characters or less.

この辺りの内容を正規表現で表しているっぽい。