Apache Mina SSL-прокси (вроде)
Мне нужно реализовать http-прокси с поддержкой SSL. SSL работает нормально, и мне нужно проанализировать поступающее сообщение, чтобы оно было HTTP-запросом или другим.
Как я думал, что это может сработать:
1. in messageReceived I should check I will check if first "maximum-length
of HTTP request method name length" amout of bytes converted to string
(new String(byte[]) starts with any of HTTP method name (e.g. GET,POST..)
2a) If so, let's tread this session as HTTP request, grap whole request and
send it to another HTTP server, wait for response, return the response and
close the connection.
2b) Otherwise, this is binary tcp connection with data, I want to keep this
connection alive and play with incoming data/send data to it.
Проблема в том, что при обратном вызове messageReceived() я получаю иногда полные, иногда неполные данные HTTP-запроса, и он вызывается несколько раз. Например, когда я запускаю HTTP-запрос к порту, он вызывается, например, один раз только с первой строкой http + заголовками, затем он вызывается с данными POST.
Я настроил прослушивание TCP с помощью mina следующим образом:
IoAcceptor acceptor = new NioSocketAcceptor();
int port = 5555; //whatever
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
// ssl support
SslFilter sslFilter = new SslFilter(MySslContextFactory.getInstance(true));
chain.addFirst("sslFilter", sslFilter);
// handling
acceptor.setHandler( new TCPHandler() );
// listening at 0.0.0.0:5555
acceptor.bind( new InetSocketAddress(port) );
Фрагмент TCPHandler.java messageReceived выглядит следующим образом:
@Override
public void messageReceived( IoSession session, Object message ) throws Exception
IoBuffer msgBuffer = (IoBuffer)message;
byte[] msgBytes = msgBuffer.array();
msgBytes = Arrays.copyOfRange(msgBytes, 0, msgBuffer.limit());
}
Я не уверен, как / когда проверить, что я прочитал ВСЕ ДАННЫЕ HTTP-запроса. Это часто происходит в пакетах данных (при проверке переменной msgBytes)