com.sixt.service.framework.jetty.RpcReadException.java Source code

Java tutorial

Introduction

Here is the source code for com.sixt.service.framework.jetty.RpcReadException.java

Source

/**
 * Copyright 2016-2017 Sixt GmbH & Co. Autovermietung KG
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain a
 * copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package com.sixt.service.framework.jetty;

import com.google.gson.JsonObject;
import org.apache.commons.io.IOUtils;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.util.Base64;
import java.util.Enumeration;

public class RpcReadException extends Exception {
    private ServletInputStream in;
    private byte[] incomplete;

    public RpcReadException(byte[] incomplete, ServletInputStream in, String message) {
        super(message);
        this.in = in;
        this.incomplete = incomplete;
    }

    public String toJson(HttpServletRequest req) {
        JsonObject obj = new JsonObject();

        Enumeration<String> h = req.getHeaderNames();
        while (h.hasMoreElements()) {
            String hKey = h.nextElement();
            String hValue = req.getHeader(hKey);
            obj.addProperty("request_header_" + hKey, hValue);
        }

        obj.addProperty("exception_message", this.getMessage());
        obj.addProperty("request_query_string", req.getQueryString());
        obj.addProperty("request_url", req.getRequestURL().toString());
        obj.addProperty("request_remote_addr", req.getRemoteAddr());
        obj.addProperty("request_remote_port", req.getRemotePort());
        obj.addProperty("request_remote_host", req.getRemoteHost());
        obj.addProperty("request_remote_user", req.getRemoteUser());

        String readBody = "success";
        // read the whole remaining body and put the joined base64 encoded message into the json object
        try {
            byte[] ba = IOUtils.toByteArray(this.in);
            byte[] combined;
            if ((ba != null) && (this.incomplete != null)) {
                combined = new byte[ba.length + this.incomplete.length];
                System.arraycopy(incomplete, 0, combined, 0, this.incomplete.length);
                System.arraycopy(ba, 0, combined, this.incomplete.length, ba.length);
                obj.addProperty("request_body", Base64.getEncoder().encodeToString(combined));
            } else if (ba != null) {
                combined = ba;
            } else if (this.incomplete != null) {
                combined = this.incomplete;
            } else {
                readBody = "body is empty";
            }
        } catch (Exception ex) {
            readBody = String.format("failed because: %s", ex.getCause());
        }
        obj.addProperty("read_body", readBody);

        return obj.toString();
    }
}