(w http.ResponseWriter, r *http.Request)
| 2209 | } |
| 2210 | |
| 2211 | func (p *proxy) reverseHandler(w http.ResponseWriter, r *http.Request) { |
| 2212 | apiItems, err := p.checkRESTItems(w, r, 1, false, apc.URLPathReverse.L) |
| 2213 | if err != nil { |
| 2214 | return |
| 2215 | } |
| 2216 | |
| 2217 | // rewrite URL path (removing `apc.Reverse`) |
| 2218 | r.URL.Path = cos.JoinWords(apc.Version, apiItems[0]) |
| 2219 | |
| 2220 | nodeID := r.Header.Get(apc.HdrNodeID) |
| 2221 | if nodeID == "" { |
| 2222 | p.writeErrMsg(w, r, "missing node ID") |
| 2223 | return |
| 2224 | } |
| 2225 | smap := p.owner.smap.get() |
| 2226 | si := smap.GetNode(nodeID) |
| 2227 | |
| 2228 | // access control |
| 2229 | switch r.Method { |
| 2230 | case http.MethodGet: |
| 2231 | // must be consistent with httpdaeget, httpcluget |
| 2232 | err = p.checkAccess(w, r, nil, apc.AceShowCluster) |
| 2233 | case http.MethodPost: |
| 2234 | // (ditto) httpdaepost, httpclupost |
| 2235 | err = p.checkAccess(w, r, nil, apc.AceAdmin) |
| 2236 | case http.MethodPut, http.MethodDelete: |
| 2237 | // (ditto) httpdaeput/delete and httpcluput/delete |
| 2238 | err = p.checkAccess(w, r, nil, apc.AceAdmin) |
| 2239 | default: |
| 2240 | cmn.WriteErr405(w, r, http.MethodDelete, http.MethodGet, http.MethodPost, http.MethodPut) |
| 2241 | return |
| 2242 | } |
| 2243 | if err != nil { |
| 2244 | return |
| 2245 | } |
| 2246 | |
| 2247 | // do |
| 2248 | if si != nil { |
| 2249 | p.reverseNodeRequest(w, r, si) |
| 2250 | return |
| 2251 | } |
| 2252 | // special case when the target self-removed itself from cluster map |
| 2253 | // after having lost all mountpaths. |
| 2254 | nodeURL := r.Header.Get(apc.HdrNodeURL) |
| 2255 | if nodeURL == "" { |
| 2256 | err = &errNodeNotFound{"cannot rproxy", nodeID, p.si, smap} |
| 2257 | p.writeErr(w, r, err, http.StatusNotFound) |
| 2258 | return |
| 2259 | } |
| 2260 | parsedURL, err := url.Parse(nodeURL) |
| 2261 | if err != nil { |
| 2262 | p.writeErrf(w, r, "%s: invalid URL %q for node %s", p.si, nodeURL, nodeID) |
| 2263 | return |
| 2264 | } |
| 2265 | |
| 2266 | p.reverseRequest(w, r, nodeID, parsedURL) |
| 2267 | } |
| 2268 |
nothing calls this directly
no test coverage detected