aptcache: accept root directory config

This commit is contained in:
Takumi Sueda
2026-03-11 01:55:12 +09:00
parent cf7cc41efe
commit 140ba3ff38
2 changed files with 15 additions and 9 deletions

View File

@@ -35,6 +35,7 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
"path"
"path/filepath" "path/filepath"
"strconv" "strconv"
"strings" "strings"
@@ -45,6 +46,7 @@ import (
type Proxy struct { type Proxy struct {
remote string remote string
root string
cli *http.Client cli *http.Client
cache map[string]struct{} cache map[string]struct{}
@@ -81,8 +83,9 @@ func NewProxy() (*Proxy, error) {
return p, nil return p, nil
} }
func (p *Proxy) Run(local, remote string) { func (p *Proxy) Run(local, remote, root string) {
p.remote = remote p.remote = remote
p.root = root
err := http.ListenAndServe(local, p) err := http.ListenAndServe(local, p)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -101,13 +104,13 @@ func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
if nocache { if nocache {
fmt.Printf("GET (no cache): %s%s -> ", p.remote, r.URL.Path) fmt.Printf("GET (no cache): %s%s%s -> ", p.remote, p.root, r.URL.Path)
err = p.fetchFromRemote(w, r, false) err = p.fetchFromRemote(w, r, false)
} else if _, ok := p.cache[encoded]; ok { } else if _, ok := p.cache[encoded]; ok {
fmt.Printf("GET (cache hit): %s%s -> ", p.remote, r.URL.Path) fmt.Printf("GET (cache hit): %s%s%s -> ", p.remote, p.root, r.URL.Path)
err = p.fetchFromCache(w, r) err = p.fetchFromCache(w, r)
} else { } else {
fmt.Printf("GET (cache miss): %s%s -> ", p.remote, r.URL.Path) fmt.Printf("GET (cache miss): %s%s%s -> ", p.remote, p.root, r.URL.Path)
err = p.fetchFromRemote(w, r, true) err = p.fetchFromRemote(w, r, true)
} }
@@ -133,6 +136,7 @@ func (p *Proxy) fetchFromRemote(w http.ResponseWriter, r *http.Request, cache bo
} }
newURL.Scheme = "http" newURL.Scheme = "http"
newURL.Host = p.remote newURL.Host = p.remote
newURL.Path = path.Join(p.root, newURL.Path)
req, err := http.NewRequest(http.MethodGet, newURL.String(), nil) req, err := http.NewRequest(http.MethodGet, newURL.String(), nil)
if err != nil { if err != nil {
@@ -219,7 +223,7 @@ func (w NullWriter) Close() error {
} }
type rule struct { type rule struct {
Local, Remote string Local, Remote, Root string
} }
type rules []rule type rules []rule
@@ -229,7 +233,7 @@ func (r *rules) String() string {
} }
func (r *rules) Set(raw string) error { func (r *rules) Set(raw string) error {
var local, remote string var local, remote, root string
kvs := strings.Split(raw, ",") kvs := strings.Split(raw, ",")
for _, kv := range kvs { for _, kv := range kvs {
@@ -243,6 +247,8 @@ func (r *rules) Set(raw string) error {
local = tokens[1] local = tokens[1]
case "remote": case "remote":
remote = tokens[1] remote = tokens[1]
case "root":
root = tokens[1]
default: default:
return fmt.Errorf("rule has unknown key: '%s'", tokens[0]) return fmt.Errorf("rule has unknown key: '%s'", tokens[0])
} }
@@ -252,7 +258,7 @@ func (r *rules) Set(raw string) error {
return fmt.Errorf("rule lacks mendatory keys: 'local' and/or 'remote'") return fmt.Errorf("rule lacks mendatory keys: 'local' and/or 'remote'")
} }
*r = append(*r, rule{Local: local, Remote: remote}) *r = append(*r, rule{Local: local, Remote: remote, Root: root})
return nil return nil
} }
@@ -268,13 +274,13 @@ func main() {
} }
for i, rule := range rules { for i, rule := range rules {
fmt.Printf("Proxy Rule %d: %s -> %s\n", i+1, rule.Local, rule.Remote) fmt.Printf("Proxy Rule %d: %s -> %s%s\n", i+1, rule.Local, rule.Remote, rule.Root)
p, err := NewProxy() p, err := NewProxy()
if err != nil { if err != nil {
panic(err) panic(err)
} }
go p.Run(rule.Local, rule.Remote) go p.Run(rule.Local, rule.Remote, rule.Root)
} }
for { for {
time.Sleep(9999999999) time.Sleep(9999999999)

Binary file not shown.