Skip to content

Commit

Permalink
WFLY-2681 Send correct content type from management REST API
Browse files Browse the repository at this point in the history
Also fix some Undertow usage to be more correct/efficent
  • Loading branch information
stuartwdouglas committed Dec 23, 2013
1 parent f4498b4 commit e0b1ca9
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ private static void sendError(HttpServerExchange exchange, boolean encode, Model
response.writeBase64(bout);
byte[] bytes = bout.toByteArray();

exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, APPLICATION_DMR_ENCODED+ ";" + UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, APPLICATION_DMR_ENCODED+ "; charset=" + UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_LENGTH, String.valueOf(bytes.length));
exchange.setResponseCode(errorCode);

Expand All @@ -103,7 +103,7 @@ private static void sendError(HttpServerExchange exchange, boolean encode, Model

String msgString = stringWriter.toString();
byte[] bytes = msgString.getBytes();
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, TEXT_PLAIN + ";" + UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, TEXT_PLAIN + "; charset=" + UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_LENGTH, String.valueOf(bytes.length));
exchange.setResponseCode(errorCode);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,16 +103,16 @@ public void handleRequest(HttpServerExchange exchange) throws Exception {
}

static void writeResponse(HttpServerExchange exchange, ModelNode response, String contentType) {
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, contentType + ";" + Common.UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, contentType + "; charset=" + Common.UTF_8);
exchange.setResponseCode(200);

//TODO Content-Length?
exchange.startBlocking();

PrintWriter print = new PrintWriter(new ChannelOutputStream(exchange.getResponseChannel()));
PrintWriter print = new PrintWriter(exchange.getOutputStream());
try {
response.writeJSONString(print, true);
} finally {
print.flush();
IoUtils.safeClose(print);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.ByteBuffer;

import io.undertow.server.HttpServerExchange;
import io.undertow.util.HeaderMap;
Expand All @@ -52,59 +53,35 @@ public static void writeResponse(final HttpServerExchange exchange, final int st

final HeaderMap responseHeaders = exchange.getResponseHeaders();
final String contentType = operationParameter.isEncode() ? Common.APPLICATION_DMR_ENCODED : Common.APPLICATION_JSON;
responseHeaders.put(Headers.CONTENT_TYPE, contentType + ";" + Common.UTF_8);
responseHeaders.put(Headers.CONTENT_TYPE, contentType + "; charset=" + Common.UTF_8);

writeCacheHeaders(exchange, status, operationParameter);

if (operationParameter.isGet() && status == 200) {
// For GET request the response is purley the model nodes result. The outcome
// is not send as part of the response but expressed with the HTTP status code.
response = response.get(RESULT);
try {
int length = getResponseLength(response, operationParameter);
responseHeaders.put(Headers.CONTENT_LENGTH, length);
} catch (IOException e) {
ROOT_LOGGER.errorf(e, "Unable to get length for '%s'", operationParameter);
}
}

OutputStream out = new ChannelOutputStream(exchange.getResponseChannel());
PrintWriter print = new PrintWriter(out);
try {
try {
if (operationParameter.isEncode()) {
response.writeBase64(out);
} else {
response.writeJSONString(print, !operationParameter.isPretty());
}
} finally {
print.flush();
try {
out.flush();
} finally {
IoUtils.safeClose(print);
IoUtils.safeClose(out);
}
}
byte[] data = getResponseBytes(response, operationParameter);
responseHeaders.put(Headers.CONTENT_LENGTH, data.length);
exchange.getResponseSender().send(ByteBuffer.wrap(data));
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private static int getResponseLength(final ModelNode modelNode, final OperationParameter operationParameter) throws IOException {
int length;
private static byte[] getResponseBytes(final ModelNode modelNode, final OperationParameter operationParameter) throws IOException {
if (operationParameter.isEncode()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedOutputStream out = new BufferedOutputStream(baos);
modelNode.writeBase64(out);
out.flush();
length = baos.size();
IoUtils.safeClose(out, baos);
return baos.toByteArray();
} else {
String json = modelNode.toJSONString(!operationParameter.isPretty());
length = json.length();
return json.getBytes(Common.UTF_8);
}
return length;
}

public static void writeCacheHeaders(final HttpServerExchange exchange, final int status, final OperationParameter operationParameter) {
Expand Down

0 comments on commit e0b1ca9

Please sign in to comment.