diff --git a/initializr/pom.xml b/initializr/pom.xml
index b9faa7fd..73e77248 100644
--- a/initializr/pom.xml
+++ b/initializr/pom.xml
@@ -10,7 +10,7 @@
UTF-8
- 1.1.5.RELEASE
+ 1.1.8.RELEASE
diff --git a/initializr/src/main/groovy/io/spring/initializr/web/MainController.groovy b/initializr/src/main/groovy/io/spring/initializr/web/MainController.groovy
index 00048c7a..fb8458e9 100644
--- a/initializr/src/main/groovy/io/spring/initializr/web/MainController.groovy
+++ b/initializr/src/main/groovy/io/spring/initializr/web/MainController.groovy
@@ -101,12 +101,7 @@ class MainController extends AbstractInitializrController {
new AntBuilder().zip(destfile: download) {
zipfileset(dir: dir, includes: '**')
}
- log.info("Uploading: ${download} (${download.bytes.length} bytes)")
- def result = new ResponseEntity(download.bytes,
- ['Content-Type': 'application/zip'] as HttpHeaders, HttpStatus.OK)
-
- projectGenerator.cleanTempFiles(dir)
- result
+ upload(download, dir, generateFileName(request, 'zip'), 'application/zip')
}
@RequestMapping(value='/starter.tgz', produces='application/x-compress')
@@ -119,10 +114,20 @@ class MainController extends AbstractInitializrController {
new AntBuilder().tar(destfile: download, compression: 'gzip') {
zipfileset(dir:dir, includes:'**')
}
- log.info("Uploading: ${download} (${download.bytes.length} bytes)")
- def result = new ResponseEntity(download.bytes,
- ['Content-Type':'application/x-compress'] as HttpHeaders, HttpStatus.OK)
+ upload(download, dir, generateFileName(request, 'tgz'), 'application/x-compress')
+ }
+ private static String generateFileName(ProjectRequest request, String extension) {
+ String tmp = request.artifactId.replaceAll(' ', '_')
+ URLEncoder.encode(tmp, 'UTF-8') + '.' + extension
+ }
+
+ private ResponseEntity upload(File download, File dir, String fileName, String contentType) {
+ log.info("Uploading: ${download} (${download.bytes.length} bytes)")
+ String contentDispositionValue = "attachment; filename=\"$fileName\""
+ def result = new ResponseEntity(download.bytes,
+ ['Content-Type': contentType,
+ 'Content-Disposition': contentDispositionValue] as HttpHeaders, HttpStatus.OK)
projectGenerator.cleanTempFiles(dir)
result
}
diff --git a/initializr/src/test/groovy/io/spring/initializr/web/AbstractInitializerControllerFormIntegrationTests.groovy b/initializr/src/test/groovy/io/spring/initializr/web/AbstractInitializerControllerFormIntegrationTests.groovy
index ff3d8ddb..a9fb90a8 100644
--- a/initializr/src/test/groovy/io/spring/initializr/web/AbstractInitializerControllerFormIntegrationTests.groovy
+++ b/initializr/src/test/groovy/io/spring/initializr/web/AbstractInitializerControllerFormIntegrationTests.groovy
@@ -18,6 +18,7 @@ package io.spring.initializr.web
import com.gargoylesoftware.htmlunit.WebClient
import com.gargoylesoftware.htmlunit.WebRequest
+import com.gargoylesoftware.htmlunit.WebResponse
import com.gargoylesoftware.htmlunit.html.HtmlPage
import io.spring.initializr.support.ProjectAssert
import io.spring.initializr.web.support.HomePage
@@ -27,11 +28,12 @@ import org.junit.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.ActiveProfiles
-import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.htmlunit.MockMvcWebConnection
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.context.WebApplicationContext
+import static org.junit.Assert.assertEquals
+
/**
* Integration tests that are actually using the HTML page to request new
* projects. Used to test both the default home page and the legacy one
@@ -64,7 +66,7 @@ abstract class AbstractInitializerControllerFormIntegrationTests extends Abstrac
@Test
void createDefaultProject() {
def page = home()
- def projectAssert = zipProjectAssert(page.generateProject())
+ def projectAssert = zipProjectAssert(page.generateProject().contentAsStream.bytes)
projectAssert.isMavenProject().isJavaProject().hasStaticAndTemplatesResources(false)
.pomAssert().hasDependenciesCount(2)
.hasSpringBootStarterRootDependency().hasSpringBootStarterDependency('test')
@@ -78,7 +80,12 @@ abstract class AbstractInitializerControllerFormIntegrationTests extends Abstrac
page.name = 'My project'
page.description = 'A description for my project'
page.dependencies << 'web' << 'data-jpa'
- def projectAssert = zipProjectAssert(page.generateProject())
+
+ WebResponse webResponse = page.generateProject()
+ String value = webResponse.getResponseHeaderValue('Content-Disposition')
+ assertEquals 'attachment; filename="foo-bar.zip"', value
+
+ def projectAssert = zipProjectAssert(webResponse)
projectAssert.isMavenProject().isJavaProject().hasStaticAndTemplatesResources(true)
projectAssert.pomAssert().hasGroupId('com.acme').hasArtifactId('foo-bar')
@@ -115,6 +122,10 @@ abstract class AbstractInitializerControllerFormIntegrationTests extends Abstrac
createHomePage(home)
}
+ ProjectAssert zipProjectAssert(WebResponse webResponse) {
+ zipProjectAssert(webResponse.contentAsStream.bytes)
+ }
+
/**
* Provide the context of the home page
*/
diff --git a/initializr/src/test/groovy/io/spring/initializr/web/support/HomePage.groovy b/initializr/src/test/groovy/io/spring/initializr/web/support/HomePage.groovy
index 53d21064..40b23271 100644
--- a/initializr/src/test/groovy/io/spring/initializr/web/support/HomePage.groovy
+++ b/initializr/src/test/groovy/io/spring/initializr/web/support/HomePage.groovy
@@ -16,9 +16,8 @@
package io.spring.initializr.web.support
-import com.gargoylesoftware.htmlunit.Page
+import com.gargoylesoftware.htmlunit.WebResponse
import com.gargoylesoftware.htmlunit.html.*
-import io.spring.initializr.support.ProjectAssert
/**
* Represent the home page of the service.
@@ -44,14 +43,14 @@ abstract class HomePage {
/**
* Generate a project using the specified temporary directory. Return
- * the {@link ProjectAssert} instance.
+ * the {@link WebResponse}.
* @see org.junit.rules.TemporaryFolder
*/
- byte[] generateProject() {
+ WebResponse generateProject() {
setup()
def submit = page.getElementByName('generate-project')
def newMessagePage = submit.click();
- newMessagePage.webResponse.contentAsStream.bytes
+ newMessagePage.webResponse
}
/**