/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.domain.http.server;
import static io.undertow.server.handlers.ResponseCodeHandler.HANDLE_404;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import io.undertow.io.IoCallback;
import io.undertow.server.HttpServerExchange;
import io.undertow.server.handlers.ResponseCodeHandler;
import io.undertow.util.Headers;
import org.jboss.dmr.ModelNode;
/**
* @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
*/
public class Common {
public static final ResponseCodeHandler MOVED_PERMANENTLY = new ResponseCodeHandler(301);
public static final ResponseCodeHandler TEMPORARY_REDIRECT = new ResponseCodeHandler(307);
public static final ResponseCodeHandler UNAUTHORIZED = new ResponseCodeHandler(403);
public static final ResponseCodeHandler NOT_FOUND = HANDLE_404;
public static final ResponseCodeHandler METHOD_NOT_ALLOWED_HANDLER = new ResponseCodeHandler(405);
public static final ResponseCodeHandler UNSUPPORTED_MEDIA_TYPE = new ResponseCodeHandler(415);
public static final ResponseCodeHandler INTERNAL_SERVER_ERROR = new ResponseCodeHandler(500);
public static final ResponseCodeHandler SERVICE_UNAVAIABLE = new ResponseCodeHandler(503);
static final String APPLICATION_DMR_ENCODED = "application/dmr-encoded";
static final String APPLICATION_JSON = "application/json";
static final String TEXT_PLAIN = "text/plain";
static final String TEXT_HTML = "text/html";
static final int ONE_WEEK = 7 * 24 * 60 * 60;
static final String UTF_8 = "utf-8";
static void sendError(HttpServerExchange exchange, boolean encode, String msg) {
int errorCode = getErrorResponseCode(msg);
sendError(exchange, encode, new ModelNode(msg == null ? "" : msg), errorCode);
}
static void sendError(HttpServerExchange exchange, boolean encode, ModelNode msg) {
int errorCode = getErrorResponseCode(msg.asString());
sendError(exchange, encode, msg, errorCode);
}
static void sendError(HttpServerExchange exchange, boolean encode, ModelNode msg, int errorCode) {
if(encode) {
try {
ModelNode response = new ModelNode();
response.set(msg);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
response.writeBase64(bout);
byte[] bytes = bout.toByteArray();
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, APPLICATION_DMR_ENCODED+ "; charset=" + UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_LENGTH, String.valueOf(bytes.length));
exchange.setStatusCode(errorCode);
exchange.getResponseSender().send(new String(bytes, StandardCharsets.UTF_8), IoCallback.END_EXCHANGE);
} catch (IOException e) {
// fallback, should not happen
sendError(exchange, false, msg);
}
}
else {
StringWriter stringWriter = new StringWriter();
final PrintWriter print = new PrintWriter(stringWriter);
try {
msg.writeJSONString(print, false);
} finally {
print.flush();
stringWriter.flush();
print.close();
}
String msgString = stringWriter.toString();
byte[] bytes = msgString.getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, APPLICATION_JSON + "; charset=" + UTF_8);
exchange.getResponseHeaders().put(Headers.CONTENT_LENGTH, String.valueOf(bytes.length));
exchange.setStatusCode(errorCode);
exchange.getResponseSender().send(msgString, IoCallback.END_EXCHANGE);
}
}
private static int getErrorResponseCode(String failureMsg) {
// WFLY-2037. This is very hacky; better would be something like an internal failure-http-code that
// is set on the response from the OperationFailedException and stripped from non-HTTP interfaces.
// But this will do for now.
int result = 500;
if (failureMsg != null && failureMsg.contains("WFLYCTL0313")) {
result = 403;
}
return result;
}
}