Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 IOBufferBlock *resp_blk;
00027 int doc_len;
00028
00029 struct NetTesterSM:public Continuation
00030 {
00031 VIO *read_vio;
00032 IOBufferReader *reader, *resp_reader;
00033 NetVConnection *vc;
00034 MIOBuffer *req_buf, *resp_buf;
00035 char request[2000];
00036 int req_len;
00037
00038
00039 NetTesterSM(ProxyMutex * _mutex, NetVConnection * _vc):Continuation(_mutex)
00040 {
00041 MUTEX_TRY_LOCK(lock, mutex, _vc->thread);
00042 ink_release_assert(lock);
00043 vc = _vc;
00044 Debug("net_test", "Accepted a connection");
00045 SET_HANDLER(&NetTesterSM::handle_read);
00046 req_buf = new_MIOBuffer(1);
00047 reader = req_buf->alloc_reader();
00048 read_vio = vc->do_io_read(this, INT64_MAX, req_buf);
00049
00050 resp_buf = new_empty_MIOBuffer(6);
00051 resp_buf->append_block(resp_blk->clone());
00052 req_len = 0;
00053 resp_reader = resp_buf->alloc_reader();
00054 }
00055
00056
00057 ~NetTesterSM()
00058 {
00059 req_buf->dealloc_all_readers();
00060 req_buf->clear();
00061 free_MIOBuffer(req_buf);
00062
00063 resp_buf->dealloc_all_readers();
00064 resp_buf->clear();
00065 free_MIOBuffer(resp_buf);
00066 }
00067
00068
00069
00070
00071
00072
00073 int handle_read(int event, void *data)
00074 {
00075 int r;
00076 char *str;
00077 switch (event) {
00078 case VC_EVENT_READ_READY:
00079 r = reader->read_avail();
00080 reader->read(&request[req_len], r);
00081 req_len += r;
00082 request[req_len] = 0;
00083 Debug("net_test", "%s\n", request);
00084 fflush(stdout);
00085
00086 if (strcmp(&request[req_len - 4], "\r\n\r\n") == 0) {
00087 Debug("net_test", "The request header is :\n%s\n", request);
00088
00089 SET_HANDLER(&NetTesterSM::handle_write);
00090 ink_assert(doc_len == resp_reader->read_avail());
00091 vc->do_io_write(this, doc_len, resp_reader);
00092
00093 }
00094 break;
00095 case VC_EVENT_READ_COMPLETE:
00096
00097 case VC_EVENT_EOS:
00098 r = reader->read_avail();
00099 str = new char[r + 10];
00100 reader->read(str, r);
00101 Debug("net_test", "%s", str);
00102 fflush(stdout);
00103 case VC_EVENT_ERROR:
00104 case VC_EVENT_INACTIVITY_TIMEOUT:
00105 vc->do_io_close();
00106
00107
00108 break;
00109 default:
00110 ink_release_assert(!"unknown event");
00111
00112 }
00113 return EVENT_CONT;
00114 }
00115
00116
00117 int handle_write(int event, Event * e)
00118 {
00119 switch (event) {
00120 case VC_EVENT_WRITE_READY:
00121 break;
00122
00123 case VC_EVENT_WRITE_COMPLETE:
00124 case VC_EVENT_EOS:
00125 case VC_EVENT_ERROR:
00126 case VC_EVENT_INACTIVITY_TIMEOUT:
00127 vc->do_io_close();
00128 delete this;
00129 return EVENT_DONE;
00130 break;
00131 default:
00132 ink_release_assert(!"unknown event");
00133 }
00134 return EVENT_CONT;
00135 }
00136
00137
00138
00139 };
00140
00141
00142 struct NetTesterAccept:public Continuation
00143 {
00144
00145 NetTesterAccept(ProxyMutex * _mutex):Continuation(_mutex)
00146 {
00147 SET_HANDLER(&NetTesterAccept::handle_accept);
00148 }
00149
00150 int handle_accept(int event, void *data)
00151 {
00152 Debug("net_test", "Accepted a connection\n");
00153 fflush(stdout);
00154 NetVConnection *vc = (NetVConnection *) data;
00155 new NetTesterSM(new_ProxyMutex(), vc);
00156 return EVENT_CONT;
00157 }
00158
00159
00160 };
00161
00162
00163
00164 struct Stop:public Continuation
00165 {
00166 Action *a;
00167 Stop(ProxyMutex * m):Continuation(m)
00168 {
00169 SET_HANDLER(&Stop::stop);
00170 }
00171
00172 int stop(int event, Event * e)
00173 {
00174 a->cancel();
00175 return EVENT_DONE;
00176 }
00177 };
00178
00179
00180 int
00181 test_main()
00182 {
00183 const char *response_hdr = "HTTP/1.0 200 OK\n" "Content-Type: text/html\n" "Content-Length: 8000\r\n\r\n";
00184
00185 resp_blk = new_IOBufferBlock();
00186 resp_blk->alloc(6);
00187 char *b = resp_blk->start();
00188 ink_strlcpy(b, response_hdr, resp_blk->block_size());
00189 memset(b + strlen(response_hdr), 'x', 8000);
00190 resp_blk->fill(doc_len = strlen(response_hdr) + 8000);
00191
00192 Action *a = sslNetProcessor.accept(new NetTesterAccept(new_ProxyMutex()), 8080, true);
00193
00194 return 0;
00195 }