亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? wwwapi.cpp

?? FastDb是高效的內(nèi)存數(shù)據(jù)庫系統(tǒng)
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//-< WWWAPI.CPP >----------------------------------------------------*--------*
// 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 *
//-------------------------------------------------------------------*--------*
// Implementation of WWWapi class
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include "wwwapi.h"
#include <ctype.h>

const size_t init_reply_buffer_size = 4*1024;

inline unsigned string_hash_function(const char* name)
{
  unsigned h = 0, g;

  while(*name)
  {
    h = (h << 4) + *name++;

    if ((g = h & 0xF0000000) != 0)
    {
      h ^= g >> 24;
    }

    h &= ~g;
  }

  return h;
}

#define ERROR_TEXT(x) \
"HTTP/1.1 " x "\r\n\
Connection: close\r\n\r\n\
<HTML><HEAD><TITLE>Invalid request to the database</TITLE>\r\n\
</HEAD><BODY>\n\r\
<H1>" x "</H1>\n\r\
</BODY></HTML>\r\n\r\n"

WWWconnection::WWWconnection()
{
  memset(hash_table, 0, sizeof hash_table);
  sock = NULL;
  reply_buf = new char[init_reply_buffer_size];
  reply_buf_size = init_reply_buffer_size;
  free_pairs = NULL;
  peer = NULL;
  userData = NULL;
  userDataDestructor = NULL;
}

WWWconnection::~WWWconnection()
{
  reset();
  name_value_pair *nvp, *next;

  for (nvp = free_pairs; nvp != NULL; nvp = next)
  {
    next = nvp->next;
    delete nvp;
  }

  delete[] reply_buf;
  delete[] peer;

  if (userDataDestructor != NULL && userData != NULL)
  {
    userDataDestructor(userData);
  }
}


inline char* WWWconnection::extendBuffer(size_t inc)
{
  if (reply_buf_used + inc >= reply_buf_size)
  {
    reply_buf_size = reply_buf_size*2 > reply_buf_used + inc
                     ? reply_buf_size*2 : reply_buf_used + inc;
    char* new_buf = new char[reply_buf_size+1];
    memcpy(new_buf, reply_buf, reply_buf_used);
    delete[] reply_buf;
    reply_buf = new_buf;
  }

  reply_buf_used += inc;
  return reply_buf;
}

bool WWWconnection::terminatedBy(char const* str) const
{
  size_t len = strlen(str);

  if (len > reply_buf_used - 4)
  {
    return false;
  }

  return memcmp(reply_buf + reply_buf_used - len, str, len) == 0;
}

WWWconnection& WWWconnection::append(const void *buf, int len)
{
  int pos = reply_buf_used;
  char *dst = extendBuffer(len);
  memcpy(dst + pos, buf, len);
  return *this;
}

WWWconnection& WWWconnection::append(char const* str)
{
  int pos = reply_buf_used;
  char* dst = extendBuffer(strlen(str));
  unsigned char ch;

  switch (encoding)
  {

  case TAG:
    strcpy(dst + pos, str);
    encoding = HTML;
    break;

  case HTML:
    encoding = TAG;
#if 1 // MS-Explorer handle "&nbsp;" in HTML string literals in very strange way

    if (str[0] == ' ' && str[1] == '\0')
    {
      strcpy(extendBuffer(5) + pos, "&nbsp;");
      return *this;
    }

#endif
    while (true)
    {
      switch(ch = *str++)
      {

      case '<':
        dst = extendBuffer(3);
        dst[pos++] = '&';
        dst[pos++] = 'l';
        dst[pos++] = 't';
        dst[pos++] = ';';
        break;

      case '>':
        dst = extendBuffer(3);
        dst[pos++] = '&';
        dst[pos++] = 'g';
        dst[pos++] = 't';
        dst[pos++] = ';';
        break;

      case '&':
        dst = extendBuffer(4);
        dst[pos++] = '&';
        dst[pos++] = 'a';
        dst[pos++] = 'm';
        dst[pos++] = 'p';
        dst[pos++] = ';';
        break;

      case '"':
        dst = extendBuffer(5);
        dst[pos++] = '&';
        dst[pos++] = 'q';
        dst[pos++] = 'u';
        dst[pos++] = 'o';
        dst[pos++] = 't';
        dst[pos++] = ';';
        break;

      case '\0':
        dst[pos] = '\0';
        return *this;
#if 0 // MS-Explorer handle "&nbsp;" in HTML string literals in very strange way

      case ' ':
        dst = extendBuffer(5);
        dst[pos++] = '&';
        dst[pos++] = 'n';
        dst[pos++] = 'b';
        dst[pos++] = 's';
        dst[pos++] = 'p';
        dst[pos++] = ';';
        break;
#endif

      default:
        dst[pos++] = ch;
      }
    }

  case URL:
    encoding = TAG;

    while (true)
    {
      ch = *str++;

      if (ch == '\0')
      {
        dst[pos] = '\0';
        return *this;
      }
      else if (ch == ' ')
      {
        dst[pos++] = '+';
      }
      else if (!isalnum(ch))
      {
        dst = extendBuffer(2);
        dst[pos++] = '%';
        dst[pos++] = (ch >> 4) >= 10
                     ? (ch >> 4) + 'A' - 10 : (ch >> 4) + '0';
        dst[pos++] = (ch & 0xF) >= 10
                     ? (ch & 0xF) + 'A' - 10 : (ch & 0xF) + '0';
      }
      else
      {
        dst[pos++] = ch;
      }
    }
  }

  return *this;
}


void WWWconnection::reset()
{
  reply_buf_used = 0;
  encoding = TAG;

  for (int i = itemsof(hash_table); --i >= 0;)
  {
    name_value_pair *nvp, *next;

    for (nvp = hash_table[i]; nvp != NULL; nvp = next)
    {
      next = nvp->next;
      nvp->next = free_pairs;
      free_pairs = nvp;
    }

    hash_table[i] = NULL;
  }
}

void WWWconnection::addPair(char const* name, char const* value)
{
  name_value_pair* nvp;

  if (free_pairs != NULL)
  {
    nvp = free_pairs;
    free_pairs = nvp->next;
  }
  else
  {
    nvp = new name_value_pair;
  }

  unsigned hash_code = string_hash_function(name);
  nvp->hash_code = hash_code;
  hash_code %= hash_table_size;
  nvp->next = hash_table[hash_code];
  hash_table[hash_code] = nvp;
  nvp->value = value;
  nvp->name = name;
}

#define HEX_DIGIT(ch) ((ch) >= 'a' ? ((ch) - 'a' + 10) : (ch) >= 'A' ? ((ch) - 'A' + 10) : ((ch) - '0'))

char* WWWconnection::unpack(char* body, size_t length)
{
  char *src = body, *end = body + length;

  while (src < end)
  {
    char* name = src;
    char ch;
    char* dst = src;

    while (src < end && (ch = *src++) != '=')
    {
      if (ch == '+')
      {
        ch = ' ';
      }
      else if (ch == '%')
      {
        ch = (HEX_DIGIT(src[0]) << 4) | HEX_DIGIT(src[1]);
        src += 2;
      }

      *dst++ = ch;
    }

    *dst = '\0';
    char* value = dst = src;

    while (src < end && (ch = *src++) != '&')
    {
      if (ch == '+')
      {
        ch = ' ';
      }
      else if (ch == '%')
      {
        ch = (HEX_DIGIT(src[0]) << 4) | HEX_DIGIT(src[1]);
        src += 2;
      }

      *dst++ = ch;
    }

    *dst = '\0';
    addPair(name, value);
  }

  stub = get
           ("stub");

  return get
           ("page");
}


char* WWWconnection::get
  (char const* name, int n)
{
  unsigned hash_code = string_hash_function(name);
  name_value_pair* nvp;

  for (nvp = hash_table[hash_code % hash_table_size];
       nvp != NULL;
       nvp = nvp->next)
  {
    if (nvp->hash_code == hash_code && strcmp(nvp->name, name) == 0)
    {
      if (n == 0)
      {
        return (char*)nvp->value;
      }

      n -= 1;
    }
  }

  return NULL;
}




//--------------------------------------------------


WWWapi::WWWapi(dbDatabase& dbase, int n_handlers, dispatcher* dispatch_table)
    : db(dbase)
{
  memset(hash_table, 0, sizeof hash_table);
  sock = NULL;
  address = NULL;
  dispatcher* disp = dispatch_table;

  while (--n_handlers >= 0)
  {
    unsigned hash_code = string_hash_function(disp->page);
    disp->hash_code = hash_code;
    hash_code %= hash_table_size;
    disp->collision_chain = hash_table[hash_code];
    hash_table[hash_code] = disp;
    disp += 1;
  }
}

bool WWWapi::open(char const* socket_address,
                  socket_t::socket_domain domain,
                  int listen_queue)
{
  if (sock != NULL)
  {
    close();
  }

  address = new char[strlen(socket_address) + 1];
  strcpy(address, socket_address);
  sock = domain != socket_t::sock_global_domain
         ? socket_t::create_local(socket_address, listen_queue)
         : socket_t::create_global(socket_address, listen_queue);
  canceled = false;

  if (!sock->is_ok())
  {
    char buf[64];
    sock->get_error_text(buf, sizeof buf);
    fprintf(stderr, "WWWapi::open: create socket failed: %s\n", buf);
    return false;
  }

  return true;
}




bool WWWapi::connect(WWWconnection& con)
{
  assert(sock != NULL);
  con.reset();
  delete con.sock;
  con.sock = sock->accept();
  con.address = address;

  if (con.sock == NULL)
  {
    if (!canceled)
    {
      char buf[64];
      sock->get_error_text(buf, sizeof buf);
      fprintf(stderr, "WWWapi::connect: accept failed: %s\n", buf);
    }

    return false;
  }

  return true;
}

void WWWapi::cancel()
{
  canceled = true;
  sock->cancel_accept();
}

void WWWapi::close()
{
  delete sock;
  delete[] address;
  sock = NULL;
}



bool WWWapi::dispatch(WWWconnection& con, char* page)
{
  unsigned hash_code = string_hash_function(page);

  for (dispatcher* disp = hash_table[hash_code % hash_table_size];
       disp != NULL;
       disp = disp->collision_chain)
  {
    if (disp->hash_code == hash_code && strcmp(disp->page, page) == 0)
    {
      bool result = disp->func(con);
      db.commit();
      return result;
    }
  }

  return true;
}


void URL2ASCII(char* src)
{
  char* dst = src;
  char ch;

  while ((ch = *src++) != '\0')
  {
    if (ch == '%')
    {
      *dst++ = ((src[0] - '0') << 8) | (src[1] - '0');
    }
    else if (ch == '+')
    {
      *dst++ = ' ';
    }
    else if (ch == '.' && *src == '.')
    {
      // for security reasons do not allow access to parent directory
      break;
    }
    else
    {
      *dst++ = ch;
    }
  }

  *dst = '\0';
}


bool CGIapi::serve(WWWconnection& con)
{
  nat4 length;
  con.reset();

  if ((size_t)con.sock->read(&length, sizeof length, sizeof length)
      != sizeof(length))
  {
    return true;
  }

  int size = length - sizeof length;
  char* buf = new char[size];

  if (con.sock->read(buf, size, size) != size)
  {
    return true;
  }

  char* page = con.unpack(buf + buf[0], length - sizeof length - buf[0]);
  char* peer = con.get("peer");
  con.peer = new char[strlen(peer)+1];
  strcpy(con.peer, peer);
  bool result = true;

  if (page != NULL)
  {
    con.extendBuffer(4);
    result = dispatch(con, page);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
波多野结衣精品在线| 精品国产一区二区三区忘忧草| 国产成人精品免费一区二区| 久久99国产精品久久| 日欧美一区二区| 麻豆中文一区二区| 国产一区二区三区精品欧美日韩一区二区三区| 日韩国产成人精品| 免费观看日韩电影| 国产在线一区二区综合免费视频| 韩国欧美国产1区| 国产乱码精品一区二区三区五月婷| 国精品**一区二区三区在线蜜桃| 国产成人精品亚洲日本在线桃色 | 亚洲夂夂婷婷色拍ww47| 亚洲你懂的在线视频| 亚洲一区二区在线免费看| 亚洲综合在线观看视频| 夜夜爽夜夜爽精品视频| 日日噜噜夜夜狠狠视频欧美人| 美女免费视频一区二区| 极品尤物av久久免费看| 粉嫩绯色av一区二区在线观看 | 精品国产不卡一区二区三区| 久久婷婷国产综合国色天香| 欧美激情一区二区三区四区| 亚洲精品国产无天堂网2021| 日韩国产欧美一区二区三区| 国产真实乱偷精品视频免| 成人网在线播放| 欧美中文字幕一区二区三区| 91麻豆精品国产91久久久久| 久久婷婷色综合| 一区二区三区在线影院| 日本va欧美va欧美va精品| 国产剧情在线观看一区二区| 日本高清不卡视频| 日韩女优视频免费观看| 欧美韩国日本一区| 亚洲午夜免费视频| 精品综合免费视频观看| 99精品偷自拍| 欧美变态tickle挠乳网站| 国产精品三级电影| 日本网站在线观看一区二区三区| 国产成人精品亚洲午夜麻豆| 欧美乱妇一区二区三区不卡视频| 久久一区二区三区国产精品| 一区二区国产盗摄色噜噜| 青青草国产精品97视觉盛宴| 粉嫩绯色av一区二区在线观看| 欧美日韩卡一卡二| 亚洲国产精品传媒在线观看| 日本亚洲电影天堂| 色诱视频网站一区| 久久久www免费人成精品| 亚洲国产美女搞黄色| 国产精品白丝jk黑袜喷水| 欧美三级日韩三级| 国产日韩欧美一区二区三区乱码 | 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲婷婷综合色高清在线| 久久精品国产久精国产| 色久综合一二码| 国产无人区一区二区三区| 天天影视涩香欲综合网| 97久久人人超碰| 久久婷婷成人综合色| 亚洲不卡一区二区三区| 94色蜜桃网一区二区三区| 日韩精品专区在线| 亚洲18影院在线观看| 成人avav影音| 欧美精品一区二区三区蜜桃| 婷婷综合在线观看| 日韩一区二区影院| 国产精品国产三级国产普通话99| 狠狠色丁香九九婷婷综合五月| 欧美主播一区二区三区美女| 中文字幕一区二区5566日韩| 国产一区二区三区| 欧美电视剧在线看免费| 亚欧色一区w666天堂| 色欧美日韩亚洲| 国产精品高清亚洲| 成人性生交大片免费看中文 | 中文无字幕一区二区三区| 激情综合色综合久久综合| 欧美久久免费观看| 天天色 色综合| 欧美午夜电影一区| 亚洲激情成人在线| 91久久人澡人人添人人爽欧美 | 国产一区二区三区在线观看精品| 日韩欧美精品在线| 免费高清在线一区| 日韩欧美在线影院| 免费在线观看一区二区三区| 91精品午夜视频| 五月婷婷久久丁香| 欧美乱熟臀69xxxxxx| 午夜免费欧美电影| 91超碰这里只有精品国产| 天堂午夜影视日韩欧美一区二区| 欧美亚洲高清一区二区三区不卡| 一区二区三区精品视频在线| 在线免费亚洲电影| 亚洲第一激情av| 777xxx欧美| 天天做天天摸天天爽国产一区 | 亚洲视频电影在线| 色婷婷综合在线| 亚洲一区二区欧美日韩 | 国产精品福利av| 99久久久久久| 一区二区三区在线观看欧美| 91国产丝袜在线播放| 亚洲mv大片欧洲mv大片精品| 这里只有精品99re| 久久国产尿小便嘘嘘尿| 久久久综合激的五月天| 国产一区二区三区视频在线播放| 国产欧美一区二区在线| 不卡的av在线播放| 亚洲精品中文在线影院| 欧美日韩亚洲丝袜制服| 奇米影视一区二区三区小说| 久久你懂得1024| 成人av资源网站| 亚洲午夜私人影院| 欧美精品一区男女天堂| 成人一级黄色片| 亚洲一区二区视频| 欧美va在线播放| 国产成人午夜片在线观看高清观看| 亚洲国产成人自拍| 在线观看一区日韩| 美女视频网站久久| 亚洲欧洲另类国产综合| 欧美日韩色综合| 国产真实乱子伦精品视频| 亚洲免费色视频| 欧美一区二区久久久| 国产成人av在线影院| 一区二区三区在线视频播放 | 美女视频一区二区| 国产精品久久久久永久免费观看 | 99re亚洲国产精品| 秋霞成人午夜伦在线观看| 国产清纯白嫩初高生在线观看91| 色av综合在线| 黄色日韩网站视频| 有坂深雪av一区二区精品| 日韩精品资源二区在线| 91麻豆福利精品推荐| 久久精品免费看| 一区二区三区在线不卡| 久久色.com| 欧美色视频在线观看| 国产91精品露脸国语对白| 日韩一区精品视频| 日韩美女视频一区二区| 日韩欧美色电影| 在线观看日韩一区| 懂色av一区二区三区蜜臀 | 色综合天天综合色综合av | 777亚洲妇女| 91在线观看视频| 国产精品99久久久久久似苏梦涵 | 亚洲欧洲中文日韩久久av乱码| 欧美大胆一级视频| 91福利社在线观看| 成人免费av在线| 久久成人综合网| 亚洲va欧美va人人爽午夜| 国产精品久久毛片a| 久久老女人爱爱| 91精品国产综合久久久久久漫画 | 国产精品区一区二区三| 欧美电影免费观看高清完整版在线观看| 色婷婷精品大在线视频| 成人v精品蜜桃久久一区| 久久国产麻豆精品| 日韩成人dvd| 亚洲久草在线视频| 中文字幕一区三区| 国产亚洲va综合人人澡精品 | 日韩电影在线看| 亚洲香蕉伊在人在线观| 亚洲激情综合网| 亚洲男人的天堂在线观看| 中文字幕av在线一区二区三区| 精品粉嫩超白一线天av| 日韩三级视频在线看| 91麻豆精品国产91久久久久| 欧美视频完全免费看| 91黄色激情网站| 91亚洲男人天堂| 99r国产精品| 99国产精品久久久久|