package http.longvers; import static http.longvers.HttpLong.Http.Http.C; import static http.longvers.HttpLong.Http.Http.ACCEPTR; import static http.longvers.HttpLong.Http.Http.BODY; import static http.longvers.HttpLong.Http.Http.CONTENTL; import static http.longvers.HttpLong.Http.Http.CONTENTT; import static http.longvers.HttpLong.Http.Http.DATE; import static http.longvers.HttpLong.Http.Http.ETAG; import static http.longvers.HttpLong.Http.Http.HTTPV; import static http.longvers.HttpLong.Http.Http.LASTM; import static http.longvers.HttpLong.Http.Http.S; import static http.longvers.HttpLong.Http.Http.SERVER; import static http.longvers.HttpLong.Http.Http.STRICTTS; import static http.longvers.HttpLong.Http.Http.VARY; import static http.longvers.HttpLong.Http.Http.VIA; import static http.longvers.HttpLong.Http.Http._200; import static http.longvers.HttpLong.Http.Http._404; import org.scribble.net.Buf; import org.scribble.net.session.MPSTEndpoint; import org.scribble.net.session.SocketChannelEndpoint; import org.scribble.util.Caller; import http.longvers.HttpLong.Http.Http; import http.longvers.HttpLong.Http.channels.C.Http_C_1; import http.longvers.HttpLong.Http.channels.C.Http_C_3; import http.longvers.HttpLong.Http.channels.C.Http_C_4_Cases; import http.longvers.HttpLong.Http.channels.C.Http_C_5; import http.longvers.HttpLong.Http.channels.C.Http_C_5_Cases; import http.longvers.HttpLong.Http.channels.C.ioifaces.Branch_C_S_200__S_404.Branch_C_S_200__S_404_Enum; import http.longvers.HttpLong.Http.roles.C; import http.longvers.message.Body; import http.longvers.message.HttpLongMessageFormatter; import http.longvers.message.client.Host; import http.longvers.message.client.RequestLine; import http.longvers.message.server.ContentLength; import http.longvers.message.server.ContentType; import http.longvers.message.server.HttpVersion; import http.longvers.message.server.Server; public class HttpLongC { public HttpLongC() throws Exception { run(); } public static void main(String[] args) throws Exception { new HttpLongC(); } public void run() 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); doResponse( doRequest(new Http_C_1(client), host) ); } } private Http_C_3 doRequest(Http_C_1 s1, String host) throws Exception { return s1.send(S, new RequestLine("/~rhu/", "1.1")) .send(S, new Host(host)) .send(S, new Body("")); } private void doResponse(Http_C_3 s3) throws Exception { Http_C_4_Cases s4cases = s3.async(S, HTTPV).branch(S); switch (s4cases.op) { case _200: doResponseAux(s4cases.receive(_200)); break; case _404: doResponseAux(s4cases.receive(_404)); break; default: throw new RuntimeException("[TODO]: " + s4cases.op); } } private void doResponseAux(Http_C_5 s5) throws Exception { Http_C_5_Cases cases = s5.branch(S); switch (cases.op) { case ACCEPTR: doResponseAux(cases.receive(ACCEPTR)); break; case CONTENTL: doResponseAux(cases.receive(CONTENTL)); break; case CONTENTT: doResponseAux(cases.receive(CONTENTT)); break; case DATE: doResponseAux(cases.receive(DATE)); break; case ETAG: doResponseAux(cases.receive(ETAG)); break; case LASTM: doResponseAux(cases.receive(LASTM)); break; case SERVER: doResponseAux(cases.receive(SERVER)); break; case STRICTTS: doResponseAux(cases.receive(STRICTTS)); break; case VARY: doResponseAux(cases.receive(VARY)); break; case VIA: doResponseAux(cases.receive(VIA)); break; case BODY: { Buf<Body> buf_body = new Buf<>(); cases.receive(BODY, buf_body); System.out.println(buf_body.val.getBody()); return; } default: throw new RuntimeException("[TODO]: " + cases.op); } } public void run1() throws Exception { Buf<HttpVersion> b_vers = new Buf<>(); Buf<ContentLength> b_clen = new Buf<>(); Buf<ContentType> b_ctype = new Buf<>(); Buf<Body> b_body = new Buf<>(); Buf<Server> b_serv = new Buf<>(); Http http = new Http(); try (MPSTEndpoint<Http, C> se = new MPSTEndpoint<>(http, Http.C, new HttpLongMessageFormatter())) { String host = "www.doc.ic.ac.uk"; int port = 80; //String host = "localhost"; int port = 8080; se.connect(S, SocketChannelEndpoint::new, host, port); Http_C_1 s1 = new Http_C_1(se); Http_C_4_Cases s4cases = s1.send(S, new RequestLine("/~rhu/", "1.1")) .send(S, new Host(host)) .send(S, new Body("")) .receive(S, HTTPV, b_vers) .branch(S); Http_C_5 s5 = // S?{ 200: ..., 404: ..., ... } (s4cases.op == Branch_C_S_200__S_404_Enum._200) ? s4cases.receive(_200) : (s4cases.op == Branch_C_S_200__S_404_Enum._404) ? s4cases.receive(_404) : new Caller().call(() -> { throw new RuntimeException("Unknown status code: " + s4cases.op); }); Y: while (true) { Http_C_5_Cases cases = s5.branch(S); switch (cases.op) { case ACCEPTR: { s5 = cases.receive(ACCEPTR); break; } case BODY: { cases.receive(BODY, b_body); System.out.println(b_body.val.getBody()); break Y; } case CONTENTL: { s5 = cases.receive(CONTENTL, b_clen); break; } case CONTENTT: { s5 = cases.receive(CONTENTT, b_ctype); break; } case DATE: { s5 = cases.receive(DATE); break; } case ETAG: { s5 = cases.receive(ETAG); break; } case LASTM: { s5 = cases.receive(LASTM); break; } case SERVER: { s5 = cases.receive(SERVER, b_serv); break; } case STRICTTS: { s5 = cases.receive(STRICTTS); break; } case VARY: { s5 = cases.receive(VARY); break; } case VIA: { s5 = cases.receive(VIA); break; } } } } } }