/**
*
*/
package com.trendrr.oss.networking.strest;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Dustin Norlander
* @created Mar 11, 2011
*
* @deprecated use com.trendrr.oss.strest
*/
@Deprecated
public class StrestRequest {
protected static Log log = LogFactory.getLog(StrestRequest.class);
StrestHeaders headers = new StrestHeaders();
private String uri = "/";
private byte[] content = new byte[0];
private String method = "GET";
private String userAgent = JSTREST_USERAGENT;
public static final String STREST_VERSION = "STREST/0.1";
public static final String JSTREST_USERAGENT = "JStrest 1.0";
public StrestRequest() {
}
/**
* gets the bytes prepared and ready for sending to the server.
*
* buffer is flipped
*
* @return
* @throws UnsupportedEncodingException
*/
public ByteBuffer getBytesAsBuffer() throws UnsupportedEncodingException {
this.finish();
byte[] header = this.encodeHeaders();
ByteBuffer buf = ByteBuffer.allocate(header.length + this.content.length);
buf.put(header);
buf.put(content);
buf.flip();
return buf;
}
protected void finish() {
//makes sure everything is set that needs to be.
if (this.content == null) {
this.content = new byte[0]; //make sure content exists.
}
this.setHeaderIfAbsent(StrestHeaders.Names.CONTENT_LENGTH, this.content.length);
this.setHeaderIfAbsent(StrestHeaders.Names.STREST_TXN_ACCEPT, StrestHeaders.Values.SINGLE);
if (this.getHeader(StrestHeaders.Names.STREST_TXN_ID) == null) {
this.setHeader(StrestHeaders.Names.STREST_TXN_ID, StrestUtil.generateTxnId());
}
}
/**
* creates a header string suitable to be sent to the server.
* @return
* @throws UnsupportedEncodingException
*/
private byte[] encodeHeaders() throws UnsupportedEncodingException {
StringBuilder buf = new StringBuilder();
this.encodeInitialLine(buf);
for (Map.Entry<String, String> h: this.getHeaders().getHeaders()) {
encodeHeader(buf, h.getKey(), h.getValue());
}
buf.append(StrestUtil.CRLF);
return buf.toString().getBytes("ASCII");
}
protected void encodeInitialLine(StringBuilder b) {
b.append(this.getMethod());
b.append(" ");
b.append(this.getUri());
b.append(" ");
b.append(StrestRequest.STREST_VERSION);
b.append(StrestUtil.CRLF);
}
protected void encodeHeader(StringBuilder b, String header, String value) {
b.append(header);
b.append(": ");
b.append(value);
b.append(StrestUtil.CRLF);
}
/**
* set the content.
* @param contentType
* @param bytes
*/
public void setContent(String contentType, byte[] bytes) {
this.content = bytes;
this.setHeader(StrestHeaders.Names.CONTENT_TYPE, contentType);
this.setHeader(StrestHeaders.Names.CONTENT_LENGTH, bytes.length);
}
public byte[] getContent() {
return this.content;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getMethod() {
return method;
}
/**
* sets the method:
*
* GET
* POST
* PUT
*
* etc.
*
* @param method
*/
public void setMethod(String method) {
this.method = method.toUpperCase().trim();
}
public StrestHeaders getHeaders() {
return this.headers;
}
public void setHeader(String name, Object value) {
this.headers.setHeader(name, value);
}
public void setHeaderIfAbsent(String name, Object value) {
if (this.getHeader(name) == null) {
this.setHeader(name, value);
}
}
public String getHeader(String name) {
return this.headers.getHeader(name);
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
try {
buf.append(new String(this.encodeHeaders(), "utf8"));
} catch (Exception x) {
log.warn("Caught", x);
}
return buf.toString();
}
}