1implement Transport; 2 3include "sys.m"; 4 sys: Sys; 5 6include "draw.m"; 7 8include "string.m"; 9 S: String; 10 11include "bufio.m"; 12 B : Bufio; 13 Iobuf: import Bufio; 14 15include "message.m"; 16 M: Message; 17 Msg, Nameval: import M; 18 19include "url.m"; 20 U: Url; 21 ParsedUrl: import U; 22 23include "dial.m"; 24 25include "webget.m"; 26 27include "wgutils.m"; 28 W: WebgetUtils; 29 Fid, Req: import WebgetUtils; 30 31include "transport.m"; 32 33init(w: WebgetUtils) 34{ 35 sys = load Sys Sys->PATH; 36 W = w; 37 M = W->M; 38 S = W->S; 39 B = W->B; 40 U = W->U; 41} 42 43connect(c: ref Fid, r: ref Req, donec: chan of ref Fid) 44{ 45 u := r.url; 46 mrep: ref Msg = nil; 47 if(!(u.host == "" || u.host == "localhost")) 48 mrep = W->usererr(r, "no remote file system to " + u.host); 49 else { 50 f := u.pstart + u.path; 51 io := B->open(f, sys->OREAD); 52 if(io == nil) 53 mrep = W->usererr(r, sys->sprint("can't open %s: %r\n", f)); 54 else { 55 mrep = Msg.newmsg(); 56 e := W->getdata(io, mrep, W->fixaccept(r.types), u); 57 B->io.close(); 58 if(e != "") 59 mrep = W->usererr(r, e); 60 else 61 W->okprefix(r, mrep); 62 } 63 } 64 if(mrep != nil) { 65 W->log(c, "file: reply ready for " + r.reqid + ": " + mrep.prefixline); 66 r.reply = mrep; 67 donec <-= c; 68 } 69} 70