service.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009 by Marc Boris Duerner, Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef cxxtools_Http_Service_h
30 #define cxxtools_Http_Service_h
31 
32 #include <cxxtools/mutex.h>
33 #include <cxxtools/condition.h>
34 #include <vector>
35 #include <string>
36 
37 namespace cxxtools {
38 
39 namespace http {
40 
41 class Responder;
42 class Request;
43 
45 {
46  protected:
47  virtual ~Authenticator()
48  { }
49  public:
50  virtual bool checkAuth(const Request&) const = 0;
51 };
52 
53 class Service
54 {
55  std::vector<const Authenticator*> _authenticators;
56  std::string _realm;
57  std::string _authContent;
58 
59  unsigned _responderCount;
60  Mutex _mutex;
61  Condition _isIdle;
62 
63  public:
65  : _responderCount(0)
66  { }
67 
68  virtual ~Service() { }
71 
72  bool checkAuth(const Request& request);
73 
74  void setRealm(const std::string& realm, const std::string& content = std::string())
75  { _realm = realm; _authContent = content; }
76 
77  const std::string& realm() const { return _realm; }
78  const std::string& authContent() const { return _authContent; }
79 
80  void addAuthenticator(const Authenticator* auth)
81  { _authenticators.push_back(auth); }
82 
83  void waitIdle();
84 
85  protected:
86  virtual Responder* createResponder(const Request&) = 0;
87  virtual void releaseResponder(Responder*) = 0;
88 };
89 
90 class CachedServiceBase : public Service
91 {
92  typedef std::vector<Responder*> Responders;
93  Responders responders;
94 
95  public:
97 
98  protected:
99  virtual Responder* newResponder() = 0;
100  Responder* createResponder(const Request& request);
101  void releaseResponder(Responder* resp);
102 
103 };
104 
105 template <typename ResponderType>
107 {
108  virtual Responder* newResponder()
109  {
110  return new ResponderType(*this);
111  }
112 };
113 
114 } // namespace http
115 
116 } // namespace cxxtools
117 
118 #endif