📄 wwwapi.h
字号:
//-< WWWAPI.H >------------------------------------------------------*--------*
// FastDB Version 1.0 (c) 1999 GARRET * ? *
// (Main Memory Database Management System) * /\| *
// * / \ *
// Created: 27-Mar-99 K.A. Knizhnik * / [] \ *
// Last update: 1-Jul-99 K.A. Knizhnik * GARRET *
//-------------------------------------------------------------------*--------*
// API for creating Internet applications
//-------------------------------------------------------------------*--------*
#ifndef __WWWAPI_H__
#define __WWWAPI_H__
#include "stdtp.h"
#include "sync.h"
#include "sockio.h"
#include "database.h"
enum WWWencodingType {
TAG = 0, // HTML tags (no conversion)
HTML = 1, // replace ('<','>','"','&') with (< > & &qout;)
URL = 2 // replace spaces with '+', and other special characters with %XX
};
//
// Automatic state shifts after each append operation:
// TAG->HTML
// HTML->TAG
// URL->TAG
//
class FASTDB_DLL_ENTRY WWWconnection {
friend class WWWapi;
friend class CGIapi;
friend class QueueManager;
friend class HTTPapi;
public:
void* userData;
typedef bool (*handler)(WWWconnection& con);
//
// Append string to reply buffer
//
WWWconnection& append(char const* str);
WWWconnection& operator << (char const* str) {
return append(str);
}
void setEncoding(WWWencodingType type) { encoding = type; }
WWWconnection& operator << (WWWencodingType type) {
setEncoding(type);
return *this;
}
WWWconnection& operator << (int value) {
char buf[32];
sprintf(buf, "%d", value);
return append(buf);
}
char* getStub() { return stub; }
char* getAddress() { return address; }
char* getPeer() { return peer; }
//
// Compare content of the string with the end of the reply buffer
//
bool terminatedBy(char const* str) const;
//
// Get value of variable from request string. If name is not present in
// string NULL is returned. Parameter 'n' can be used to get n-th
// value of variable for multiple selection slot. Zero value of n
// corresponds to the first variable's value, 1 - to the second,...
// When no more values are available NULL is returned.
//
char* get(char const* name, int n = 0);
//
// Associatte value with name
//
void addPair(char const* name, char const* value);
WWWconnection();
~WWWconnection();
protected:
enum { hash_table_size = 1013 };
socket_t* sock;
char* reply_buf;
size_t reply_buf_size;
size_t reply_buf_used;
char* stub;
char* address;
char* peer;
WWWconnection* next;
WWWencodingType encoding;
struct name_value_pair {
name_value_pair* next;
char const* name;
char const* value;
unsigned hash_code;
};
name_value_pair* hash_table[hash_table_size];
name_value_pair* free_pairs;
char* extendBuffer(size_t inc);
//
// Deallocate all resources hold by connection. It is not possible to
// call get_value() or reply() method after this. Method reset()
// is implicitly called by WWWapi::get() method.
//
void reset();
//
// Unpack requests paramters
//
char* unpack(char* body, size_t body_length);
};
class FASTDB_DLL_ENTRY WWWapi {
public:
struct dispatcher {
char const* page;
WWWconnection::handler func;
// filled by contracutor of WWWapi
unsigned hash_code;
dispatcher* collision_chain;
};
protected:
socket_t* sock;
bool canceled;
char* address;
dbDatabase& db;
enum { hash_table_size = 113 };
dispatcher* hash_table[hash_table_size];
bool dispatch(WWWconnection& con, char* page);
public:
WWWapi(dbDatabase& db, int n_handlers, dispatcher* dispatch_table);
//
// Bind and listen socket
//
bool open(char const* socket_address = "localhost:80",
socket_t::socket_domain domain = socket_t::sock_global_domain,
int listen_queue = DEFAULT_LISTEN_QUEUE_SIZE);
//
// Read and execute requests
//
virtual bool serve(WWWconnection& con) = 0;
//
// Accept new connection by the socket
//
bool connect(WWWconnection& con);
//
// Cancel acception of connections
//
void cancel();
//
// Close socket
//
void close();
};
//
// Interaction with WWW server by means of CGI protocol and CGIatub program
//
class FASTDB_DLL_ENTRY CGIapi : public WWWapi {
public:
virtual bool serve(WWWconnection& con);
CGIapi(dbDatabase& db, int n_handlers, dispatcher* dispatch_table)
: WWWapi(db, n_handlers, dispatch_table) {}
};
//
// Built-in implementation of sunset of subset of HTTP protocol
//
class FASTDB_DLL_ENTRY HTTPapi : public WWWapi {
protected:
time_t connectionHoldTimeout;
bool keepConnectionAlive;
bool handleRequest(WWWconnection& con, char* begin, char* end,
char* host, bool& result);
public:
virtual bool serve(WWWconnection& con);
HTTPapi(dbDatabase& db, int n_handlers, dispatcher* dispatch_table,
bool persistentConnections = false,
time_t connectionHoldTimeoutSec = WAIT_FOREVER)
: WWWapi(db, n_handlers, dispatch_table)
{
keepConnectionAlive = persistentConnections;
connectionHoldTimeout = connectionHoldTimeoutSec;
}
};
class FASTDB_DLL_ENTRY QueueManager {
WWWconnection* connectionPool;
WWWconnection* freeList;
WWWconnection* waitList;
dbMutex mutex;
dbLocalSemaphore go;
dbLocalEvent done;
dbThread* threads;
int nThreads;
WWWapi* server;
dbDatabase& db;
static void thread_proc handleThread(void* arg);
void handle();
public:
void stop();
void start();
QueueManager(WWWapi& api, // WWWapi should be opened
dbDatabase& db,
int nThreads = 8,
int connectionQueueLen = 64);
~QueueManager();
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -