2015-10-22 20:02:55 +02:00
|
|
|
package com.jenkov.nioserver.http;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2019-12-28 10:43:48 +01:00
|
|
|
import com.jenkov.nioserver.IMessageReader;
|
|
|
|
import com.jenkov.nioserver.Message;
|
|
|
|
import com.jenkov.nioserver.MessageBuffer;
|
|
|
|
import com.jenkov.nioserver.Socket;
|
|
|
|
|
2015-10-22 20:02:55 +02:00
|
|
|
/**
|
2019-12-28 10:43:48 +01:00
|
|
|
* Project: <strong>java-nio-server</strong><br>
|
|
|
|
* File: <strong>HttpMessageReader.java</strong><br>
|
|
|
|
* Created: <strong>18 Oct 2015</strong><br>
|
|
|
|
*
|
|
|
|
* @author jjenkov
|
2015-10-22 20:02:55 +02:00
|
|
|
*/
|
|
|
|
public class HttpMessageReader implements IMessageReader {
|
|
|
|
|
2019-12-28 10:43:48 +01:00
|
|
|
private MessageBuffer messageBuffer;
|
|
|
|
|
|
|
|
private List<Message> 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<Message> getMessages() { return completeMessages; }
|
|
|
|
}
|