Extended filter in ex_filter_frontend_net program to return a
[metaproxy-moved-to-github.git] / src / ex_filter_frontend_net.cpp
1
2 #include <cstdlib>
3 #include <iostream>
4 #include <stdexcept>
5
6 #include "config.hpp"
7
8 #include "filter_frontend_net.hpp"
9
10 #include "router.hpp"
11 #include "session.hpp"
12 #include "package.hpp"
13
14 class FilterInit: public yp2::Filter {
15 public:
16     void process(yp2::Package & package) const {
17
18         if (package.session().is_closed())
19         {
20             // std::cout << "Got Close.\n";
21         }
22        
23         Z_GDU *gdu = package.request().get();
24         if (gdu)
25         {
26             ODR odr = odr_createmem(ODR_ENCODE);
27             switch(gdu->which)
28             {
29             case Z_GDU_Z3950:
30                 // std::cout << "Got PDU. Sending init response\n";
31                 Z_APDU *apdu = zget_APDU(odr, Z_APDU_initResponse);
32                 
33                 apdu->u.initResponse->implementationName = "YP2/YAZ";
34                 
35                 package.response() = apdu;
36                 break;
37             case Z_GDU_HTTP_Request:
38                 Z_GDU *gdu = z_get_HTTP_Response(odr, 200);
39                 Z_HTTP_Response *http_res = gdu->u.HTTP_Response;
40         
41                 z_HTTP_header_add(odr, &http_res->headers,
42                                   "Content-Type", "text/plain");
43            
44                 http_res->content_buf = 
45                     odr_strdup(odr, "Welcome to YP2");
46                 http_res->content_len = strlen(http_res->content_buf);
47
48                 package.response() = gdu;
49                 break;
50             default:
51                 break;
52             } 
53             odr_destroy(odr);
54        }
55         return package.move();
56     };
57 };
58
59 int main(int argc, char **argv)
60 {
61     try 
62     {
63         {
64             yp2::RouterChain router;
65
66             // put in frontend first
67             yp2::FilterFrontendNet filter_front;
68             filter_front.listen_address() = "tcp:@:9999";
69
70             // 0=no time, >0 timeout in seconds
71             filter_front.listen_duration() = 0;
72             router.rule(filter_front);
73
74             // put in a backend
75             FilterInit filter_init;
76             router.rule(filter_init);
77
78             yp2::Session session;
79             yp2::Origin origin;
80             yp2::Package pack(session, origin);
81             
82             pack.router(router).move(); 
83         }
84     }
85     catch ( ... ) {
86         std::cerr << "unknown exception\n";
87         std::exit(1);
88     }
89 }
90
91 /*
92  * Local variables:
93  * c-basic-offset: 4
94  * indent-tabs-mode: nil
95  * End:
96  * vim: shiftwidth=4 tabstop=8 expandtab
97  */