/*
*
* Paros and its related class files.
*
* Paros is an HTTP/HTTPS proxy for assessing web application security.
* Copyright (C) 2003-2004 Chinotec Technologies Company
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the Clarified Artistic License
* as published by the Free Software Foundation.
*
* This program 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
* Clarified Artistic License for more details.
*
* You should have received a copy of the Clarified Artistic License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// ZAP: 2012/02/21 Added logging
// ZAP: 2012/04/25 Added @Override annotation to all appropriate methods.
// ZAP: 2013/03/03 Issue 546: Remove all template Javadoc comments
// ZAP: 2013/08/21 Added a new encoding/decoding model for a correct parameter value interpretation
// ZAP: 2014/01/06 Issue 965: Support 'single page' apps and 'non standard' parameter separators
// ZAP: 2014/02/08 Used the same constants used in ScanParam Target settings
// ZAP: 2016/05/04 Changed to use setParameters(int, List<NameValuePair>)
package org.parosproxy.paros.core.scanner;
import org.apache.commons.httpclient.URIException;
import org.apache.log4j.Logger;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.network.HttpMessage;
import org.parosproxy.paros.network.HtmlParameter.Type;
public class VariantURLQuery extends VariantAbstractQuery {
private static final Logger log = Logger.getLogger(VariantURLQuery.class);
public VariantURLQuery() {
super();
}
/**
* Encode the parameter for a correct URL introduction
* @param msg the message object
* @param value the value that need to be encoded
* @return the Encoded value
*/
@Override
protected String getEscapedValue(HttpMessage msg, String value) {
// ZAP: unfortunately the method setQuery() defined inside the httpclient Apache component
// create trouble when special characters like ?+? are set inside the parameter,
// because this method implementation simply doesn?t encode them.
// So we have to explicitly encode values using the URLEncoder component before setting it.
return (value != null) ?
AbstractPlugin.getURLEncode(value) : "";
}
@Override
protected String getUnescapedValue(String value) {
//return value;
return (value != null) ? AbstractPlugin.getURLDecode(value) : "";
}
@Override
public void setMessage(HttpMessage msg) {
this.setParameters(NameValuePair.TYPE_QUERY_STRING, Model.getSingleton().getSession().getParameters(msg, Type.url));
}
@Override
protected void buildMessage(HttpMessage msg, String query) {
try {
// ZAP: encoding has been decided before inside the VariantAbstractQuery
// implementation so now we have only to set a raw query string
msg.getRequestHeader().getURI().setEscapedQuery(query);
} catch (URIException e) {
log.error(e.getMessage() + query, e);
}
}
}