HttpMessageHandler.java
/*
* Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.synapse.transport.util;
import org.apache.axis2.context.MessageContext;
import org.apache.synapse.transport.netty.BridgeConstants;
import org.apache.synapse.transport.netty.util.MessageUtils;
import org.apache.synapse.transport.passthru.PassThroughConstants;
import org.wso2.transport.http.netty.message.HttpCarbonMessage;
import org.wso2.transport.http.netty.message.HttpMessageDataStreamer;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
/**
* Message handler to handle the messages coming through Netty based HTTP transport.
*/
public class HttpMessageHandler implements MessageHandler {
@Override
public InputStream getMessageDataStream(MessageContext msgContext) {
HttpCarbonMessage carbonMessage =
(HttpCarbonMessage) msgContext.getProperty(BridgeConstants.HTTP_CARBON_MESSAGE);
if (Objects.isNull(carbonMessage)) {
return null;
}
BufferedInputStream bufferedInputStream;
if (msgContext.getProperty(PassThroughConstants.BUFFERED_INPUT_STREAM) != null) {
bufferedInputStream =
(BufferedInputStream) msgContext.getProperty(PassThroughConstants.BUFFERED_INPUT_STREAM);
try {
bufferedInputStream.reset();
bufferedInputStream.mark(0);
} catch (Exception e) {
//just ignore the error
}
} else {
HttpMessageDataStreamer httpMessageDataStreamer = new HttpMessageDataStreamer(carbonMessage);
bufferedInputStream = new BufferedInputStream(httpMessageDataStreamer.getInputStream());
// Multiplied it by two because we always need a bigger read-limit than the buffer size.
bufferedInputStream.mark(Integer.MAX_VALUE);
msgContext.setProperty(PassThroughConstants.BUFFERED_INPUT_STREAM, bufferedInputStream);
}
return bufferedInputStream;
}
@Override
public void buildMessage(MessageContext messageContext) throws IOException {
MessageUtils.buildMessage(messageContext);
}
@Override
public void buildMessage(MessageContext messageContext, boolean earlyBuild) throws IOException {
MessageUtils.buildMessage(messageContext, earlyBuild);
}
}