117 lines
2.4 KiB
Go
117 lines
2.4 KiB
Go
package proxy
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
// GetMetadata returns cached NPM response for a given package path
|
|
func (proxy Proxy) GetMetadata(name string, originalPath string, request *http.Request) ([]byte, error) {
|
|
options, err := proxy.GetOptions()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
key := options.DatabasePrefix + name
|
|
|
|
// get package from database
|
|
pkg, err := proxy.Database.Get(key)
|
|
|
|
// either package doesn't exist or there's some other problem
|
|
if err != nil {
|
|
|
|
// check if error is caused by nonexistend package
|
|
// if no, return error
|
|
if err.Error() != "redis: nil" {
|
|
return nil, err
|
|
}
|
|
|
|
// error is caused by nonexistent package
|
|
// fetch package
|
|
req, err := http.NewRequest("GET", options.UpstreamAddress+originalPath, nil)
|
|
|
|
req.Header = request.Header
|
|
req.Header.Set("Accept-Encoding", "gzip")
|
|
|
|
res, err := proxy.HttpClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
if res.Header.Get("Content-Encoding") == "gzip" {
|
|
zr, err := gzip.NewReader(res.Body)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
res.Body = zr
|
|
}
|
|
|
|
body, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// convert body to string
|
|
pkg = string(body)
|
|
|
|
// save to redis
|
|
err = proxy.Database.Set(key, pkg, options.DatabaseExpiration)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
// replace tarball urls
|
|
// FIXME: unmarshall and replace only necessary fields
|
|
// convertedPkg := strings.ReplaceAll(string(pkg), options.ReplaceAddress, options.StaticServerAddress)
|
|
|
|
return []byte(pkg), nil
|
|
}
|
|
|
|
// ListMetadata returns list of all cached packages
|
|
func (proxy Proxy) ListMetadata() ([]string, error) {
|
|
options, err := proxy.GetOptions()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
metadata, err := proxy.Database.Keys(options.DatabasePrefix)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
deprefixedMetadata := make([]string, 0)
|
|
for _, record := range metadata {
|
|
deprefixedMetadata = append(deprefixedMetadata, strings.Replace(record, options.DatabasePrefix, "", 1))
|
|
}
|
|
|
|
return deprefixedMetadata, nil
|
|
}
|
|
|
|
// PurgeMetadata deletes all cached packages
|
|
func (proxy Proxy) PurgeMetadata() error {
|
|
options, err := proxy.GetOptions()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
metadata, err := proxy.Database.Keys(options.DatabasePrefix)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, record := range metadata {
|
|
err := proxy.Database.Delete(record)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|