package io.craft.atom.protocol.http.model; import static io.craft.atom.protocol.http.HttpConstants.S_CR; import static io.craft.atom.protocol.http.HttpConstants.S_EQUAL_SIGN; import static io.craft.atom.protocol.http.HttpConstants.S_LF; import static io.craft.atom.protocol.http.HttpConstants.S_SEMICOLON; import java.io.Serializable; import java.nio.charset.Charset; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** * Represent a http chunk data structure. * * @author mindwind * @version 1.0, Feb 8, 2013 */ @ToString(of = { "size", "extension", "data" }) public class HttpChunk implements Serializable { private static final long serialVersionUID = 8782130672644634878L; @Getter @Setter private int size ; @Getter @Setter private Map<String, String> extension = new LinkedHashMap<String, String>(); @Getter @Setter private byte[] data ; // ~ -------------------------------------------------------------------------------------------------------- public HttpChunk() { super(); } public HttpChunk(int size) { this.size = size; } public HttpChunk(int size, byte[] data) { this(size); this.data = data; } public HttpChunk(int size, String data, Charset charset) { this(size); this.data = data.getBytes(charset); } public HttpChunk(int size, byte[] data, Map<String, String> extension) { this(size, data); this.extension = extension; } public HttpChunk(int size, String data, Charset charset, Map<String, String> extension) { this(size, data, charset); this.extension = extension; } // ~ -------------------------------------------------------------------------------------------------------- public String getDataString(Charset charset) { return new String(data, charset); } public void addExtension(String name, String value) { this.extension.put(name, value); } public String toHttpString(Charset charset) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toHexString(size)); Set<Entry<String, String>> extSet = extension.entrySet(); for (Entry<String, String> entry : extSet) { sb.append(S_SEMICOLON); String extName = entry.getKey(); String extValue = entry.getValue(); sb.append(extName); if (extValue != null) { sb.append(S_EQUAL_SIGN).append(extValue); } } sb.append(S_CR).append(S_LF); if (data != null) { sb.append(new String(data, charset)).append(S_CR).append(S_LF); } return sb.toString(); } }