package com.jenkov.nioserver.http;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import com.jenkov.nioserver.IMessageReader;
import com.jenkov.nioserver.Message;
import com.jenkov.nioserver.MessageBuffer;
import com.jenkov.nioserver.Socket;
/**
* Project: java-nio-server
* File: HttpMessageReader.java
* Created: 18 Oct 2015
*
* @author jjenkov
*/
public class HttpMessageReader implements IMessageReader {
private MessageBuffer messageBuffer;
private List completeMessages = new ArrayList<>();
private Message nextMessage;
@Override
public void init(MessageBuffer readMessageBuffer) {
messageBuffer = readMessageBuffer;
nextMessage = messageBuffer.getMessage();
nextMessage.metaData = new HttpHeaders();
}
@Override
public void read(Socket socket, ByteBuffer byteBuffer) throws IOException {
socket.read(byteBuffer);
byteBuffer.flip();
if (byteBuffer.remaining() == 0) {
byteBuffer.clear();
return;
}
nextMessage.writeToMessage(byteBuffer);
int endIndex = HttpUtil.parseHttpRequest(nextMessage.sharedArray,
nextMessage.offset,
nextMessage.offset + nextMessage.length,
(HttpHeaders) nextMessage.metaData);
if (endIndex != -1) {
Message message = messageBuffer.getMessage();
message.metaData = new HttpHeaders();
message.writePartialMessageToMessage(nextMessage, endIndex);
completeMessages.add(nextMessage);
nextMessage = message;
}
byteBuffer.clear();
}
@Override
public List getMessages() { return completeMessages; }
}