📄 httpexternalservice.java
字号:
processResponse(statusCode); } catch (final IOException e) { // ODE MEX needs to be invoked in a TX. try { scheduler.execIsolatedTransaction(new Callable<Void>() { public Void call() throws Exception { PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId); String errmsg = "Unable to execute http request : " + e.getMessage(); log.error(errmsg, e); odeMex.replyWithFailure(MessageExchange.FailureType.COMMUNICATION_ERROR, errmsg, null); return null; } }); } catch (Exception e1) { String errmsg = "Error executing reply transaction; reply will be lost."; log.error(errmsg, e); } } finally { method.releaseConnection(); } return null; } public void processResponse(int statusCode) { // a one-way message does not care about the response try { // log the URI since the engine may have moved on while this One Way request was executing if (statusCode >= 400) { if (log.isWarnEnabled()) log.warn("OneWay http request [" + method.getURI() + "] failed with status: " + method.getStatusLine()); } else { if (log.isDebugEnabled()) log.debug("OneWay http request [" + method.getURI() + "] status: " + method.getStatusLine()); } } catch (URIException e) { if (log.isDebugEnabled()) log.debug(e); } } } private class TwoWayCallable extends OneWayCallable { public TwoWayCallable(org.apache.commons.httpclient.HttpClient client, HttpMethod method, String mexId, Operation operation) { super(client, method, mexId, operation); } public void processResponse(final int statusCode) { try { // ODE MEX needs to be invoked in a TX. scheduler.execIsolatedTransaction(new Callable<Void>() { public Void call() throws Exception { if (statusCode >= 200 && statusCode < 300) { _2xx_success(); } else if (statusCode >= 300 && statusCode < 400) { _3xx_redirection(); } else if (statusCode >= 400 && statusCode < 500) { _4xx_badRequest(); } else if (statusCode >= 500 && statusCode < 600) { _5xx_serverError(); } else { unmanagedStatus(); } return null; } }); } catch (Exception e) { String errmsg = "Error executing reply transaction; reply will be lost."; log.error(errmsg, e); } } private void unmanagedStatus() throws IOException { PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId); String errmsg = "Unmanaged Status Code! " + method.getStatusLine(); log.error(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } /** * For 500s if a fault is defined in the WSDL and the response body contains the corresponding xml doc, then reply with a fault ; else reply with failure. * * @throws IOException */ private void _5xx_serverError() throws IOException { String errmsg = "Internal Server Error! " + method.getStatusLine(); log.error(errmsg); PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId); Operation opDef = odeMex.getOperation(); BindingOperation opBinding = portBinding.getBindingOperation(opDef.getName(), opDef.getInput().getName(), opDef.getOutput().getName()); if (opDef.getFaults().isEmpty()) { errmsg = "Operation has no fault. This 500 error will be considered as a failure."; if (log.isDebugEnabled()) log.debug(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } else if (opBinding.getBindingFaults().isEmpty()) { errmsg = "No fault binding. This 500 error will be considered as a failure."; if (log.isDebugEnabled()) log.debug(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } else if (method.getResponseBodyAsStream() == null) { errmsg = "No body in the response. This 500 error will be considered as a failure."; if (log.isDebugEnabled()) log.debug(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } else { final InputStream bodyAsStream = method.getResponseBodyAsStream(); try { Element bodyEl = DOMUtils.parse(bodyAsStream).getDocumentElement(); QName bodyName = new QName(bodyEl.getNamespaceURI(), bodyEl.getNodeName()); Fault faultDef = WsdlUtils.inferFault(opDef, bodyName); // is this fault bound with ODE extension? if (!WsdlUtils.isOdeFault(opBinding.getBindingFault(faultDef.getName()))) { errmsg = "Fault " + bodyName + " is not bound with " + new QName(Namespaces.ODE_HTTP_EXTENSION_NS, "fault") + ". This 500 error will be considered as a failure."; if (log.isDebugEnabled()) log.debug(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } else { Part partDef = (Part) faultDef.getMessage().getParts().values().iterator().next(); // build the element to be sent back Document odeMsg = DOMUtils.newDocument(); Element odeMsgEl = odeMsg.createElementNS(null, "message"); Element partEl = odeMsgEl.getOwnerDocument().createElementNS(null, partDef.getName()); odeMsgEl.appendChild(partEl); // import the response body partEl.appendChild(odeMsgEl.getOwnerDocument().importNode(bodyEl, true)); QName faultType = new QName(targetNamespace, faultDef.getName()); Message response = odeMex.createMessage(faultType); response.setMessage(odeMsgEl); // extract and set headers httpMethodConverter.extractHttpResponseHeaders(response, method, faultDef.getMessage(), opBinding.getBindingOutput()); // finally send the fault. We did it! odeMex.replyWithFault(faultType, response); } } catch (Exception e) { errmsg = "Unable to parse the response body as xml. This 500 error will be considered as a failure."; if (log.isDebugEnabled()) log.debug(errmsg, e); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method, false)); } } } private void _4xx_badRequest() throws IOException { PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId); String errmsg = "Bad Request! " + method.getStatusLine(); log.error(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } private void _3xx_redirection() throws IOException { PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId); String errmsg = "Redirections are not supported! " + method.getStatusLine(); log.error(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } private void _2xx_success() { PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId); if (log.isDebugEnabled()) log.debug("Http Status Line=" + method.getStatusLine()); if (log.isDebugEnabled()) log.debug("Received response for MEX " + odeMex); Operation opDef = odeMex.getOperation(); BindingOperation opBinding = portBinding.getBindingOperation(opDef.getName(), opDef.getInput().getName(), opDef.getOutput().getName()); // assumption is made that a response may have at most one body. HttpBindingValidator checks this. MIMEContent outputContent = WsdlUtils.getMimeContent(opBinding.getBindingOutput().getExtensibilityElements()); boolean isBodyMandatory = outputContent != null && outputContent.getType().endsWith("text/xml"); try { final InputStream bodyAsStream = method.getResponseBodyAsStream(); if (isBodyMandatory && bodyAsStream == null) { String errmsg = "Response body is mandatory but missing! Msg Id=" + odeMex.getMessageExchangeId(); log.error(errmsg); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, null); } else { javax.wsdl.Message outputMessage = odeMex.getOperation().getOutput().getMessage(); Message odeResponse = odeMex.createMessage(outputMessage.getQName()); // handle the body if any if (bodyAsStream != null) { // only text/xml is supported in the response body try { Element bodyElement = DOMUtils.parse(bodyAsStream).getDocumentElement(); // we expect a single part per output message // see org.apache.ode.axis2.httpbinding.HttpBindingValidator call in constructor Part part = (Part) outputMessage.getParts().values().iterator().next(); Element partElement = httpMethodConverter.createPartElement(part, bodyElement); odeResponse.setPart(part.getName(), partElement); } catch (Exception e) { String errmsg = "Unable to parse the response body: " + e.getMessage(); log.error(errmsg, e); odeMex.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR, errmsg, null); return; } } // handle headers httpMethodConverter.extractHttpResponseHeaders(odeResponse, method, outputMessage, opBinding.getBindingOutput()); try { if (log.isInfoEnabled()) log.info("Response:\n" + DOMUtils.domToString(odeResponse.getMessage())); odeMex.reply(odeResponse); } catch (Exception ex) { String errmsg = "Unable to process response: " + ex.getMessage(); log.error(errmsg, ex); odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method)); } } } catch (IOException e) { String errmsg = "Unable to get the request body : " + e.getMessage(); log.error(errmsg, e); odeMex.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR, errmsg, null); return; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -