public static FailedRequest getFailedRequest(int httpStatus, MediaType contentType, InputStream content) { FailedRequest failure; // by default XML is supported if (contentType.equals(MediaType.APPLICATION_XML_TYPE)) { FailedRequestParser xmlParser = new FailedRequestXMLParser(); failure = xmlParser.parseFailedRequest(httpStatus, content); } else if (contentType.equals(MediaType.APPLICATION_JSON_TYPE)) { failure = jsonFailedRequest(httpStatus, content); } else { failure = new FailedRequest(); failure.setStatusCode(httpStatus); failure.setMessageCode("UNKNOWN"); failure.setMessageString("Server (not a REST instance?) did not respond with an expected REST Error message."); failure.setStatusString("UNKNOWN"); } if (failure.getStatusCode() == 401) { failure.setMessageString("Unauthorized"); failure.setStatusString("Failed Auth"); } return failure; }
private FailedRequest extractErrorFields(Response response) { if ( response == null ) return null; try { if ( response.code() == STATUS_UNAUTHORIZED ) { FailedRequest failure = new FailedRequest(); failure.setMessageString("Unauthorized"); failure.setStatusString("Failed Auth"); return failure; } String responseBody = getEntity(response.body(), String.class); InputStream is = new ByteArrayInputStream(responseBody.getBytes("UTF-8")); FailedRequest handler = FailedRequest.getFailedRequest(response.code(), response.header(HEADER_CONTENT_TYPE), is); if ( handler.getMessage() == null ) { handler.setMessageString(responseBody); } return handler; } catch (UnsupportedEncodingException e) { throw new IllegalStateException("UTF-8 is unsupported", e); } finally { response.close(); } }
@SuppressWarnings("unchecked") @Override public FailedRequest parseFailedRequest(int httpStatus, InputStream content) { FailedRequest failure = new FailedRequest(); ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally Map<String, Map<String, String>> errorData; try { errorData = mapper.readValue(content, Map.class); Map<String, String> errorBody = errorData.get("errorResponse"); failure.setStatusCode(httpStatus); failure.setStatusString(errorBody.get("status")); failure.setMessageCode(errorBody.get("messageCode")); failure.setMessageString(errorBody.get("message")); failure.setStackTrace(errorBody.get("stackTrace")); } catch (JsonParseException e1) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server"); } catch (JsonMappingException e1) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server"); } catch (IOException e1) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server"); } return failure; } }
private void checkStatus(Response response, int status, String operation, String entityType, String path, ResponseStatus expected) { if (!expected.isExpected(status)) { FailedRequest failure = extractErrorFields(response); if (status == STATUS_NOT_FOUND) { throw new ResourceNotFoundException("Could not " + operation + " " + entityType + " at " + path, failure); } if ("RESTAPI-CONTENTNOVERSION".equals(failure.getMessageCode())) { throw new FailedRequestException("Content version required to " + operation + " " + entityType + " at " + path, failure); } else if (status == STATUS_FORBIDDEN) { throw new ForbiddenUserException("User is not allowed to " + operation + " " + entityType + " at " + path, failure); } throw new FailedRequestException("failed to " + operation + " " + entityType + " at " + path + ": " + getReasonPhrase(response), failure); } }
"Local message: User is not allowed to write /config/query. Server Message: You do not have permission to this method and URL.", e.getMessage()); assertEquals(403, e.getFailedRequest().getStatusCode()); assertEquals("Forbidden", e.getFailedRequest().getStatus()); "Local message: /config/query write failed: Bad Request. Server Message: RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: Operation results in invalid Options: Operator or constraint name \"blah\" is used more than once (must be unique).", e.getMessage()); assertEquals(400, e.getFailedRequest().getStatusCode()); assertEquals("Bad Request", e.getFailedRequest().getStatus()); assertEquals("RESTAPI-INVALIDCONTENT", e.getFailedRequest() .getMessageCode());
} catch (FailedRequestException e) { exception = e.toString(); statusCode = e.getFailedRequest().getMessageCode(); expCode = e.getFailedRequest().getStatusCode();
@Ignore public void testErrorOnNonREST() throws ForbiddenUserException { DatabaseClient badClient = DatabaseClientFactory.newClient(Common.HOST, 8001, new DigestAuthContext(Common.USER, Common.PASS)); ServerConfigurationManager serverConfig = badClient .newServerConfigManager(); try { serverConfig.readConfiguration(); } catch (FailedRequestException e) { assertEquals( "Local message: config/properties read failed: Not Found. Server Message: Server (not a REST instance?) did not respond with an expected REST Error message.", e.getMessage()); assertEquals(404, e.getFailedRequest().getStatusCode()); assertEquals("UNKNOWN", e.getFailedRequest().getStatus()); } finally { badClient.release(); } }
FailedRequest failreq = e.getFailedRequest(); if (failreq != null) statusCode = failreq.getStatusCode(); ex = e; FailedRequest failreq = e.getFailedRequest(); if (failreq != null) statusCode = failreq.getStatusCode(); ex = e; FailedRequest failreq = e.getFailedRequest(); if (failreq != null) statusCode = failreq.getStatusCode(); ex = e; FailedRequest failreq = e.getFailedRequest(); if (failreq != null) statusCode = failreq.getStatusCode(); ex = e;
@Override public String getMessage() { if (super.getMessage() != null && failedRequest != null) { return "Local message: " + super.getMessage() + ". Server Message: " + failedRequest.getMessage(); } else if (failedRequest != null) { return failedRequest.getMessage(); } else return super.getMessage(); }
private FailedRequest extractErrorFields(ClientResponse response) { InputStream is = response.getEntityInputStream(); try { FailedRequest handler = FailedRequest.getFailedRequest( response.getStatus(), response.getType(), is); return handler; } catch (RuntimeException e) { throw (e); } finally { response.close(); } }
@SuppressWarnings("unchecked") public FailedRequest parseFailedRequest(int httpStatus, InputStream content) { FailedRequest failure = new FailedRequest(); ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally Map<String, Map<String, String>> errorData; try { errorData = mapper.readValue(content, Map.class); Map<String, String> errorBody = errorData.get("error"); failure.setStatusCode(httpStatus); failure.setStatusString(errorBody.get("status")); failure.setMessageCode(errorBody.get("message-code")); failure.setMessageString(errorBody.get("message")); } catch (JsonParseException e1) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server"); } catch (JsonMappingException e1) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server"); } catch (IOException e1) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server"); } return failure; } }
if (failure.getMessageCode().equals("RESTAPI-CONTENTNOVERSION")) throw new FailedRequestException( "Content version required to delete document", failure); if (failure.getMessageCode().equals("RESTAPI-CONTENTWRONGVERSION")) throw new FailedRequestException( "Content version must match to delete document", failure); else if (failure.getMessageCode().equals("RESTAPI-EMPTYBODY")) throw new FailedRequestException( "Empty request body sent to server", failure);
@Override public String getMessage() { if (super.getMessage() != null && failedRequest != null) { return "Local message: " + super.getMessage() + ". Server Message: " + failedRequest.getMessage(); } else if (failedRequest != null) { return failedRequest.getMessage(); } else return super.getMessage(); }
@Override public FailedRequest parseFailedRequest(int httpStatus, InputStream is) { FailedRequest failure = new FailedRequest(); DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); .getElementsByTagNameNS(JerseyServices.ERROR_NS, "status-code").item(0).getTextContent(); failure.setStatusCode(Integer.parseInt(statusCode)); failure.setStatusString(doc .getElementsByTagNameNS(JerseyServices.ERROR_NS, "status").item(0).getTextContent()); failure.setMessageCode(doc .getElementsByTagNameNS(JerseyServices.ERROR_NS, "message-code").item(0).getTextContent()); failure.setMessageString(doc .getElementsByTagNameNS(JerseyServices.ERROR_NS, "message").item(0).getTextContent()); } catch (ParserConfigurationException e) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Unable to parse server error."); } catch (SAXException e) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Unable to parse server error details"); } catch (IOException e) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server");
failure = jsonFailedRequest(httpStatus, content); failure = new FailedRequest(); failure.setStatusCode(httpStatus); failure.setMessageString(""); failure.setStatusString("Not Found"); failure = new FailedRequest(); failure.setStatusCode(httpStatus); failure.setMessageCode("UNKNOWN"); failure.setMessageString("Server (not a REST instance?) did not respond with an expected REST Error message."); failure.setStatusString("UNKNOWN"); if (failure.getStatusCode() == 401) { failure.setMessageString("Unauthorized"); failure.setStatusString("Failed Auth");
if (failure.getMessageCode().equals("RESTAPI-CONTENTNOVERSION")) { throw new FailedRequestException( "Content version required to delete document", failure); if (failure.getMessageCode().equals("RESTAPI-CONTENTWRONGVERSION")) { throw new FailedRequestException( "Content version must match to delete document", failure); } else if (failure.getMessageCode().equals("RESTAPI-EMPTYBODY")) { throw new FailedRequestException( "Empty request body sent to server", failure);
@Override public FailedRequest parseFailedRequest(int httpStatus, InputStream is) { FailedRequest failure = new FailedRequest(); DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); failure.setStatusCode(Integer.parseInt(statusCode)); } else { failure.setStatusCode(httpStatus); failure.setStatusString( statuses.item(0).getTextContent() ); failure.setMessageCode( messageCodes.item(0).getTextContent() ); failure.setMessageString(formatString); } else { NodeList messageStrings = doc.getElementsByTagNameNS(ERROR_NS, "message"); if ( messageStrings != null && messageStrings.getLength() > 0 ) { failure.setMessageString( messageStrings.item(0).getTextContent() ); failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Unable to parse server error."); } catch (SAXException e) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Unable to parse server error details"); } catch (IOException e) { failure.setStatusCode(httpStatus); failure.setMessageString("Request failed. Error body not received from server");
if (failure.getMessageCode().equals("RESTAPI-CONTENTNOVERSION")) throw new FailedRequestException( "Content version required to write document", failure); if (failure.getMessageCode().equals("RESTAPI-CONTENTWRONGVERSION")) throw new FailedRequestException( "Content version must match to write document", failure); else if (failure.getMessageCode().equals("RESTAPI-EMPTYBODY")) throw new FailedRequestException( "Empty request body sent to server", failure);
failure = extractErrorFields(response); } else if ( statusCode == STATUS_UNAUTHORIZED ) { failure = new FailedRequest(); failure.setMessageString("Unauthorized"); failure.setStatusString("Failed Auth"); } else if (statusCode == STATUS_NOT_FOUND) { ResourceNotFoundException ex = failure == null ? new ResourceNotFoundException("Could not " + method + " at " + endpoint) : throw ex; } else { failure = new FailedRequest(); failure.setStatusCode(statusCode); failure.setMessageCode("UNKNOWN"); failure.setMessageString("Server did not respond with an expected Error message."); failure.setStatusString("UNKNOWN");
if (failure.getMessageCode().equals("RESTAPI-CONTENTNOVERSION")) { throw new FailedRequestException( "Content version required to write document", failure); if (failure.getMessageCode().equals("RESTAPI-CONTENTWRONGVERSION")) { throw new FailedRequestException( "Content version must match to write document", failure); } else if (failure.getMessageCode().equals("RESTAPI-EMPTYBODY")) { throw new FailedRequestException( "Empty request body sent to server", failure);