@@ 4,6 4,7 @@ import "fmt"
import "log"
import "net/http"
import "os"
+import "strings"
var proxied bool = false
@@ 12,21 13,37 @@ func usage() {
os.Exit(1)
}
-type SavedWriter struct {
+func fixupLocation(header http.Header, r *http.Request) {
+ loc := header.Get("Location")
+ if loc != "" && loc[0] == '/' {
+ pfx := strings.Repeat("../", strings.Count(r.URL.Path, "/") - 1)
+ if pfx == "" {
+ pfx = "./"
+ }
+
+ header.Set("Location", pfx + loc[1:])
+ }
+
+
+}
+type responseWriter struct {
w http.ResponseWriter
+ r *http.Request
statusCode int
}
-func (s *SavedWriter) Header() http.Header {
+func (s *responseWriter) Header() http.Header {
return s.w.Header()
}
-func (s *SavedWriter) Write(b []byte) (int, error) {
+func (s *responseWriter) Write(b []byte) (int, error) {
if s.statusCode == 0 {
+ fixupLocation(s.w.Header(), s.r)
s.statusCode = 200
}
return s.w.Write(b)
}
-func (s *SavedWriter) WriteHeader(statusCode int) {
+func (s *responseWriter) WriteHeader(statusCode int) {
+ fixupLocation(s.w.Header(), s.r)
s.statusCode = statusCode
s.w.WriteHeader(statusCode)
}
@@ 40,7 57,7 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
}
- s := SavedWriter { w, 0 }
+ s := responseWriter { w, r, 0 }
h.inner.ServeHTTP(&s, r)
log.Printf(