/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.synapse.transport.nhttp.debug; import org.apache.http.HttpRequest; import org.apache.http.RequestLine; import org.apache.http.HttpException; import org.apache.http.nio.NHttpClientConnection; import org.apache.synapse.transport.nhttp.Axis2HttpRequest; import org.apache.synapse.transport.nhttp.ClientHandler; import java.io.IOException; import java.net.HttpRetryException; /** * A connection debug object would be accumulated during processing, but only made use of if the connection * encounters issues during processing. */ public class ClientConnectionDebug extends AbstractConnectionDebug { private long connectionCreationTime; private long lastRequestStartTime; private String lastRequestEPR; private String lastRequestProtocol; private String lastRequestHTTPMethod; private StringBuffer previousRequestAttempts; private long requestCompletionTime; private long responseStartTime; private long responseCompletionTime = -1; private String responseLine; private ServerConnectionDebug serverConnectionDebug; public ClientConnectionDebug(ServerConnectionDebug serverConnectionDebug) { super(); this.serverConnectionDebug = serverConnectionDebug; } public void recordRequestStartTime(NHttpClientConnection conn, Axis2HttpRequest axis2Req) { if (conn != null) { this.connectionCreationTime = (Long) conn.getContext().getAttribute( ClientHandler.CONNECTION_CREATION_TIME); try { HttpRequest request = axis2Req.getRequest(); RequestLine requestLine = request.getRequestLine(); this.lastRequestProtocol = requestLine.getProtocolVersion().toString(); this.lastRequestHTTPMethod = requestLine.getMethod(); this.headers = request.getAllHeaders(); } catch (IOException ignore) { } catch (HttpException ignore) { } } if (this.lastRequestStartTime != 0) { if (previousRequestAttempts == null) { previousRequestAttempts = new StringBuffer(); } else { previousRequestAttempts.append(fieldSeparator); } previousRequestAttempts.append("Attempt-Info").append(keyValueSeparator).append("{"); previousRequestAttempts.append("Req-Start-Time").append(keyValueSeparator) .append(format(this.lastRequestStartTime)); previousRequestAttempts.append(fieldSeparator); previousRequestAttempts.append("Req-URL").append(keyValueSeparator) .append(this.lastRequestEPR).append("}"); } this.lastRequestStartTime = System.currentTimeMillis(); this.lastRequestEPR = axis2Req.getEpr().toString(); } public void recordResponseCompletionTime() { this.responseCompletionTime = System.currentTimeMillis(); } public void recordRequestCompletionTime() { this.requestCompletionTime = System.currentTimeMillis(); } public void recordResponseStartTime(String responseLine) { this.responseStartTime = System.currentTimeMillis(); this.responseLine = responseLine; } public long getLastRequestStartTime() { return lastRequestStartTime; } public long getResponseCompletionTime() { return responseCompletionTime; } public long getResponseStartTime() { return responseStartTime; } public String dump() { StringBuffer sb = new StringBuffer(25); sb.append("E2S-Req-Start").append(keyValueSeparator).append(format(lastRequestStartTime)); sb.append(fieldSeparator); sb.append("E2S-Req-End").append(keyValueSeparator).append(format(requestCompletionTime)); sb.append(fieldSeparator); sb.append("E2S-Req-ConnCreateTime").append(keyValueSeparator) .append(format(connectionCreationTime)); sb.append(statementSeparator); sb.append("E2S-Req-URL").append(keyValueSeparator).append(lastRequestEPR); sb.append(fieldSeparator); sb.append("E2S-Req-Protocol").append(keyValueSeparator).append(lastRequestProtocol); sb.append(fieldSeparator); sb.append("E2S-Req-Method").append(keyValueSeparator).append(lastRequestHTTPMethod); sb.append(statementSeparator); if (previousRequestAttempts != null) { sb.append("E2S-Previous-Attempts").append(keyValueSeparator) .append(previousRequestAttempts); sb.append(statementSeparator); } sb.append("S2E-Resp-Start").append(keyValueSeparator).append(format(responseStartTime)); sb.append(fieldSeparator); sb.append("S2E-Resp-End").append(keyValueSeparator).append(responseCompletionTime != -1 ? format(responseCompletionTime) : "NOT-COMPLETED"); sb.append(statementSeparator); sb.append("S2E-Resp-Status").append(keyValueSeparator).append(responseLine); if (!printNoHeaders) { sb.append(fieldSeparator); sb.append("S2E-Resp-Info").append(keyValueSeparator).append("{") .append(headersToString()).append("}"); } sb.append(statementSeparator); return sb.toString(); } public ServerConnectionDebug getServerConnectionDebug() { return serverConnectionDebug; } }