/*******************************************************************************
 * Copyright (c) 2003, 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.internet.monitor.core.internal.http;

import org.eclipse.wst.internet.monitor.core.internal.IProtocolAdapter;
import org.eclipse.wst.internet.monitor.core.internal.Monitor;
import org.eclipse.wst.internet.monitor.core.internal.provisional.Request;
/**
 * 
 */
public class HTTPRequest extends Request {
	protected static final String HTTP_REQUEST_HEADER = "request-header";
	protected static final String HTTP_RESPONSE_HEADER = "response-header";

	protected static final String HTTP_REQUEST_BODY = "request-body";
	protected static final String HTTP_RESPONSE_BODY = "response-body";

	protected static final byte[] EMPTY = new byte[0];

	/**
	 * Create an HTTPRequest.
	 * 
	 * @param monitor
	 * @param localPort
	 * @param remoteHost
	 * @param remotePort
	 */
	public HTTPRequest(Monitor monitor, int localPort, String remoteHost, int remotePort) {
		super(monitor, IProtocolAdapter.HTTP_PROTOCOL_ID, localPort, remoteHost, remotePort);
	}

	/**
	 * @see Request#getRequest(int)
	 */
	public byte[] getRequest(int type2) {
		if (type2 == ALL)
			return request;
		else if (type2 == TRANSPORT)
			return getRequestHeader();
		else
			return getRequestContent();
	}

	/**
	 * @see Request#getResponse(int)
	 */
	public byte[] getResponse(int type2) {
		if (type2 == ALL)
			return response;
		else if (type2 == TRANSPORT)
			return getResponseHeader();
		else
			return getResponseContent();
	}

	protected byte[] getRequestHeader() {
		Object obj = getProperty(HTTP_REQUEST_HEADER);
		if (obj == null || !(obj instanceof byte[]))
			return null;
		return (byte[]) obj;
	}

	protected byte[] getRequestContent() {
		Object obj = getProperty(HTTP_REQUEST_BODY);
		if (obj == null || !(obj instanceof byte[]))
			return null;
		return (byte[]) obj;
	}

	protected byte[] getResponseHeader() {
		Object obj = getProperty(HTTP_RESPONSE_HEADER);
		if (obj == null || !(obj instanceof byte[]))
			return null;
		return (byte[]) obj;
	}

	protected byte[] getResponseContent() {
		Object obj = getProperty(HTTP_RESPONSE_BODY);
		if (obj == null || !(obj instanceof byte[]))
			return null;
		return (byte[]) obj;
	}

	protected void setName(String n) {
		super.setName(n);
	}
}
