/// <summary>
        /// Connects to the server specified by the address and port, sends the request and waits for a response.
        /// </summary>
        /// <param name="address">The address of the server, either an IPv4 address or Dns hostname</param>
        /// <param name="port">The port of the server</param>
        /// <param name="request">The request to send</param>
        /// <param name="exception">Any exception that is throw or encountered during the request/response session with the server</param>
        /// <param name="verbose">A flag that indicates the connection's verbosity level, true for more messages</param>
        /// <returns></returns>
        public static HttpResponse GetResponse(
            string address,
            int port,
            HttpRequest request,
            out Exception exception,
            bool verbose,
            EventHandler <AddressResolutionEventArgs> onResolvingAddress,
            EventHandler <HttpMessageProgressEventArgs> onSendProgress,
            EventHandler <HttpMessageProgressEventArgs> onRecvProgress,
            object stateObject)
        {
            exception = null;

            try
            {
                // parse the address using either IPv4 or Dns for hostnames into an end point with the port specified
                IPEndPoint ep = SocketUtilities.Resolve(address, port, null, onResolvingAddress, stateObject);

                // return a response from the server
                return(HttpRequest.GetResponse(ep, request, out exception, verbose, onSendProgress, onRecvProgress, stateObject));
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                exception = ex;
            }
            return(null);
        }
        /// <summary>
        /// Connects to the server specified by the endpoint, sends the request and waits for a response.
        /// </summary>
        /// <param name="ep">The address:port of the server</param>
        /// <param name="request">The request to send</param>
        /// <param name="exception">Any exception that is throw or encountered during the request/response session with the server</param>
        /// <param name="verbose">A flag that indicates the connection's verbosity level, true for more messages</param>
        /// <returns></returns>
        public static HttpResponse GetResponse(
            IPEndPoint ep,
            HttpRequest request,
            out Exception exception,
            bool verbose,
            EventHandler <HttpMessageProgressEventArgs> onSendProgress,
            EventHandler <HttpMessageProgressEventArgs> onRecvProgress,
            object stateObject)
        {
            #region Params Validation

            if (ep == null)
            {
                throw new ArgumentNullException("ep");
            }

            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            exception = null;

            #endregion

            // define a connection for this request/response session
            HttpConnection connection = null;

            try
            {
                // create a connection to the remote end point
                connection = new HttpConnection(ep, false, verbose, HttpOptions.SendTimeout, HttpOptions.RecvTimeout);

                // return a response from the server
                return(HttpRequest.GetResponse(connection, request, out exception, onSendProgress, onRecvProgress, stateObject));
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                //Debug.WriteLine(ex);
                exception = ex;
            }
            finally
            {
                // always try and close the connect up afterwards
                if (connection != null)
                {
                    connection.Close();
                }
            }
            return(null);
        }