EvBufferEvent & smtp_buffer_test from eventxx/ioevent.git
[ioevent.git] / test / smtp_buffer_test.cpp
blob90092ab673303189b002dac8d415bb4f221fd1c0
2 #include <ioevent>
4 #include <EvBufferEvent.hpp>
6 #include <evhttp.h>
8 #include <iostream>
10 enum {
11 STATE_INIT = 0,
12 STATE_DATA
15 struct cc {
16 int state;
18 EvBufferEvent * be;
19 struct bufferevent * bev;
21 const char * cur_line;
25 void react_helo(struct cc * c)
27 bufferevent * bev = c->bev;
28 evbuffer * b = ::evbuffer_new();
30 const char * line = c->cur_line;
32 ::evbuffer_add_printf(b, "250 Hello %s\r\n", line + 5);
33 ::bufferevent_write_buffer(bev, b);
35 ::evbuffer_free(b);
38 void react_250_ok(struct cc * c)
40 bufferevent * bev = c->bev;
41 evbuffer * b = ::evbuffer_new();
43 ::evbuffer_add_printf(b, "250 Ok\r\n");
44 ::bufferevent_write_buffer(bev, b);
46 ::evbuffer_free(b);
49 void react_data(struct cc * c)
51 bufferevent * bev = c->bev;
52 evbuffer * b = ::evbuffer_new();
54 ::evbuffer_add_printf(b, "354 End data with <CR><LF>.<CR><LF>\r\n");
55 ::bufferevent_write_buffer(bev, b);
57 c->state = STATE_DATA;
59 ::evbuffer_free(b);
62 void react_data_line(struct cc * c)
64 bufferevent * bev = c->bev;
65 evbuffer * b = ::evbuffer_new();
67 ::evbuffer_add_printf(b, "250 Ok\r\n");
68 ::bufferevent_write_buffer(bev, b);
70 c->state = STATE_INIT;
72 ::evbuffer_free(b);
75 void react_bye(struct cc * c)
77 bufferevent * bev = c->bev;
78 evbuffer * b = ::evbuffer_new();
80 ::evbuffer_add_printf(b, "221 Bye\r\n");
81 ::bufferevent_write_buffer(bev, b);
83 ::evbuffer_free(b);
86 void readcb(struct bufferevent *bev, void * v)
88 char * line;
90 struct cc * c = (struct cc *)v;
92 while (line = ::evbuffer_readline(bev->input))
94 c->cur_line = line;
96 if (c->state == STATE_INIT)
98 if (!strncmp(line, "HELO ", 5) ||
99 !strncmp(line, "EHLO ", 5))
101 react_helo(c);
103 else
104 if (!strncmp(line, "MAIL", 4))
106 react_250_ok(c);
108 else
109 if (!strncmp(line, "RCPT", 4))
111 react_250_ok(c);
113 else
114 if (!strncmp(line, "DATA", 4))
116 react_data(c);
118 else
119 if (!strncmp(line, "QUIT", 4))
121 react_bye(c);
124 else
126 if (strcmp(line, "."))
128 react_data_line(c);
132 free(line);
133 c->cur_line = NULL;
138 void writecb(struct bufferevent *, void *)
143 void errorcb(struct bufferevent *, short, void *)
148 void accept_handler(int s1, short, void *)
150 struct cc * c = new cc;
151 c->state = STATE_INIT;
153 EvBufferEvent * be = new EvBufferEvent(readcb, writecb, errorcb, c);
155 be->accept(s1);
157 c->be = be;
158 c->bev = be->_bufferevent;
160 c->cur_line = NULL;
162 evbuffer * b = ::evbuffer_new();
164 ::bufferevent_enable(be->_bufferevent, EV_READ);
166 be->write("220 www.example.com ESMTP postfix\r\n", 35);
170 main()
172 ::event_init();
174 int sock = ::bind_socket(NULL, 5525);
176 ::bufev_socket_listen(sock, 10);
178 ioevent accept_event(sock, EV_READ, &accept_handler, NULL);
179 ::event_add(&accept_event, NULL);
181 ::event_dispatch();