diff --git a/server.go b/server.go deleted file mode 100644 index 3fd3786..0000000 --- a/server.go +++ /dev/null @@ -1,178 +0,0 @@ -package pypihub - -import ( - "encoding/base64" - "fmt" - "io" - "net/http" - "strconv" - "strings" - "time" -) - -type Server struct { - client *Client - config Config - assets []Asset - timer *time.Timer -} - -func NewServer(cfg Config) *Server { - return &Server{ - client: NewClient(cfg), - config: cfg, - assets: make([]Asset, 0), - } -} - -func (s *Server) findAsset(owner string, repo string, id int) *Asset { - for _, a := range s.assets { - if a.Owner == owner && a.Repo == repo && a.ID == id { - return &a - } - } - return nil -} - -func (s *Server) refetchAssets() { - var err error - s.assets, err = s.client.GetAllAssets() - if err != nil { - fmt.Println(err) - } -} - -func (s *Server) startTimer() { - if s.timer != nil { - s.timer.Stop() - } - s.timer = time.AfterFunc(time.Duration(10*time.Minute), func() { - go s.refetchAssets() - }) -} - -func (s *Server) listAssets(w http.ResponseWriter, r *http.Request) { - var repo = strings.Trim(r.URL.Path, "/") - - w.Header().Add("Content-Type", "text/html") - fmt.Fprintf(w, "Links for %s", repo) - fmt.Fprintf(w, "

Links for %s

", repo) - for _, a := range s.assets { - if a.Repo == repo { - fmt.Fprintf(w, "%s ", a.URL(), a.Name) - } - } - fmt.Fprintf(w, "") -} - -func (s *Server) listRepoAssets(w http.ResponseWriter, r *http.Request) { - var parts = strings.SplitN(strings.Trim(r.URL.Path, "/"), "/", 2) - var owner = parts[0] - var repo = parts[1] - - w.Header().Add("Content-Type", "text/html") - fmt.Fprintf(w, "Links for %s", repo) - fmt.Fprintf(w, "

Links for %s

", repo) - for _, a := range s.assets { - if a.Owner == owner && a.Repo == repo { - fmt.Fprintf(w, "%s ", a.URL(), a.Name) - } - } - fmt.Fprintf(w, "") -} - -func (s *Server) listAllAssets(w http.ResponseWriter, r *http.Request) { - w.Header().Add("Content-Type", "text/html") - fmt.Fprintf(w, "All asset links") - fmt.Fprintf(w, "

All asset links

") - for _, a := range s.assets { - fmt.Fprintf(w, "%s ", a.URL(), a.Name) - } - fmt.Fprintf(w, "") -} - -func (s *Server) listRepos(w http.ResponseWriter, r *http.Request) { - w.Header().Add("Content-Type", "text/html") - fmt.Fprintf(w, "Simple index") - for _, r := range s.config.RepoNames { - var parts = strings.SplitN(r, "/", 2) - fmt.Fprintf(w, "%s ", parts[1], parts[1]) - } - fmt.Fprintf(w, "") -} - -func (s *Server) fetchAsset(w http.ResponseWriter, r *http.Request) { - var url = strings.Trim(r.URL.Path, "/") - var parts = strings.SplitN(url, "/", 4) - - if len(parts) != 4 { - w.WriteHeader(http.StatusNotFound) - return - } - - var asset *Asset - var id int64 - var err error - id, err = strconv.ParseInt(parts[2], 10, 32) - if err != nil { - w.WriteHeader(http.StatusNotFound) - return - } - asset = s.findAsset(parts[0], parts[1], int(id)) - if asset == nil { - w.WriteHeader(http.StatusNotFound) - return - } - - var rc io.ReadCloser - rc, err = s.client.DownloadAsset(*asset) - if err != nil || rc == nil { - w.WriteHeader(http.StatusNotFound) - return - } - - defer rc.Close() - io.Copy(w, rc) -} - -func (s *Server) serveFavicon(w http.ResponseWriter, r *http.Request) { - var decoded []byte - var err error - decoded, err = base64.StdEncoding.DecodeString("AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAPs7/AJ9vNwBO3f8APMz/AEzb/wCdbjYAStn/AJZqNgBI1/8ARtX/AETT/wBA0f8AqnY3AD7P/wCjcjcApHI3ADzN/wBQ3v8AOsv/AE7c/wA4yf8Amm02ALF6OACYazYARtb/AETU/wCveTcAQtL/AKh1NwCtdzcAQND/AKFxNwCmczcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcDA4RExUAAAAAAAAAAAAZGhwfDhEAFQAAAAAAAAAACRkaHB8OABMAAAAAAAAAAAcJGRocHw4RAAAAAAAgAgYFBwkZGhwfARETFQAhDyACAwUHCQoaHB8BERMVHSEPIBIUBQcJChocHwEREw0dIQ8AEhQFBwkKGhwfAQQeDR0hDyACBhYYCAALHB8BGx4NHSEPIAIGFhgICgscHxcbHg0dIRAgAgYWGAkKCxwAFxseDR0hECACBhYHCQoAAAAAAB4NHSEQIAIGAAAAAAAAAAAbAA0dIRAgAgAAAAAAAAAAFwAeDR0hECAAAAAAAAAAAAAXGx4NHSEAAAAAAPgfAADwLwAA8C8AAPAPAACAAQAAAAAAAAAAAAAIAAAAABAAAAAAAAAAAAAAgAEAAPAPAAD0DwAA9A8AAPgfAAA=") - if err != nil { - w.WriteHeader(http.StatusNotFound) - return - } - fmt.Fprintf(w, "%s", decoded) -} - -func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - var parts = strings.Split(strings.Trim(r.URL.Path, "/"), "/") - parts = removeEmpty(parts) - - fmt.Println(r.URL.Path) - - switch len(parts) { - case 0: - s.listAllAssets(w, r) - case 1: - if parts[0] == "favicon.ico" { - s.serveFavicon(w, r) - } else { - s.listAssets(w, r) - } - case 2: - s.listRepoAssets(w, r) - default: - s.fetchAsset(w, r) - } -} - -func (s *Server) ListenAndServe() error { - s.refetchAssets() - s.startTimer() - - http.Handle("/", s) - fmt.Println("Server listening at", s.config.Bind) - return http.ListenAndServe(s.config.Bind, nil) -}