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

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

?? wwwapi.cpp

?? FastDb是高效的內(nèi)存數(shù)據(jù)庫系統(tǒng)
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
    *(int4*)con.reply_buf = con.reply_buf_used;
    con.sock->write(con.reply_buf, con.reply_buf_used);
  }

  delete[] con.peer;
  con.peer = NULL;
  delete con.sock;
  con.sock = NULL; // close connection
  return result;
}

inline char* stristr(char* s, char* p)
{
  while (*s != '\0')
  {
    int i;

    for (i = 0; (s[i] & ~('a'-'A')) == (p[i] & ~('a' - 'A')) && p[i] != '\0'; i++)

      ;
    if (p[i] == '\0')
    {
      return s;
    }

    s += 1;
  }

  return NULL;
}

bool HTTPapi::serve(WWWconnection& con)
{
  const size_t inputBufferSize = 16*1024;
  char buf[inputBufferSize];
  bool result = false;
  size_t size = 0;

  con.peer = con.sock->get_peer_name();

  while (true)
  {
    con.reset();
    char* p = buf;
    char prev_ch = 0;

    do
    {
      if (p == buf + size)
      {
        int rc = con.sock->read(buf + size, 5, sizeof(buf) - size - 1,
                                connectionHoldTimeout);

        if (rc < 0)
        {
          delete con.sock;
          con.sock = NULL;
          return true;
        }

        if (rc < 5)
        {
          con.append(ERROR_TEXT("200 OK")); // connection closed due to timeout expiration
          break;
        }

        size += rc;
      }

      buf[size] = '\0';

      while (*p != '\0' && (prev_ch != '\n' || *p != '\r'))
      {
        prev_ch = *p++;
      }
    }
    while (*p == '\0' && p == buf + size); // p now points to the message body

    if (*p != '\r' || *(p+1) != '\n')
    {
      con.append(ERROR_TEXT("400 Bad Request"));
      break;
    }

    p += 2;
    int length = INT_MAX;
    char* lenptr = stristr(buf, "content-length: ");
    bool  persistentConnection =
      stristr(buf, "Connection: keep-alive") != NULL;
    char* host = stristr(buf, "host: ");

    if (host != NULL)
    {
      char* q = host += 6;

      while (*q != '\n' && *q != '\r' && *q != '\0')
        q += 1;

      *q = '\0';
    }

    if (lenptr != NULL)
    {
      sscanf(lenptr+15, "%d", &length);
    }

    if (strncmp(buf, "GET ", 4) == 0)
    {
      char* file, *uri = buf;
      file = strchr(uri, '/');

      if (file == NULL)
      {
        con.append(ERROR_TEXT("400 Bad Request"));
        break;
      }

      if (*++file == '/')
      {
        if (host == NULL)
        {
          host = file+1;
        }

        file = strchr(uri, '/');

        if (file == NULL)
        {
          con.append(ERROR_TEXT("400 Bad Request"));
          break;
        }

        *file++ = '\0';
      }

      char* file_end = strchr(file, ' ');
      char index_html[] = "index.html";

      if (file_end == NULL)
      {
        con.append(ERROR_TEXT("400 Bad Request"));
        break;
      }

      if (file_end == file)
      {
        file = index_html;
      }
      else
      {
        *file_end = '\0';
      }

      if (host == NULL)
      {
        host = "localhost";
      }

      char* params = strchr(file, '?');

      if (params != NULL)
      {
        if (!handleRequest(con, params+1, file_end, host, result))
        {
          delete con.sock;
          con.sock = NULL;
          return result;
        }
      }
      else
      {
        URL2ASCII(file);
        FILE* f = fopen(file, "rb");

        if (f == NULL)
        {
          if (strcmp(file, index_html) == 0)
          {
            static char defaultPage[] = "page=defaultPage";

            if (!handleRequest(con, defaultPage, defaultPage + strlen(defaultPage), host, result))
            {
              delete con.sock;
              con.sock = NULL;
              return result;
            }
          }
          else
          {
            con.append(ERROR_TEXT("404 File Not Found"));
            break;
          }
        }
        else
        {
          fseek(f, 0, SEEK_END);
          size_t file_size = ftell(f);
          fseek(f, 0, SEEK_SET);
          char reply[1024];
          sprintf(reply, "HTTP/1.1 200 OK\r\nContent-Length: %u\r\n"
                  "Content-Type: text/html\r\nConnection: %s\r\n\r\n",
                  file_size,
                  keepConnectionAlive ? "Keep-Alive" : "close");
          con.append(reply);
          size_t pos = con.reply_buf_used;
          char* dst = con.extendBuffer(file_size);

          if (dst == NULL)
          {
            con.reset();
            con.append(ERROR_TEXT("413 Request Entity Too Large"));
            break;
          }

          if (fread(dst + pos, 1, file_size, f) != file_size)
          {
            con.reset();
            con.append(ERROR_TEXT("500 Internal server error"));
            break;
          }

          fclose(f);

          if (!con.sock->write(dst, con.reply_buf_used)
              || !keepConnectionAlive)
          {
            delete con.sock;
            con.sock = NULL;
            return true;
          }
        }
      }
    }
    else if (strncmp(buf, "POST ", 5) == 0)
    {
      char* body = p;

ScanNextPart:
      int n = length < buf + size - p
              ? length : buf + size - p;

      while (--n >= 0 && *p != '\r' && *p != '\n')
      {
        p += 1;
      }

      if (n < 0 && p - body != length)
      {
        if (size >= sizeof(buf) - 1)
        {
          con.append(ERROR_TEXT("413 Request Entity Too Large"));
          break;
        }

        int rc = con.sock->read(p, 1, sizeof(buf) - size - 1,
                                connectionHoldTimeout);

        if (rc < 0)
        {
          delete con.sock;
          con.sock = NULL;
          return true;
        }

        size += rc;
        goto ScanNextPart;
      }
      else
      {
        if (host == NULL)
        {
          host = "localhost";
        }

        if (!handleRequest(con, body, p, host, result))
        {
          delete con.sock;
          con.sock = NULL;
          return result;
        }

        while (n >= 0 && (*p == '\n' || *p == '\r'))
        {
          p += 1;
          n -= 1;
        }
      }
    }
    else
    {
      con.append(ERROR_TEXT("405 Method not allowed"));
      break;
    }

    if (!persistentConnection)
    {
      delete con.sock;
      con.sock = NULL;
      return true;
    }

    if (p - buf < (long)size)
    {
      size -= p - buf;
      memcpy(buf, p, size);
    }
    else
    {
      size = 0;
    }
  }

  if (con.sock != NULL)
  {
    con.sock->write(con.reply_buf, con.reply_buf_used);
    con.sock->shutdown();
    delete con.sock;
    con.sock = NULL;
  }

  return true;
}


bool HTTPapi::handleRequest(WWWconnection& con, char* begin, char* end,
                            char* host, bool& result)
{
  char buf[64];
  char ch = *end;
  char* page = con.unpack(begin, end - begin);

  if (page != NULL)
  {
    con.append("HTTP/1.1 200 OK\r\nContent-Length:       \r\n");
    int length_pos = con.reply_buf_used - 8;
    con.append(keepConnectionAlive
               ? "Connection: Keep-Alive\r\n"
               : "Connection: close\r\n");
    sprintf(buf, "http://%s/", host);
    con.stub = buf;
    result = dispatch(con, page);
    char* body = con.reply_buf + length_pos;
    char prev_ch = 0;
    con.reply_buf[con.reply_buf_used] = '\0';

    while ((*body != '\n' || prev_ch != '\n') &&
           (*body != '\r' || prev_ch != '\n') &&
           *body != '\0')
    {
      prev_ch = *body++;
    }

    if (*body == '\0')
    {
      con.reset();
      con.append(ERROR_TEXT("404 Not found"));
      con.sock->write(con.reply_buf, con.reply_buf_used);
      return false;
    }

    body += *body == '\n' ? 1 : 2;
    sprintf(buf, "%u",
            con.reply_buf_used - (body - con.reply_buf));
    memcpy(con.reply_buf + length_pos,
           buf, strlen(buf));

    if (!con.sock->write(con.reply_buf, con.reply_buf_used))
    {
      return false;
    }

    *end = ch;
    return result && keepConnectionAlive;
  }
  else
  {
    con.append(ERROR_TEXT("Not acceptable"));
    con.sock->write(con.reply_buf, con.reply_buf_used);
    result = true;
    *end = ch;
    return false;
  }
}


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

void thread_proc QueueManager::handleThread(void* arg)
{
  ((QueueManager*)arg)->handle();
}


QueueManager::QueueManager(WWWapi&     api,
                           dbDatabase& dbase,
                           int         nThreads,
                           int         connectionQueueLen)
    : db(dbase)
{
  assert(nThreads >= 1 && connectionQueueLen >= 1);
  this->nThreads = nThreads;
  go.open();
  done.open();
  threads = new dbThread[nThreads];

  while (--nThreads >= 0)
  {
    threads[nThreads].create(handleThread, this);
    threads[nThreads].detach();
  }

  connectionPool = new WWWconnection[connectionQueueLen];
  connectionPool[--connectionQueueLen].next = NULL;

  while (--connectionQueueLen >= 0)
  {
    connectionPool[connectionQueueLen].next =
      &connectionPool[connectionQueueLen+1];
  }

  freeList = connectionPool;
  waitList = NULL;
  server = &api;
}

void QueueManager::start()
{
  mutex.lock();

  while (server != NULL)
  {
    if (freeList == NULL)
    {
      done.reset();
      done.wait(mutex);

      if (server == NULL)
      {
        break;
      }

      assert(freeList != NULL);
    }

    WWWconnection* con = freeList;
    freeList = con->next;
    WWWapi* srv = server;
    mutex.unlock();

    if (!srv->connect(*con) || server == NULL)
    {
      return;
    }

    mutex.lock();
    con->next = waitList;
    waitList = con;
    go.signal();
  }

  mutex.unlock();
}


void QueueManager::handle()
{
  db.attach();
  mutex.lock();

  while (true)
  {
    go.wait(mutex);
    WWWapi* api = server;

    if (api == NULL)
    {
      break;
    }

    WWWconnection* con = waitList;
    assert(con != NULL);
    waitList = con->next;
    mutex.unlock();

    if (!api->serve(*con))
    {
      stop();
    }

    mutex.lock();

    if (freeList == NULL)
    {
      done.signal();
    }

    con->next = freeList;
    freeList = con;
  }

  mutex.unlock();
  db.detach();
}


void QueueManager::stop()
{
  mutex.lock();
  WWWapi* server = this->server;
  this->server = NULL;
  server->cancel();

  while (--nThreads >= 0)
  {
    go.signal();
  }

  done.signal();
  mutex.unlock();
}


QueueManager::~QueueManager()
{
  go.close();
  done.close();
  delete[] threads;
  delete[] connectionPool;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲av在线| 91成人在线观看喷潮| 亚洲小少妇裸体bbw| 国产精品美女久久久久aⅴ| 久久久亚洲精品石原莉奈| 欧美午夜一区二区三区免费大片| 99精品视频一区二区三区| 国产成人精品aa毛片| 东方aⅴ免费观看久久av| 国产成人高清在线| 成人av影院在线| proumb性欧美在线观看| 色香蕉久久蜜桃| 在线观看精品一区| 91精品国产一区二区三区香蕉| 欧美日韩精品高清| 欧美成人乱码一区二区三区| 精品国产乱码久久久久久老虎| 精品久久久久久久久久久久久久久久久 | 26uuu成人网一区二区三区| 日韩欧美一区二区三区在线| 欧美成va人片在线观看| 久久精品欧美日韩| 亚洲欧美自拍偷拍色图| 一区二区三区中文字幕电影 | 午夜a成v人精品| 日韩av一区二区三区四区| 日本成人中文字幕| 国产白丝网站精品污在线入口| 成人在线综合网站| 欧美伊人精品成人久久综合97| 欧美日韩精品一区视频| 精品国产一区二区三区不卡| 欧美国产激情二区三区 | 欧美一区二区三区视频免费播放 | 国产精品成人免费在线| 亚洲狠狠爱一区二区三区| 日本91福利区| 国产成人在线看| 欧美在线看片a免费观看| 精品国产免费久久| 一区二区在线观看av| 蜜桃传媒麻豆第一区在线观看| 成人免费高清在线观看| 欧美一区二区三区思思人| 国产精品白丝在线| 久久99国产精品尤物| 色88888久久久久久影院野外| 日韩一区二区视频| 亚洲综合色丁香婷婷六月图片| 精品亚洲免费视频| 欧美高清激情brazzers| 日韩一区中文字幕| 国产福利精品一区二区| 91麻豆精品国产91久久久资源速度| 欧美国产一区二区在线观看| 欧美aaa在线| 欧美午夜免费电影| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲欧美激情在线| 国产suv一区二区三区88区| 日韩午夜在线影院| 日韩欧美一级二级三级久久久| 一区二区在线电影| 91香蕉视频污在线| 久久精品夜色噜噜亚洲aⅴ| 丝袜美腿一区二区三区| 欧美日韩成人综合在线一区二区 | 欧美日韩精品欧美日韩精品一综合| 国产网站一区二区三区| 韩国视频一区二区| 精品黑人一区二区三区久久| 蜜臀国产一区二区三区在线播放| 欧美视频一区在线| 亚洲精品videosex极品| 91麻豆国产香蕉久久精品| 国产午夜精品一区二区三区嫩草 | 欧美三片在线视频观看| 国产精品的网站| 97久久精品人人做人人爽| 成人欧美一区二区三区黑人麻豆| 高清在线观看日韩| 在线电影欧美成精品| 日韩精品久久理论片| 欧美一区2区视频在线观看| 日韩av成人高清| 日韩视频一区二区三区在线播放| 欧美a级一区二区| 亚洲精品一区在线观看| 国产精品1024| 国产丝袜在线精品| 成人国产精品免费网站| 亚洲视频在线观看三级| 色综合激情五月| 一区二区高清免费观看影视大全| 色综合一区二区| 丝瓜av网站精品一区二区| 日韩亚洲欧美在线| 精品中文字幕一区二区| 亚洲国产精品精华液2区45| 成人精品小蝌蚪| 一区二区三区日韩精品| 欧美一卡在线观看| 精品一二三四在线| 亚洲欧洲国产日韩| 欧美日韩精品一区二区三区蜜桃| 奇米影视一区二区三区小说| 26uuu久久天堂性欧美| aaa欧美日韩| 日本亚洲三级在线| 国产精品国产自产拍在线| 欧美色电影在线| 国产一区久久久| 亚洲国产成人va在线观看天堂| 日韩欧美色综合网站| www.日本不卡| 奇米影视一区二区三区| 欧美国产亚洲另类动漫| 欧美日韩黄色一区二区| 国产真实乱对白精彩久久| 亚洲欧美色综合| 精品久久五月天| 欧美日韩在线播| 成人国产视频在线观看| 免费的成人av| 一级中文字幕一区二区| 久久久蜜桃精品| 欧美久久久久免费| 91亚洲永久精品| 国产麻豆成人精品| 午夜国产精品影院在线观看| 国产欧美视频在线观看| 91精品国产色综合久久不卡蜜臀 | 精品在线观看免费| 亚洲另类春色校园小说| 国产偷国产偷精品高清尤物| 欧美精品18+| 在线视频国内自拍亚洲视频| 国产精品乡下勾搭老头1| 视频在线观看国产精品| 一区二区三区四区亚洲| 中文字幕+乱码+中文字幕一区| 日韩女优视频免费观看| 欧美精品丝袜中出| 色噜噜夜夜夜综合网| 国产成人免费av在线| 免费成人性网站| 五月天亚洲精品| 亚洲小说春色综合另类电影| 欧美激情资源网| 国产精品色一区二区三区| 亚洲精品在线一区二区| 91精品国产综合久久久久久漫画| 91在线一区二区三区| 丰满岳乱妇一区二区三区| 国产精品123| 国产成人综合在线播放| 国产一本一道久久香蕉| 国产在线播精品第三| 国产一区二区三区免费观看| 久久成人免费电影| 狠狠色丁香久久婷婷综合_中| 日本欧美在线观看| 老司机午夜精品| 激情文学综合插| 国产盗摄一区二区| 岛国精品在线观看| 99久久精品情趣| 成人精品亚洲人成在线| 91麻豆国产自产在线观看| 91女神在线视频| 欧美探花视频资源| 欧美老年两性高潮| 欧美成人艳星乳罩| 国产欧美精品一区aⅴ影院 | 免费不卡在线视频| 激情久久五月天| 成人一区在线观看| 91麻豆免费看| 日韩一区二区三区电影在线观看| 日韩网站在线看片你懂的| 久久久91精品国产一区二区精品| 国产欧美日韩在线看| 亚洲精品老司机| 午夜精品一区在线观看| 国产一区欧美日韩| 在线亚洲高清视频| 精品少妇一区二区三区在线视频| 久久久一区二区三区| 亚洲欧美日韩在线播放| 免费在线看一区| 成人激情小说网站| 欧美一区二区三区视频免费播放 | 亚洲国产日韩av| 国产毛片一区二区| 欧美系列在线观看| 国产丝袜美腿一区二区三区| 亚洲欧美日韩中文播放| 蜜臀av国产精品久久久久| 成人高清免费观看|