]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (C) 1996-2020 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 |