package http_parser.lolevel; // name : 200 trailing space on chunked body // raw : “HTTP/1.1 200 OKrnContent-Type: text/plainrnTransfer-Encoding: chunkedrnrn25 rnThis is the data in the first chunkrnrn1Crnand this is the second onernrn0 rnrn” // type : HTTP_RESPONSE // method: HTTP_DELETE // status code :200 // request_path: // request_url : // fragment : // query_string: // body :“This is the data in the first chunkrnand this is the second onern” // body_size :65 // header_0 :{ “Content-Type”: “text/plain”} // header_1 :{ “Transfer-Encoding”: “chunked”} // should_keep_alive :1 // upgrade :0 // http_major :1 // http_minor :1
import java.io.FileReader; import java.io.BufferedReader; import java.io.StringReader; import java.io.Reader; import java.io.Reader; import java.io.IOException;
import java.util.*; import java.util.regex.*;
import java.nio.ByteBuffer;
import http_parser.HTTPMethod; import http_parser.ParserType;
public class TestLoaderNG {
String fn;
public TestLoaderNG(String filename) {
this.fn = filename;
}
static void p(Object o) {
System.out.println(o);
}
public static List<Message> load (String fn) {
List<Message> list = null;
try {
BufferedReader buf = new BufferedReader(new FileReader(fn));
list = load(buf);
} catch (Throwable t) {
throw new RuntimeException(t);
}
return list;
}
public static Message parse (String message) {
List<Message> list = load(new BufferedReader(new StringReader(message)));
if (null == list || 0 == list.size() ) {
return null;
}
return list.get(0);
}
public static List<Message> load (BufferedReader buf) {
List<Message> list = new LinkedList<Message>();
String line = null;
Message curr = new Message();
Pattern pattern = Pattern.compile("(\\S+)\\s*:(.*)");
try {
while (null != (line = buf.readLine()) ){
if ("".equals(line.trim())) {
list.add (curr);
curr = new Message();
continue;
}
Matcher m = pattern.matcher(line);
if (m.matches()) {
// you can not be fucking serious!?
// this has got to be the most retarded regex
// interface in the history of the world ...
// (though I'm sure there's worse c++ regexp libs...)
MatchResult r = m.toMatchResult();
String key = r.group(1).trim();
String value = r.group(2).trim();
if ("name".equals(key)) {curr.name = value;}
else if ("raw".equals(key)) {curr.raw = toByteArray(value);} //!
else if ("type".equals(key)) {curr.type = ParserType.parse(value);}
else if ("method".equals(key)) {curr.method = HTTPMethod.parse(value);}
else if ("status_code".equals(key)) {curr.status_code = Integer.parseInt(value);}
else if ("request_path".equals(key)) {curr.request_path = value;}
else if ("request_url".equals(key)) {curr.request_url = value;}
else if ("fragment".equals(key)) {curr.fragment = value;}
else if ("query_string".equals(key)) {curr.query_string = value;}
else if ("body".equals(key)) {curr.body = toByteArray(value);} //!
else if ("body_size".equals(key)) {curr.body_size = Integer.parseInt(value);}
else if (key.startsWith("header")) {
String [] h = getHeader(value);
curr.header.put(h[0], h[1]);
}
else if ("should_keep_alive".equals(key))
{curr.should_keep_alive = (1 == Integer.parseInt(value));}
else if ("upgrade".equals(key)) { curr.upgrade = toByteArray(value);}
else if ("http_major".equals(key)) {curr.http_major = Integer.parseInt(value);}
else if ("http_minor".equals(key)) {curr.http_minor = Integer.parseInt(value);}
} else {
p("WTF?"+line);
}
}
} catch (Throwable t) {
throw new RuntimeException(t);
}
return list;
}
static String [] getHeader(String value) {
// { "Host": "0.0.0.0=5000"}
Pattern p = Pattern.compile("\\{ ?\"([^\"]*)\": ?\"(.*)\"}");
Matcher m = p.matcher(value);
if (!m.matches()) {
p(value);
throw new RuntimeException("something wrong");
}
String [] result = new String[2];
MatchResult r = m.toMatchResult();
result[0] = r.group(1).trim();
result[1] = r.group(2); //.trim();
return result;
}
static final byte BSLASH = 0x5c;
static final byte QUOT = 0x22;
static final byte CR = 0x0d;
static final byte LF = 0x0a;
static final byte n = 0x6e;
static final byte r = 0x72;
static final Byte[] JAVA_GENERICS_ROCK_HARD = new Byte[0];
static byte [] toByteArray (String quotedString) {
ArrayList<Byte> bytes = new ArrayList<Byte>();
String s = quotedString.substring(1, quotedString.length()-1);
byte [] byts = s.getBytes(java.nio.charset.Charset.forName("UTF8"));
boolean escaped = false;
for (byte b : byts) {
switch (b) {
case BSLASH:
escaped = true;
break;
case n:
if (escaped) {
bytes.add(LF);
escaped = false;
} else {
bytes.add(b);
}
break;
case r:
if (escaped) {
escaped = false;
bytes.add(CR);
} else {
bytes.add(b);
}
break;
case QUOT:
escaped = false;
bytes.add(QUOT);
break;
default:
bytes.add(b);
}
}
byts = new byte[bytes.size()];
int i = 0;
for (Byte b : bytes) {
byts[i++]=b;
}
return byts;
}
public static void main(String [] args) throws Throwable {
//TestLoaderNG l = new TestLoaderNG(args[0]);
List<Message> ts = load(args[0]);
for (Message t : ts) {
// for (int i =0; i!= t.raw.length; ++i) { // p(i+“:”+t.raw); // } // try {
t.execute_permutations();
// } catch (Throwable th) { // p(“failed: ”+t.name); // }
t.execute();
// System.exit(0);
}
}
class Header {
String field;
String value;
}
enum LastHeader {
NONE
,FIELD
,VALUE
}
}