⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgistub.cpp

📁 FastDb是高效的内存数据库系统
💻 CPP
字号:
//-< CGISTUB.CXX >---------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     27-Mar-99    K.A. Knizhnik  * / [] \ *
//                          Last update: 30-Jul-99    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Stub for CGI scripts
//-------------------------------------------------------------------*--------*

#include "stdtp.h"
#include "sockio.h"

void message(char const* msg)
{
  printf("Content-type: text/html\r\n\r\n"
         "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">"
         "<HTML><HEAD><TITLE>CGI STUB message</TITLE></HEAD><BODY>"
         "<H1><FONT COLOR=\"#FF0000\">%s</FONT></H1></BODY></HTML>", msg);
  exit(0);
}


int main()
{
  char*  request = getenv("QUERY_STRING");
  char*  buf;
  size_t length;
  size_t buf_size;
  char* host = getenv("HTTP_HOST");
  char* script = getenv("SCRIPT_NAME");
  char* peer = getenv("REMOTE_ADDR");
  assert(host != NULL);
  assert(script != NULL);

  if (request == NULL || *request == '\0')
  {
    char* length_str = getenv("CONTENT_LENGTH");

    if (length_str == NULL || sscanf(length_str, "%d", &length) != 1)
    {
      message("Failed to receive data using POST method");
    }

    buf_size = length + 14 + 6 + strlen(host) + strlen(script) + strlen(peer);
    buf = new char[buf_size+1];

    if (fread(buf, 1, length, stdin) != length)
    {
      message("Failed to read data using POST method");
    }
  }
  else
  {
    length = strlen(request);
    buf_size = length + 14 + 6 + strlen(host) + strlen(script) + strlen(peer);
    buf = new char[buf_size+1];
    memcpy(buf, request, length);
  }

  if (length <= 7 || strncmp(buf, "socket=", 7) != 0)
  {
    message("No socket field specified");
  }

  sprintf(buf+length, "&stub=http://%s%s&peer=%s&", host, script, peer);
  char* addr = buf + 7;
  char *src = addr, *dst = addr;

  while (*src != '&')
  {
    if (*src == '+')
    {
      *dst++ = ' ';
      src += 1;
    }
    else if (*src == '%')
    {
      *dst++ = ((src[1] >= 'A' ? src[1] - 'A'+ 10 : src[1] - '0') << 4) |
               (src[2] >= 'A' ? src[2] - 'A'+ 10 : src[2] - '0');
      src += 3;
    }
    else
    {
      *dst++ = *src++;
    }
  }

  *dst = '\0';
  socket_t* s = socket_t::connect(addr);

  if (s == NULL)
  {
    message("Failed to connect to application");
  }

  *(int*)buf = buf_size;
  buf[4] = src - buf - 3;

  if (!s->write(buf, buf_size))
  {
    message("Failed to send query to application");
  }

  if (s->read(buf, 4, 4) != 4)
  {
    message("Failed to read reply length");
  }

  nat4 reply_length = *(int4*)buf;

  if (reply_length > buf_size)
  {
    delete[] buf;
    buf = new char[reply_length];
  }

  int size = reply_length - sizeof(reply_length);

  if (s->read(buf, size, size) != size)
  {
    message("Failed to read reply");
  }

  fwrite(buf, 1, reply_length - sizeof(reply_length), stdout);
  delete[] buf;
  s->close();
  return 0;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -