Skip to content

Commit e12aa96

Browse files
Forward auth headers to volume servers
1 parent 499958c commit e12aa96

4 files changed

Lines changed: 36 additions & 20 deletions

File tree

src/lib.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,18 @@ func needs_rebalance(volumes []string, kvolumes []string) bool {
143143

144144
// *** Remote Access Functions ***
145145

146-
func remote_delete(remote string) error {
146+
func addAuth(req *http.Request, auth string) {
147+
if auth != "" {
148+
req.Header.Set("Authorization", auth)
149+
}
150+
}
151+
152+
func remote_delete(remote string, auth string) error {
147153
req, err := http.NewRequest("DELETE", remote, nil)
148154
if err != nil {
149155
return err
150156
}
157+
addAuth(req, auth)
151158
resp, err := http.DefaultClient.Do(req)
152159
if err != nil {
153160
return err
@@ -159,12 +166,13 @@ func remote_delete(remote string) error {
159166
return nil
160167
}
161168

162-
func remote_put(remote string, length int64, body io.Reader) error {
169+
func remote_put(remote string, length int64, body io.Reader, auth string) error {
163170
req, err := http.NewRequest("PUT", remote, body)
164171
if err != nil {
165172
return err
166173
}
167174
req.ContentLength = length
175+
addAuth(req, auth)
168176
resp, err := http.DefaultClient.Do(req)
169177
if err != nil {
170178
return err
@@ -176,8 +184,13 @@ func remote_put(remote string, length int64, body io.Reader) error {
176184
return nil
177185
}
178186

179-
func remote_get(remote string) (string, error) {
180-
resp, err := http.Get(remote)
187+
func remote_get(remote string, auth string) (string, error) {
188+
req, err := http.NewRequest("GET", remote, nil)
189+
if err != nil {
190+
return "", err
191+
}
192+
addAuth(req, auth)
193+
resp, err := http.DefaultClient.Do(req)
181194
if err != nil {
182195
return "", err
183196
}
@@ -192,13 +205,14 @@ func remote_get(remote string) (string, error) {
192205
return string(body), nil
193206
}
194207

195-
func remote_head(remote string, timeout time.Duration) (bool, error) {
208+
func remote_head(remote string, timeout time.Duration, auth string) (bool, error) {
196209
ctx, cancel := context.WithTimeout(context.Background(), timeout)
197210
defer cancel()
198211
req, err := http.NewRequestWithContext(ctx, "HEAD", remote, nil)
199212
if err != nil {
200213
return false, err
201214
}
215+
addAuth(req, auth)
202216
resp, err := http.DefaultClient.Do(req)
203217
if err != nil {
204218
return false, err

src/rebalance.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type RebalanceRequest struct {
1111
key []byte
1212
volumes []string
1313
kvolumes []string
14+
auth string
1415
}
1516

1617
func rebalance(a *App, req RebalanceRequest) bool {
@@ -20,7 +21,7 @@ func rebalance(a *App, req RebalanceRequest) bool {
2021
rvolumes := make([]string, 0)
2122
for _, rv := range req.volumes {
2223
remote_test := fmt.Sprintf("http://%s%s", rv, kp)
23-
found, err := remote_head(remote_test, 1*time.Minute)
24+
found, err := remote_head(remote_test, 1*time.Minute, req.auth)
2425
if err != nil {
2526
fmt.Println("rebalance head error", err, remote_test)
2627
return false
@@ -49,7 +50,7 @@ func rebalance(a *App, req RebalanceRequest) bool {
4950
remote_from := fmt.Sprintf("http://%s%s", v, kp)
5051

5152
// read
52-
ss, err = remote_get(remote_from)
53+
ss, err = remote_get(remote_from, req.auth)
5354
if err != nil {
5455
fmt.Println("rebalance get error", err, remote_from)
5556
} else {
@@ -74,7 +75,7 @@ func rebalance(a *App, req RebalanceRequest) bool {
7475
if needs_write {
7576
remote_to := fmt.Sprintf("http://%s%s", v, kp)
7677
// write
77-
if err := remote_put(remote_to, int64(len(ss)), strings.NewReader(ss)); err != nil {
78+
if err := remote_put(remote_to, int64(len(ss)), strings.NewReader(ss), req.auth); err != nil {
7879
fmt.Println("rebalance put error", err, remote_to)
7980
rebalance_error = true
8081
}
@@ -102,7 +103,7 @@ func rebalance(a *App, req RebalanceRequest) bool {
102103
}
103104
if needs_delete {
104105
remote_del := fmt.Sprintf("http://%s%s", v2, kp)
105-
if err := remote_delete(remote_del); err != nil {
106+
if err := remote_delete(remote_del, req.auth); err != nil {
106107
fmt.Println("rebalance delete error", err, remote_del)
107108
delete_error = true
108109
}

src/rebuild.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type RebuildRequest struct {
2525
func get_files(url string) []File {
2626
//fmt.Println(url)
2727
var files []File
28-
dat, err := remote_get(url)
28+
dat, err := remote_get(url, "")
2929
if err != nil {
3030
fmt.Println("ugh", err)
3131
return files

src/server.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func (a *App) QueryHandler(key []byte, w http.ResponseWriter, r *http.Request) {
102102
}
103103
}
104104

105-
func (a *App) Delete(key []byte, unlink bool) int {
105+
func (a *App) Delete(key []byte, unlink bool, auth string) int {
106106
// delete the key, first locally
107107
rec := a.GetRecord(key)
108108
if rec.deleted == HARD || (unlink && rec.deleted == SOFT) {
@@ -123,7 +123,7 @@ func (a *App) Delete(key []byte, unlink bool) int {
123123
delete_error := false
124124
for _, volume := range rec.rvolumes {
125125
remote := fmt.Sprintf("http://%s%s", volume, key2path(key))
126-
if remote_delete(remote) != nil {
126+
if remote_delete(remote, auth) != nil {
127127
// if this fails, it's possible to get an orphan file
128128
// but i'm not really sure what else to do?
129129
delete_error = true
@@ -142,7 +142,7 @@ func (a *App) Delete(key []byte, unlink bool) int {
142142
return 204
143143
}
144144

145-
func (a *App) WriteToReplicas(key []byte, value io.Reader, valuelen int64) int {
145+
func (a *App) WriteToReplicas(key []byte, value io.Reader, valuelen int64, auth string) int {
146146
// we don't have the key, compute the remote URL
147147
kvolumes := key2volume(key, a.volumes, a.replicas, a.subvolumes, a.vdir_colocation)
148148

@@ -160,7 +160,7 @@ func (a *App) WriteToReplicas(key []byte, value io.Reader, valuelen int64) int {
160160
body = bytes.NewReader(buf.Bytes())
161161
}
162162
remote := fmt.Sprintf("http://%s%s", kvolumes[i], key2path(key))
163-
if remote_put(remote, valuelen, body) != nil {
163+
if remote_put(remote, valuelen, body, auth) != nil {
164164
// we assume the remote wrote nothing if it failed
165165
fmt.Printf("replica %d write failed: %s\n", i, remote)
166166
// try not to leave key in INIT (writing) state (ignore errors)
@@ -188,6 +188,7 @@ func (a *App) WriteToReplicas(key []byte, value io.Reader, valuelen int64) int {
188188
func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
189189
key := []byte(r.URL.Path)
190190
lkey := []byte(r.URL.Path + r.URL.Query().Get("partNumber"))
191+
auth := r.Header.Get("Authorization")
191192

192193
log.Println(r.Method, r.URL, r.ContentLength, r.Header["Range"])
193194

@@ -237,7 +238,7 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
237238
good := false
238239
for _, vn := range rand.Perm(len(rec.rvolumes)) {
239240
remote = fmt.Sprintf("http://%s%s", rec.rvolumes[vn], key2path(key))
240-
found, _ := remote_head(remote, a.voltimeout)
241+
found, _ := remote_head(remote, a.voltimeout, auth)
241242
if found {
242243
good = true
243244
break
@@ -285,7 +286,7 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
285286

286287
for _, subkey := range del.Keys {
287288
fullkey := fmt.Sprintf("%s/%s", key, subkey)
288-
status := a.Delete([]byte(fullkey), false)
289+
status := a.Delete([]byte(fullkey), false, auth)
289290
if status != 204 {
290291
w.WriteHeader(status)
291292
return
@@ -324,7 +325,7 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
324325
fs = append(fs, f)
325326
}
326327

327-
status := a.WriteToReplicas(key, io.MultiReader(fs...), sz)
328+
status := a.WriteToReplicas(key, io.MultiReader(fs...), sz, auth)
328329
w.WriteHeader(status)
329330
w.Write([]byte("<CompleteMultipartUploadResult></CompleteMultipartUploadResult>"))
330331
return
@@ -363,11 +364,11 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
363364
io.Copy(f, r.Body)
364365
w.WriteHeader(200)
365366
} else {
366-
status := a.WriteToReplicas(key, r.Body, r.ContentLength)
367+
status := a.WriteToReplicas(key, r.Body, r.ContentLength, auth)
367368
w.WriteHeader(status)
368369
}
369370
case "DELETE", "UNLINK":
370-
status := a.Delete(key, r.Method == "UNLINK")
371+
status := a.Delete(key, r.Method == "UNLINK", auth)
371372
w.WriteHeader(status)
372373
case "RELINK":
373374
rec := a.GetRecord(key)
@@ -391,7 +392,7 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
391392
}
392393

393394
kvolumes := key2volume(key, a.volumes, a.replicas, a.subvolumes, a.vdir_colocation)
394-
rbreq := RebalanceRequest{key: key, volumes: rec.rvolumes, kvolumes: kvolumes}
395+
rbreq := RebalanceRequest{key: key, volumes: rec.rvolumes, kvolumes: kvolumes, auth: auth}
395396
if !rebalance(a, rbreq) {
396397
w.WriteHeader(400)
397398
return

0 commit comments

Comments
 (0)