Signed-off-by: David Calavera <david.calavera@gmail.com>
| ... | ... |
@@ -5,11 +5,15 @@ import ( |
| 5 | 5 |
"fmt" |
| 6 | 6 |
"net/http" |
| 7 | 7 |
"regexp" |
| 8 |
- "strings" |
|
| 9 | 8 |
|
| 10 | 9 |
"github.com/docker/docker/pkg/jsonmessage" |
| 11 | 10 |
) |
| 12 | 11 |
|
| 12 |
+var ( |
|
| 13 |
+ headerRegexp = regexp.MustCompile(`^(?:(.+)/(.+))\s\((.+)\).*$`) |
|
| 14 |
+ errInvalidHeader = errors.New("Bad header, should be in format `docker/version (platform)`")
|
|
| 15 |
+) |
|
| 16 |
+ |
|
| 13 | 17 |
// Download requests a given URL and returns an io.Reader. |
| 14 | 18 |
func Download(url string) (resp *http.Response, err error) {
|
| 15 | 19 |
if resp, err = http.Get(url); err != nil {
|
| ... | ... |
@@ -39,21 +43,13 @@ type ServerHeader struct {
|
| 39 | 39 |
// ParseServerHeader extracts pieces from an HTTP server header |
| 40 | 40 |
// which is in the format "docker/version (os)" eg docker/1.8.0-dev (windows). |
| 41 | 41 |
func ParseServerHeader(hdr string) (*ServerHeader, error) {
|
| 42 |
- re := regexp.MustCompile(`.*\((.+)\).*$`) |
|
| 43 |
- r := &ServerHeader{}
|
|
| 44 |
- if matches := re.FindStringSubmatch(hdr); matches != nil {
|
|
| 45 |
- r.OS = matches[1] |
|
| 46 |
- parts := strings.Split(hdr, "/") |
|
| 47 |
- if len(parts) != 2 {
|
|
| 48 |
- return nil, errors.New("Bad header: '/' missing")
|
|
| 49 |
- } |
|
| 50 |
- r.App = parts[0] |
|
| 51 |
- v := strings.Split(parts[1], " ") |
|
| 52 |
- if len(v) != 2 {
|
|
| 53 |
- return nil, errors.New("Bad header: Expected single space")
|
|
| 54 |
- } |
|
| 55 |
- r.Ver = v[0] |
|
| 56 |
- return r, nil |
|
| 42 |
+ matches := headerRegexp.FindStringSubmatch(hdr) |
|
| 43 |
+ if len(matches) != 4 {
|
|
| 44 |
+ return nil, errInvalidHeader |
|
| 57 | 45 |
} |
| 58 |
- return nil, errors.New("Bad header: Failed regex match")
|
|
| 46 |
+ return &ServerHeader{
|
|
| 47 |
+ App: matches[1], |
|
| 48 |
+ Ver: matches[2], |
|
| 49 |
+ OS: matches[3], |
|
| 50 |
+ }, nil |
|
| 59 | 51 |
} |
| ... | ... |
@@ -1,19 +1,17 @@ |
| 1 | 1 |
package httputils |
| 2 | 2 |
|
| 3 |
-import ( |
|
| 4 |
- "testing" |
|
| 5 |
-) |
|
| 3 |
+import "testing" |
|
| 6 | 4 |
|
| 7 | 5 |
func TestDownload(t *testing.T) {
|
| 8 | 6 |
_, err := Download("http://docker.com")
|
| 9 | 7 |
|
| 10 | 8 |
if err != nil {
|
| 11 |
- t.Errorf("Expected error to not exist when Download(http://docker.com)")
|
|
| 9 |
+ t.Fatalf("Expected error to not exist when Download(http://docker.com)")
|
|
| 12 | 10 |
} |
| 13 | 11 |
|
| 14 | 12 |
// Expected status code = 404 |
| 15 | 13 |
if _, err = Download("http://docker.com/abc1234567"); err == nil {
|
| 16 |
- t.Errorf("Expected error to exist when Download(http://docker.com/abc1234567)")
|
|
| 14 |
+ t.Fatalf("Expected error to exist when Download(http://docker.com/abc1234567)")
|
|
| 17 | 15 |
} |
| 18 | 16 |
} |
| 19 | 17 |
|
| ... | ... |
@@ -21,37 +19,41 @@ func TestNewHTTPRequestError(t *testing.T) {
|
| 21 | 21 |
errorMessage := "Some error message" |
| 22 | 22 |
httpResponse, _ := Download("http://docker.com")
|
| 23 | 23 |
if err := NewHTTPRequestError(errorMessage, httpResponse); err.Error() != errorMessage {
|
| 24 |
- t.Errorf("Expected err to equal error Message")
|
|
| 24 |
+ t.Fatalf("Expected err to equal error Message")
|
|
| 25 | 25 |
} |
| 26 | 26 |
} |
| 27 | 27 |
|
| 28 | 28 |
func TestParseServerHeader(t *testing.T) {
|
| 29 |
- serverHeader, err := ParseServerHeader("bad header")
|
|
| 30 |
- if err.Error() != "Bad header: Failed regex match" {
|
|
| 31 |
- t.Errorf("Should fail when header can not be parsed")
|
|
| 29 |
+ if _, err := ParseServerHeader("bad header"); err != errInvalidHeader {
|
|
| 30 |
+ t.Fatalf("Should fail when header can not be parsed")
|
|
| 32 | 31 |
} |
| 33 | 32 |
|
| 34 |
- if serverHeader, err = ParseServerHeader("(bad header)"); err.Error() != "Bad header: '/' missing" {
|
|
| 35 |
- t.Errorf("Should fail when header can not be parsed")
|
|
| 33 |
+ if _, err := ParseServerHeader("(bad header)"); err != errInvalidHeader {
|
|
| 34 |
+ t.Fatalf("Should fail when header can not be parsed")
|
|
| 36 | 35 |
} |
| 37 | 36 |
|
| 38 |
- if serverHeader, err = ParseServerHeader("(without/spaces)"); err.Error() != "Bad header: Expected single space" {
|
|
| 39 |
- t.Errorf("Should fail when header can not be parsed")
|
|
| 37 |
+ if _, err := ParseServerHeader("(without/spaces)"); err != errInvalidHeader {
|
|
| 38 |
+ t.Fatalf("Should fail when header can not be parsed")
|
|
| 40 | 39 |
} |
| 41 | 40 |
|
| 42 |
- if serverHeader, err = ParseServerHeader("(header/with space)"); err != nil {
|
|
| 43 |
- t.Errorf("Expected err to not exist when ParseServerHeader(\"(header/with space)\")")
|
|
| 41 |
+ if _, err := ParseServerHeader("(header/with space)"); err != errInvalidHeader {
|
|
| 42 |
+ t.Fatalf("Expected err to not exist when ParseServerHeader(\"(header/with space)\")")
|
|
| 44 | 43 |
} |
| 45 | 44 |
|
| 46 |
- if serverHeader.App != "(header" {
|
|
| 47 |
- t.Errorf("Expected serverHeader.App to equal \"(header\"")
|
|
| 45 |
+ serverHeader, err := ParseServerHeader("foo/bar (baz)")
|
|
| 46 |
+ if err != nil {
|
|
| 47 |
+ t.Fatal(err) |
|
| 48 |
+ } |
|
| 49 |
+ |
|
| 50 |
+ if serverHeader.App != "foo" {
|
|
| 51 |
+ t.Fatalf("Expected serverHeader.App to equal \"foo\", got %s", serverHeader.App)
|
|
| 48 | 52 |
} |
| 49 | 53 |
|
| 50 |
- if serverHeader.Ver != "with" {
|
|
| 51 |
- t.Errorf("Expected serverHeader.Ver to equal \"with\"")
|
|
| 54 |
+ if serverHeader.Ver != "bar" {
|
|
| 55 |
+ t.Fatalf("Expected serverHeader.Ver to equal \"bar\", got %s", serverHeader.Ver)
|
|
| 52 | 56 |
} |
| 53 | 57 |
|
| 54 |
- if serverHeader.OS != "header/with space" {
|
|
| 55 |
- t.Errorf("Expected serverHeader.OS to equal \"header/with space\"")
|
|
| 58 |
+ if serverHeader.OS != "baz" {
|
|
| 59 |
+ t.Fatalf("Expected serverHeader.OS to equal \"baz\", got %s", serverHeader.OS)
|
|
| 56 | 60 |
} |
| 57 | 61 |
} |