package httputils import ( "errors" "fmt" "net/http" "regexp" "strings" "github.com/docker/docker/pkg/jsonmessage" ) var ( headerRegexp = regexp.MustCompile(`^(?:(.+)/(.+?))\((.+)\).*$`) errInvalidHeader = errors.New("Bad header, should be in format `docker/version (platform)`") ) // Download requests a given URL and returns an io.Reader. func Download(url string) (resp *http.Response, err error) { if resp, err = http.Get(url); err != nil { return nil, err } if resp.StatusCode >= 400 { return nil, fmt.Errorf("Got HTTP status code >= 400: %s", resp.Status) } return resp, nil } // NewHTTPRequestError returns a JSON response error. func NewHTTPRequestError(msg string, res *http.Response) error { return &jsonmessage.JSONError{ Message: msg, Code: res.StatusCode, } } // ServerHeader contains the server information. type ServerHeader struct { App string // docker Ver string // 1.8.0-dev OS string // windows or linux } // ParseServerHeader extracts pieces from an HTTP server header // which is in the format "docker/version (os)" e.g. docker/1.8.0-dev (windows). func ParseServerHeader(hdr string) (*ServerHeader, error) { matches := headerRegexp.FindStringSubmatch(hdr) if len(matches) != 4 { return nil, errInvalidHeader } return &ServerHeader{ App: strings.TrimSpace(matches[1]), Ver: strings.TrimSpace(matches[2]), OS: strings.TrimSpace(matches[3]), }, nil }