1 /* $Id: ex_filter_frontend_net.cpp,v 1.7 2005-10-15 14:09:09 adam Exp $
2 Copyright (c) 2005, Index Data.
11 #include <boost/program_options.hpp>
12 namespace po = boost::program_options;
16 #include "filter_frontend_net.hpp"
17 #include "filter_log.hpp"
20 #include "session.hpp"
21 #include "package.hpp"
23 class FilterInit: public yp2::filter::Base {
25 void process(yp2::Package & package) const {
27 if (package.session().is_closed())
29 // std::cout << "Got Close.\n";
32 Z_GDU *gdu = package.request().get();
35 ODR odr = odr_createmem(ODR_ENCODE);
39 // std::cout << "Got PDU. Sending init response\n";
40 Z_APDU *apdu = zget_APDU(odr, Z_APDU_initResponse);
42 apdu->u.initResponse->implementationName = "YP2/YAZ";
44 package.response() = apdu;
46 case Z_GDU_HTTP_Request:
47 Z_GDU *gdu = z_get_HTTP_Response(odr, 200);
48 Z_HTTP_Response *http_res = gdu->u.HTTP_Response;
50 z_HTTP_header_add(odr, &http_res->headers,
51 "Content-Type", "text/plain");
53 http_res->content_buf =
54 odr_strdup(odr, "Welcome to YP2");
55 http_res->content_len = strlen(http_res->content_buf);
57 package.response() = gdu;
64 return package.move();
68 int main(int argc, char **argv)
72 po::options_description desc("Allowed options");
74 ("help", "produce help message")
75 ("duration", po::value<int>(),
76 "number of seconds for server to exist")
77 ("port", po::value< std::vector<std::string> >(), "listener port")
80 po::positional_options_description p;
84 po::store(po::command_line_parser(argc, argv).
85 options(desc).positional(p).run(), vm);
88 if (vm.count("help")) {
89 std::cout << desc << "\n";
95 std::vector<std::string> ports =
96 vm["port"].as< std::vector<std::string> >();
98 for (size_t i = 0; i<ports.size(); i++)
99 std::cout << "port " << i << " " << ports[i] << "\n";
101 yp2::RouterChain router;
103 // put frontend filter in router
104 yp2::filter::FrontendNet filter_front;
105 filter_front.ports() = ports;
107 // 0=no time, >0 timeout in seconds
108 if (vm.count("duration")) {
109 filter_front.listen_duration() = vm["duration"].as<int>();
111 router.rule(filter_front);
113 // put log filter in router
114 yp2::filter::Log filter_log;
115 router.rule(filter_log);
117 // put backend init filter in router
118 FilterInit filter_init;
119 router.rule(filter_init);
121 yp2::Session session;
123 yp2::Package pack(session, origin);
125 pack.router(router).move();
129 std::cerr << "unknown exception\n";
138 * indent-tabs-mode: nil
139 * c-file-style: "stroustrup"
141 * vim: shiftwidth=4 tabstop=8 expandtab