/* 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.felix.upnp.basedriver.importer.util;

import java.io.*;
import java.net.*;

/* 
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class HTTPRequestForIcon {
	private URL url;

	public HTTPRequestForIcon(URL url) {
		this.url = url;
	}
	public InputStream getInputStream() throws IOException {
		//TODO we should speak about that
		InetAddress inet = InetAddress.getByName(url.getHost());
		int port = url.getPort();
		Socket socket = null;
		socket = new Socket(inet, port);
		OutputStream out = null;
		out = socket.getOutputStream();
		String CRLF = "\r\n";
		url.getFile();
		String request = "GET " + url.getPath() + " " + "HTTP/1.1" + CRLF
				+ "Host: " + url.getHost() + CRLF + "Connection: " + "close"
				+ CRLF + CRLF;
		//System.out.println(request);
		byte[] get = request.getBytes();
		out.write(get, 0, get.length);
		InputStream in = socket.getInputStream();
		boolean exit = true;
		while (exit) {
			byte[] b = new byte[1];
			in.read(b, 0, b.length);

			if (b[0] == '\r') {
				in.read(b, 0, b.length);
				while (b[0] == '\r') {
					in.read(b, 0, b.length);
				}
				if (b[0] != '\n') {
					continue;
				}
				in.read(b, 0, b.length);
				if (b[0] != '\r') {
					continue;
				}
				in.read(b, 0, b.length);
				if (b[0] != '\n') {
					continue;
				}
				exit = false;
			}
		}

		return in;

		/*
		 * HTTPResponse response=new HTTPResponse(in); 
		 * InputStream  iconInStream=response.getContentInputStream(); 
		 * return iconInStream;
		 * 
		 */
		/*
		 * 
		 * byte[] buff = new byte[maxLength]; int initial = 0; while (initial <
		 * maxLength - 1) { int read = 0; read = in.read(buff, initial, 1024);
		 * if (read == -1) break; initial += read; } System.out.println(new
		 * String(buff));
		 */

	}

}
