778cd18a2e4ec77b608b949245208e32fb20e860
[metaproxy-moved-to-github.git] / src / ex_filter_frontend_net.cpp
1
2 #include <cstdlib>
3 #include <iostream>
4 #include <stdexcept>
5
6 #include <boost/program_options.hpp>
7 namespace po = boost::program_options;
8
9 #include "config.hpp"
10
11 #include "filter_frontend_net.hpp"
12 #include "filter_log.hpp"
13
14 #include "router.hpp"
15 #include "session.hpp"
16 #include "package.hpp"
17
18 class FilterInit: public yp2::filter::Base {
19 public:
20     void process(yp2::Package & package) const {
21
22         if (package.session().is_closed())
23         {
24             // std::cout << "Got Close.\n";
25         }
26        
27         Z_GDU *gdu = package.request().get();
28         if (gdu)
29         {
30             ODR odr = odr_createmem(ODR_ENCODE);
31             switch(gdu->which)
32             {
33             case Z_GDU_Z3950:
34                 // std::cout << "Got PDU. Sending init response\n";
35                 Z_APDU *apdu = zget_APDU(odr, Z_APDU_initResponse);
36                 
37                 apdu->u.initResponse->implementationName = "YP2/YAZ";
38                 
39                 package.response() = apdu;
40                 break;
41             case Z_GDU_HTTP_Request:
42                 Z_GDU *gdu = z_get_HTTP_Response(odr, 200);
43                 Z_HTTP_Response *http_res = gdu->u.HTTP_Response;
44         
45                 z_HTTP_header_add(odr, &http_res->headers,
46                                   "Content-Type", "text/plain");
47            
48                 http_res->content_buf = 
49                     odr_strdup(odr, "Welcome to YP2");
50                 http_res->content_len = strlen(http_res->content_buf);
51
52                 package.response() = gdu;
53                 break;
54             default:
55                 break;
56             } 
57             odr_destroy(odr);
58         }
59         return package.move();
60     };
61 };
62
63 int main(int argc, char **argv)
64 {
65     try 
66     {
67         po::options_description desc("Allowed options");
68         desc.add_options()
69             ("help", "produce help message")
70             ("duration", po::value<int>(),
71              "number of seconds for server to exist")
72             ("port", po::value< std::vector<std::string> >(), "listener port")
73             ;
74
75         po::positional_options_description p;
76         p.add("port", -1);
77
78         po::variables_map vm;        
79         po::store(po::command_line_parser(argc, argv).
80                   options(desc).positional(p).run(), vm);
81         po::notify(vm);    
82
83         if (vm.count("help")) {
84             std::cout << desc << "\n";
85             return 1;
86         }
87
88         if (vm.count("port"))
89         {
90             std::vector<std::string> ports = 
91                 vm["port"].as< std::vector<std::string> >();
92
93             for (size_t i = 0; i<ports.size(); i++)
94                 std::cout << "port " << i << " " << ports[i] << "\n";
95
96             yp2::RouterChain router;
97
98             // put frontend filter in router
99             yp2::filter::FrontendNet filter_front;
100             filter_front.ports() = ports;
101
102             // 0=no time, >0 timeout in seconds
103             if (vm.count("duration")) {
104                 filter_front.listen_duration() = vm["duration"].as<int>();
105             }
106             router.rule(filter_front);
107
108             // put log filter in router
109             yp2::filter::Log filter_log;
110             router.rule(filter_log);
111
112             // put backend init filter in router
113             FilterInit filter_init;
114             router.rule(filter_init);
115
116             yp2::Session session;
117             yp2::Origin origin;
118             yp2::Package pack(session, origin);
119             
120             pack.router(router).move(); 
121         }
122     }
123     catch ( ... ) {
124         std::cerr << "unknown exception\n";
125         std::exit(1);
126     }
127     std::exit(0);
128 }
129
130 /*
131  * Local variables:
132  * c-basic-offset: 4
133  * indent-tabs-mode: nil
134  * End:
135  * vim: shiftwidth=4 tabstop=8 expandtab
136  */