Added rewrite functionality, multiple paths, groovy servlet patterns.

This commit is contained in:
Jonathan Bernard 2015-12-11 23:20:05 -06:00
parent 237997837b
commit 81b88344b3
2 changed files with 85 additions and 21 deletions

View File

@ -1,8 +1,9 @@
apply plugin: "groovy" apply plugin: "groovy"
apply plugin: "application" apply plugin: "application"
apply plugin: "maven"
group = "com.jdbernard" group = "com.jdbernard"
version = "1.1" version = "1.2"
mainClassName = "com.jdbernard.net.GroovyDirectoryServer" mainClassName = "com.jdbernard.net.GroovyDirectoryServer"
@ -17,4 +18,5 @@ dependencies {
compile 'ch.qos.logback:logback-classic:1.1.2' compile 'ch.qos.logback:logback-classic:1.1.2'
compile 'javax.servlet:servlet-api:2.4' compile 'javax.servlet:servlet-api:2.4'
compile 'javax.servlet.jsp:jsp-api:2.1' compile 'javax.servlet.jsp:jsp-api:2.1'
compile 'org.eclipse.jetty.aggregate:jetty-all:7.6.15.v20140411' } compile 'org.eclipse.jetty.aggregate:jetty-all:7.6.15.v20140411'
compile 'com.jdbernard:jdb-util:4.2' }

View File

@ -1,43 +1,105 @@
package com.jdbernard.net package com.jdbernard.net
import org.eclipse.jetty.rewrite.handler.RewriteHandler
import org.eclipse.jetty.rewrite.handler.RewriteRegexRule
import org.eclipse.jetty.servlet.DefaultServlet
import org.eclipse.jetty.servlet.ServletContextHandler
import org.eclipse.jetty.server.Server import org.eclipse.jetty.server.Server
import org.eclipse.jetty.servlet.* import groovy.servlet.GroovyServlet
import groovy.servlet.* import com.jdbernard.util.LightOptionParser
public class GroovyDirectoryServer { public class GroovyDirectoryServer {
public static final String VERSION = "1.1" public static final String VERSION = "1.2"
public static void main(String[] args) { public static void main(String[] args) {
def port = 9002 def port = 9000
if (args.length < 1) { println "Defaulting to port 9002" } def cli = [
v: [longName: 'version'],
h: [longName: 'help'],
p: [longName: 'port', arguments: 1],
P: [longName: 'map-path', arguments: 2],
r: [longName: 'rewrite', arguments: 2],
g: [longName: 'groovy-servlet', arguments: 1] ]
else try { port = args[0] as int } def opts = LightOptionParser.parseOptions(cli, args)
catch(Exception e) {
println "Usage: GroovyDirectoryServer.grooy <port>"
System.exit(1) }
println "Starting Jetty on port $port, press Ctrl-C to stop." if (opts.v) { println "GroovyDirectoryServer v$VERSION"; System.exit(1) }
runJetty(port) if (opts.h) { println getUsage(); System.exit(1) }
def options = [
port: opts.p ? opts.p[0] as int : 9000,
mappedPaths: opts.P ?: [['/', '.']],
rewriteRules: opts.r ?: [],
groovyPatterns: opts.g ?: ["*.groovy"] ]
runJetty(options)
} }
public static void runJetty(int port) { public static void runJetty(options) {
def server = new Server(port) def server = new Server(options.port)
def handler = new ServletContextHandler(ServletContextHandler.SESSIONS) def handler = new ServletContextHandler(ServletContextHandler.SESSIONS)
handler.contextPath = '/' handler.contextPath = '/'
handler.resourceBase = '.' handler.resourceBase = '.'
// Groovy Scripts // Maped paths.
handler.addServlet(GroovyServlet, '*.groovy') println options.mappedPaths
options.mappedPaths.each { pair ->
def pathHandler = handler.addServlet(DefaultServlet, pair[0])
pathHandler.setInitParameter('resourceBase', pair[1])
println "Serving '${pair[1]}' from base url '${pair[0]}'." }
// Files // Groovy Scripts
def filesHolder = handler.addServlet(DefaultServlet, '/') options.groovyPatterns.each { pattern ->
filesHolder.setInitParameter('resourceBase', '.') handler.addServlet(GroovyServlet, pattern)
println "Using GroovyServlet for urls matching '$pattern'." }
// Rewrite rules
if (options.rewriteRules) {
def rewriteHandler = new RewriteHandler()
rewriteHandler.setHandler(handler)
handler = rewriteHandler }
options.rewriteRules.each { pair ->
def rule = new RewriteRegexRule()
rule.regex = pair[0]
rule.replacement = pair[1]
handler.addRule(rule)
println "Rewriting '${pair[0]}' to '${pair[1]}'." }
server.handler = handler server.handler = handler
server.start() server.start()
println "Jetty started on port ${options.port}."
} }
public static String getUsage() {
return """\
GroovyDirectoryServer v$VERSION
usage: GroovyDirectoryServer [options]
Options:
-h,--help Print this usage information.
-v, --version Print versioning information.
-p, --port <port> Listen on the given port. Defaults to 9000.
-P <url-path> <dir-path>, --map-path <url-path> <dir-path>
Map the contents of the filesystem at <dir-path> to the url prefix at
<url-path>.
-r <url-pattern> <replacement>, --rewrite <url-pattern> <replacement>
Rewrite URLs matching <url-pattern> to <replacement>.
-g <url=pattern>, --groovy-servlet
Invoke the GroovyServet for any url matching <url-pattern>
""";
}
} }