/*
* 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;
}
}