1 package com.quadcap.http.util; 2 3 40 41 import java.io.IOException ; 42 import java.io.InputStream ; 43 44 import java.util.HashMap ; 45 import java.util.Map ; 46 47 import com.quadcap.util.text.OctetMap; 48 import com.quadcap.util.text.Scanner; 49 50 import com.quadcap.util.Debug; 51 52 57 public class HeaderParser { 58 59 66 public static String getToken(Scanner scanner, OctetMap map) 67 throws IOException 68 { 69 scanner.skipWhile(OctetMap.wsChars); 70 return scanner.parseWhile(map); 71 } 72 73 78 public static void parseHeaders(Scanner scanner, Map headers) 79 throws IOException 80 { 81 82 boolean done = false; 83 String name = null, val = null; 84 while (!done) { 85 int c = scanner.peek(); 86 if (c == -1) break; 87 if (OctetMap.wsChars.has(c)) { 88 if (val != null) { 89 val = val + " " + getToken(scanner, 90 OctetMap.fieldValueChars); 91 } else { 92 throw new IOException ("Unexpected ws in headers"); 93 } 94 } else { 95 if (val != null) { 96 headers.put(name, val); 97 val = null; 98 } 99 100 if (c == '\r') { 101 done = true; 102 } else if (c == '\n') { 103 scanner.matchChar('\n'); 104 break; 105 } else { 106 name = getToken(scanner, 107 OctetMap.tokenChars).toLowerCase(); 108 scanner.matchChar(':'); 109 val = getToken(scanner, OctetMap.fieldValueChars); 110 } 111 } 112 parseCRLF(scanner); 113 } 114 if (val != null) { 115 headers.put(name, val); 116 } 117 } 118 119 125 public static void parseCRLF(Scanner scanner) throws IOException { 126 scanner.skipWhile(OctetMap.wsChars); 127 if (scanner.peek() == '\n') { 128 scanner.matchChar('\n'); 129 } else { 130 while (scanner.peek() == '\r') scanner.matchChar('\r'); 131 scanner.matchChar('\n'); 132 } 133 } 134 135 139 public static Map parseHeaders(InputStream is) throws IOException { 140 Map map = new HashMap (); 141 Scanner scanner = new Scanner(is, false); 142 parseHeaders(scanner, map); 143 return map; 144 } 145 146 } 147 | Popular Tags |