//
// Transport.h
//
// Transport: A virtual transport interface class for accessing
// remote documents. Used to grab URLs based on the
// scheme (e.g. http://, ftp://...)
//
// Part of the ht://Dig package
// Copyright (c) 1995-2004 The ht://Dig Group
// For copyright details, see the file COPYING in your distribution
// or the GNU Library General Public License (LGPL) version 2 or later
//
//
// $Id: Transport.h,v 1.12 2004/05/28 13:15:23 lha Exp $
//
//
#ifndef _Transport_H
#define _Transport_H
#ifdef HAVE_CONFIG_H
#include "htconfig.h"
#endif
#include "Object.h"
#include "HtDateTime.h"
#include "htString.h"
#include "URL.h"
#include "Connection.h"
#ifdef HAVE_STD
#include
#ifdef HAVE_NAMESPACES
using namespace std;
#endif
#else
#include
#endif /* HAVE_STD */
// Declare in advance
class Transport;
// But first, something completely different. Here's the response class
class Transport_Response : public Object
{
friend class Transport; // declaring friendship
public:
///////
// Construction / Destruction
///////
Transport_Response();
virtual ~Transport_Response();
// Reset the information stored
virtual void Reset(); // This function must be defined
// Get the contents
virtual const String &GetContents() const { return _contents; }
// Get the modification time object pointer
virtual HtDateTime *GetModificationTime() const { return _modification_time; }
// Get the access time object pointer
virtual HtDateTime *GetAccessTime() const { return _access_time; }
// Get the Content type
virtual const String &GetContentType() const { return _content_type; }
// Get the Content length
virtual int GetContentLength() const { return _content_length; }
// Get the Document length (really stored)
virtual int GetDocumentLength() const { return _document_length; }
// Get the Status Code
virtual int GetStatusCode() const { return _status_code; }
// Get the Status Code reason phrase
virtual const String &GetReasonPhrase() { return _reason_phrase; }
// Get the location (redirect)
virtual const String &GetLocation() { return _location; }
protected:
// Body of the response message
String _contents; // Contents of the document
HtDateTime *_modification_time; // Modification time returned by the server
HtDateTime *_access_time; // Access time returned by the server
String _content_type; // Content-type returned by the server
int _content_length; // Content-length returned by the server
int _document_length; // Length really stored
int _status_code; // return Status code
String _reason_phrase; // status code reason phrase
String _location; // Location (in case of redirect)
};
///////
// Transport class declaration
///////
class Transport : public Object
{
public:
///////
// Construction / Destruction
///////
Transport(Connection* _connection = 0);
virtual ~Transport();
///////
// Enumeration of possible return status of a resource retrieving
///////
enum DocStatus
{
Document_ok,
Document_not_changed,
Document_not_found,
Document_not_parsable,
Document_redirect,
Document_not_authorized,
Document_no_connection,
Document_connection_down,
Document_no_header,
Document_no_host,
Document_no_port,
Document_not_local,
Document_not_recognized_service, // Transport service not recognized
Document_other_error // General error (memory)
};
///////
// Connects to an host and a port
// Overloaded methods provided in order to take
// the info from a URL obj or ptr
///////
// Set Connection parameters
virtual void SetConnection (const String &host, int port);
// from a URL pointer
virtual void SetConnection (URL *u)
{ SetConnection (u->host(), u->port()); }
// from a URL object
virtual void SetConnection (URL &u)
{ SetConnection (&u); }
// Make the request
virtual DocStatus Request() = 0; // different in derived classes
// Get the date time information about the request
const HtDateTime *GetStartTime() const { return &_start_time; }
const HtDateTime *GetEndTime() const { return &_end_time; }
// Set and get the connection time out value
void SetTimeOut ( int t ) { _timeout=t; }
int GetTimeOut () { return _timeout; }
// Set and get the connection retry number
void SetRetry ( int r ) { _retries=r; }
int GetRetry () { return _retries; }
// Set and get the wait time after a failed connection
void SetWaitTime ( unsigned int t ) { _wait_time = t; }
unsigned int GetWaitTime () { return _wait_time; }
// Get the Connection Host
const String &GetHost() { return _host; }
// Get the Connection IP Address
const String &GetHostIPAddress() { return _ip_address; }
// Get the Connection Port
int GetPort() { return _port; }
// Set and get the credentials
// Likely to vary based on transport protocol
virtual void SetCredentials (const String& s) { _credentials = s;}
virtual String GetCredentials () { return _credentials;}
// Proxy settings
virtual void SetProxy(int aUse) { _useproxy=aUse; }
// Proxy credentials
virtual void SetProxyCredentials (const String& s) { _proxy_credentials = s;}
virtual String GetProxyCredentials () { return _proxy_credentials;}
// Set the modification date and time for If-Modified-Since
void SetRequestModificationTime (HtDateTime *p) { _modification_time=p; }
void SetRequestModificationTime (HtDateTime &p)
{ SetRequestModificationTime (&p) ;}
// Get the modification date time
HtDateTime *GetRequestModificationTime () { return _modification_time; }
// Get and set the max document size to be retrieved
void SetRequestMaxDocumentSize (int s) { _max_document_size=s; }
int GetRequestMaxDocumentSize() const { return _max_document_size; }
virtual Transport_Response *GetResponse() = 0;
virtual DocStatus GetDocumentStatus() = 0;
///////
// Querying the status of the connection
///////
// Are we still connected?
// This is the only part regarding
// a connection that's got a public access
virtual bool isConnected(){ return _connection?_connection->IsConnected():0; }
// Set the default parser string for the content-type
static void SetDefaultParserContentType (const String &ct)
{ _default_parser_content_type = ct; }
// Set the debug level
static void SetDebugLevel (int d) { debug=d;}
// Get statistics info
static int GetTotOpen () { return _tot_open; }
static int GetTotClose () { return _tot_close; }
static int GetTotServerChanges () { return _tot_changes; }
protected:
///////
// Services about a Transport layer connection
// They're invisible from outside
///////
// Open the connection
virtual int OpenConnection();
// Assign the host and the port for the connection
int AssignConnectionServer();
int AssignConnectionPort();
// Connect to the specified host and port
int Connect();
// Write a message
inline int ConnectionWrite(char *cmd)
{ return _connection?_connection->Write(cmd):0; }
// Assign the timeout to the connection (returns the old value)
inline int AssignConnectionTimeOut()
{ return _connection?_connection->Timeout(_timeout):0; }
// Assign the retry number to the connection (returns the old value)
inline int AssignConnectionRetries()
{ return _connection?_connection->Retries(_retries):0; }
// Assign the wait time (after a failure) to the connection
inline int AssignConnectionWaitTime()
{ return _connection?_connection->WaitTime(_wait_time):0; }
// Flush the connection
void FlushConnection();
// Close the connection
int CloseConnection();
// Reset Stats
static void ResetStatistics ()
{ _tot_open=0; _tot_close=0; _tot_changes=0;}
// Show stats
static ostream &ShowStatistics (ostream &out);
// Methods for manipulating date strings -- useful for subclasses
enum DateFormat
{
DateFormat_RFC1123,
DateFormat_RFC850,
DateFormat_AscTime,
DateFormat_NotRecognized
};
// Create a new HtDateTime object
HtDateTime *NewDate(const char *);
// Recognize Date Format
DateFormat RecognizeDateFormat (const char *);
protected:
Connection *_connection; // Connection object
String _host; // TCP Connection host
String _ip_address; // TCP Connection host (IP Address)
int _port; // TCP Connection port
int _timeout; // Connection timeout
int _retries; // Connection retry limit
unsigned int _wait_time; // Connection wait time (if failed)
HtDateTime *_modification_time; // Stored modification time if avail.
int _max_document_size; // Max document size to retrieve
String _credentials; // Credentials for this connection
int _useproxy; // if true, GET should include full url,
// not path only
String _proxy_credentials; // Credentials for this proxy connection
HtDateTime _start_time; // Start time of the request
HtDateTime _end_time; // end time of the request
///////
// Default parser content-type
// This string is matched in order to determine
// what content type can be considered parsed
// directly by the internal indexer (not by using
// any external parser)
///////
static String _default_parser_content_type;
///////
// Debug level
///////
static int debug;
// Statistics about requests
static int _tot_open; // Number of connections opened
static int _tot_close; // Number of connections closed
static int _tot_changes; // Number of server changes
// Use the HTTP Basic Digest Access Authentication method to write a String
// to be used for credentials (both HTTP and HTTP PROXY authentication)
static void SetHTTPBasicAccessAuthorizationString(String &dest, const String& s);
};
#endif