/usr/include/bobcat/cgi is in libbobcat-dev 4.08.02-2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | #ifndef INCLUDED_BOBCAT_CGI_
#define INCLUDED_BOBCAT_CGI_
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <vector>
#include <unordered_map>
#include <bobcat/pattern>
namespace FBB
{
class CGI
{
friend std::ostream &operator<<(std::ostream &out, CGI const &cgi);
public:
typedef std::unordered_map<std::string, std::vector<std::string> >
MapStringVector;
enum Method
{
UNDETERMINED,
GET,
POST
};
enum Create
{
DONT_CREATE_PATH,
CREATE_PATH
};
private:
enum Boundary // see multipartFormData()
{
NO_BOUNDARY,
BOUNDARY,
END_BOUNDARY
};
Method d_method;
bool d_escapeValue;
bool d_escape[256]; // initially all d_defaultEscape
MapStringVector d_param;
std::string d_query;
std::string d_boundary; // boundary of the multipart/form-data forms
// empty if POST produces GET-like info on
// stdin.
unsigned long long d_contentLength;
std::string d_filePath; // uploaded files are named
std::string d_filePrefix; // d_filePath / d_filePrefix d_fileNr++
size_t d_fileNr;
Pattern d_contentDisposition;
Pattern d_contentFile;
std::string d_status;
bool d_activated;
unsigned long long d_maxUploadSize;
static std::vector<std::string> s_empty;
enum: size_t
{
s_uploadBlock = 8000, // upload.cc
s_nTries = 100
};
public:
explicit CGI(bool defaultEscape = true,
char const *header = "Content-type: text/html",
std::ostream &out = std::cout);
CGI(CGI &&tmp);
void swap(CGI &other);
CGI &operator=(CGI const &rhs) = default;
CGI &operator=(CGI &&tmp);
CGI &operator<<(std::string const &set);
CGI &operator<<(std::pair<char, char> range);
CGI &operator<<(int ch);
void setFileDestination(std::string const &path,
std::string const &prefix = "",
Create create = CREATE_PATH);
void setMaxUploadSize(size_t maxUploadSize, int unit = 'M');
void report() const; // also called by param()
// accessors:
char const *operator[](std::string const &key) const; // opindex.f
unsigned long long maxUploadSize() const; // .f
Method method() const; // .f
std::string const &query() const; // .f
// empty with multipart/form-data
std::vector<std::string> const ¶m(std::string const &variable);
MapStringVector::const_iterator begin(); // .f
MapStringVector::const_iterator end(); // .f
std::string param1(std::string const &variable);
// static members:
// unpercent also does the '+' to ' '
// conversion
static std::string unPercent(std::string const &text);
static std::string dos2unix(std::string const &text);
private:
void setQuery();
void get();
void post();
void addParam(std::string const ¶m);
void init(bool &target);
std::string escape(std::string const &text);
void next(std::string *line);
void multipartFormData();
Boundary typeOf(std::string const &line) const;
bool isFile(std::string const &line);
void readPart(std::string *line);
void setMethod();
void setParam();
void upload(std::string *line);
};
inline char const *CGI::operator[](std::string const &key) const
{
return getenv(key.c_str());
}
inline std::string const &CGI::query() const
{
return d_query;
}
inline CGI::Method CGI::method() const
{
return d_method;
}
inline CGI::MapStringVector::const_iterator CGI::begin()
{
setParam();
return d_param.begin();
}
inline CGI::MapStringVector::const_iterator CGI::end()
{
setParam();
return d_param.end();
}
} // namespace
#endif
|