Skip to content
This repository was archived by the owner on Jul 31, 2022. It is now read-only.

Add multipart/form-data class. Fixed map issue. #105

Merged
merged 4 commits into from
Oct 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions src/main/java/com/kttdevelopment/simplehttpserver/FileRecord.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.kttdevelopment.simplehttpserver;

import java.nio.charset.StandardCharsets;
import java.util.*;

/**
* This class represents on set of headers and parameters in a multipart/form-data that is expected of a file input.
*
* @see MultipartFormData
* @see Record
* @see com.kttdevelopment.simplehttpserver.Record.Header
* @since 4.0.0
* @version 4.0.0
* @author Ktt Development
*/
public class FileRecord extends Record {

private final String fileName, contentType;
private final byte[] bytes;

/**
* Creates a record from a map entry. Throws a {@link NullPointerException} if the entry doesn't have all the required fields for a {@link Record#Record(Map.Entry)}; and a filename and Content-Type field.
*
* @param entry map entry
*
* @since 4.0.0
* @author Ktt Development
*/
@SuppressWarnings("rawtypes")
FileRecord(final Map.Entry<String,Map> entry){
super(entry);

Header header = Objects.requireNonNull(getHeader("Content-Disposition"));
fileName = Objects.requireNonNull(header.getParameter("filename"));
header = Objects.requireNonNull(getHeader("Content-Type"));
contentType = Objects.requireNonNull(header.getHeaderValue());
bytes = getValue().getBytes(StandardCharsets.UTF_8);
}

/**
* Returns the file name.
*
* @return file name
*
* @since 4.0.0
* @author Ktt Development
*/
public final String getFileName(){
return fileName;
}

/**
* Returns the content type of the file.
*
* @return content type
*
* @since 4.0.0
* @author Ktt Development
*/
public final String getContentType(){
return contentType;
}

/**
* Returns the file as bytes.
*
* @return file in bytes
*
* @see #getValue()
* @since 4.0.0
* @author Ktt Development
*/
public final byte[] getBytes(){
return bytes;
}

@Override
public String toString(){
return
"FileRecord" + '{' +
"name" + '=' + '\'' + getName() + '\'' + ", " +
"fileName" + '=' + '\'' + fileName + '\'' + ", " +
"contentType" + '=' + '\'' + contentType + '\'' + ", " +
"value" + '=' + '\'' + Arrays.toString(bytes) + '\'' + ", " +
"headers" + '=' + getHeaders() +
'}';
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.kttdevelopment.simplehttpserver;

import java.util.Collections;
import java.util.Map;

/**
* This class represents a POST request map as a multipart/form-data.
*
* @see SimpleHttpExchange
* @see Record
* @see FileRecord
* @since 4.0.0
* @version 4.0.0
* @author Ktt Development
*/
public class MultipartFormData {

private final Map<String,Record> records;

/**
* Creates a multipart/form-data.
*
* @param records map of records and record keys
*
* @see Record
* @see FileRecord
* @since 4.0.0
* @author Ktt Development
*/
MultipartFormData(final Map<String,Record> records){
this.records = Collections.unmodifiableMap(records);
}

/**
* Returns the record for key or null if none is found. If the record is supposed to be a FileRecord then cast it to {@link FileRecord}.
*
* @param key record key
* @return {@link Record} or {@link FileRecord} or null if none is found.
*
* @see Record
* @see FileRecord
* @since 4.0.0
* @author Ktt Development
*/
public final Record getRecord(final String key){
return records.get(key);
}

/**
* Returns all the records in the multipart/form-data;
*
* @return map of all records
*
* @see Record
* @see FileRecord
* @since 4.0.0
* @author Ktt Development
*/
public final Map<String,Record> getRecords(){
return records;
}

@Override
public String toString(){
return
"MultipartFormData" + '{' +
"record" + '=' + records +
'}';
}

}
199 changes: 199 additions & 0 deletions src/main/java/com/kttdevelopment/simplehttpserver/Record.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
package com.kttdevelopment.simplehttpserver;

import java.util.*;

/**
* This class represents one set of headers and parameters in a multipart/form-data.
*
* @see MultipartFormData
* @see FileRecord
* @see Header
* @since 4.0.0
* @version 4.0.0
* @author Ktt Development
*/
public class Record {

private final Map<String,Header> headers;
private final String name, value;

/**
* Creates a record from a map entry. Throws a {@link NullPointerException} if the entry doesn't have a: header-name, header-value, and parameters field.
*
* @param entry map entry
*
* @since 4.0.0
* @author Ktt Development
*/
@SuppressWarnings({"rawtypes", "unchecked"})
Record(final Map.Entry<String,Map> entry){
name = Objects.requireNonNull(entry.getKey());
value = Objects.requireNonNull(entry.getValue().get("value").toString());

final Map<String,Header> headers = new HashMap<>();
Objects.requireNonNull((Map<String,Map>) entry.getValue().get("headers")).forEach((k, v) -> headers.put(
k,
new Header(
Objects.requireNonNull(v.get("header-name")).toString(),
Objects.requireNonNull(v.get("header-value")).toString(),
(Map) Objects.requireNonNull(v.get("parameters"))
)
));
this.headers = Collections.unmodifiableMap(headers);
}

/**
* Returns form input name.
*
* @return form input name
*
* @since 4.0.0
* @author Ktt Development
*/
public final String getName(){
return name;
}

/**
* Returns a specified header.
*
* @param key header key
* @return header
*
* @see Header
* @see #getHeaders()
* @since 4.0.0
* @author Ktt Development
*/
public final Header getHeader(final String key){
return headers.get(key);
}

/**
* Returns all the headers.
*
* @return headers
*
* @see Header
* @see #getHeader(String)
* @since 4.0.0
* @author Ktt Development
*/
public final Map<String,Header> getHeaders(){
return headers;
}

/**
* Returns the value as a string.
*
* @return value
*
* @since 4.0.0
* @author Ktt Development
*/
public final String getValue(){
return value;
}

@Override
public String toString(){
return
"Record" + '{' +
"name" + '=' + '\'' + name + '\'' + ", " +
"value" + '=' + '\'' + value + '\'' + ", " +
"headers" + '=' + headers +
'}';
}

/**
* Represents a header in a multipart/form-data.
*
* @since 4.0.0
* @version 4.0.0
* @author Ktt Development
*/
public static class Header {

private final String headerName, headerValue;
private final Map<String,String> headerParams;

/**
* Creates header.
*
* @param headerName header name
* @param headerValue header value
* @param headerParams header parameters
*
* @since 4.0.0
* @author Ktt Development
*/
Header(final String headerName, final String headerValue, final Map<String,String> headerParams){
this.headerName = headerName;
this.headerValue = headerValue;
this.headerParams = Collections.unmodifiableMap(headerParams);
}

/**
* Returns the header name
*
* @return header name
*
* @since 4.0.0
* @author Ktt Development
*/
public final String getHeaderName(){
return headerName;
}

/**
* Returns the header value
*
* @return header value
*
* @since 4.0.0
* @author Ktt Development
*/
public final String getHeaderValue(){
return headerValue;
}

/**
* Returns specific header parameter.
*
* @param key parameter key
* @return parameter value
*
* @see #getParameters()
* @since 4.0.0
* @author Ktt Development
*/
public final String getParameter(final String key){
return headerParams.get(key);
}

/**
* Returns all the header parameters.
*
* @return header parameters
*
* @see #getParameter(String)
* @since 4.0.0
* @author Ktt Development
*/
public final Map<String,String> getParameters(){
return headerParams;
}

@Override
public String toString(){
return
"Header" + '{' +
"headerName" + '=' + '\'' + headerName + '\'' + ", " +
"headerValue" + '=' + '\'' + headerValue + '\'' + ", " +
"headerParams" + '=' + headerParams +
'}';
}

}

}
Loading