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/http/api.h>
33 #include <cxxtools/mutex.h>
34 #include <cxxtools/condition.h>
35 #include <vector>
36 #include <string>
37 
38 namespace cxxtools {
39 
40 namespace http {
41 
42 class Responder;
43 class Request;
44 
46 {
47  protected:
48  virtual ~Authenticator()
49  { }
50  public:
51  virtual bool checkAuth(const Request&) const = 0;
52 };
53 
55 {
56  std::vector<const Authenticator*> _authenticators;
57  std::string _realm;
58  std::string _authContent;
59 
60  unsigned _responderCount;
61  Mutex _mutex;
62  Condition _isIdle;
63 
64  public:
66  : _responderCount(0)
67  { }
68 
69  virtual ~Service() { }
70  Responder* doCreateResponder(const Request&);
71  void doReleaseResponder(Responder*);
72 
73  bool checkAuth(const Request& request);
74 
75  void setRealm(const std::string& realm, const std::string& content = std::string())
76  { _realm = realm; _authContent = content; }
77 
78  const std::string& realm() const { return _realm; }
79  const std::string& authContent() const { return _authContent; }
80 
81  void addAuthenticator(const Authenticator* auth)
82  { _authenticators.push_back(auth); }
83 
84  void waitIdle();
85 
86  protected:
87  virtual Responder* createResponder(const Request&) = 0;
88  virtual void releaseResponder(Responder*) = 0;
89 };
90 
91 class CachedServiceBase : public Service
92 {
93  typedef std::vector<Responder*> Responders;
94  Responders responders;
95 
96  public:
98 
99  protected:
100  virtual Responder* newResponder() = 0;
101  Responder* createResponder(const Request& request);
102  void releaseResponder(Responder* resp);
103 
104 };
105 
106 template <typename ResponderType>
108 {
109  virtual Responder* newResponder()
110  {
111  return new ResponderType(*this);
112  }
113 };
114 
115 } // namespace http
116 
117 } // namespace cxxtools
118 
119 #endif