~josejuan-sanchez/esajpip/continue

« back to all changes in this revision

Viewing changes to src/http/request.cc

  • Committer: José Juan Sánchez Hernández
  • Date: 2013-10-01 10:01:21 UTC
  • Revision ID: josejuan.sanchez@gmail.com-20131001100121-xfobvkenqie7y0te
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#define SHOW_TRACES
 
2
#include "trace.h"
 
3
#include "request.h"
 
4
 
 
5
 
 
6
namespace http
 
7
{
 
8
 
 
9
  void Request::ParseParameter(istream& stream, const string& param, string& value)
 
10
  {
 
11
    getline(stream, value, '&');
 
12
  }
 
13
 
 
14
  void Request::ParseParameters(istream& stream)
 
15
  {
 
16
    string param, value;
 
17
 
 
18
    parameters.clear();
 
19
 
 
20
    while(stream.good()) {
 
21
      value.clear();
 
22
      getline(stream, param, '=');
 
23
      ParseParameter(stream, param, value);
 
24
      if(stream) parameters[param] = value;
 
25
    }
 
26
  }
 
27
 
 
28
  istream& operator >> (istream &in, Request &request)
 
29
  {
 
30
    string line, cad, uri;
 
31
    request.type = Request::UNKNOWN;
 
32
 
 
33
    if(getline(in, line)) {
 
34
      if(line.size() <= 0) in.setstate(istream::failbit);
 
35
      else {
 
36
        TRACE("HTTP Request: " << line);
 
37
 
 
38
        istringstream in_str(line);
 
39
 
 
40
        if(!(in_str >> cad >> uri >> request.protocol)) in.setstate(istream::failbit);
 
41
        else {
 
42
          if(cad == "POST") request.type = Request::POST;
 
43
          else if(cad == "GET") request.type = Request::GET;
 
44
          else in.setstate(istream::failbit);
 
45
          request.ParseURI(uri);
 
46
        }
 
47
      }
 
48
    }
 
49
 
 
50
    return in;
 
51
  }
 
52
 
 
53
  ostream& operator << (ostream& out, const Request& request)
 
54
  {
 
55
    if(request.type != Request::UNKNOWN) {
 
56
      out << (request.type == Request::GET ? "GET" : "POST") << " " << request.object;
 
57
 
 
58
      if(request.parameters.size() > 0) {
 
59
        out << "?";
 
60
        map<string, string>::const_iterator i = request.parameters.begin();
 
61
 
 
62
        if(!i->second.empty()) out << i->first << "=" << i->second;
 
63
        else out << i->first;
 
64
 
 
65
        while(++i != request.parameters.end()) {
 
66
          out << "&";
 
67
          if(!i->second.empty()) out << i->first << "=" << i->second;
 
68
          else out << i->first;
 
69
        }
 
70
      }
 
71
 
 
72
      out << " " << request.protocol << Protocol::CRLF;
 
73
    }
 
74
 
 
75
    return out;
 
76
  }
 
77
 
 
78
}