WSO2微集成器API构建Passthrough流时出现StringIndexOutOfBoundsException排查
问题分析:java.lang.StringIndexOutOfBoundsException 错误原因排查
问题背景
通过API Manager发布Micro Integrator API后,客户端测试时遇到java.lang.StringIndexOutOfBoundsException错误,请求未被API的第一个中介器记录日志。使用Postman发送相同请求可正常工作,无法复现该错误,客户端声称请求发送正确,需排查该异常的可能原因。
错误日志
Error while building Passthrough stream java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 1025 at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319) at java.base/java.lang.String.substring(String.java:1874) at org.apache.synapse.commons.builders.XFormURLEncodedBuilder.extractParametersFromRequest(XFormURLEncodedBuilder.java:223) at org.apache.synapse.commons.builders.XFormURLEncodedBuilder.processDocumentWrapper(XFormURLEncodedBuilder.java:128) at org.apache.synapse.commons.builders.XFormURLEncodedBuilder.processDocument(XFormURLEncodedBuilder.java:52) at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:153) at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:169) at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:122) at org.apache.synapse.transport.util.PassThroughMessageHandler.buildMessage(PassThroughMessageHandler.java:103) at org.apache.synapse.mediators.AbstractListMediator.buildMessage(AbstractListMediator.java:155) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:96) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:72) at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) at org.apache.synapse.api.Resource.process(Resource.java:342) at org.apache.synapse.api.API.process(API.java:477) at org.apache.synapse.api.AbstractApiHandler.apiProcessNonDefaultStrategy(AbstractApiHandler.java:107) at org.apache.synapse.api.AbstractApiHandler.identifyAPI(AbstractApiHandler.java:127) at org.apache.synapse.api.AbstractApiHandler.dispatchToAPI(AbstractApiHandler.java:54) at org.apache.synapse.api.rest.RestRequestHandler.dispatchToAPI(RestRequestHandler.java:90) at org.apache.synapse.api.rest.RestRequestHandler.process(RestRequestHandler.java:76) at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:54) at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:344) at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:101) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:376) at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:435) at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183) at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) {api:v1.0.0} Error while building message. Error while building Passthrough stream org.apache.axis2.AxisFault: Error while building Passthrough stream at org.apache.synapse.transport.passthru.util.RelayUtils.handleException(RelayUtils.java:453) at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:216) at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:122) at org.apache.synapse.transport.util.PassThroughMessageHandler.buildMessage(PassThroughMessageHandler.java:103) at org.apache.synapse.mediators.AbstractListMediator.buildMessage(AbstractListMediator.java:155) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:96) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:72) at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) at org.apache.synapse.api.Resource.process(Resource.java:342) at org.apache.synapse.api.API.process(API.java:477) at org.apache.synapse.api.AbstractApiHandler.apiProcessNonDefaultStrategy(AbstractApiHandler.java:107) at org.apache.synapse.api.AbstractApiHandler.identifyAPI(AbstractApiHandler.java:127) at org.apache.synapse.api.AbstractApiHandler.dispatchToAPI(AbstractApiHandler.java:54) at org.apache.synapse.api.rest.RestRequestHandler.dispatchToAPI(RestRequestHandler.java:90) at org.apache.synapse.api.rest.RestRequestHandler.process(RestRequestHandler.java:76) at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:54) at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:344) at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:101) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:376) at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:435) at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183) at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 1025 at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319) at java.base/java.lang.String.substring(String.java:1874) at org.apache.synapse.commons.builders.XFormURLEncodedBuilder.extractParametersFromRequest(XFormURLEncodedBuilder.java:223) at org.apache.synapse.commons.builders.XFormURLEncodedBuilder.processDocumentWrapper(XFormURLEncodedBuilder.java:128) at org.apache.synapse.commons.builders.XFormURLEncodedBuilder.processDocument(XFormURLEncodedBuilder.java:52) at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:153) at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:169) ... 24 more {api:v1.0.0} ERROR_CODE = 0, ERROR_MESSAGE = Error while building message. Error while building Passthrough stream, ERROR_DETAILS = null
可能的原因
- 表单请求格式不规范:
异常栈显示错误发生在XFormURLEncodedBuilder的参数解析步骤,说明Micro Integrator在解析application/x-www-form-urlencoded类型请求时失败。常见情况包括:- 请求体中存在无值的参数(如
key=或仅key),解析逻辑未处理该场景; - 参数包含未正确转义的特殊字符,导致字符串截取时索引计算错误;
- 请求体格式损坏,缺少参数分隔符
&或存在非法字符。
- 请求体中存在无值的参数(如
- 请求头与请求体不匹配:
客户端请求头声明Content-Type: application/x-www-form-urlencoded,但实际发送的请求体并非标准表单格式,解析器按表单规则解析非表单数据,触发索引越界。 - Micro Integrator版本bug:
部分旧版本的WSO2 Micro Integrator在处理特定表单请求时存在边界校验漏洞,比如处理空值参数或超长参数时未做索引合法性检查,升级到稳定版本可解决。 - 请求编码不一致:
客户端发送的请求体编码与Content-Encoding头声明的编码不匹配,导致解析器读取的字符串内容异常,触发索引越界。
内容的提问来源于stack exchange,提问作者idix
相关产品推荐
相关产品推荐

