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

📄 cgimap.h

📁 Think in C++ 第二版源码
💻 H
字号:
//: C26:CGImap.h

// From Thinking in C++, 2nd Edition

// Available at http://www.BruceEckel.com

// (c) Bruce Eckel 1999

// Copyright notice in Copyright.txt

// Tools for extracting and decoding data from 

// from CGI GETs and POSTs.

#include <string>

#include <vector>

#include <iostream>

using namespace std;



class CGIpair : public pair<string, string> {

public:

  CGIpair() {}

  CGIpair(string name, string value) {

    first = decodeURLString(name);

    second = decodeURLString(value);

  }

  // Automatic type conversion for boolean test:

  operator bool() const {

    return (first.length() != 0);

  } 

private:  

  static string decodeURLString(string URLstr) {

    const int len = URLstr.length();

    string result;

    for(int i = 0; i < len; i++) {

      if(URLstr[i] == '+')

        result += ' ';

      else if(URLstr[i] == '%') {

        result +=

          translateHex(URLstr[i + 1]) * 16 +

          translateHex(URLstr[i + 2]);

        i += 2; // Move past hex code

      } else // An ordinary character

        result += URLstr[i];

    }

    return result;

  }

  // Translate a single hex character; used by

  // decodeURLString():

  static char translateHex(char hex) {

    if(hex >= 'A')

      return (hex & 0xdf) - 'A' + 10;

    else

      return hex - '0';

  }

};



// Parses any CGI query and turns it into an

// STL vector of CGIpair which has an associative

// lookup operator[] like a map. A vector is used

// instead of a map because it keeps the original

// ordering of the fields in the Web page form.

class CGImap : public vector<CGIpair> {

  string gq;

  int index;

  // Prevent assignment and copy-construction:

  void operator=(CGImap&);

  CGImap(CGImap&);

public:

  CGImap(string query): index(0), gq(query){

    CGIpair p;

    while((p = nextPair()) != 0)

      push_back(p); 

  }

  // Look something up, as if it were a map:

  string operator[](const string& key) {

    iterator i = begin();

    while(i != end()) {

      if((*i).first == key)

        return (*i).second;

      i++;

    }

    return string(); // Empty string == not found

  }

  void dump(ostream& o, string nl = "<br>") {

    for(iterator i = begin(); i != end(); i++) {

      o << (*i).first << " = "

        << (*i).second << nl;

    }

  }

private:

  // Produces name-value pairs from the query 

  // string. Returns an empty Pair when there's 

  // no more query string left:

  CGIpair nextPair() {

    if(gq.length() == 0)

      return CGIpair(); // Error, return empty

    if(gq.find('=') == -1)

      return CGIpair(); // Error, return empty

    string name = gq.substr(0, gq.find('='));

    gq = gq.substr(gq.find('=') + 1);

    string value = gq.substr(0, gq.find('&'));

    gq = gq.substr(gq.find('&') + 1);

    return CGIpair(name, value);

  }

};



// Helper class for getting POST data:

class Post : public string {

public: 

  Post() {

    // For a CGI "POST," the server puts the

    // length of the content string in the 

    // environment variable CONTENT_LENGTH:

    char* clen = getenv("CONTENT_LENGTH");

    if(clen == 0) {

      cout << "Zero CONTENT_LENGTH, Make sure "

        "this is a POST and not a GET" << endl;

      return;

    }

    int len = atoi(clen);

    char* s = new char[len];

    cin.read(s, len); // Get the data

    append(s, len); // Add it to this string

    delete []s;

  }

}; ///:~

⌨️ 快捷键说明

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