diff --git a/gitlab.go b/gitlab.go new file mode 100644 index 0000000..2c5676e --- /dev/null +++ b/gitlab.go @@ -0,0 +1,46 @@ +package main + +import ( + "errors" + "net/http" + "net/url" + "strings" +) + +// isGitLabURL tests a string to determine if it is a well-structured GitLab URL +func isGitLabURL(s string) (string, bool) { + if strings.HasPrefix(s, "gitlab.com/") { + s = "https://" + s + } + + u, err := url.ParseRequestURI(s) + if err != nil { + return "", false + } + + return u.String(), strings.ToLower(u.Host) == "gitlab.com" +} + +// findGitLabREADME tries to find the correct README filename in a repository +func findGitLabREADME(s string) (*http.Response, error) { + u, err := url.ParseRequestURI(s) + if err != nil { + return nil, err + } + + for _, r := range readmeNames { + v := u + v.Path += "/raw/master/" + r + + resp, err := http.Get(v.String()) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusOK { + return resp, nil + } + } + + return nil, errors.New("can't find README in GitLab repository") +} diff --git a/main.go b/main.go index 9b88cc6..cce9761 100644 --- a/main.go +++ b/main.go @@ -43,6 +43,13 @@ func readerFromArg(s string) (io.ReadCloser, error) { } return resp.Body, nil } + if u, ok := isGitLabURL(s); ok { + resp, err := findGitLabREADME(u) + if err != nil { + return nil, err + } + return resp.Body, nil + } if u, err := url.ParseRequestURI(s); err == nil { if u.Scheme != "http" && u.Scheme != "https" {