5749369 [rkeene@sledge /home/rkeene/projects/d/micro_proxy]$ cat -n HTTPRequest.d
   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: };
5749370 [rkeene@sledge /home/rkeene/projects/d/micro_proxy]$

Click here to go back to the directory listing.
Click here to download this file.
last modified: 2005-08-28 17:32:55