# HG changeset patch # User Marcus Granado # Date 1266426911 0 # Node ID 6d66c87993de600782428fecd670a43c8d67601e # Parent 7031b543d1cf60a31a8ec04068ef525db8aad29c CA-36633: http server can also return 500 and 403 Signed-off-by: Marcus Granado diff -r 7031b543d1cf -r 6d66c87993de ocaml/database/master_connection.ml --- a/ocaml/database/master_connection.ml Wed Feb 17 17:15:11 2010 +0000 +++ b/ocaml/database/master_connection.ml Wed Feb 17 17:15:11 2010 +0000 @@ -133,8 +133,8 @@ write_ok := true; result := res (* yippeee! return and exit from while loop *) with - | Xmlrpcclient.Http_401_unauthorized -> - error "Received HTTP 401 unauthorized from master. This suggests our master address is wrong. Sleeping for %.0fs and then restarting." Xapi_globs.permanent_master_failure_retry_timeout; + | Xmlrpcclient.Http_error (http_code,err_msg) -> + error "Received HTTP error %s (%s) from master. This suggests our master address is wrong. Sleeping for %.0fs and then restarting." http_code err_msg Xapi_globs.permanent_master_failure_retry_timeout; Thread.delay Xapi_globs.permanent_master_failure_retry_timeout; exit Xapi_globs.restart_return_code | _ -> diff -r 7031b543d1cf -r 6d66c87993de ocaml/idl/ocaml_backend/xmlrpcclient.ml --- a/ocaml/idl/ocaml_backend/xmlrpcclient.ml Wed Feb 17 17:15:11 2010 +0000 +++ b/ocaml/idl/ocaml_backend/xmlrpcclient.ml Wed Feb 17 17:15:11 2010 +0000 @@ -62,8 +62,13 @@ to immediately close. *) exception Empty_response_from_server -(** Thrown when we get an HTTP 401, e.g. if we supply the wrong credentials *) -exception Http_401_unauthorized +(** Thrown when we get a specific HTTP error, e.g. + 401 (unauthorized) if we supply the wrong credentials + 403 (forbidden) if RBAC denied access + 500 (internal server error) if XAPI failed with an INTERNAL_ERROR, + Api_server error, XMLRPC_UNMARSHAL_FAILURE error etc. + *) +exception Http_error of string*string let input_line_fd (fd: Unix.file_descr) = let buf = Buffer.create 20 in @@ -153,8 +158,8 @@ end end done - | _ :: "401" :: _ -> - raise Http_401_unauthorized + | _ :: (("401"|"403"|"500") as http_code) :: _ -> + raise (Http_error (http_code,error_msg)) | _ -> debug "Read unknown response response: %s" line; raise Not_found @@ -189,6 +194,8 @@ let line = Buf_io.input_line ?timeout buf in match String.split_f String.isspace line with | _ :: "200" :: _ -> read_http_headers ?timeout buf + | _ :: (("401"|"403"|"500") as http_code) :: _ -> + raise (Http_error (http_code,error_msg)) | _ -> warn "http_rpc_recv_response_timeout: unknown response: %s" line; raise (Http_request_rejected error_msg) diff -r 7031b543d1cf -r 6d66c87993de ocaml/idl/ocaml_backend/xmlrpcclient.mli --- a/ocaml/idl/ocaml_backend/xmlrpcclient.mli Wed Feb 17 17:15:11 2010 +0000 +++ b/ocaml/idl/ocaml_backend/xmlrpcclient.mli Wed Feb 17 17:15:11 2010 +0000 @@ -15,8 +15,13 @@ parse enough of the response to be sure... but it was non-empty at least) *) exception Http_request_rejected of string -(** Thrown when we get an HTTP 401, e.g. if we supply the wrong credentials *) -exception Http_401_unauthorized +(** Thrown when we get a specific HTTP error, e.g. + 401 (unauthorized) if we supply the wrong credentials + 403 (forbidden) if RBAC denied access + 500 (internal server error) if XAPI failed with an INTERNAL_ERROR, + Api_server error, XMLRPC_UNMARSHAL_FAILURE error etc. +*) +exception Http_error of string*string exception Content_length_required diff -r 7031b543d1cf -r 6d66c87993de ocaml/xapi/quicktest_http.ml --- a/ocaml/xapi/quicktest_http.ml Wed Feb 17 17:15:11 2010 +0000 +++ b/ocaml/xapi/quicktest_http.ml Wed Feb 17 17:15:11 2010 +0000 @@ -93,7 +93,7 @@ "Tests that invalid pool secrets are rejected." begin fun () -> assert_raises_match - (function Xmlrpcclient.Http_401_unauthorized _ -> true | _ -> false) + (function Xmlrpcclient.Http_error _ -> true | _ -> false) (fun () -> http invalid_pool_secret "" (fun _ _ _ -> ())) end @@ -101,7 +101,7 @@ "Tests that invalid basic authentication fails." begin fun () -> assert_raises_match - (function Xmlrpcclient.Http_request_rejected _ -> true | _ -> false) + (function Xmlrpcclient.Http_error _ -> true | Xmlrpcclient.Http_request_rejected _ -> true | _ -> false) (fun () -> http invalid_basicauth "" (fun _ _ _ -> ())) end diff -r 7031b543d1cf -r 6d66c87993de ocaml/xapi/workload_balancing.ml --- a/ocaml/xapi/workload_balancing.ml Wed Feb 17 17:15:11 2010 +0000 +++ b/ocaml/xapi/workload_balancing.ml Wed Feb 17 17:15:11 2010 +0000 @@ -294,7 +294,7 @@ with | Remote_requests.Timed_out -> raise_timeout timeout - | Xmlrpcclient.Http_request_rejected _ -> + | Xmlrpcclient.Http_request_rejected _ | Xmlrpcclient.Http_error _ -> raise_authentication_failed () | Xmlrpcclient.Connection_reset -> raise_connection_reset () diff -r 7031b543d1cf -r 6d66c87993de ocaml/xapi/xapi_pool.ml --- a/ocaml/xapi/xapi_pool.ml Wed Feb 17 17:15:11 2010 +0000 +++ b/ocaml/xapi/xapi_pool.ml Wed Feb 17 17:15:11 2010 +0000 @@ -515,7 +515,7 @@ let rpc = rpc master_address in let session_id = try Client.Session.login_with_password rpc master_username master_password Xapi_globs.api_version_string - with Xmlrpcclient.Http_request_rejected _ -> + with Xmlrpcclient.Http_request_rejected _ | Xmlrpcclient.Http_error _ -> raise (Api_errors.Server_error(Api_errors.pool_joining_host_service_failed, [])) in let cluster_secret = ref "" in