• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

TestSimpleProxy.cc

Go to the documentation of this file.
00001 /** @file
00002 
00003   A brief file description
00004 
00005   @section license License
00006 
00007   Licensed to the Apache Software Foundation (ASF) under one
00008   or more contributor license agreements.  See the NOTICE file
00009   distributed with this work for additional information
00010   regarding copyright ownership.  The ASF licenses this file
00011   to you under the Apache License, Version 2.0 (the
00012   "License"); you may not use this file except in compliance
00013   with the License.  You may obtain a copy of the License at
00014 
00015       http://www.apache.org/licenses/LICENSE-2.0
00016 
00017   Unless required by applicable law or agreed to in writing, software
00018   distributed under the License is distributed on an "AS IS" BASIS,
00019   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00020   See the License for the specific language governing permissions and
00021   limitations under the License.
00022  */
00023 
00024 #include <limits.h>
00025 #include "Net.h"
00026 #include "Disk.h"
00027 #include "Main.h"
00028 #include "DNS.h"
00029 #include "OneWayTunnel.h"
00030 
00031 struct TestProxy:Continuation
00032 {
00033 
00034   NetVConnection *vc;
00035   NetVConnection *remote;
00036   MIOBuffer *inbuf;
00037   MIOBuffer *outbuf;
00038   char *host, *url, *url_end;
00039   char s[256];
00040 
00041   int done()
00042   {
00043     if (inbuf)
00044       free_MIOBuffer(inbuf);
00045     if (outbuf)
00046       free_MIOBuffer(outbuf);
00047     if (vc)
00048       vc->do_io(VIO::CLOSE);
00049     if (remote)
00050       remote->do_io(VIO::CLOSE);
00051     delete this;
00052       return EVENT_DONE;
00053   }
00054 
00055   int startEvent(int event, VIO * vio)
00056   {
00057     if (event != VC_EVENT_READ_READY) {
00058       printf("TestProxy startEvent error %d\n", event);
00059       return done();
00060     }
00061     if (vio->buffer.mbuf->gets(s, 255)) {
00062       host = s + 11;
00063       url = strchr(host, '/');
00064       url_end = strchr(url, ' ');
00065       *url = 0;
00066       dnsProcessor.gethostbyname(host, this);
00067       *url = '/';
00068       SET_HANDLER(dnsEvent);
00069       vc = (NetVConnection *) vio->vc_server;
00070       return EVENT_DONE;
00071     }
00072     return EVENT_CONT;
00073   }
00074 
00075   int dnsEvent(int event, HostEnt * ent)
00076   {
00077     if (!ent) {
00078       printf("TestProxy dnsEvent error %d\n", event);
00079       return done();
00080     }
00081     unsigned int ip = *(unsigned int *) ent->h_addr_list[0];
00082     netProcessor.connect(this, ip, 80);
00083     SET_HANDLER(connectEvent);
00084     return EVENT_DONE;
00085   }
00086 
00087   int connectEvent(int event, NetVConnection * aremote)
00088   {
00089     if (!aremote) {
00090       printf("TestProxy connectEvent error %d\n", event);
00091       return done();
00092     }
00093     remote = aremote;
00094     outbuf = new_MIOBuffer();
00095     remote->do_io(VIO::WRITE, this, INT64_MAX, outbuf);
00096     *url_end = 0;
00097     sprintf(outbuf->start, "GET %s HTTP/1.0\n\n\n", url);
00098     outbuf->fill(strlen(outbuf->start) + 1);
00099     printf("sending [%s]\n", outbuf->start);
00100     SET_HANDLER(sendEvent);
00101     return EVENT_CONT;
00102   }
00103 
00104   int sendEvent(int event, VIO * vio)
00105   {
00106     if (event != VC_EVENT_WRITE_READY) {
00107       printf("TestProxy sendEvent error %d\n", event);
00108       return done();
00109     }
00110     if (vio->buffer.size())
00111       return EVENT_CONT;
00112     new OneWayTunnel(remote, vc, this, TUNNEL_TILL_DONE, true, true, true);
00113     SET_HANDLER(tunnelEvent);
00114     return EVENT_DONE;
00115   }
00116 
00117   int tunnelEvent(int event, Continuation * cont)
00118   {
00119     (void) cont;
00120     if (event != VC_EVENT_EOS) {
00121       printf("TestProxy sendEvent error %d\n", event);
00122       return done();
00123     }
00124     remote = 0;
00125     vc = 0;
00126     printf("sucessful proxy of %s\n", url);
00127     return done();
00128   }
00129 
00130   TestProxy(MIOBuffer * abuf)
00131 :  Continuation(new_ProxyMutex()), vc(0), remote(0), inbuf(abuf), outbuf(0), host(0), url(0), url_end(0) {
00132     SET_HANDLER(startEvent);
00133   }
00134 };
00135 
00136 
00137 struct TestAccept:Continuation
00138 {
00139   int startEvent(int event, NetVConnection * e)
00140   {
00141     if (!event) {
00142       MIOBuffer *buf = new_MIOBuffer();
00143         e->do_io(VIO::READ, new TestProxy(buf), INT64_MAX, buf);
00144     } else
00145     {
00146       printf("TestAccept error %d\n", event);
00147       return EVENT_DONE;
00148     }
00149     return EVENT_CONT;
00150   }
00151 TestAccept():Continuation(new_ProxyMutex()) {
00152     SET_HANDLER(startEvent);
00153   }
00154 };
00155 
00156 void
00157 test()
00158 {
00159   netProcessor.accept(new TestAccept, accept_port_number);
00160 }

Generated by  doxygen 1.7.1