import synthesijer.lib.upl.UPLInputPort; import synthesijer.lib.upl.UPLOutputPort; public class SimpleHttpServer { UPLInputPort inport = new UPLInputPort(); UPLOutputPort outport = new UPLOutputPort(); private int[] data = new int[1024]; private int pack(char a, char b, char c, char d){ return (((int)a&0xFF) << 24) + (((int)b&0xFF) << 16) + (((int)c&0xFF) << 8) + ((int)d&0xFF); } private final HttpResponseHeader resp = new HttpResponseHeader(); private int content_words = 8; private int content_length_field = 0x33322020; // "32 " private void init(){ data[0] = pack('<', 'h', 't', 'm'); data[1] = pack('l', '>', '<', 'b'); data[2] = pack('o', 'd', 'y', '>'); data[3] = pack('T', 'e', 's', 't'); data[4] = pack('<', '/', 'b', 'o'); data[5] = pack('d', 'y', '>', '<'); data[6] = pack('/', 'h', 't', 'm'); data[7] = pack('l', '>', '\n', '\n'); content_words = 8; content_length_field = 0x33322020; // "32 " } private void run(){ outport.kick = false; while(inport.ready == false){;} int ip_src = inport.data[0]; int ip_dest = inport.data[1]; int port_src_dest = inport.data[2]; int length = inport.data[3] & 0x0000FFFF; if(length == 0){ inport.done = true; inport.done = false; return; // should be fin, nothing to do. } // header for(int i = 0; i < resp.length; i++){ int v = resp.data[i]; outport.data[i+4] = v; } outport.data[8+4] = content_length_field; // data int offset = resp.length; for(int i = 0; i < content_words; i++){ int v = data[i]; outport.data[i+4+offset] = v; } outport.data[0] = ip_src; outport.data[1] = ip_dest; outport.data[2] = port_src_dest; outport.data[3] = (resp.length + content_words) << 2; outport.send_length = 4 + resp.length + content_words; inport.done = true; inport.done = false; outport.kick = true; outport.kick = false; } public void main(){ init(); while(true){ run(); } } }