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