const string& query, const string& version):
HTTPMessage(version), method(method), uri(uri), query(query) {
#ifdef DEBUG
const string& query, const string& version):
HTTPMessage(version), method(method), uri(uri), query(query) {
#ifdef DEBUG
-istream& operator>>(istream& is, HTTPRequest& req) {
+istream& operator>>(istream& is, HTTPRequest& req)
+ throw(HTTPError, ios::failure) {
- // FIXME - poner excepciones lindas.
- throw "HTTP/1.1 501 Method Not Implemented";
+ throw HTTPError(HTTPMessage::BAD_REQUEST, line
+ + ": No tiene un método conocido.");
}
// Averiguo método.
string::size_type pos = line.find_first_of(String::SPACE_CHARS);
String met = line.substr(0, pos);
}
// Averiguo método.
string::size_type pos = line.find_first_of(String::SPACE_CHARS);
String met = line.substr(0, pos);
- // FIXME - poner excepciones lindas.
- throw "HTTP/1.1 501 Method Not Implemented";
+ throw HTTPError(HTTPMessage::NOT_IMPLEMENTED, met
+ + ": No es un método soportado.");
}
// Si tiene sólo el método, no es válido.
line = line.substr(pos + 1);
line.trim();
if (!line.length()) {
}
// Si tiene sólo el método, no es válido.
line = line.substr(pos + 1);
line.trim();
if (!line.length()) {
}
// Si tiene más espacios, tengo la URI y el protocolo (o un error).
pos = line.find_first_of(String::SPACE_CHARS);
if (pos != string::npos) {
// Si el resto es un protocolo válido, agrego más variables.
String protocol = line.substr(pos + 1);
}
// Si tiene más espacios, tengo la URI y el protocolo (o un error).
pos = line.find_first_of(String::SPACE_CHARS);
if (pos != string::npos) {
// Si el resto es un protocolo válido, agrego más variables.
String protocol = line.substr(pos + 1);
- protocol = protocol.trim();
- if (protocol.to_upper() == "HTTP/1.0") {
+ protocol = protocol.trim().to_upper();
+ if (protocol.substr(0, 5) != "HTTP/") {
+ throw HTTPError(HTTPMessage::BAD_REQUEST,
+ protocol + ": Protocolo desconocido");
+ }
+ if (protocol.substr(5) == "1.0") {
- // FIXME - poner excepciones lindas.
- throw "HTTP/1.1 400 Bad Request";
+ throw HTTPError(HTTPMessage::HTTP_VERSION_NOT_SUPPORTED,
+ protocol.substr(5) + ": Versión HTTP no soportada.");
}
line = line.substr(0, pos);
}
// Agrego la URI y sus derivados.
if (!line.length() || (line[0] != '/')) {
// FIXME || request.find_first_not_of(";/?:@&=+$,")) {
}
line = line.substr(0, pos);
}
// Agrego la URI y sus derivados.
if (!line.length() || (line[0] != '/')) {
// FIXME || request.find_first_not_of(";/?:@&=+$,")) {
- // FIXME - poner excepciones lindas.
- throw "HTTP/1.1 400 Bad Request";
+ throw HTTPError(HTTPMessage::BAD_REQUEST,
+ line + ": La URI no comienza con /.");