xref: /inferno-os/appl/svc/webget/file.b (revision fbc1184c08d18d5ac0f8763a058e015e95353341)
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