/* $Id: HttpResponse.java,v 1.1 2004/01/09 16:55:42 burkhard Exp $
 * Created on 09.05.2003 by sell
 *
 */
package de.skyrix.zsp.logic.httpclient;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

/**Response Objekt fuer eine HTTP Anfrage
 * 
 * @author sell
 * @version 
 */
public class HttpResponse {
  /**Body*/
  private byte[] responseBody = null;
  private InputStream responseStream = null;
  private String httpVersion = null;
  private int statusCode = 0;
  private String reasonMessage = null;
  private boolean statusLineRead = false;
  private Properties headers = null;
  private StringBuffer body;

  public HttpResponse(InputStream responseStream) {
    this.responseStream = responseStream;
    doParse();
  }

  private void readStatusLine(BufferedReader in) {
    if (statusLineRead)
      return;

    try {
      
      String statusString = in.readLine();
      while ((statusString != null) && !statusString.startsWith("HTTP/")) {
        statusString = in.readLine();
      }
      if (statusString == null) {
        //TODO: Am besten Exception thrown
        return;
      }

      parseStatusLine(statusString);
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void parseStatusLine(String statusLine) {
    int length = statusLine.length();

    if (!statusLine.startsWith("HTTP/")) {
      //          TODO: Am besten Exception thrown
      return;
    }

    int at = statusLine.indexOf(" ");
    if (at <= 0) {
      //          TODO: Am besten Exception thrown (Httpversion nicht gefunden)
    }

    this.httpVersion = (statusLine.substring(0, at)).toUpperCase();

    while (statusLine.charAt(at) == ' ') {
      at++;
    }

    int to = statusLine.indexOf(" ", at);
    if (to < 0) {
      to = length;
    }
    try {
      setStatusCode(Integer.parseInt(statusLine.substring(at, to)));
    }
    catch (NumberFormatException e) {
      e.printStackTrace();
      setStatusCode(0);
    }

    at = to + 1;
    try {
      if (at < length) {
        setReasonMessage(statusLine.substring(at).trim());
      }
      else {
        setReasonMessage("");
      }
    }
    catch (StringIndexOutOfBoundsException e) {
      e.printStackTrace();
    }
  }

  private void setStatusCode(int statusCode) {
    this.statusCode = statusCode;
  }

  public int getStatusCode() {
    return statusCode;
  }

  private void setReasonMessage(String reasonMessage) {
    this.reasonMessage = reasonMessage;
  }

  public String getReasonMessage() {
    return reasonMessage;
  }

  public void parseHeaders(BufferedReader in) {
    if (headers == null)
      headers = new Properties();
    else
      headers.clear();

    String name = null;
    StringBuffer value = null;
    try {

      for (;;) {
        String line = in.readLine();
        if ((line == null) || (line.length() < 1)) {
          break;
        }

        if ((line.charAt(0) == ' ') || (line.charAt(0) == '\t')) {
          value.append(' ');
          value.append(line.trim());
        }
        else {
          if (name != null) {
            headers.setProperty(name, value.toString());
          }

          int colon = line.indexOf(":");
          if (colon < 0) {
            //TODO: Header kann nicht geparst werden
          }
          try {
            name = line.substring(0, colon).trim();
            value = new StringBuffer(line.substring(colon + 1).trim());
          }
          catch (Exception e) {
          }
        }

      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    if (name != null) {
      headers.setProperty(name, value.toString());
    }
  }

  public Properties getHeaders() {
    return headers;
  }
  
  public String getBody() {
    if (body == null) return null;
    return body.toString();
  }

  private void parseBody(BufferedReader in) {
    if (in == null) return;
    
    try {
      body = new StringBuffer();
       
      String line = null;
      while ((line = line = in.readLine()) != null) {
        body.append(line);
        body.append("\n");
      }
    }
    catch (Exception e) {
    }
  }

  private void doParse() {
    BufferedReader in =
      new BufferedReader(new InputStreamReader(responseStream));

    readStatusLine(in);
    parseHeaders(in);
    parseBody(in);
  }

}
