Revision: 4330 http://vexi.svn.sourceforge.net/vexi/?rev=4330&view=rev Author: mkpg2 Date: 2012-01-18 04:11:35 +0000 (Wed, 18 Jan 2012) Log Message: ----------- Improve HttpTester. - More flexible options. - NTLM authentication support.
Modified Paths: -------------- trunk/org.vexi-tools.httptester/meta/module.xml trunk/org.vexi-tools.httptester/meta/product-assembly.xml trunk/org.vexi-tools.httptester/src/main/java/httptester/HttpTester.java Added Paths: ----------- trunk/org.vexi-tools.httptester/httptester.properties trunk/org.vexi-tools.httptester/src/main/java/httptester/ConfProblem.java trunk/org.vexi-tools.httptester/src/main/java/httptester/Configuration.java trunk/org.vexi-tools.httptester/src/main/java/httptester/Main.java trunk/org.vexi-tools.httptester/src/main/java/httptester/MessageParams.java Removed Paths: ------------- trunk/org.vexi-tools.httptester/request.properties Property Changed: ---------------- trunk/org.vexi-tools.httptester/ Property changes on: trunk/org.vexi-tools.httptester ___________________________________________________________________ Modified: svn:ignore - build release .settings .project .classpath + build release .settings .project .classpath .configuration gen *.html Copied: trunk/org.vexi-tools.httptester/httptester.properties (from rev 4324, trunk/org.vexi-tools.httptester/request.properties) =================================================================== --- trunk/org.vexi-tools.httptester/httptester.properties (rev 0) +++ trunk/org.vexi-tools.httptester/httptester.properties 2012-01-18 04:11:35 UTC (rev 4330) @@ -0,0 +1,25 @@ +# The message to be sent to the internet +message=<?xml version="1.0" encoding="UTF-8"?>\ + <methodCall>\ + <methodName>emanate5.Init.isInitialized</methodName>\ + <params/>\ + </methodCall> +target.host=sandbox.emanate5.com +target.port=8084 +target.path=/installation/xmlrpc + +# Proxy options +method.proxy_select=detect_builtin +method.proxy_authenticate=ntlm + +# Proxy credentials +#credentials.username= +#credentials.password= +#### NTLM only +#credentials.workstation= +#credentials.domain= + +# Manually configure proxy +#proxy.host=82.198.228.92 +#proxy.port=80 + Property changes on: trunk/org.vexi-tools.httptester/httptester.properties ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/org.vexi-tools.httptester/meta/module.xml =================================================================== --- trunk/org.vexi-tools.httptester/meta/module.xml 2012-01-17 09:27:33 UTC (rev 4329) +++ trunk/org.vexi-tools.httptester/meta/module.xml 2012-01-18 04:11:35 UTC (rev 4330) @@ -8,6 +8,7 @@ <dependencies> <dependency source="maven-public" org="org.apache.httpcomponents" name="httpclient" tag="4.1.2"/> + <dependency source="ebuild" org="com.googlecode.proxyvole" name="proxyvole" tag="20111102"/> <dependency source="local" name="library.util" /> </dependencies> </ebuild-module> Modified: trunk/org.vexi-tools.httptester/meta/product-assembly.xml =================================================================== --- trunk/org.vexi-tools.httptester/meta/product-assembly.xml 2012-01-17 09:27:33 UTC (rev 4329) +++ trunk/org.vexi-tools.httptester/meta/product-assembly.xml 2012-01-18 04:11:35 UTC (rev 4330) @@ -20,8 +20,7 @@ <input name="jar" ref="jar"/> <input name="props" ref="jar"/> <property key="layout"> - jar-> httptester.jar | - props-> request.properties | + jar-> httptester.jar | </property> </assembler> </target> Deleted: trunk/org.vexi-tools.httptester/request.properties =================================================================== --- trunk/org.vexi-tools.httptester/request.properties 2012-01-17 09:27:33 UTC (rev 4329) +++ trunk/org.vexi-tools.httptester/request.properties 2012-01-18 04:11:35 UTC (rev 4330) @@ -1,13 +0,0 @@ -message=<?xml version="1.0" encoding="UTF-8"?>\ - <methodCall>\ - <methodName>emanate5.Init.isInitialized</methodName>\ - <params/>\ - </methodCall> -target.host=sandbox.emanate5.com -target.port=8084 -target.path=/installation/xmlrpc - -proxy.host=82.198.228.92 -proxy.port=80 -#proxy.username= -#proxy.password= \ No newline at end of file Added: trunk/org.vexi-tools.httptester/src/main/java/httptester/ConfProblem.java =================================================================== --- trunk/org.vexi-tools.httptester/src/main/java/httptester/ConfProblem.java (rev 0) +++ trunk/org.vexi-tools.httptester/src/main/java/httptester/ConfProblem.java 2012-01-18 04:11:35 UTC (rev 4330) @@ -0,0 +1,29 @@ +package httptester; + +public class ConfProblem extends Exception{ + final boolean severe; + public ConfProblem(String message){ this(message, null, true); } + public ConfProblem(String message, boolean severe){ this(message, null, severe); } + public ConfProblem(String message, ConfProblem cause){ this(message, cause, true); } + private ConfProblem(String message, ConfProblem cause, boolean severe){ + super(message, cause); + this.severe = severe; + } + + public void print(){ + if(!severe){ + System.err.println(getMessage()); + }else{ + System.err.println("[Conf Problem] "+getMessage()); + Throwable cause = getCause(); + if(cause != null){ + System.err.println(" ... caused by ... "); + if(cause instanceof ConfProblem){ + ((ConfProblem)cause).print(); + }else{ + cause.printStackTrace(System.err); + } + } + } + } +} Property changes on: trunk/org.vexi-tools.httptester/src/main/java/httptester/ConfProblem.java ___________________________________________________________________ Added: svn:mime-type + text/plain Copied: trunk/org.vexi-tools.httptester/src/main/java/httptester/Configuration.java (from rev 4324, trunk/org.vexi-tools.httptester/src/main/java/httptester/HttpTester.java) =================================================================== --- trunk/org.vexi-tools.httptester/src/main/java/httptester/Configuration.java (rev 0) +++ trunk/org.vexi-tools.httptester/src/main/java/httptester/Configuration.java 2012-01-18 04:11:35 UTC (rev 4330) @@ -0,0 +1,108 @@ +package httptester; + +import java.util.Properties; + +import org.apache.http.HttpHost; +import org.apache.http.auth.NTCredentials; +import org.apache.http.auth.UsernamePasswordCredentials; + +public class Configuration { + static enum MethodOfProxySelection{ + none, manual, detect_builtin, detect_proxyvole; + } + + static enum MethodOfProxyAuthentication{ + none, basic, ntlm; + } + + static enum MethodOfHttpRequest{ + java, + apache; + } + + + + final Properties props; + public Configuration(Properties props){ + this.props = props; + } + + String getProperty(String property){ + return props.getProperty(property); + } + + String expectProperty(String property) throws ConfProblem{ + String r = getProperty(property); + if(r==null) throw new ConfProblem("Required property '"+property+"' not set"); + return r; + } + + public <T extends Enum> T expectEnumProperty(Class<T> class_, String property) throws ConfProblem{ + String s = expectProperty(property); + try{ + return (T)Enum.valueOf(class_, s); + }catch(IllegalArgumentException e){ + throw new ConfProblem("No such proxy selection option, "+property+": "+s+"\nFrom:-"+join(class_.getEnumConstants())); + } + } + + + public MethodOfProxySelection getMethodOfProxySelection() throws ConfProblem{ + return expectEnumProperty(MethodOfProxySelection.class, "method.proxy_select"); + } + + public MethodOfProxyAuthentication getMethodOfProxyAuthentication() throws ConfProblem{ + return expectEnumProperty(MethodOfProxyAuthentication.class, "method.proxy_authenticate"); + } + + public MethodOfHttpRequest getMethodOfHttpRequest() throws ConfProblem{ + return expectEnumProperty(MethodOfHttpRequest.class, "method.http_request"); + } + + int parsePort(String property) throws ConfProblem{ + String s = expectProperty(property); + try{ + return Integer.parseInt(s); + }catch(NumberFormatException e){ + throw new ConfProblem("Not a valid port '"+property+"': "+s); + } + } + + MessageParams constructRequest() throws ConfProblem{ + try{ + String MESSAGE = expectProperty("message"); + String TARGET_HOST = expectProperty("target.host"); + int TARGET_PORT = parsePort("target.port"); + String TARGET_PATH = expectProperty("target.path"); + return new MessageParams(TARGET_HOST, TARGET_PORT, TARGET_PATH, MESSAGE); + }catch(ConfProblem e){ + throw new ConfProblem("Could not construct request", e); + } + } + + public HttpHost constructManualProxy() throws ConfProblem { + String host = expectProperty("proxy.host"); + int port = parsePort("proxy.port"); + return new HttpHost(host, port); + } + public UsernamePasswordCredentials constructBasicCredentials() throws ConfProblem { + String username = expectProperty("credentials.username"); + String password = expectProperty("credentials.password"); + return new UsernamePasswordCredentials(username, password); + } + + public NTCredentials constructNtlmCredentials() throws ConfProblem { + String username = expectProperty("credentials.username"); + String password = expectProperty("credentials.password"); + String workstation = expectProperty("credentials.workstation"); + String domain = expectProperty("credentials.domain"); + return new NTCredentials(username, password, workstation, domain); + } + + + static private String join(Object[] os){ + StringBuilder r = new StringBuilder(); + for(Object o: os) r.append("\n "+o); + return r.toString(); + } +} Property changes on: trunk/org.vexi-tools.httptester/src/main/java/httptester/Configuration.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/org.vexi-tools.httptester/src/main/java/httptester/HttpTester.java =================================================================== --- trunk/org.vexi-tools.httptester/src/main/java/httptester/HttpTester.java 2012-01-17 09:27:33 UTC (rev 4329) +++ trunk/org.vexi-tools.httptester/src/main/java/httptester/HttpTester.java 2012-01-18 04:11:35 UTC (rev 4330) @@ -1,78 +1,109 @@ package httptester; -import java.io.File; -import java.io.FileInputStream; +import httptester.Configuration.MethodOfProxyAuthentication; +import httptester.Configuration.MethodOfProxySelection; + import java.io.IOException; -import java.util.Properties; +import java.net.Proxy; +import java.net.ProxySelector; +import java.util.List; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.auth.AuthScope; +import org.apache.http.auth.NTCredentials; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.ProxySelectorRoutePlanner; import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.ibex.util.IOUtil; +import com.btr.proxy.search.ProxySearch; - public class HttpTester { + final Configuration conf; + MessageParams message; - static public Properties load(File propsFile) throws IOException { - Properties props = new Properties(); - FileInputStream fis = new FileInputStream(propsFile); - props.load(fis); - fis.close(); - return props; + + public HttpTester(Configuration conf) { + this.conf = conf; } - static public int parsePort(String p){ + public void run() throws ConfProblem{ try{ - return Integer.parseInt(p); - }catch(NumberFormatException e){ - System.err.println("[ERROR] Not a valid port: "+p); - System.exit(1); - return -1; + message = conf.constructRequest(); + doApacheHttpRequest(conf.getMethodOfProxySelection(), conf.getMethodOfProxyAuthentication()); + }catch(ConfProblem p){ + p.print(); + return; } } - static public void main(String[] args) throws IOException { - Properties props = load(new File("request.properties")); + private void log(String s){ System.err.println(s); } + public void doApacheHttpRequest(MethodOfProxySelection proxySelect, MethodOfProxyAuthentication proxyAuthenticate) throws ConfProblem{ + log("-------------------- Request ------------------------------"); + log("proxy selection method: "+proxySelect); + log("proxy authentication method: "+proxyAuthenticate); - String MESSAGE = props.getProperty("message"); - DefaultHttpClient httpclient = new DefaultHttpClient(); - String PROXY_HOST = props.getProperty("proxy.host"); - if(PROXY_HOST!=null){ - int PROXY_PORT = parsePort(props.getProperty("proxy.port")); + switch(proxySelect){ + case manual: + HttpHost proxyHost = null; + try{ + proxyHost = conf.constructManualProxy(); - String PROXY_USERNAME = props.getProperty("proxy.username"); - if(PROXY_USERNAME!=null){ - String PROXY_PASSWORD = props.getProperty("proxy.password"); - httpclient.getCredentialsProvider().setCredentials( - new AuthScope(PROXY_HOST, PROXY_PORT), - new UsernamePasswordCredentials(PROXY_USERNAME, PROXY_PASSWORD)); - + }catch(ConfProblem p){ + p.print(); + return; } + httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxyHost); + break; + + case detect_proxyvole: + ProxySearch proxySearch = ProxySearch.getDefaultProxySearch(); + ProxySelector myProxySelector = proxySearch.getProxySelector(); + ProxySelector.setDefault(myProxySelector); + // fall through + case detect_builtin: + ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner( + httpclient.getConnectionManager().getSchemeRegistry(), + ProxySelector.getDefault()); + httpclient.setRoutePlanner(routePlanner); - HttpHost proxy = new HttpHost(PROXY_HOST, PROXY_PORT); - httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); + List<Proxy> proxies = ProxySelector.getDefault().select(message.uri); + log(proxies.size()+" discovered proxies:- "); + for(Proxy p: proxies){ + log(" "+p); + } + break; + default: } - - - String TARGET_HOST = props.getProperty("target.host"); - int TARGET_PORT = parsePort(props.getProperty("target.port")); - String TARGET_PATH = props.getProperty("target.path"); + switch(proxyAuthenticate){ + case ntlm:{ + NTCredentials creds = conf.constructNtlmCredentials(); + httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds); + break; + } + case basic:{ + UsernamePasswordCredentials credentials = conf.constructBasicCredentials(); + httpclient.getCredentialsProvider().setCredentials( + AuthScope.ANY,credentials); + break; + } + case none: + default: + } - String targetUrl = "http://"+TARGET_HOST+":"+TARGET_PORT+TARGET_PATH; + HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "UTF-8"); @@ -81,25 +112,29 @@ BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest( - "POST", targetUrl); + "POST", message.uriString); - ByteArrayEntity entity = new ByteArrayEntity(MESSAGE.getBytes()); + ByteArrayEntity entity = new ByteArrayEntity(message.message.getBytes()); entity.setContentType("text/xml"); request.setEntity(entity); - + HttpHost host = new HttpHost(message.host, message.port); + request.setParams(params); + try { + log("-------------------- Response ------------------------------"); + HttpResponse response = httpclient.execute(host, request); + byte[] bytes = IOUtil.toByteArray(response.getEntity().getContent()); + int statusCode = response.getStatusLine().getStatusCode(); + log("Status Code: "+statusCode); + log(new String(bytes)); - HttpHost host = new HttpHost(TARGET_HOST, TARGET_PORT); - - request.setParams(params); - HttpResponse response = httpclient.execute(host, request); - byte[] bytes = IOUtil.toByteArray(response.getEntity().getContent()); - int statusCode = response.getStatusLine().getStatusCode(); - System.err.println("Status Code: "+statusCode); - System.err.println(new String(bytes)); + } catch (IOException e) { + System.err.println("[Problem] Exception thrown performing request"); + e.printStackTrace(); + } } } Added: trunk/org.vexi-tools.httptester/src/main/java/httptester/Main.java =================================================================== --- trunk/org.vexi-tools.httptester/src/main/java/httptester/Main.java (rev 0) +++ trunk/org.vexi-tools.httptester/src/main/java/httptester/Main.java 2012-01-18 04:11:35 UTC (rev 4330) @@ -0,0 +1,25 @@ +package httptester; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public class Main { + + static public Properties load(File propsFile) throws IOException { + Properties props = new Properties(); + FileInputStream fis = new FileInputStream(propsFile); + props.load(fis); + fis.close(); + return props; + } + + static public void main(String[] args) throws Exception { + Properties props = load(new File("httptester.properties")); + + Configuration conf = new Configuration(props); + HttpTester tester = new HttpTester(conf); + tester.run(); + } +} Property changes on: trunk/org.vexi-tools.httptester/src/main/java/httptester/Main.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: trunk/org.vexi-tools.httptester/src/main/java/httptester/MessageParams.java =================================================================== --- trunk/org.vexi-tools.httptester/src/main/java/httptester/MessageParams.java (rev 0) +++ trunk/org.vexi-tools.httptester/src/main/java/httptester/MessageParams.java 2012-01-18 04:11:35 UTC (rev 4330) @@ -0,0 +1,34 @@ +package httptester; + +import java.net.URI; +import java.net.URISyntaxException; + + +public class MessageParams { + final String host; + final Integer port; + final String path; + final String message; + + final String uriString; + final URI uri; + public MessageParams( + String host, + Integer port, + String path, + String message) throws ConfProblem { + this.host = host; + this.port = port; + this.path = path; + this.message = message; + + this.uriString = "http://"+host+":"+port+path; + try { + this.uri = new URI(uriString); + } catch (URISyntaxException e) { + throw new ConfProblem("Invalid uri: "+uriString); + } + + } + +} Property changes on: trunk/org.vexi-tools.httptester/src/main/java/httptester/MessageParams.java ___________________________________________________________________ Added: svn:mime-type + text/plain This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Keep Your Developer Skills Current with LearnDevNow! The most comprehensive online learning library for Microsoft developers is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, Metro Style Apps, more. Free future releases when you subscribe now! http://p.sf.net/sfu/learndevnow-d2d _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn