1: import std.stream; 2: import std.string; 3: import std.uri; 4: 5: class HTTPRequest { 6: this() { 7: debug { 8: stderr.writeLine("HTTPRequest initialized."); 9: } 10: } 11: 12: this(InputStream instream) { 13: debug { 14: stderr.writeLine("HTTPRequest initialized."); 15: } 16: 17: if (GetRequest(instream) < 0) { 18: /* XXX: Throw some kind of exception here. */ 19: } 20: } 21: 22: ~this() { 23: debug { 24: stderr.writeLine("HTTPRequest deinitialized."); 25: } 26: } 27: 28: int GetRequest(InputStream instream) { 29: char[][] words; 30: char[] input, cmd, uri, proto; 31: char[] header, value; 32: char[] header_host; 33: int headeridx = 0; 34: bool firstline = true; 35: int subidx; 36: 37: headers.length = headeridx; 38: 39: if (GotRequest) { 40: return(0); 41: } 42: 43: GotRequest = true; 44: 45: while (1) { 46: input = instream.readLine(); 47: words = split(input); 48: if (words.length == 0) { 49: break; 50: } 51: 52: if (firstline) { 53: if (words.length < 2) { 54: return(-1); 55: } 56: cmd = toupper(words[0]); 57: uri = words[1]; 58: if (words.length > 2) { 59: proto = toupper(words[2]); 60: } 61: } else { 62: subidx = find(input, ':'); 63: if (subidx == -1) { 64: return(-1); 65: } 66: header = input; 67: value = input[subidx + 2 .. input.length]; 68: header.length = subidx; 69: if (toupper(header) == "HOST") { 70: debug { 71: stderr.printf("host = %.*s\n", value); 72: } 73: header_host = value; 74: } 75: 76: if (headeridx >= headers.length) { 77: debug { 78: stderr.printf("Enlarging length from %i to %i\n", headers.length, (headers.length * 2) + 1); 79: } 80: headers.length = (headers.length * 2) + 1; 81: } 82: 83: headers[headeridx][0] = header; 84: headers[headeridx][1] = value; 85: headeridx++; 86: } 87: 88: firstline = false; 89: } 90: 91: if (!cmd || !uri) { 92: return(-1); 93: } 94: 95: switch (cmd) { 96: case "GET": 97: if (uri[0] == '/' && header_host) { 98: uri = "http://" ~ header_host ~ uri; 99: } 100: break; 101: case "CONNECT": 102: break; 103: default: 104: break; 105: } 106: 107: debug { 108: stderr.printf("url=%.*s, cmd=%.*s, proto=%.*s\n", decode(uri), cmd, proto); 109: } 110: 111: return(0); 112: } 113: 114: private char[][2][] headers; 115: private bool GotRequest = false; 116: }; |