<?php

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Http
 * @subpackage Client_Adapter
 * @version    $Id: Interface.php 8064 2008-02-16 10:58:39Z thomas $
 * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */

/**
 * An interface description for Zend_Http_Client_Adapter classes.
 *
 * These classes are used as connectors for Zend_Http_Client, performing the
 * tasks of connecting, writing, reading and closing connection to the server.
 *
 * @category   Zend
 * @package    Zend_Http
 * @subpackage Client_Adapter
 * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
interface Zend_Http_Client_Adapter_Interface {

  /**
   * Set the configuration array for the adapter
   *
   * @param array $config
   */
  public function setConfig($config = array());

  /**
   * Connect to the remote server
   *
   * @param string  $host
   * @param int     $port
   * @param boolean $secure
   */
  public function connect($host, $port = 80, $secure = false);

  /**
   * Send request to the remote server
   *
   * @param string        $method
   * @param Zend_Uri_Http $url
   * @param string        $http_ver
   * @param array         $headers
   * @param string        $body
   * @return string Request as text
   */
  public function write($method, $url, $http_ver = '1.1', $headers = array(), $body = '');

  /**
   * Read response from server
   *
   * @return string
   */
  public function read();

  /**
   * Close the connection to the server
   *
   */
  public function close();
}
