ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/FeepingCreaturism/FeepingCreaturism.cpp
(Generate patch)

Comparing FeepingCreaturism/FeepingCreaturism.cpp (file contents):
Revision 202 by Douglas Thrift, 2004-08-30T23:18:58-07:00 vs.
Revision 203 by Douglas Thrift, 2004-09-01T02:10:19-07:00

# Line 27 | Line 27 | int main(int argc, char* argv[])
27   FeepingCreaturism::FeepingCreaturism()
28   {
29          initialize();
30 +        parse();
31  
32 <        std::string path(env.get("PATH_INFO"));
32 >        ext::String path(env.get("PATH_INFO"));
33          Matcher matcher;
34  
35          if (path == "/daily/") daily(); else if (path == "/random/")
# Line 41 | Line 42 | FeepingCreaturism::FeepingCreaturism()
42          }
43          else
44          {
45 <                cout << "Status: 301\r\nLocation: http://" << env.get("HTTP_HOST")
45 >                api::Cout << "Location: http://" << env.get("HTTP_HOST")
46                          << env.get("SCRIPT_NAME") << "/daily/\r\n\r\n";
47          }
48   }
49  
50 < std::string FeepingCreaturism::program;
50 > ext::String FeepingCreaturism::program;
51  
52   void FeepingCreaturism::initialize()
53   {
# Line 61 | Line 62 | void FeepingCreaturism::initialize()
62          std::strcpy(path[0], this->path.c_str());
63  
64          ::FTS* traversal(::fts_open(path, FTS_LOGICAL, NULL));
65 <        Matcher matcher('^' + this->path + "/(" + this->matcher + ")$");
65 >        Matcher matcher("^" + this->path + "/(" + this->matcher + ")$");
66  
67          if (traversal == NULL)
68          {
69 <                cerr << program << ": Horrible Failure!\n";
69 >                api::Cerr << program << ": Horrible Failure!\n";
70  
71                  std::exit(1);
72          }
# Line 84 | Line 85 | void FeepingCreaturism::initialize()
85          delete [] path[0];
86   }
87  
88 + void FeepingCreaturism::parse()
89 + {
90 +        std::stringstream query(env.get("QUERY_STRING"));
91 +
92 +        if (env.get("REQUEST_METHOD") == "POST")
93 +        {
94 +                std::streamsize length(lexical_cast<std::streamsize>(env.get("CONTENT_"
95 +                        "TYPE")));
96 +                char* content(new char[length]);
97 +
98 +                api::Cin.Read(content, length);
99 +                query.write(content, length);
100 +
101 +                delete [] content;
102 +        }
103 +
104 +        if (query.str().empty()) return;
105 +
106 +        do
107 +        {
108 +                std::string name, value;
109 +
110 +                std::getline(query, name, '=');
111 +                std::getline(query, value, '&');
112 +
113 +                cgi.insert(_P(name, value));
114 +        }
115 +        while (query.good());
116 + }
117 +
118   void FeepingCreaturism::daily()
119   {
120          std::time_t when(std::time(NULL));
# Line 94 | Line 125 | void FeepingCreaturism::daily()
125          now->tm_hour = 0;
126  
127          std::time_t difference(mktime(now) / 86400);
128 <        std::vector<std::string> jargon(this->jargon.begin(), this->jargon.end());
129 <        std::string entry(jargon.size() ? jargon[difference % jargon.size()] : "");
128 >        std::vector<ext::String> jargon(this->jargon.begin(), this->jargon.end());
129 >        ext::String entry(jargon.size() ? jargon[difference % jargon.size()] : "");
130  
131          select(entry);
132   }
# Line 104 | Line 135 | void FeepingCreaturism::random()
135   {
136          ::srandomdev();
137  
138 <        std::vector<std::string> jargon(this->jargon.begin(), this->jargon.end());
139 <        std::string entry(jargon.size() ? jargon[::random() % jargon.size()] : "");
138 >        std::vector<ext::String> jargon(this->jargon.begin(), this->jargon.end());
139 >        ext::String entry(jargon.size() ? jargon[::random() % jargon.size()] : "");
140  
141          select(entry);
142   }
143  
144 < void FeepingCreaturism::select(const std::string& selection, bool validate)
144 > void FeepingCreaturism::select(const ext::String& selection, bool validate)
145   {
146          if (!validate || jargon.find(selection) != jargon.end())
147          {
148 <                cout << "Content-Type: text/html; charset=UTF-8\r\n\r\n";
148 >                api::Cout << "Content-Type: text/html; charset=UTF-8\r\n\r\n";
149 >
150 >                _M::iterator include(cgi.find("include"));
151  
152 <                Jargon jargon(path + '/' + selection);
152 >                if (include != cgi.end())
153 >                {
154 >                        Jargon jargon(path + "/" + selection,
155 >                                lexical_cast<bool>(include->second));
156  
157 <                cout << jargon;
157 >                        api::Cout << jargon;
158 >                }
159 >                else
160 >                {
161 >                        Jargon jargon(path + "/" + selection);
162 >
163 >                        api::Cout << jargon;
164 >                }
165          }
166          else
167          {
168 <                cout << "Status: 404\r\nContent-Type: text/html; charset=ISO-8859-1\r\n"
169 <                        << "\r\n<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
168 >                api::Cout << "Status: 404\r\n"
169 >                        << "Content-Type: text/html; charset=ISO-8859-1\r\n\r\n"
170 >                        << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
171                          << "<html><head>\n<title>404 Not Found</title>\n</head><body>\n"
172                          << "<h1>Not Found</h1>\n<p>The requested URL "
173                          << env.get("PATH_INFO") << " was not found on this server.</p>\n"

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines