/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2015 The ZAP development team
*
* 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 org.zaproxy.zap.extension.ascan;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Represents a snapshot of response counts, grouped by response code groups
* @author simon
*
*/
public class ResponseCountSnapshot {
public enum RESPONSE_CODE_RANGE {RC_100, RC_200, RC_300, RC_400, RC_500};
private Date date;
private int period;
private AtomicInteger resp100;
private AtomicInteger resp200;
private AtomicInteger resp300;
private AtomicInteger resp400;
private AtomicInteger resp500;
public ResponseCountSnapshot() {
this.date = new Date();
this.period = -1;
this.resp100 = new AtomicInteger();
this.resp200 = new AtomicInteger();
this.resp300 = new AtomicInteger();
this.resp400 = new AtomicInteger();
this.resp500 = new AtomicInteger();
}
public ResponseCountSnapshot(Date date, int period, int resp100,
int resp200, int resp300, int resp400, int resp500) {
super();
this.date = date;
this.period = period;
this.resp100 = new AtomicInteger(resp100);
this.resp200 = new AtomicInteger(resp200);
this.resp300 = new AtomicInteger(resp300);
this.resp400 = new AtomicInteger(resp400);
this.resp500 = new AtomicInteger(resp500);
}
public ResponseCountSnapshot getDifference(ResponseCountSnapshot previous) {
return new ResponseCountSnapshot(this.date, getPeriod(),
getResp100() - previous.getResp100(),
getResp200() - previous.getResp200(),
getResp300() - previous.getResp300(),
getResp400() - previous.getResp400(),
getResp500() - previous.getResp500());
}
public Date getDate() {
return date;
}
public int getResponseCodeCount(RESPONSE_CODE_RANGE rcr) {
switch (rcr) {
case RC_100: return getResp100();
case RC_200: return getResp200();
case RC_300: return getResp300();
case RC_400: return getResp400();
case RC_500: return getResp500();
}
return -1;
}
public void incResponseCodeCount(int responseCode) {
switch (responseCode / 100) {
case 1: incResponseCodeCount(RESPONSE_CODE_RANGE.RC_100); break;
case 2: incResponseCodeCount(RESPONSE_CODE_RANGE.RC_200); break;
case 3: incResponseCodeCount(RESPONSE_CODE_RANGE.RC_300); break;
case 4: incResponseCodeCount(RESPONSE_CODE_RANGE.RC_400); break;
case 5: incResponseCodeCount(RESPONSE_CODE_RANGE.RC_500); break;
default: // Ignore
}
}
public void incResponseCodeCount(RESPONSE_CODE_RANGE rcr) {
switch (rcr) {
case RC_100: resp100.incrementAndGet(); break;
case RC_200: resp200.incrementAndGet(); break;
case RC_300: resp300.incrementAndGet(); break;
case RC_400: resp400.incrementAndGet(); break;
case RC_500: resp500.incrementAndGet(); break;
}
}
public int getPeriod() {
return period;
}
public int getResp100() {
return resp100.get();
}
public int getResp200() {
return resp200.get();
}
public int getResp300() {
return resp300.get();
}
public int getResp400() {
return resp400.get();
}
public int getResp500() {
return resp500.get();
}
public int getTotal() {
return this.getResp100() + this.getResp200() + this.getResp300() + this.getResp400() + this.getResp500();
}
@Override
public ResponseCountSnapshot clone() {
return new ResponseCountSnapshot(new Date(), period,
resp100.get(), resp200.get(), resp300.get(), resp400.get(), resp500.get());
}
}