1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package httputils
- import (
- "errors"
- "fmt"
- "net/http"
- "regexp"
- "strings"
- "github.com/docker/docker/pkg/jsonmessage"
- )
- // 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)" eg docker/1.8.0-dev (windows).
- func ParseServerHeader(hdr string) (*ServerHeader, error) {
- re := regexp.MustCompile(`.*\((.+)\).*$`)
- r := &ServerHeader{}
- if matches := re.FindStringSubmatch(hdr); matches != nil {
- r.OS = matches[1]
- parts := strings.Split(hdr, "/")
- if len(parts) != 2 {
- return nil, errors.New("Bad header: '/' missing")
- }
- r.App = parts[0]
- v := strings.Split(parts[1], " ")
- if len(v) != 2 {
- return nil, errors.New("Bad header: Expected single space")
- }
- r.Ver = v[0]
- return r, nil
- }
- return nil, errors.New("Bad header: Failed regex match")
- }
|