package betty16.lec1.httplong; import static betty16.lec1.httplong.HttpLong.Http.Http.ACCEPTR; import static betty16.lec1.httplong.HttpLong.Http.Http.BODY; import static betty16.lec1.httplong.HttpLong.Http.Http.C; import static betty16.lec1.httplong.HttpLong.Http.Http.CONTENTL; import static betty16.lec1.httplong.HttpLong.Http.Http.CONTENTT; import static betty16.lec1.httplong.HttpLong.Http.Http.DATE; import static betty16.lec1.httplong.HttpLong.Http.Http.ETAG; import static betty16.lec1.httplong.HttpLong.Http.Http.HTTPV; import static betty16.lec1.httplong.HttpLong.Http.Http.LASTM; import static betty16.lec1.httplong.HttpLong.Http.Http.S; import static betty16.lec1.httplong.HttpLong.Http.Http.SERVER; import static betty16.lec1.httplong.HttpLong.Http.Http.STRICTTS; import static betty16.lec1.httplong.HttpLong.Http.Http.VARY; import static betty16.lec1.httplong.HttpLong.Http.Http.VIA; import static betty16.lec1.httplong.HttpLong.Http.Http._200; import static betty16.lec1.httplong.HttpLong.Http.Http._404; import org.scribble.net.Buf; import org.scribble.net.session.MPSTEndpoint; import org.scribble.net.session.SocketChannelEndpoint; import betty16.lec1.httplong.HttpLong.Http.Http; import betty16.lec1.httplong.HttpLong.Http.channels.C.EndSocket; import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_1; import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_3; import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_4_Cases; import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_5; import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_5_Cases; import betty16.lec1.httplong.HttpLong.Http.roles.C; import betty16.lec1.httplong.message.Body; import betty16.lec1.httplong.message.HttpLongMessageFormatter; import betty16.lec1.httplong.message.client.Host; import betty16.lec1.httplong.message.client.RequestLine; public class HttpLongC { public static void main(String[] args) throws Exception { Http http = new Http(); try (MPSTEndpoint<Http, C> client = new MPSTEndpoint<>(http, C, new HttpLongMessageFormatter())) { String host = "www.doc.ic.ac.uk"; int port = 80; //String host = "localhost"; int port = 8080; client.connect(S, SocketChannelEndpoint::new, host, port); new HttpLongC().run(new Http_C_1(client), host); } } public void run(Http_C_1 c, String host) throws Exception { doResponse(doRequest(c, host)); } private Http_C_3 doRequest(Http_C_1 c1, String host) throws Exception { return c1.send(S, new RequestLine("/~rhu/", "1.1")) .send(S, new Host(host)) .send(S, new Body("")); } private void doResponse(Http_C_3 c3) throws Exception { Http_C_4_Cases cases = c3.async(S, HTTPV).branch(S); switch (cases.op) { case _200: doResponseAux(cases.receive(_200)); break; case _404: doResponseAux(cases.receive(_404)); break; default: throw new RuntimeException("[TODO]: " + cases.op); } } private EndSocket doResponseAux(Http_C_5 c5) throws Exception { Http_C_5_Cases cases = c5.branch(S); switch (cases.op) { case ACCEPTR: return doResponseAux(cases.receive(ACCEPTR)); case CONTENTL: return doResponseAux(cases.receive(CONTENTL)); case CONTENTT: return doResponseAux(cases.receive(CONTENTT)); case DATE: return doResponseAux(cases.receive(DATE)); case ETAG: return doResponseAux(cases.receive(ETAG)); case LASTM: return doResponseAux(cases.receive(LASTM)); case SERVER: return doResponseAux(cases.receive(SERVER)); case STRICTTS: return doResponseAux(cases.receive(STRICTTS)); case VARY: return doResponseAux(cases.receive(VARY)); case VIA: return doResponseAux(cases.receive(VIA)); case BODY: { Buf<Body> buf_body = new Buf<>(); EndSocket end = cases.receive(BODY, buf_body); System.out.println(buf_body.val.getBody()); return end; } default: throw new RuntimeException("[TODO]: " + cases.op); } } }