diff --git a/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java b/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java index e290ec2..03aed5b 100644 --- a/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java +++ b/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java @@ -99,6 +99,9 @@ class DiagramResponse { addHeaderForCache(blockUml); } final Diagram diagram = blockUml.getDiagram(); + if (diagram instanceof PSystemError) { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + } final ImageData result = diagram.exportDiagram(response.getOutputStream(), idx, new FileFormatOption(format)); } diff --git a/src/main/java/net/sourceforge/plantuml/servlet/UmlDiagramService.java b/src/main/java/net/sourceforge/plantuml/servlet/UmlDiagramService.java index 2481201..a90f178 100644 --- a/src/main/java/net/sourceforge/plantuml/servlet/UmlDiagramService.java +++ b/src/main/java/net/sourceforge/plantuml/servlet/UmlDiagramService.java @@ -23,17 +23,18 @@ */ package net.sourceforge.plantuml.servlet; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.servlet.utility.UmlExtractor; + import javax.imageio.IIOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - -import net.sourceforge.plantuml.FileFormat; -import net.sourceforge.plantuml.servlet.utility.UmlExtractor; +import java.io.BufferedReader; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Common service servlet to produce diagram from compressed UML source contained in the end part of the requested URI. @@ -46,6 +47,7 @@ public abstract class UmlDiagramService extends HttpServlet { // build the UML source from the compressed request parameter final String[] sourceAndIdx = getSourceAndIdx(request); + final int idx = Integer.parseInt(sourceAndIdx[1]); final String uml; try { uml = UmlExtractor.getUmlSource(sourceAndIdx[0]); @@ -55,9 +57,38 @@ public abstract class UmlDiagramService extends HttpServlet { return; } + doDiagramResponse(request, response, uml, idx); + } + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + + // build the UML source from the compressed request parameter + final String[] sourceAndIdx = getSourceAndIdx(request); + final int idx = Integer.parseInt(sourceAndIdx[1]); + + final StringBuilder uml = new StringBuilder(); + final BufferedReader in = request.getReader(); + while (true) { + final String line = in.readLine(); + if (line == null) { + break; + } + uml.append(line).append('\n'); + } + + doDiagramResponse(request, response, uml.toString(), idx); + } + + private void doDiagramResponse( + HttpServletRequest request, + HttpServletResponse response, + String uml, + int idx) + throws IOException { + // generate the response DiagramResponse dr = new DiagramResponse(response, getOutputFormat(), request); - final int idx = Integer.parseInt(sourceAndIdx[1]); try { dr.sendDiagram(uml, idx); } catch (IIOException iioe) { diff --git a/src/test/java/net/sourceforge/plantuml/servlet/TestSVG.java b/src/test/java/net/sourceforge/plantuml/servlet/TestSVG.java index 526baab..4928df6 100644 --- a/src/test/java/net/sourceforge/plantuml/servlet/TestSVG.java +++ b/src/test/java/net/sourceforge/plantuml/servlet/TestSVG.java @@ -1,10 +1,13 @@ package net.sourceforge.plantuml.servlet; import com.meterware.httpunit.GetMethodWebRequest; +import com.meterware.httpunit.PostMethodWebRequest; import com.meterware.httpunit.WebConversation; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; +import java.io.ByteArrayInputStream; +import java.nio.charset.Charset; import java.util.Scanner; public class TestSVG extends WebappTestCase { @@ -25,6 +28,47 @@ public class TestSVG extends WebappTestCase { assertTrue(diagramLen < 3000); } + /** + * Verifies the generation of the SVG for the Bob -> Alice sample + */ + public void testPostedSequenceDiagram() throws Exception { + WebConversation conversation = new WebConversation(); + PostMethodWebRequest request = new PostMethodWebRequest( + getServerUrl() + "svg/", + new ByteArrayInputStream("@startuml\nBob -> Alice\n@enduml".getBytes(Charset.defaultCharset())), + "text/plain"); + + WebResponse response = conversation.getResource(request); + + assertEquals(200, response.getResponseCode()); + + // Analyze response + // Verifies the Content-Type header + assertEquals("Response content type is not SVG", "image/svg+xml", response.getContentType()); + // Get the content and verify its size + + String diagram = response.getText(); + + int diagramLen = diagram.length(); + assertTrue(diagramLen > 1000); + assertTrue(diagramLen < 3000); + } + + /** + * Verifies the generation of the SVG for the Bob -> Alice sample + */ + public void testPostedInvalidSequenceDiagram() throws Exception { + WebConversation conversation = new WebConversation(); + PostMethodWebRequest request = new PostMethodWebRequest( + getServerUrl() + "svg/", + new ByteArrayInputStream("@startuml\n[Bob\n@enduml".getBytes(Charset.defaultCharset())), + "text/plain"); + + WebResponse response = conversation.getResource(request); + + assertEquals(400, response.getResponseCode()); + } + /** * Check the content of the SVG */