root/Weektaken2/Weektaak3/ESB/src/hanze/ga/wt3/http/HTTPPostConnection.java

User picture

Author: klystr

Revision: 369 («Previous)


File Size: 3.72 KB

(December 07, 2009 11:19 UTC) Over 2 years ago


  

 
Show/hide line numbers
package hanze.ga.wt3.http;

import hanze.ga.wt3.channels.App2Q;
import hanze.ga.wt3.main.ESBServer;
import hanze.ga.wt3.socket.SocketApp2QChannel;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class HTTPPostConnection implements Runnable {

	private Socket socket;
	private PrintWriter outPutWriter;
	private BufferedReader inputReader;
	private HTTPApp2QChannel httpObject;

	public HTTPPostConnection(Socket accept, HTTPApp2QChannel httpObject) {
		this.socket = accept;
		this.httpObject = httpObject;
	}

	private String getHttpQueueName(App2Q object) {
		return object.getDestinationQueue().getqName();
	}

	private String getQueueName(String header) {
		// "POST /<<QueueNaam>> HTTP/1.1"
		return header.substring(6, header.indexOf(" HTTP/1.1"));
	}

	private String getReqeustInfo(String inputLine) {
		// Queuenaam / Content length
		return inputLine.substring(5).trim();
	}

	private void handleSocketRequest(String inputLine) {

		// Pak socket
		SocketApp2QChannel inputSocket;
		inputSocket = (SocketApp2QChannel) ESBServer.esbChannels.get("LocatorIn");

		// Header info
		String header = getReqeustInfo(inputLine);
		String[] info = header.split("/");

		// Queue controleren
		if (this.getHttpQueueName(inputSocket).equals(info[0].trim())) {
			try {
				String readline = inputReader.readLine();
				while (readline != null) {
					inputSocket.getDestinationQueue().addToQueue(inputLine);
					outPutWriter.println("ACK");
					break;
				}
			} catch (Exception e) {
				// Do nothing
				outPutWriter.println("NACK");
			}
		} else {
			outPutWriter.println("NACK");
		}
	}

	private void handleValidRequest() {
		int contentLength = 0;
		try {
			String inputLine = inputReader.readLine();
			while (inputLine != null) {
				if (inputLine.startsWith("Content-Length=")) {
					// Content length oplezen
					try {
						contentLength = Integer.parseInt(inputLine.substring(15));
					} catch (Exception e) {
						outPutWriter.println("HTTP/1.1 500 Bad Request");
						break;
					}
				} else {
					this.httpObject.getDestinationQueue().addToQueue(inputLine);
					break;
				}
				inputLine = inputReader.readLine().trim();
			}

		} catch (Exception e) {
			outPutWriter.println("HTTP/1.1 500 Bad Request");
		}
	}

	private void initListen() {
		System.out.println("[HTTPApp2QChannel] Connection received from "
				+ socket.getInetAddress().getHostName());

		try {
			inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			outPutWriter = new PrintWriter(socket.getOutputStream(), true);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void listenAndHandle() {

		// Luister naar input van gebruiker
		try {
			String inputLine = inputReader.readLine();
			while (inputLine != null) {
				if (inputLine.startsWith("POST")) { // Naar FTP Queue
					if (this.getHttpQueueName(this.httpObject).equals(this.getQueueName(inputLine))) {
						this.handleValidRequest();
						outPutWriter.println("HTTP/1.1 200 OK");
						break;
					} else {
						outPutWriter.println("HTTP/1.1 404 Not Found");
						break;
					}
				} else if (inputLine.startsWith("SEND")) { // Naar Socket Queue
					this.handleSocketRequest(inputLine);
				}

				// Volgende line
				inputLine = inputReader.readLine();
			}

			// Sluiten
			outPutWriter.close();
			inputReader.close();

		} catch (Exception e) {
			// do nothing
			System.err.println("Fout in connectie");
		}

	}

	@Override
	public void run() {
		// Open connection
		this.initListen();

		// Input lezen
		this.listenAndHandle();
	}

}