Skip to content

Instantly share code, notes, and snippets.

@mcroteau
Created January 10, 2022 03:38
Show Gist options
  • Save mcroteau/f7a7994136f19fbfe00bc63ea1b61724 to your computer and use it in GitHub Desktop.
Save mcroteau/f7a7994136f19fbfe00bc63ea1b61724 to your computer and use it in GitHub Desktop.
Form Upload/Submission HttpExchange Example
/**
* Thank you Mr. Walter
* https://gist.github.com/JensWalter/0f19780d131d903879a2
*/
public class ElementCompiler {
A8i a8i;
byte[] bytes;
Map<String, HttpSession> sessions;
HttpExchange httpExchange;
public ElementCompiler(A8i a8i, byte[] bytes, Map<String, HttpSession> sessions, HttpExchange httpExchange){
this.a8i = a8i;
this.bytes = bytes;//httpExchange.getRequestBody();
this.sessions = sessions;
this.httpExchange = httpExchange;
}
public HttpRequest compile(){
Headers headers = httpExchange.getRequestHeaders();
HttpRequest httpRequest = new HttpRequest(sessions, httpExchange);
String contentType = headers.getFirst("Content-Type");
String delimeter = "";
if(contentType != null) {
String[] bits = contentType.split("boundary=");
if (bits.length > 1) {
delimeter = bits[1];
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append((char) b);
}
String payload = sb.toString();
List<FormElement> data = getElements(delimeter, payload);
for (FormElement formElement : data) {
String key = formElement.getName();
httpRequest.set(key, formElement);
}
}else if(bytes.length > 0){
String query = "";
try {
query = new String(bytes, "utf-8");
query = java.net.URLDecoder.decode(query, StandardCharsets.UTF_8.name());
} catch (Exception ex){
ex.printStackTrace();
}
for (String param : query.split("&")) {
FormElement element = new FormElement();
String[] entry = param.split("=");
if (entry.length > 1) {
element.setName(entry[0]);
element.setValue(entry[1]);
}else{
element.setName(entry[0]);
element.setValue("");
}
httpRequest.data().put(entry[0], element);
}
}
}
return httpRequest;
}
protected List<FormElement> getElements(String delimeter, String payload){
List<FormElement> formData = new ArrayList<>();
Integer index = payload.indexOf("name=\"");
FormElement data = getData(index, delimeter, payload);
formData.add(data);
while (index >= 0) {
index = payload.indexOf("name=\"", index + 1);
if(index >= 0){
FormElement dataDos = getData(index, delimeter, payload);
formData.add(dataDos);
}
}
return formData;
}
protected FormElement getData(int index, String delimeter, String payload){
FormElement formElement = new FormElement();
Integer startName = payload.indexOf("\"", index + 1);
Integer endName = payload.indexOf("\"", startName + 1);
String name = payload.substring(startName + 1, endName);
formElement.setName(name);
Integer fileIdx = payload.indexOf("filename=", endName + 1);
//if we are equal to 3, then we are on the same line,
//we have a file and we can proceed.
if(fileIdx - endName == 3) {
Integer startFile = payload.indexOf("\"", fileIdx + 1);
Integer endFile = payload.indexOf("\"", startFile + 1);
String fileName = payload.substring(startFile + 1, endFile);
formElement.setFileName(fileName);
Integer startContent = payload.indexOf("Content-Type", endFile + 1);
Integer startType = payload.indexOf(":", startContent + 1);
Integer endType = payload.indexOf("\r\n", startType + 1);
String type = payload.substring(startType + 1, endType).trim();
formElement.setContentType(type);
Integer startBytes = payload.indexOf("\r\n", endType + 1);
Integer endBytes = payload.indexOf(delimeter, startBytes + 4);
String value = payload.substring(startBytes, endBytes);
Integer startValue = startBytes + 2;
Integer endValue = endBytes;
if(value.endsWith("--")){
endValue = endBytes - 2;// -- tells us we are at the end
}
endValue = endValue - 2;//finicky, need to remove the final 2 bytes
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for(int z = startValue; z < endValue; z++){
byte b = bytes[z];
baos.write(b);
}
formElement.setFileBytes(baos.toByteArray());
}else{
//a plain old value here.
Integer startValue = payload.indexOf("\r\n", endName + 1);
Integer endValue = payload.indexOf(delimeter, startValue + 1);
String value = payload.substring(startValue + 1, endValue);
if(value.endsWith("\r\n--")){
int lastbit = value.indexOf("\r\n--");
value = value.substring(0, lastbit).trim();
}
formElement.setValue(value);
}
return formElement;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment