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

Reply via email to