The Host Class

/*
**	(c) COPYRIGHT MIT 1995.
**	Please first read the full copyright statement in the file COPYRIGH.
*/

The Host class manages what we know about a remote host. This can for example be what type of host it is, and what version it is using. Notice that a host object can be used to describe both a server or a client - all information in the Host object can be shared regardless of whether it is to be used in a server application or a client application.

This module is implemented by HTHost.c, and it is a part of the W3C Reference Library.

#ifndef HTHOST_H
#define HTHOST_H

typedef struct _HTHost HTHost;

#include "HTChannl.h"
#include "HTReq.h"
#include "HTEvent.h"

The Host class contains information about the remote host, for example the type (HTTP/1.0, HTTP/1.1, FTP etc.) along with information on how the connections can be used (if it supports persistent connections, interleaved access etc.)

Creation and Deletion Methods

We keep a cache of information that we know about a remote host. This allows us to be much more detailed in geneating requests. Search the host info cache for a host object or create a new one and add it. Examples of host names are

Add a Host Object

extern HTHost * HTHost_new (char * host);

Delete a Host Object

The Host Class contains an automatic garbage collection of Host objects so that we don't keep information around that is stale.

Host Class Methods

This is what we know about the remote host

Remote Host Class and Version

Define the host class of the host at the other end. A class is a generic description of the protocol which is exactly like the access method in a URL, for example "http" etc. The host version is a finer distinction (sub-class) between various versions of the host class, for example HTTP/0.9, HTTP/1.1 etc. The host version is a bit flag that the protocol module can define on its own. That way we don't have to change this module when registering a new protocol module. The host type is a description of whether we can keep the connection persistent or not.

extern char * HTHost_class	(HTHost * host);
extern void HTHost_setClass	(HTHost * host, char * s_class);

extern int  HTHost_version	(HTHost * host);
extern void HTHost_setVersion	(HTHost * host, int version);

Register a Persistent Channel

We don't want more than MaxSockets-2 connections to be persistent in order to avoid deadlock.

extern BOOL HTHost_setChannel (HTHost * host, HTChannel * channel);
extern BOOL HTHost_clearChannel (HTHost * host);

extern HTChannel * HTHost_channel (HTHost * host);

Is this host Persistent?

Check whether we have a persistent channel or not

extern BOOL HTHost_isPersistent (HTHost * host);

Timing Persistent Channels

Normally we wait for the peer process to close persistent connections but in order not to use up our own resources, we have a timeout on our own. The default value is 1 hour, but you can modify the value using the following methods:

extern time_t HTHost_persistTimeout (time_t timeout);
extern void HTHost_setPersistTimeout (time_t timeout);

Each persistent connection has an absolute value of when this connection most likely will expire. If the peer process does not inform us, we use our own timeout.

extern void HTHost_setPersistExpires (HTHost * host, time_t expires);
extern time_t HTHost_persistExpires (HTHost * host);

Catching a Close Event

This function is registered when the socket is idle so that we get a notification if the socket closes at the other end. At this point we can't use the request object as it might have been freed a long time ago.

extern int HTHost_catchClose (SOCKET soc, HTRequest * request, SockOps ops);
#endif /* HTHOST_H */


@(#) $Id: HTHost.html,v 2.3 1996/05/20 15:06:48 frystyk Exp $