httputils.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package httputils
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "regexp"
  7. "strings"
  8. "github.com/docker/docker/pkg/jsonmessage"
  9. )
  10. var (
  11. headerRegexp = regexp.MustCompile(`^(?:(.+)/(.+?))\((.+)\).*$`)
  12. errInvalidHeader = errors.New("Bad header, should be in format `docker/version (platform)`")
  13. )
  14. // Download requests a given URL and returns an io.Reader.
  15. func Download(url string) (resp *http.Response, err error) {
  16. if resp, err = http.Get(url); err != nil {
  17. return nil, err
  18. }
  19. if resp.StatusCode >= 400 {
  20. return nil, fmt.Errorf("Got HTTP status code >= 400: %s", resp.Status)
  21. }
  22. return resp, nil
  23. }
  24. // NewHTTPRequestError returns a JSON response error.
  25. func NewHTTPRequestError(msg string, res *http.Response) error {
  26. return &jsonmessage.JSONError{
  27. Message: msg,
  28. Code: res.StatusCode,
  29. }
  30. }
  31. // ServerHeader contains the server information.
  32. type ServerHeader struct {
  33. App string // docker
  34. Ver string // 1.8.0-dev
  35. OS string // windows or linux
  36. }
  37. // ParseServerHeader extracts pieces from an HTTP server header
  38. // which is in the format "docker/version (os)" e.g. docker/1.8.0-dev (windows).
  39. func ParseServerHeader(hdr string) (*ServerHeader, error) {
  40. matches := headerRegexp.FindStringSubmatch(hdr)
  41. if len(matches) != 4 {
  42. return nil, errInvalidHeader
  43. }
  44. return &ServerHeader{
  45. App: strings.TrimSpace(matches[1]),
  46. Ver: strings.TrimSpace(matches[2]),
  47. OS: strings.TrimSpace(matches[3]),
  48. }, nil
  49. }