1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- 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
- }
|