3
A brief file description
5
@section license License
7
Licensed to the Apache Software Foundation (ASF) under one
8
or more contributor license agreements. See the NOTICE file
9
distributed with this work for additional information
10
regarding copyright ownership. The ASF licenses this file
11
to you under the Apache License, Version 2.0 (the
12
"License"); you may not use this file except in compliance
13
with the License. You may obtain a copy of the License at
15
http://www.apache.org/licenses/LICENSE-2.0
17
Unless required by applicable law or agreed to in writing, software
18
distributed under the License is distributed on an "AS IS" BASIS,
19
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
See the License for the specific language governing permissions and
21
limitations under the License.
28
unsigned int addr = inet_addr(host);
29
struct hostent *host_info = NULL;
31
if (!addr || (-1 == (int) addr)) {
32
host_info = gethostbyname(host);
34
perror("gethostbyname");
35
return (unsigned int) -1;
37
addr = *((unsigned int *) host_info->h_addr);
44
char *origin_server = "npdev.inktomi.com";
45
unsigned int origin_server_ip;
46
unsigned short origin_server_port = 8080;
48
struct NetTesterSM:public Continuation
51
VIO *client_resp_write_vio;
52
VIO *server_resp_read_vio;
53
int server_vc_closed, client_vc_closed;
55
IOBufferReader *client_reader, *client_parse_reader;
57
NetVConnection *client_vc, *server_vc;
58
MIOBuffer *request_buf;
59
MIOBuffer *response_buf;
64
NetTesterSM(ProxyMutex * _mutex, NetVConnection * _vc):Continuation(_mutex),
65
server_vc_closed(0), client_vc_closed(0)
67
MUTEX_TRY_LOCK(lock, mutex, _vc->thread);
68
ink_release_assert(lock);
71
SET_HANDLER(&NetTesterSM::handle_request_read_from_client);
72
// jtest headers are really short
73
request_buf = new_MIOBuffer(1);
74
response_buf = new_MIOBuffer(8);
75
client_reader = request_buf->alloc_reader();
76
client_parse_reader = request_buf->alloc_reader();
77
client_read_vio = client_vc->do_io_read(this, INT_MAX, request_buf);
78
//client_vc->set_inactivity_timeout(HRTIME_SECONDS(60));
85
request_buf->dealloc_all_readers();
87
free_MIOBuffer(request_buf);
88
response_buf->dealloc_all_readers();
89
response_buf->clear();
90
free_MIOBuffer(response_buf);
95
/* ********************* jtest sample request **********************
96
GET http://npdev:8080/0.5216393021/6000 HTTP/1.0
97
Proxy-Connection: Keep-Alive
100
int handle_request_read_from_client(int event, void *data)
105
case VC_EVENT_READ_READY:
106
r = client_parse_reader->read_avail();
107
client_parse_reader->read(&request[req_len], r);
109
request[req_len] = 0;
110
Debug("net_test", "%s\n", request);
112
//client_vc->set_inactivity_timeout(HRTIME_SECONDS(30));
113
if (strcmp(&request[req_len - 4], "\r\n\r\n") == 0) {
114
Debug("net_test", "The request header is :\n%s\n", request);
115
client_vc->cancel_inactivity_timeout();
116
// connect to the origin server
117
SET_HANDLER(&NetTesterSM::handle_server_connect);
118
sslNetProcessor.connect_re(this, origin_server_ip, origin_server_port);
121
case VC_EVENT_READ_COMPLETE:
124
r = client_parse_reader->read_avail();
125
str = NEW(new char[r + 10]);
126
client_parse_reader->read(str, r);
129
case VC_EVENT_INACTIVITY_TIMEOUT:
132
// handle timeout events
135
ink_release_assert(!"unknown event");
141
int handle_server_connect(int event, Event * e)
145
server_vc = (NetVConnection *) e;
146
SET_HANDLER(&NetTesterSM::handle_write_request_to_server);
147
Debug("net_test", "connected to server\n");
148
Debug("net_test", "writing %d to server\n", client_reader->read_avail());
149
server_vc->do_io_write(this, client_reader->read_avail(), client_reader);
150
//vc->set_inactivity_timeout(HRTIME_SECONDS(10));
152
case NET_EVENT_OPEN_FAILED:
160
int handle_write_request_to_server(int event, Event * e)
162
IOBufferReader *resp_reader;
164
case VC_EVENT_WRITE_READY:
165
Debug("net_test", "wrote some bytes to server\n");
168
case VC_EVENT_WRITE_COMPLETE:
169
Debug("net_test", "wrote request to server\n");
170
SET_HANDLER(&NetTesterSM::handle_response_pump);
171
resp_reader = response_buf->alloc_reader();
173
response_buf->autopilot = 1;
174
server_resp_read_vio = server_vc->do_io_read(this, INT64_MAX, response_buf);
175
client_resp_write_vio = client_vc->do_io_write(this, INT64_MAX, resp_reader);
176
response_buf->assign_reader_vio(client_resp_write_vio, resp_reader);
177
response_buf->assign_writer_vio(server_resp_read_vio);
181
case VC_EVENT_INACTIVITY_TIMEOUT:
188
ink_release_assert(!"unknown event");
193
void close_server_vc()
195
if (!server_vc_closed)
196
server_vc->do_io_close();
198
server_vc_closed = 1;
201
void close_client_vc()
203
if (!client_vc_closed)
204
client_vc->do_io_close();
206
client_vc_closed = 1;
209
int handle_response_pump(int event, Event * e)
214
case VC_EVENT_INACTIVITY_TIMEOUT:
222
case VC_EVENT_WRITE_READY:
223
case VC_EVENT_READ_READY:
224
ink_release_assert(!"unexpected READY event in handle_response_pump");
227
case VC_EVENT_READ_COMPLETE:
229
doc_len = server_resp_read_vio->ndone;
230
Debug("net_test", "Got response %d bytes from server\n", doc_len);
232
if (client_resp_write_vio->ndone != doc_len) {
233
client_resp_write_vio->set_nbytes(doc_len);
234
client_vc->reenable(client_resp_write_vio);
236
Debug("net_test", "Wrote response %d bytes to client\n", client_resp_write_vio->ndone);
242
case VC_EVENT_WRITE_COMPLETE:
243
Debug("net_test", "Wrote response %d bytes to client\n", client_resp_write_vio->ndone);
249
ink_release_assert(!"unexpected event in handle_response_pump");
259
struct NetTesterAccept:public Continuation
262
NetTesterAccept(ProxyMutex * _mutex):Continuation(_mutex)
264
SET_HANDLER(&NetTesterAccept::handle_accept);
267
int handle_accept(int event, void *data)
269
Debug("net_test", "Accepted a connection\n");
270
NetVConnection *vc = (NetVConnection *) data;
271
NEW(new NetTesterSM(new_ProxyMutex(), vc));
278
//#define TEST_ACCEPT_CANCEL
280
struct Stop:public Continuation
283
Stop(ProxyMutex * m):Continuation(m)
285
SET_HANDLER(&Stop::stop);
288
int stop(int event, Event * e)
290
printf("Cancelling accept\n");
301
origin_server_ip = get_addr(origin_server);
303
a = sslNetProcessor.accept(NEW(new NetTesterAccept(new_ProxyMutex())), 45080, true);
305
#ifdef TEST_ACCEPT_CANCEL
306
Stop *s = NEW(new Stop(new_ProxyMutex()));
307
eventProcessor.schedule_in(s, HRTIME_SECONDS(10));