Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting timeout for new URL(...).text in Groovy/Grails

Tags:

grails

groovy

I use the following Groovy snippet to obtain the plain-text representation of an HTML-page in a Grails application:

String str = new URL("http://www.example.com/some/path")?.text?.decodeHTML()

Now I want to alter the code so that the request will timeout after 5 seconds (resulting instr == null). What is the easiest and most Groovy way to achieve that?

like image 920
knorv Avatar asked Dec 03 '09 11:12

knorv


2 Answers

You'd have to do it the old way, getting a URLConnection, setting the timeout on that object, then reading in the data through a Reader

This would be a good thing to add to Groovy though (imho), as it's something I could see myself needing at some point ;-)

Maybe suggest it as a feature request on the JIRA?

I've added it as a RFE on the Groovy JIRA

https://issues.apache.org/jira/browse/GROOVY-3921

So hopefully we'll see it in a future version of Groovy...

like image 135
tim_yates Avatar answered Nov 04 '22 21:11

tim_yates


I checked source code of groovy 2.1.8, below code is available:

'http://www.google.com'.toURL().getText([connectTimeout: 2000, readTimeout: 3000])

The logic to process configuration map is located in method org.codehaus.groovy.runtime.ResourceGroovyMethods#configuredInputStream

private static InputStream configuredInputStream(Map parameters, URL url) throws IOException {
    final URLConnection connection = url.openConnection();
    if (parameters != null) {
        if (parameters.containsKey("connectTimeout")) {
            connection.setConnectTimeout(DefaultGroovyMethods.asType(parameters.get("connectTimeout"), Integer.class));
        }
        if (parameters.containsKey("readTimeout")) {
            connection.setReadTimeout(DefaultGroovyMethods.asType(parameters.get("readTimeout"), Integer.class));
        }
        if (parameters.containsKey("useCaches")) {
            connection.setUseCaches(DefaultGroovyMethods.asType(parameters.get("useCaches"), Boolean.class));
        }
        if (parameters.containsKey("allowUserInteraction")) {
            connection.setAllowUserInteraction(DefaultGroovyMethods.asType(parameters.get("allowUserInteraction"), Boolean.class));
        }
        if (parameters.containsKey("requestProperties")) {
            @SuppressWarnings("unchecked")
            Map<String, String> properties = (Map<String, String>) parameters.get("requestProperties");
            for (Map.Entry<String, String> entry : properties.entrySet()) {
                connection.setRequestProperty(entry.getKey(), entry.getValue());
            }
        }

    }
    return connection.getInputStream();
}
like image 28
oldratlee Avatar answered Nov 04 '22 23:11

oldratlee