HEAD /v1/buckets/bucket-name
(w http.ResponseWriter, r *http.Request)
| 1523 | |
| 1524 | // HEAD /v1/buckets/bucket-name |
| 1525 | func (p *proxy) httpbckhead(w http.ResponseWriter, r *http.Request) { |
| 1526 | apireq := apiReqAlloc(1, apc.URLPathBuckets.L, false) |
| 1527 | defer apiReqFree(apireq) |
| 1528 | if err := p.parseReq(w, r, apireq); err != nil { |
| 1529 | return |
| 1530 | } |
| 1531 | bckArgs := bckInitArgs{p: p, w: w, r: r, bck: apireq.bck, perms: apc.AceBckHEAD, dpq: apireq.dpq, query: apireq.query} |
| 1532 | bckArgs.createAIS = false |
| 1533 | bckArgs.headRemB = shouldHeadRemB() |
| 1534 | bck, err := bckArgs.initAndTry(apireq.bck.Name) |
| 1535 | if err != nil { |
| 1536 | return |
| 1537 | } |
| 1538 | if bck.IsAIS() || !bckArgs.exists { |
| 1539 | _bpropsToHdr(bck, w.Header()) |
| 1540 | return |
| 1541 | } |
| 1542 | cloudProps, statusCode, err := p.headRemoteBck(bck.RemoteBck(), nil) |
| 1543 | if err != nil { |
| 1544 | // TODO: what if HEAD fails |
| 1545 | p.writeErr(w, r, err, statusCode) |
| 1546 | return |
| 1547 | } |
| 1548 | |
| 1549 | if p.forwardCP(w, r, nil, "httpheadbck") { |
| 1550 | return |
| 1551 | } |
| 1552 | |
| 1553 | ctx := &bmdModifier{ |
| 1554 | pre: p._bckHeadPre, |
| 1555 | final: p._syncBMDFinal, |
| 1556 | msg: &apc.ActionMsg{Action: apc.ActResyncBprops}, |
| 1557 | bcks: []*cluster.Bck{bck}, |
| 1558 | cloudProps: cloudProps, |
| 1559 | } |
| 1560 | _, err = p.owner.bmd.modify(ctx) |
| 1561 | if err != nil { |
| 1562 | debug.AssertNoErr(err) |
| 1563 | p.writeErr(w, r, err, http.StatusNotFound) |
| 1564 | return |
| 1565 | } |
| 1566 | _bpropsToHdr(bck, w.Header()) |
| 1567 | } |
| 1568 | |
| 1569 | func _bpropsToHdr(bck *cluster.Bck, hdr http.Header) { |
| 1570 | if bck.Props == nil { |
no test coverage detected