File: HttpHeaders.hpp

package info (click to toggle)
sslsniff 0.8%2Bgit20111017-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 504 kB
  • sloc: cpp: 2,165; xml: 12; makefile: 8
file content (103 lines) | stat: -rw-r--r-- 2,945 bytes parent folder | download | duplicates (2)
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
/*
 * Copyright (c) 2002-2009 Moxie Marlinspike
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 */

#ifndef __HTTP_HEADERS_H__
#define __HTTP_HEADERS_H__

#define READING_ACTION 0
#define READING_KEY    1
#define READING_VALUE  2
#define READING_POST   3
#define READING_DONE   4

#include <string>
#include <map>
#include <iostream>

class HttpHeaderException : public std::exception {
public:
  virtual const char* what() const throw() {
    return "HTTP Action Malformed...";
  }
};

/************************************************************************/
/* Comparator for case-insensitive comparison in STL assos. containers  */
/************************************************************************/
struct ci_less : std::binary_function<std::string, std::string, bool>
{
  // case-independent (ci) compare_less binary function
  struct nocase_compare : public std::binary_function<unsigned char,unsigned char,bool> 
  {
    bool operator() (const unsigned char& c1, const unsigned char& c2) const {
        return tolower (c1) < tolower (c2);
    }
  };
  bool operator() (const std::string & s1, const std::string & s2) const {
    return std::lexicographical_compare
      (s1.begin (), s1.end (),   // source range
      s2.begin (), s2.end (),   // dest range
      nocase_compare ());  // comparison
  }
};


class HttpHeaders {

private:
  int foundCr;
  int foundLf;

  int state;

  std::string action;
  std::string method;
  std::string request;

  std::string postData;
  std::string key;
  std::string value;
  std::map<std::string, std::string, ci_less> headers;

  int readLine(char *buffer, int *offset, int length);
  int readAction(char *buffer, int length);
  int readValue(char *buffer, int offset, int length);
  int readKey(char *buffer, int offset, int length);
  void readPostData(char *buffer, int offset, int length);
  void parseAction();
  int getContentLength();

public:
  HttpHeaders()
    : state(READING_ACTION),
      foundCr(0),
      foundLf(0) {}      

  bool process(char * buffer, int length);
  bool isPost();

  std::map<std::string, std::string, ci_less>& getHeaders();
  std::string& getHeader(std::string& header);
  std::string& getMethod();
  std::string& getRequest();  
  std::string& getPostData();  
};


#endif