]> git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/Service.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / adaptation / Service.cc
1 /*
2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 /* DEBUG: section 93 Adaptation */
10
11 #include "squid.h"
12 #include "adaptation/Service.h"
13 #include "adaptation/ServiceFilter.h"
14 #include "HttpRequest.h"
15
16 Adaptation::Service::Service(const ServiceConfigPointer &aConfig): theConfig(aConfig)
17 {
18 Must(theConfig != NULL);
19 debugs(93,3, HERE << "creating adaptation service " << cfg().key);
20 }
21
22 Adaptation::Service::~Service()
23 {}
24
25 void
26 Adaptation::Service::finalize()
27 {
28 }
29
30 bool Adaptation::Service::broken() const
31 {
32 return probed() && !up();
33 }
34
35 bool
36 Adaptation::Service::wants(const ServiceFilter &filter) const
37 {
38 if (cfg().method != filter.method)
39 return false;
40
41 if (cfg().point != filter.point)
42 return false;
43
44 // sending a message to a broken service is likely to cause errors
45 if (cfg().bypass && broken())
46 return false;
47
48 if (up()) {
49 // Sending a message to a service that does not want it is useless.
50 // note that we cannot check wantsUrl for service that is not "up"
51 // note that even essential services are skipped on unwanted URLs!
52 return wantsUrl(filter.request->url.path());
53 }
54
55 // The service is down and is either not bypassable or not probed due
56 // to the bypass && broken() test above. Thus, we want to use it!
57 return true;
58 }
59
60 Adaptation::Services &
61 Adaptation::AllServices()
62 {
63 static Services *TheServices = new Services;
64 return *TheServices;
65 }
66
67 Adaptation::ServicePointer
68 Adaptation::FindService(const Service::Id& key)
69 {
70 typedef Services::iterator SI;
71 for (SI i = AllServices().begin(); i != AllServices().end(); ++i) {
72 if ((*i)->cfg().key == key)
73 return *i;
74 }
75 return NULL;
76 }
77
78 void Adaptation::DetachServices()
79 {
80 while (!AllServices().empty()) {
81 AllServices().back()->detach();
82 AllServices().pop_back();
83 }
84 }
85