]> git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/ecap/Host.cc
48f9d65f670dbd620543a167738767d4539ab6f4
[thirdparty/squid.git] / src / adaptation / ecap / Host.cc
1 #include "squid.h"
2 #include <libecap/adapter/service.h>
3 #include <libecap/common/names.h>
4 #include "base/TextException.h"
5 #include "adaptation/ecap/ServiceRep.h"
6 #include "adaptation/ecap/Host.h"
7
8 const libecap::Name Adaptation::Ecap::protocolInternal("internal", libecap::Name::NextId());
9 const libecap::Name Adaptation::Ecap::protocolCacheObj("cache_object", libecap::Name::NextId());
10 const libecap::Name Adaptation::Ecap::protocolIcp("ICP", libecap::Name::NextId());
11 #if USE_HTCP
12 const libecap::Name Adaptation::Ecap::protocolHtcp("Htcp", libecap::Name::NextId());
13 #endif
14
15 Adaptation::Ecap::Host::Host()
16 {
17 // assign our host-specific IDs to well-known names
18 libecap::headerReferer.assignHostId(HDR_REFERER);
19
20 libecap::protocolHttp.assignHostId(PROTO_HTTP);
21 libecap::protocolHttps.assignHostId(PROTO_HTTPS);
22 libecap::protocolFtp.assignHostId(PROTO_FTP);
23 libecap::protocolGopher.assignHostId(PROTO_GOPHER);
24 libecap::protocolWais.assignHostId(PROTO_WAIS);
25 libecap::protocolUrn.assignHostId(PROTO_URN);
26 libecap::protocolWhois.assignHostId(PROTO_WHOIS);
27 protocolInternal.assignHostId(PROTO_INTERNAL);
28 protocolCacheObj.assignHostId(PROTO_CACHEOBJ);
29 protocolIcp.assignHostId(PROTO_ICP);
30 #if USE_HTCP
31 protocolHtcp.assignHostId(PROTO_HTCP);
32 #endif
33 }
34
35 std::string
36 Adaptation::Ecap::Host::uri() const
37 {
38 return "ecap://squid-cache.org/ecap/hosts/squid";
39 }
40
41 void
42 Adaptation::Ecap::Host::describe(std::ostream &os) const
43 {
44 os << PACKAGE_NAME << " v" << PACKAGE_VERSION;
45 }
46
47 void
48 Adaptation::Ecap::Host::noteService(const libecap::weak_ptr<libecap::adapter::Service> &weak)
49 {
50 // Many ecap_service lines may use the same service URI. Find each
51 // matching service rep, make sure it is an eCAP rep,
52 // and update it with the actual eCAP service.
53 int found = 0;
54
55 libecap::shared_ptr<libecap::adapter::Service> shared(weak);
56 typedef Adaptation::Services::iterator SI;
57 for (SI i = Adaptation::AllServices().begin(); i != Adaptation::AllServices().end(); ++i) {
58 if ((*i)->cfg().uri == shared->uri().c_str()) {
59 ServiceRep *rep = dynamic_cast<ServiceRep*>(i->getRaw());
60 Must(rep);
61 rep->noteService(shared);
62 ++found;
63 }
64 }
65
66 debugs(93,5, HERE << "Found " << found << " ecap_service configs for " <<
67 shared->uri());
68 if (!found) {
69 debugs(93,1, "Warning: ignoring loaded eCAP module service without " <<
70 "a matching ecap_service configuration: " << shared->uri());
71 }
72 }
73
74 static int
75 SquidLogLevel(libecap::LogVerbosity lv)
76 {
77 if (lv.critical())
78 return DBG_CRITICAL; // is it a good idea to ignore other flags?
79
80 if (lv.large())
81 return DBG_DATA; // is it a good idea to ignore other flags?
82
83 if (lv.application())
84 return DBG_DATA; // is it a good idea to ignore other flags?
85
86 return 2 + 2*lv.debugging() + 3*lv.operation() + 2*lv.xaction();
87 }
88
89 std::ostream *
90 Adaptation::Ecap::Host::openDebug(libecap::LogVerbosity lv)
91 {
92 const int squidLevel = SquidLogLevel(lv);
93 const int squidSection = 93; // XXX: this should be a global constant
94 // XXX: Debug.h should provide this to us
95 if ((Debug::level = squidLevel) <= Debug::Levels[squidSection])
96 return &Debug::getDebugOut();
97 else
98 return NULL;
99 }
100
101 void
102 Adaptation::Ecap::Host::closeDebug(std::ostream *debug)
103 {
104 if (debug)
105 Debug::finishDebug();
106 }