package ar.com.javacuriosities.nio.server.http.reader; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import ar.com.javacuriosities.nio.server.clients.ClientSocket; import ar.com.javacuriosities.nio.server.http.util.HttpHeaders; import ar.com.javacuriosities.nio.server.http.util.HttpUtil; import ar.com.javacuriosities.nio.server.message.Message; import ar.com.javacuriosities.nio.server.message.MessageBuffer; import ar.com.javacuriosities.nio.server.message.reader.IMessageReader; /* * Implementación del Reader para un mensaje que utiliza el protocolo HTTP */ public class HttpMessageReader implements IMessageReader { private Message nextMessage = null; private MessageBuffer messageBuffer = null; private List<Message> completeMessages = new ArrayList<Message>(); public HttpMessageReader() { } @Override public void init(MessageBuffer readMessageBuffer) { this.messageBuffer = readMessageBuffer; this.nextMessage = messageBuffer.getMessage(); this.nextMessage.metaData = new HttpHeaders(); } @Override public void read(ClientSocket socket, ByteBuffer byteBuffer) throws IOException { socket.read(byteBuffer); byteBuffer.flip(); if(byteBuffer.remaining() == 0){ byteBuffer.clear(); return; } this.nextMessage.writeToMessage(byteBuffer); int endIndex = HttpUtil.parseHttpRequest(this.nextMessage.sharedBuffer, this.nextMessage.offset, this.nextMessage.offset + this.nextMessage.length, (HttpHeaders) this.nextMessage.metaData); if(endIndex != -1){ Message message = this.messageBuffer.getMessage(); message.metaData = new HttpHeaders(); message.writePartialMessageToMessage(nextMessage, endIndex); completeMessages.add(nextMessage); nextMessage = message; } byteBuffer.clear(); } @Override public List<Message> getMessages() { return this.completeMessages; } }