Giter Site home page Giter Site logo

plantuml-server's Introduction

PlantUML Server

GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007 latest tag workflow status (Main) workflow status (Tests)

online rate peak

GitHub Sponsors docker pulls Docker Image Size (Jetty) Docker Image Size (Tomcat)

PlantUML Server is a web application to generate UML diagrams on-the-fly.

PlantUML is not affected by the log4j vulnerability.

Breaking changes:
The PlantUML core removed the deprecated ALLOW_PLANTUML_INCLUDE environment property feature and switch to the PLANTUML_SECURITY_PROFILE concept with version v1.2023.9. All details about PlantUML's security can be found on https://plantuml.com/security.

By default PlantUML server sets the PLANTUML_SECURITY_PROFILE to INTERNET. If you need more access to e.g. other ports than 80 (http) and 443 (https) or even access to local files, please consider using one of the allowlist features. It is strongly advised not to set the PLANTUML_SECURITY_PROFILE below INTERNET!

PlantUML Server

More examples and features about the Web UI can be found in docs/WebUI.

To know more about PlantUML, please visit https://plantuml.com.

Requirements

  • jre/jdk 11 or above
  • apache maven 3.0.2 or above

Recommendations

  • Jetty 11 or above
  • Tomcat 10 or above

How to run the server

Just run:

mvn jetty:run

The server is now listening to http://localhost:8080/plantuml. In this way the server is run on an embedded jetty server.

You can specify the port at which it runs:

mvn jetty:run -Djetty.http.port=9999

How to run the server with Docker

You can run Plantuml with jetty or tomcat container

docker run -d -p 8080:8080 plantuml/plantuml-server:jetty
docker run -d -p 8080:8080 plantuml/plantuml-server:tomcat

The server is now listening to http://localhost:8080.

Read-only container

The jetty container supports read-only files system, you can run the read-only mode with:

docker run -d -p 8080:8080 --read-only -v /tmp/jetty plantuml/plantuml-server:jetty

This makes the container compatible with more restricted environment such as OpenShift, just make sure you mount a volume (can be ephemeral) on /tmp/jetty.

Change base URL

To run plantuml using different base url, change the docker-compose.yml file:

environment:
  - BASE_URL=plantuml

And run docker-compose up. This will start a modified version of the image using the base url /plantuml, e.g. http://localhost:8080/plantuml

How to set PlantUML options

You can apply some option to your PlantUML server with environment variable.

If you run the directly the jar:

# NOTE: jetty-runner is deprecated.
# build war file and jetty-runner
mvn package
# start directly
# java $JVM_ARGS -jar jetty-runner.jar $JETTY_ARGS
java -jar target/dependency/jetty-runner.jar --config src/main/config/jetty.xml --port 9999 --path /plantuml target/plantuml.war
# see help for more possible options
java -jar target/dependency/jetty-runner.jar --help

Note: --config src/main/config/jetty.xml is only necessary if you need support for empty path segments in URLs (e.g. for the old proxy)

Alternatively, start over maven and pass the option with -D flag

mvn jetty:run -D THE_ENV_VARIABLE=THE_ENV_VALUE -Djetty.http.port=9999

If you use docker, you can use the -e flag:

docker run -d -p 9999:8080 -e THE_ENV_VARIABLE=THE_ENV_VALUE plantuml/plantuml-server:jetty

You can set all the following variables:

  • BASE_URL
    • PlantUML Base URL path
    • Default value: ROOT
  • PLANTUML_SECURITY_PROFILE
    • Set PlantUML security profile. See PlantUML security.
    • If you need more access to e.g. other ports than 80 (http) and 443 (https) or even access to local files, please consider using one of the allowlist features:
      • plantuml.allowlist.path
      • plantuml.include.path
      • plantuml.allowlist.url
    • It is strongly advised not to set the PLANTUML_SECURITY_PROFILE below INTERNET!
    • Default value: INTERNET
  • PLANTUML_PROPERTY_FILE
    • Set PlantUML system properties (like over the Java command line using the -Dpropertyname=value syntax).
    • To see what kind of file content is supported, see the documentation of java.util.Properties.load.
    • Default value: null
  • PLANTUML_CONFIG_FILE
    • Local path to a PlantUML configuration file (identical to the -config flag on the CLI)
    • File content will be added before each PlantUML diagram code.
    • Default value: null
  • PLANTUML_LIMIT_SIZE
    • Limits image width and height
    • Default value: 4096
  • PLANTUML_STATS
  • HTTP_AUTHORIZATION
    • when calling the proxy endpoint, the value of HTTP_AUTHORIZATION will be used to set the HTTP Authorization header
    • Default value: null
  • HTTP_PROXY_READ_TIMEOUT
    • when calling the proxy endpoint, the value of HTTP_PROXY_READ_TIMEOUT will be the connection read timeout in milliseconds
    • Default value: 10000 (10 seconds)

Alternate: How to build your docker image

This method uses maven to run the application. That requires internet connectivity. So, you can use following command to create a self-contained docker image that will "just work".

docker image build -f Dockerfile.jetty -t plantuml-server:local .
docker run -d -p 8080:8080 plantuml-server:local

The server is now listening to http://localhost:8080.

You may specify the port in -p Docker command line argument.

How to generate the war

To build the war, just run:

mvn package

at the root directory of the project to produce plantuml.war in the target/ directory.

NOTE: If you want that the generated war includes the apache-jsp artifact run:

mvn package -Dapache-jsp.scope=compile

If you want to generate the war with java 8 as target just remove the src/test directory and use pom.jdk8.xml.

rm -rf src/test
mvn package -f pom.jdk8.xml [-Dapache-jsp.scope=compile]

Use with reverse-proxy

It is possible to use PlantUML with a reverse proxy.

You can find this and other examples here.

plantuml-server's People

Contributors

aadrian avatar arnaudroques avatar codeprefect avatar devantler avatar ducatel avatar esler avatar fabianhauser avatar fgreinacher avatar ftomassetti avatar halindrome avatar heinrichad avatar hupling avatar jarv avatar jemerald avatar jessetan avatar lalloni avatar madduci avatar maximesinclair avatar morotti avatar mrausch avatar natescarlet avatar norbertnogacki-tomtom avatar paddy-hack avatar peterdavehello avatar roxspring avatar slavisah avatar stevehipwell avatar the-lum avatar thiyagaraj avatar translucens avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

plantuml-server's Issues

Add fonts to docker image

Hi there,

The list of fonts installed on the official docker image is:

image

It would be great to add a few!

Cheers,

Jun

Lifetime statements activate/deactivate don't work in sequence diagram with allow_mixing

@startuml
allow_mixing

Interface ServerCapabilities {
}
Interface ClientCapabilities {
}

Interface Initialize {

}
Interface ResourcePath {

}
Interface DidOpenedNotification {

}

Interface GoalsRequest {

}

Interface GoalsResponse {

}

Interface Goal {

}

Interface ResourceFilter {

}

Interface BuildNotification {

}

Interface BuildStatusNotification {
	
}

Actor User
Entity WSExplorer
Entity BSDplugin
Entity BSDServer

User -> WSExplorer :open
activate WSExplorer
WSExplorer -> BSDServer: start

activate BSDServer
deactivate BSDServer
deactivate WSExplorer

@enduml

Any way to make the PlantUML server accept raw or URLEncoded text?

Having to use Base64 limits usage of a PlantUML server and doesn't allow things like wiki templates to embed PlantUML source that's directly editable. For example,

http://www.plantuml.com/plantuml/proxy?uml=%40startuml%0ABob%20-%3E%20Alice%20%3A%20hello%0A%40enduml

would generate the standard Bob & Alice sequence diagram.

Redirections with absolute urls

Hi,
In my current setup, Plantuml is working behind a proxy and is accessible via http://somewhere.local/plantuml.
However all redirections (from platnuml) fail since it seems it assumes that the root directory is /. So you can get something like http://somewhere.local/uml/blabla instead of http://somewhere.local/plantuml/uml/blabla

Example:

  • Going to http://somewhere.local/plantuml
  • Redirected to http://somewhere.local/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000

via curl:

% curl -v -L http://somewhere.local/plantuml/
*   Trying 100.73.1.89...
* TCP_NODELAY set
* Connected to somewhere.local (100.73.1.89) port 80 (#0)
> GET /plantuml/ HTTP/1.1
> Host: somewhere.local
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: nginx
< Date: Thu, 03 Aug 2017 04:27:14 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
< Location: http://somewhere.local/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000
<
* Ignoring the response-body
* Connection #0 to host somewhere.local left intact
* Issue another request to this URL: 'http://somewhere.local/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000'
* Found bundle for host somewhere.local: 0x7ffce7c0b590 [can pipeline]
* Re-using existing connection! (#0) with host somewhere.local
* Connected to somewhere.local (100.73.1.89) port 80 (#0)
> GET /uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 HTTP/1.1
> Host: somewhere.local
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Server: nginx
< Date: Thu, 03 Aug 2017 04:27:14 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Vary: Accept-Encoding
<
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host somewhere.local left intact

The nginx setup, if not good for some reasons:

upstream backend-plantuml {
    least_conn;
    server some-backend.local:80 weight=1;
}

location /plantuml/ {
    proxy_set_header HOST $host;
    proxy_connect_timeout 500ms; # approximate
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    rewrite ^/plantuml/(.*) /$1 break;
    proxy_pass http://backend-plantuml;
}

Error message not useful when Proxy fails with source not containing @startuml/@enduml

I mistakenly tried to use the proxy with a file that didn't have @startuml/@enduml around the PlantUML text. For example, using http://www.plantuml.com/plantuml/proxy?fmt=svg&src=https://raw.githubusercontent.com/fuhrmanator/gti792-peets/master/OOAD/test.puml the proxy fails with a message as follows:

Sorry, but things didn't work out as planned.

Wed Jan 06 17:25:10 UTC 2016
Request that failed: /plantuml/proxy
Status code: 500
Exception: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

It would be better if there was a cleaner error message, to indicate the real problem. Ideally, this would be in the image that is supposed to be returned, since many of us are using /proxy in markdown.

Create uml from git link

Given I have public link to text file with uml on gitlab or github, I may paste link into plantuml server and get image.

It would be either reasonable to create issue on github and gitlab to render plantuml inside their web interfaces, like these where done for some other kinds of text - e.g. 2d/3d models.

Draw images for PlantUML markup reachable via URL?

It would be great if we could pass the PlantUML server an URL to a markup file as an URL parameter and get the image in return.

That way, I could put .puml files somewhere in my repo.

Then, my documentation .md files could point to something like http://www.plantuml.com/imageForUrl?url=..urlencoded_URL_of_the_raw_version_of_the_markup_file... and embed the image rendered by the server.

... at least until GitHub supports PlantUML nativaly :)

As an extra bonus, a second parameter could choose which @startuml...@enduml section to pick from the source file in case there are more than one.

Does that make sense?

Support POST requests

Because GET requests have a char length limit

from urllib.parse import urlencode
from urllib.request import Request, urlopen

url = 'http://localhost:8080/plantuml/post'
post_fields = {'source': r'@startuml\na --> b\na <-- b\n@enduml'}

request = Request(url, urlencode(post_fields).encode())
answer = urlopen(request).read().decode()
print(answer)

Would be useful for internal application as:

  1. https://github.com/qjebbs/vscode-plantuml
  2. https://github.com/pkucmus/sublime-plantuml

With this they can render the images much faster and can handle big diagrams:

Plugin supports two renders: Local and PlantUMLServer.

Local is the default and traditional way. If you care more about export speed, you should try PlantUMLServer.

Local: 6 documents, 9 digrams, 14 files exported in 24.149 seconds
PlantUMLServer: 6 documents, 9 digrams, 14 files exported in 1.564 seconds

frontpage redirect

i've setup docker image which is behind haproxy, which itself is on https.

now if i access the service over https, it redirects to http url. it's apparently due haproxy connecting over http and plantuml not being able to understand that.

  1. how to configure it to redirect to https url?
$ curl -i https://plantuml.example.net
HTTP/1.1 302 Found
Connection: close
Location: http://plantuml.example.net/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000
Server: Jetty(9.4.6.v20170531)

Add a couple of rest calls to support a more interactive editor..?

I'm getting a ton of use out of plantuml these days. Having content embedded in the url is awesome!

I was messing around with a little cleaner online editor, and I ran into the issue of a couple of rest calls that seem to be missing, and would be helpful:

  • Decode the diagram and return it as text
  • Accept a diagram content and return it as a url (maybe I should just do encoding in JS?)

Anywho, if I get more time and interest down the line, I might flush these out more on the Java side. Thanks.

"Too Many Redirects" when using a WAR

Hello,

I want to deploy the server in an Openshift Origin cluster, which is essentially Kubernetes + a management layer on top. I used your Dockerfile as a starting point, but made a few modifications:

  1. Allow to run as an arbitrary user; Openshift does not run the containers as root.
  2. Speed-up deployment by splitting WAR generation and tool startup
  3. Set the Jetty ContextPath using a variable that is overridden in the Dockerfile

See https://github.com/woopla/plantuml-server for the modifications

Step 2 is necessary because otherwise, the start-up phase of the container will fail if it takes too long to start.

The big problem I have is that in this mode, the server enters a loop of redirects which is ended by the browser with a Too Many Redirects error. Here's an excerpt of the logfile with Jetty debug output:

2017-03-20 23:48:46.580:DBUG:oeji.nio:created SCEP@506b4efb{l(/172.17.0.1:40738)<->r(/172.17.0.5:8080),d=false,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0}-{AsyncHttpConnection@5fd399cb,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}
2017-03-20 23:48:46.584:DBUG:oejh.HttpParser:filled 2931/2931
2017-03-20 23:48:46.589:DBUG:oejs.Server:REQUEST / on AsyncHttpConnection@5fd399cb,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=13,c=0},r=1
2017-03-20 23:48:46.589:DBUG:oejsh.ContextHandler:scope null||/ @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.589:DBUG:oejsh.ContextHandler:context=||/ @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.595:DBUG:oejs.session:sessionManager=org.eclipse.jetty.server.session.HashSessionManager@47b2e9e1
2017-03-20 23:48:46.595:DBUG:oejs.session:session=null
2017-03-20 23:48:46.595:DBUG:oejs.ServletHandler:servlet |/|null -> default
2017-03-20 23:48:46.597:DBUG:oejs.ServletHandler:chain=null
2017-03-20 23:48:46.599:DBUG:oejs.DefaultServlet:Resource /=file:/app/target/plantuml/
2017-03-20 23:48:46.599:DBUG:oejs.DefaultServlet:uri=/ resource=file:/app/target/plantuml/ content
2017-03-20 23:48:46.609:DBUG:oejs.DefaultServlet:Resource /welcome=null
2017-03-20 23:48:46.609:DBUG:oejs.DefaultServlet:welcome=/welcome
2017-03-20 23:48:46.610:DBUG:oejsh.ContextHandler:scope /||/welcome @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.610:DBUG:oejsh.ContextHandler:context=||/welcome @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.610:DBUG:oejs.session:sessionManager=org.eclipse.jetty.server.session.HashSessionManager@47b2e9e1
2017-03-20 23:48:46.610:DBUG:oejs.session:session=null
2017-03-20 23:48:46.610:DBUG:oejs.ServletHandler:servlet |/welcome|null -> plantumlservlet
2017-03-20 23:48:46.610:DBUG:oejs.ServletHandler:chain=null
2017-03-20 23:48:46.610:DBUG:oejw.WebAppClassLoader:loaded interface java.lang.CharSequence
2017-03-20 23:48:46.610:DBUG:oejw.WebAppClassLoader:loaded interface java.lang.CharSequence from null
2017-03-20 23:48:46.610:DBUG:oejw.WebAppClassLoader:loaded class java.net.HttpURLConnection
2017-03-20 23:48:46.610:DBUG:oejw.WebAppClassLoader:loaded class java.net.HttpURLConnection from null
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class javax.net.ssl.HttpsURLConnection
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class javax.net.ssl.HttpsURLConnection from null
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.lang.Throwable
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.lang.Throwable from null
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.lang.Exception
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.lang.Exception from null
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.ServletResponse
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.ServletResponse from sun.misc.Launcher$AppClassLoader@4b67cf4d
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.ServletRequest
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.ServletRequest from sun.misc.Launcher$AppClassLoader@4b67cf4d
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.util.regex.Pattern
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.util.regex.Pattern from null
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.http.HttpServletRequest
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.http.HttpServletRequest from sun.misc.Launcher$AppClassLoader@4b67cf4d
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.lang.String
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.lang.String from null
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.io.IOException
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded class java.io.IOException from null
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.http.HttpServletResponse
2017-03-20 23:48:46.611:DBUG:oejw.WebAppClassLoader:loaded interface javax.servlet.http.HttpServletResponse from sun.misc.Launcher$AppClassLoader@4b67cf4d
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class java.lang.Object
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class java.lang.Object from null
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded interface net.sourceforge.plantuml.code.Transcoder from WebAppClassLoader=plantuml@4f8e5cde
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class java.net.URL
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class java.net.URL from null
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class java.io.InputStream
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class java.io.InputStream from null
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class javax.servlet.ServletException
2017-03-20 23:48:46.612:DBUG:oejw.WebAppClassLoader:loaded class javax.servlet.ServletException from sun.misc.Launcher$AppClassLoader@4b67cf4d
2017-03-20 23:48:46.614:DBUG:oejw.WebAppClassLoader:loaded class java.util.regex.Matcher
2017-03-20 23:48:46.614:DBUG:oejw.WebAppClassLoader:loaded class java.util.regex.Matcher from null
2017-03-20 23:48:46.614:DBUG:oejw.WebAppClassLoader:loaded class java.lang.StringBuilder
2017-03-20 23:48:46.614:DBUG:oejw.WebAppClassLoader:loaded class java.lang.StringBuilder from null
2017-03-20 23:48:46.649:DBUG:oejs.Server:RESPONSE /  302 handled=true
2017-03-20 23:48:46.649:DBUG:oejs.AsyncHttpConnection:Enabled read interest SCEP@506b4efb{l(/172.17.0.1:40738)<->r(/172.17.0.5:8080),d=true,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@5fd399cb,g=HttpGenerator{s=4,h=0,b=-1,c=-1},p=HttpParser{s=0,l=13,c=0},r=1}
2017-03-20 23:48:46.650:DBUG:oejh.HttpParser:filled 0/0
2017-03-20 23:48:46.672:DBUG:oejh.HttpParser:filled 2967/2967
2017-03-20 23:48:46.674:DBUG:oejs.Server:REQUEST /uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 on AsyncHttpConnection@5fd399cb,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=13,c=0},r=2
2017-03-20 23:48:46.674:DBUG:oejsh.ContextHandler:scope null||/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.674:DBUG:oejsh.ContextHandler:context=||/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.674:DBUG:oejs.session:sessionManager=org.eclipse.jetty.server.session.HashSessionManager@47b2e9e1
2017-03-20 23:48:46.674:DBUG:oejs.session:session=null
2017-03-20 23:48:46.674:DBUG:oejs.ServletHandler:servlet |/uml|/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 -> plantumlservlet
2017-03-20 23:48:46.675:DBUG:oejs.ServletHandler:chain=null
2017-03-20 23:48:46.675:DBUG:oejs.Server:RESPONSE /uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000  302 handled=true
2017-03-20 23:48:46.675:DBUG:oejs.AsyncHttpConnection:Enabled read interest SCEP@506b4efb{l(/172.17.0.1:40738)<->r(/172.17.0.5:8080),d=true,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=1r}-{AsyncHttpConnection@5fd399cb,g=HttpGenerator{s=4,h=0,b=-1,c=-1},p=HttpParser{s=0,l=13,c=0},r=2}
2017-03-20 23:48:46.677:DBUG:oejh.HttpParser:filled 0/0
2017-03-20 23:48:46.729:DBUG:oejh.HttpParser:filled 2967/2967
2017-03-20 23:48:46.730:DBUG:oejs.Server:REQUEST /uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 on AsyncHttpConnection@5fd399cb,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=13,c=0},r=3
2017-03-20 23:48:46.730:DBUG:oejsh.ContextHandler:scope null||/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.730:DBUG:oejsh.ContextHandler:context=||/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 @ o.e.j.w.WebAppContext{/,[file:/app/target/plantuml/, jar:file:/app/target/plantuml/WEB-INF/lib/codemirror-3.21.jar!/META-INF/resources/]},file:/app/target/plantuml.war
2017-03-20 23:48:46.731:DBUG:oejs.session:sessionManager=org.eclipse.jetty.server.session.HashSessionManager@47b2e9e1
2017-03-20 23:48:46.731:DBUG:oejs.session:session=null
2017-03-20 23:48:46.731:DBUG:oejs.ServletHandler:servlet |/uml|/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 -> plantumlservlet
2017-03-20 23:48:46.731:DBUG:oejs.ServletHandler:chain=null
2017-03-20 23:48:46.731:DBUG:oejs.Server:RESPONSE /uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000  302 handled=true

There's the initial request plus a couple of HTTP 302 redirects.

I know next to nothing about Maven/Jetty etc. amy help in debugging the issue would be appreciated. I will file a PR once I get it working. While it makes the server working on OpenShift, it's still a generic Dockerfile that can be used in replacement of the existing one.

Thanks,

ClΓ©ment

No metadata in generated images

The latest server (downloaded today) outputs images without the source metadata.

$ curl -s http://localhost:8080/plantuml/png/SyfFKj2rKt3CoKnELR1Io4ZDoSclg000 > test.png
$ plantuml -metadata test.png
------------------------
test.png

null
------------------------

The plantuml.com instance and older versions (not sure how old) work fine.

Using with Nginx SSL termination proxy https -> http

Hi,

I'm trying to expose plantuml-server docker via Nginx with SSL enabled and while the cert works fine for server running on port 80 it doesn't for plantuml-server exposed on different port.

The setup seems to be called "Nginx proxy with SSL termination" and is similar to what's shown on image in https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing-with-ssl-termination.

When I address the Nginx server via http it works ok but when i use https i get the following error:

:WARN:oejh.HttpParser:qtp1732398722-13: Illegal character 0x16 in state=START for buffer HeapByteBuffer@1c1b2884[p=1,l=201,c=8192,r=200]={\x16<<<\x03\x01\x00\xC4\x01\x00\x00\xC0\x03\x03\xAd\x06\x10F\x97=K...\x00\x08\n\n\x00\x1d\x00\x17\x00\x18JJ\x00\x01\x00>>>0\r\nETag: "3m0ukyV...\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

Is there some known way to fix this? Nginx configuration seems fine and host -> docker connection is normal HTTP so there should be no problems.

Alpine-based image

I made a Linux Alpine image which seems to work just like the tomcat version but is a lot smaller (meaning it starts faster and takes less memory as well).

Here it's, and it should be easy to apply that to the Dockerfile.tomcat:

FROM tomcat:9-alpine

ENV LC_CTYPE en_US.UTF-8

RUN set -x \
    # Remove existing wars
 && rm -r /usr/local/tomcat/webapps/* \
    # Make dot executable available
 && apk add --no-cache curl graphviz ttf-dejavu \
    # Install PlantUML from http://plantuml.com/server
 && curl -Lo /usr/local/tomcat/webapps/plantuml.war http://sourceforge.net/projects/plantuml/files/plantuml.war/download \
    # Clean-up
 && apk del --purge curl

I can provide a PR, but it's just about using tomcat:9-alpine and then apk add --no-cache instead of apt-get install -y.

Compile error when running with Java 10

I am running this locally on my mac with Java 10, and the server started fine, but on first request, I am getting the following error:

Jul 11, 2018 7:28:14 PM org.apache.jasper.compiler.Compiler generateClass
SEVERE: Error compiling file: /Users/tnguyen14/github/plantuml/plantuml-server/target/tmp/jsp/org/apache/jsp/error_jsp.java
2018-07-11 19:28:14.226:WARN:oejs.ErrorPageErrorHandler:EXCEPTION
org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP||PWC6199: Generated servlet error:|Source option 5 is no longer supported. Use 6 or later.||PWC6199: Generated servlet error:|Target option 1.5 is no longer supported. Use 1.6 or later.||
        at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:126)
        at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:296)
        at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:387)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:448)

Test fails

I just cloned the repo and ran mvn package. Unfortunately it fails with:

2013-04-22 18:27:32.550:INFO:oejs.Server:jetty-8.0.4.v20111024
2013-04-22 18:27:32.564:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:32.564:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:32.569:INFO:oejs.AbstractConnector:Started SelectChannelConnector@localhost:58599 STARTING
2013-04-22 18:27:32.804:INFO:oejsl.ELContextCleaner:javax.el.BeanELResolver purged
2013-04-22 18:27:32.804:INFO:oejsh.ContextHandler:stopped o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:32.869:INFO:oejs.Server:jetty-8.0.4.v20111024
2013-04-22 18:27:32.887:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:32.887:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:32.896:INFO:oejs.AbstractConnector:Started SelectChannelConnector@localhost:58602 STARTING
2013-04-22 18:27:33.088:INFO:oejsl.ELContextCleaner:javax.el.BeanELResolver purged
2013-04-22 18:27:33.088:INFO:oejsh.ContextHandler:stopped o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:33.144:INFO:oejs.Server:jetty-8.0.4.v20111024
2013-04-22 18:27:33.158:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:33.158:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:33.165:INFO:oejs.AbstractConnector:Started SelectChannelConnector@localhost:58605 STARTING
2013-04-22 18:27:33.275:INFO:oejsl.ELContextCleaner:javax.el.BeanELResolver purged
2013-04-22 18:27:33.275:INFO:oejsh.ContextHandler:stopped o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
Tests run: 3, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.779 sec <<< FAILURE!
Running net.sourceforge.plantuml.servlet.TestSVG
2013-04-22 18:27:33.332:INFO:oejs.Server:jetty-8.0.4.v20111024
2013-04-22 18:27:33.343:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:33.343:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
2013-04-22 18:27:33.349:INFO:oejs.AbstractConnector:Started SelectChannelConnector@localhost:58607 STARTING
2013-04-22 18:27:33.405:INFO:oejsl.ELContextCleaner:javax.el.BeanELResolver purged
2013-04-22 18:27:33.405:INFO:oejsh.ContextHandler:stopped o.e.j.w.WebAppContext{/plantuml,file:/Users/tobi/Projects/java/plantumlservlet/src/main/webapp/},src/main/webapp
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.131 sec <<< FAILURE!
Running net.sourceforge.plantuml.servlet.TestUtils
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

Results :

Failed tests:
  testDefaultProxy(net.sourceforge.plantuml.servlet.TestProxy)
  testProxyWithFormat(net.sourceforge.plantuml.servlet.TestProxy)
  testSimpleSequenceDiagram(net.sourceforge.plantuml.servlet.TestSVG)

I'm on Mac 10.8.3, Java version "1.6.0_45"

any idea what is wrong? Thx

Broken Over HTTPS (Fix Provided)

When we run PlantUML Server over https, it generates broken URLs (http://server:443).

Here's a fix to apply to the master branch:

src/main/webapp/index.jsp
 <c:set var="cfg" value="${applicationScope['cfg']}" />
 <c:set var="contextroot" value="${pageContext.request.contextPath}" />
-<c:set var="hostpath" value="http://${pageContext.request.serverName}:${pageContext.request.serverPort}${contextroot}" />
-<c:if test="${pageContext.request.serverPort == 80 }">
-    <c:set var="hostpath" value="http://${pageContext.request.serverName}${contextroot}" />
+<c:if test="${
+  (pageContext.request.scheme == 'http' && pageContext.request.serverPort != 80) ||
+  (pageContext.request.scheme == 'https' && pageContext.request.serverPort != 443 ) }">
+    <c:set var="port" value=":${pageContext.request.serverPort}" />
 </c:if>
+<c:set var="hostpath" value="${pageContext.request.scheme}://${pageContext.request.serverName}${port}${contextroot}" />
 <c:if test="${!empty encoded}">
     <c:set var="imgurl" value="${hostpath}/png/${encoded}" />
     <c:set var="svgurl" value="${hostpath}/svg/${encoded}" />

Support multiple images/new page functionality

PlantUML supports the newpage mechanism that starts a new page/image for large schemas. Is it possible to generate a large image or separate images with the separate pages? At this moment only the image of the first page is returned.

I can fix this if I can find the time, but maybe it's already been taken care of?

Thanks in advance.

Generate EPS using PlantUML server

The command line version of PlantUML supports many different output options, including EPS using the -teps option, which looks better than png when included in a LaTeX document.
PlantUML server only supports png and svg output.

Remove old binary files from the repositry blobs

$ git rev-list --all --objects |     sed -n $(git rev-list --objects --all | \
    cut -f1 -d' ' | \
    git cat-file --batch-check | \
    grep blob | \
    sort -n -k 3 | \
    tail -n40 | \
    while read hash type size; do
         size_in_kibibytes=$(echo $size | awk '{ foo = $1 / 1024 ; print foo "KiB" }')
         echo -n "-e s/$hash/$size_in_kibibytes/p ";
    done) |     sort -n -k1
3.9873KiB diagram/__init__.py
3.98828KiB diagram/__init__.py
4.00195KiB diagram/__init__.py
4.02051KiB diagram/plantuml.py
4.05762KiB diagram/__init__.py
4.06055KiB diagram/__init__.py
4.06836KiB diagram/__init__.py
4.125KiB diagram/__init__.py
4.18555KiB Main.sublime-menu
4.18652KiB Main.sublime-menu
4.19531KiB diagram/plantuml.py
4.19531KiB diagram/plantuml.py
4.23242KiB Main.sublime-menu
4.25KiB diagram/plantuml.py
4.25684KiB diagram/plantuml.py
4.25977KiB diagram/plantuml.py
4.25977KiB diagram/plantuml.py
4.41211KiB Syntaxes/diagram.tmLanguage
4.45703KiB Main.sublime-menu
4.55273KiB diagram/plantuml.py
4.58691KiB Syntaxes/DiagramEx.sublime-syntax
4.7832KiB diagram/plantuml.py
5.07422KiB diagram/plantuml.py
5.08398KiB diagram/plantuml.py
5.10645KiB diagram/plantuml.py
5.11719KiB diagram/plantuml.py
5.11816KiB diagram/plantuml.py
5.12793KiB diagram/plantuml.py
5.31934KiB diagram/plantuml.py
22.5107KiB samples/component2.png
46.9346KiB samples/state1.png
63.2139KiB samples/component1.png
1585.52KiB diagram/plantuml-7232.jar
1748.09KiB diagram/plantuml-7931.jar
1942.46KiB diagram/plantuml-7958.jar
2010.62KiB diagram/plantuml-7963.jar
2162.41KiB diagram/plantuml-7981.jar
2723.62KiB diagram/plantuml-8024.jar
5379.99KiB diagram/plantuml-8050.jar
9206.35KiB diagram/plantuml-8054.jar

java.lang.IllegalArgumentException: Cannot decode webjars/codemirror/3.21/lib/codemirror.js

The server is running on AWS with mvn jetty:run command:

java.lang.IllegalArgumentException: Cannot decode webjars/codemirror/3.21/lib/codemirror.js
at net.sourceforge.plantuml.code.AsciiEncoder.decode(AsciiEncoder.java:62)
at net.sourceforge.plantuml.code.TranscoderImpl.decode(TranscoderImpl.java:69)
at net.sourceforge.plantuml.code.TranscoderSmart.decode(TranscoderSmart.java:48)
at net.sourceforge.plantuml.servlet.PlantUmlServlet.getTextFromUrl(PlantUmlServlet.java:138)
at net.sourceforge.plantuml.servlet.PlantUmlServlet.doGet(PlantUmlServlet.java:89)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:558)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:488)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:973)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:417)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:907)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
at org.eclipse.jetty.server.Server.handle(Server.java:346)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:442)
at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:924)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)

Error starting userland proxy: mkdir /port/tcp:0.0.0.0:8080:tcp:172.17.0.3:8080: input/output error

Hi,

Trying to startup a docker image and getting the following error. Any suggestions please?
I've tried both Tomcat and Jetty images.

docker run -d -p 8080:8080 plantuml/plantuml-server:jetty
d965e26e5a08c0664676b4b2aecb90e3573788b04f3e2996acf09c4fa1d68fa5
docker: Error response from daemon: driver failed programming external connectivity on endpoint practical_pare (8dc80a80905e476b95b0bc76aae7e398f343517c6f7858f40e1128b4d31d7796): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:8080:tcp:172.17.0.3:8080: input/output error.

Sometimes Missing Response-Headers for broken PNG images

Hi,
I extended the sendDiagram()method in DiagramResponse.java with 3 new headers:

void sendDiagram(String uml) throws IOException {
      if (StringUtils.isDiagramCacheable(uml)) {
         response.addHeader(HttpHeaders.CACHE_CONTROL, "public");
         response.addHeader(HttpHeaders.CACHE_CONTROL, "max-age=" + CACHE_CONTROL_MAX_AGE_IN_SECONDS);
      }
      response.addHeader("Access-Control-Allow-Origin", "*");

      response.setContentType(getContentType());

      final SourceStringReader reader = new SourceStringReader(uml);
      reader.generateImage(response.getOutputStream(), new FileFormatOption(format, false));
   }

I want this diagram to be rendered (which will fail because of the wrong syntax):

Bob -|-> Alice : hello

My expectation:

The response headers are always set and not missing.

My results:

Used: PlantUML Server / version 8037

With JMeter:
GET /plantuml/png/SyfFKj3LhT6rKt3CoKnELR1Io4ZDoSdN1G00 (broken image)
GET /plantuml/svg/SyfFKj3LhT6rKt3CoKnELR1Io4ZDoSdN1G00 (broken image)
#2000 samples each

Jetty localhost:8080

Format Keep Alive NO Keep Alive
png X OK
svg OK OK

Tomcat7 localhost:8080

Format Keep Alive NO Keep Alive
png X X
svg OK OK

X := Access-Control-Allow-Origin (and often all other response Headers) missing

docker image sometimes doesn't work with 'host unreachable'

Hi, I'm using the plantuml/plantuml-server image and the default uml works fine. If I copy and paste in this

@startuml

[*] --> NotShooting

state "Not Shooting State" as NotShooting {
  state "Idle mode" as Idle
  state "Configuring mode" as Configuring
  [*] --> Idle
  Idle --> Configuring : EvConfig
  Configuring --> Idle : EvConfig
}

note right of NotShooting : This is a note on a composite state

@enduml

It breaks with the following message - any ideas?

Wed Jun 14 21:32:07 UTC 2017
Request that failed: /uml/LOwn3i8m34HtVyMf8r9_e0CBOc1XALl54D4sYKHZrAGiY7_7ILC8aWVV-LrotUwAkjxZpA4rpC4wJUI32WCgyR2PQADNGVaInOk0J9_w-u29-nMAwdSxi1kjNkOO-IA5AMINY-HWUYtgCjhW-5or4ELX2vR4cyYnV3vRRG9u_ElTu6AiXun2ejZ9TkFfmTwAJBtf0m00
Status code: 500
Exception: javax.servlet.ServletException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Problem accessing the absolute URL "http://utils.domain.com:8082/map/LOwn3i8m34JtVCMf8r9_e0CBOc1XALl54D4sYKHZrAGiY7_7ILCmaWVV-LrotUwAkjxZJB6rHD5verI8EWwesCDcearU1HqaYfS22dtgxmCcwbSegT_jG7vqPfbJv8i8ayck52d1_5hICjhW-5mr4_Am1INnLieJVpuxOoDe_ElTu69T08z6fiZpTgFfGS6npBq_". java.net.NoRouteToHostException: No route to host (Host unreachable)

Like I said earlier, the standard blob of text works fine:

@startuml
Bob -> Alice : hello
@enduml

Support block numbers/ids in URL

Thanks for the excellent work on PlantUML. We get an incredible amount of use out of it.

Do you have any plans to support block numbers and ids in URLs? With the include directive, you can do this:

!include foo.txt!MY_OWN_ID.

It would be nice to be able to do the same with urls, like:

https://www.planttext.com/plantuml/img/SoWkIImg?block=MY_OWN_ID

Use PlantUML behind a reverse proxy

Hi everyone,

i try to use plantUML behind a reverse proxy and have some problems with it.

My plantuml server ist running at:
http://plantuml.pcf.tld/

The request for plantuml goes to:
http://intra.domain.tld/plantuml which reverse proxys requests to
http://plantuml.pcf.tld/

Direct Requests to png/svg are working, for example:
http://intra.domain.tld/plantuml/png/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 -> works fine

What is not working are links in the jsp singlepage application.

Whent i try to access: http://intra.domain.tld/plantuml/
it redirects to http://intra.domain.tld/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 -> which is the wrong context root ("uml" instead of "plantuml").

When i try to access the singlepage application with a direkt request like:
http://intra.domain.tld/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000
the page loads, but all links in build against the wrong URL ( it builds the links against http://plantuml.pcf.tld instead of http://intra.domain.tld/plantuml )

I would really like to use the jsp singlepage with the reverse Proxy. I have not found a way to fix this.
The index.jsp gets the host URI from:
<c:set var="hostpath" value="${scheme}://${pageContext.request.serverName}${port}${contextroot}" />

As the server where plantuml is running is not the same that delivers the webpages, this does not work for my scenario.

Can you make the baseurl where plantuml is building on configurable or have any advice for me?

plantuml-stdlib is not included with this server

I've started server using docker

docker run -d -p 8080:8080 plantuml/plantuml-server:jetty

and tried to render example from plantuml-stdlib on my local server:

@startuml
!include <aws/common>
!include <aws/Storage/AmazonS3/AmazonS3>
!include <aws/Storage/AmazonS3/bucket/bucket>

AMAZONS3(s3_internal)
AMAZONS3(s3_partner,"Vendor's S3")
s3_internal <- s3_partner
@enduml

but got an error:

image


It works correctly on the official server.

Using a different context path than root

Hello, I was trying to run the server on a different path than root, but since the the .war file was named ROOT.war it was impossible for me. I have changed this so now is possible to do it at build time like this:

docker image build --build-arg context_path=name_of_dot_war_file -t plantuml-server .

This is was my solution:

  • ARG context_path=ROOT
  • RUN rm -rf /usr/local/tomcat/webapps/ROOT
  • COPY --from=builder /app/target/plantuml.war /usr/local/tomcat/webapps/ROOT.war+
  • COPY --from=builder /app/target/plantuml.war /usr/local/tomcat/webapps/${context_path}.war

This is obiviously not the best solution since I can't run the server on for example /my/context/path, just in /my_context_path

I think that this was supported before d7a8a7e

Thank you for your help!

unicode error

Can not correctly recognize chinese character
group

But it works fine in online demo of official website.

The server version i use is 201709

Retrieve source from image via server?

I frequently post PlantUML diagrams on StackExchange that are direct URLs to the PlantUML.com server. Because of past problems with services that go off line and negatively affect StackExchange experience, they want the images to be hosted on stack.imgur.com.

I know that there's a PlantUML jar command, but I'm wondering how to get it through the server.

    -metadata       To retrieve PlantUML sources from PNG images

If so, we could do stuff like draw.io does: example

I tested (locally) with http://i.stack.imgur.com/HJvKF.png and -metadata recovers the source. It's just a question of providing a server hook.

latest version

We wanted to install puml-server for integration to gitlab.
As per https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/administration/integration/plantuml.md, we did
git clone https://github.com/plantuml/plantuml-server.git
This built version 1.2017.14.

But I bet the latest is 1.2017.15 from
http://sourceforge.net/projects/plantuml/files/plantuml.war/download, as explained at http://plantuml.com/server.

If github doesn't have the latest version of plantuml-server, I believe it is actually harmful.

Beta Gantt feature not available in docker server

Hi,

I encounter an error when trying to draw Gantt (beta, I know) diagrams even with the demo diagram code available on plantuml site.

@startgantt
[Prototype design] lasts 15 days
[Test prototype] lasts 10 days
@endgantt

Neither Image, txt or svg format works.
Image shows a square with only "plantuml diagram" text.
SVG and TXT format throw the following error :

Sorry, but things didn't work out as planned.

Fri Dec 01 12:19:01 UTC 2017
Request that failed: /txt/SoWkIImgIK_CAodXYWueoY_9BwaiI5L8IItEJC-BLSX9B2ufLZ0qLKX9h2pcYWv9BIvHA82fWaiRGAGTKlDIm2O10000
Status code: 500
Exception: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Is it implemented in this docker release ?
Il use the latest image from docker hub.

$ docker pull plantuml/plantuml-server:jetty
jetty: Pulling from plantuml/plantuml-server
Digest: sha256:2f630034b6875e08904e3d74e09a5ee25b88fd5afb16034031ef8e235d4b22ca
Status: Image is up to date for plantuml/plantuml-server:jetty

Thanks.

Emojis in UML Diagrams

Emojis, as cute and silly as they seem are to me a very powerful means of providing a quick summary of what I want to display.

Unfortunately it's currently not possible to include emojis in plantuml diagrams:

@startuml
usecase "πŸ›  Implement the changes" as Implement

:Company: --> Implement
@enduml

The above does not generate the desired UML Image.

Current Result

sowkiimgastduiejjareb4vlkfemv_o21s_swfpktdiy4emiz5i5v8p4lfjkoym5n6a431unbnd-ra5yngmlwgwk7pa4gsfu2ix8bw00

Desired result

sowkiimgastduiejjareb4vlkd9j00fft8asrdpkl1a5aenkxuicnbpqr68bxshyx0mnbvlpvcv1obwbboakhxsix4dgnwh8k2u0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.