2. Using Piperack
Running pipelines with Piperack is performed through a RESTful web services API. The examples that follow use curl, but any tool that supports the ability to GET and POST resources to a web service will work.
Important
When running, Piperack has all of the privileges of the user who started it. Just because you could allow the public to access it, doesn't mean you should. Your gun, your bullet, your foot.
When started, Piperack listens for requests
on the configured port. In the examples that follow, it is running on
“localhost
” on port “8088
”. If you're running
it on a different machine or port, adjust the examples accordingly.
For most endpoints, content negotiation is used to determine how the results should be returned. XML, HTML, plain text, and JSON are all supported. Endpoints that return the outputs of a pipeline after it has been run always return XML.
Our example pipeline for this section is pipe.xpl
:
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
xmlns:ex="http://example.com/ns/example"
name="main" version="1.0" exclude-inline-prefixes="ex">
<p:input port="source" sequence="true"/>
<p:input port="parameters" kind="parameter"/>
<p:output port="result" sequence="true" primary="true"/>
<p:output port="result2" sequence="true">
<p:pipe step="id" port="result"/>
</p:output>
<p:option name="opt1" select="'default'"/>
<p:option name="ex:opt2" select="'default'"/>
<p:serialization port="result" indent="true"/>
<p:identity name="id"/>
</p:declare-step>
It doesn't do anything useful, it simply copies its input to two different output ports.
2.1. /status
The /status
endpoint just returns information about the
status of the server. Only GET is supported.
$
curl -H "Accept: text/plain" http://localhost:8088/status
XML Calabash version 1.0.14a, an XProc processor.
Running on Saxon version 9.5.1.1, EE edition.
Copyright © 2007-2013 Norman Walsh
See docs/notices/NOTICES in the distribution for licensing.
See also http://xmlcalabash.com/ for more information.
2.2. /help
(or just /
)
The /help
endpoint returns a summary of the valid endpoints
only GET is supported.
2.3. /pipelines
A new pipeline is added to the server by POSTing it to the
/pipelines
endpoint. The user can suggest an ID with the
name
parameter. (If the requested name is in use,
a different, unique name will be returned.)
$
curl -X POST -d@pipe.xpl http://localhost:8088/pipelines?name=mypipe
<response xmlns="http://xmlcalabash.com/ns/piperack">
<code>201</code>
<expires>2013-10-25T15:49:04Z</expires>
<uri>http://localhost:8088/pipelines/mypipe</uri>
<message>Created http://localhost:8088/pipelines/mypipe</message>
</response>
The response also includes the HTTP Location header, pointing to the newly minted URI for the pipeline.
All pipelines get an expiration time when they are created. Periodically, the server will delete any pipelines that are past their expiration time.
The default expiration time can be set in several ways, see
Section 34, “Piperack configuration”. The expires
parameter
can be used to specify a different expiration time for any particular pipeline
when it is created. If -1 is specified, the pipeline will never expire.
Performing a GET on /pipelines
returns a list of the pipelines
available.
$
curl -H "Accept: application/json" http://localhost:8088/pipelines
{"pipelines":["http://localhost:8088/pipelines/mypipe"]}
2.4. /pipelines/{id}
Performing a GET on /pipelines/{id}
returns information
about the pipeline:
$
curl http://localhost:8088/pipelines/mypipe
<pipeline xmlns="http://xmlcalabash.com/ns/piperack">
<uri>http://localhost:8088/pipelines/mypipe</uri>
<has-run>false</has-run>
<input documents="0">source</input>
<input primary="true" documents="0">parameters</input>
<option>
<name>opt1</name>
<value default="true"/>
</option>
<option>
<name xmlns:ex="http://example.com/ns/example">ex:opt2</name>
<value default="true"/>
</option>
</pipeline>
The exact information returned varies depending on the state of the pipeline (before or after it has been run) and on the state of the various inputs, outputs, options, and parameters.
As we shall see, there are individual endpoints for sending documents to the pipeline, setting options, setting parameters, and running the pipeline. However, you can post directly to the pipeline URI.
POSTing multipart/form-data
according to RFC 2388
to /pipelines/{id}
has the following effects:
-
Each uploaded document is delievered to the named input port. It is an error if the pipeline has no such port.
-
Any POSTed data that isn't an uploaded document is treated as the value of a named option or parameter.
POSTing a single document to /pipelines/{id}
has the
following effects:
-
The POSTed document is delivered to the pipeline's primary input port. It is an error if the pipeline does not have a primary input port.
-
Any parameters passed as part of the URI are delivered to the pipeline as the values of named options or parameters.
By default simple name=value
pairs posted
to the pipeline are treated as named options.
To specify a parameter, use a
name of the form -pparameter-name
. By default
the parameter will be written to the primary parameter input port.
To specify a particular port explicitly, use a field name of the form
-pport@parameter-name
.
Use fields of the form
xmlns:
to specify namespace bindings,
if necessary.prefix
After the POSTed data is processed, the pipeline is run.
If the pipeline runs successfully, the first document on the pipeline's primary output port is returned. If the pipeline has no primary output port, nothing is returned.
For example:
$
curl -X POST -F "source=@doc.xml;type=application/xml" -F "opt1=somevalue" http://localhost:8088/pipelines/mypipe
<doc/>
Or
$
curl -X POST -H "Content-type: application/xml" -d @doc.xml "http://localhost:8088/pipelines/mypipe&opt1=somevalue"
<doc/>
2.5. /pipelines/{id}/inputs/{port}
POSTing to /pipelines/{id}/inputs/{port}
delivers the POSTed
document to the specified port.
2.6. /pipelines/{id}/options
POSTing to /pipelines/{id}/options
delivers the POSTed
parameters (from the application/x-www-form-urlencoded
body or from the URI) to the pipeline as options.
$
curl -X POST "http://localhost:8088/pipelines/mypipe/options?xmlns:x=http://example.com/ns/example&x:opt2=two&opt1=one"
<response xmlns="http://xmlcalabash.com/ns/piperack">
<code>202</code>
<message>Options added: opt1, x:opt2</message>
</response>
The pipeline information endpoint will now show that those values have been specified.
$
curl http://localhost:8088/pipelines/mypipe
<pipeline xmlns="http://xmlcalabash.com/ns/piperack">
<uri>http://localhost:8088/pipelines/mypipe</uri>
<has-run>false</has-run>
<input primary="true" documents="0">source</input>
<input documents="0">parameters</input>
<option>
<name>opt1</name>
<value>one</value>
</option>
<option>
<name xmlns:ex="http://example.com/ns/example">ex:opt2</name>
<value>two</value>
</option>
</pipeline>
2.7. /pipelines/{id}/options/{option}
POSTing to /pipelines/{id}/options/{option}
sets the value
of the option named “{option}
” to the POSTed
content. This option exists to support the “general values” extension; it's
otherwise not necessary.
If the option name is in a namespace, use a parameter of the form
xmlns:
on the URI to specify
the namespace binding.prefix
2.8. /pipelines/{id}/parameters
POSTing to /pipelines/{id}/parameters
delivers the POSTed
parameters (from the application/x-www-form-urlencoded
body or from the URI) to the pipeline as parameters.
This endpoint uses the primary parameter input port.
2.9. /pipelines/{id}/parameters/{port}
POSTing to /pipelines/{id}/parameters/{port}
delivers the POSTed
parameters (from the application/x-www-form-urlencoded
body or from the URI) to the pipeline as parameters on the
“{port}
” parameter input port.
2.10. /pipelines/{id}/parameters/{port}/{param}
POSTing to /pipelines/{id}/parameters/{port}/{param}
sets the value
of the option named “{param}
” to the POSTed
content. This option exists to support the “general values” extension; it's
otherwise not necessary.
If the parameter name is in a namespace, use a parameter of the form
xmlns:
on the URI to specify
the namespace binding.prefix
2.11. /pipelines/{id}/run
POSTing to the /pipelines/{id}/run
endpoint runs
the pipeline and returns the first document on the primary output port.
The pipeline information endpoint will now show outputs instead of inputs.
$
curl http://localhost:8088/pipelines/mypipe
<pipeline xmlns="http://xmlcalabash.com/ns/piperack">
<uri>http://localhost:8088/pipelines/mypipe</uri>
<has-run>true</has-run>
<output primary="true" documents="0">result</output>
<output documents="1">result2</output>
</pipeline>
2.12. /pipelines/{id}/outputs/{port}
After a pipeline has been run, a GET request to
/pipelines/{id}/outputs/{port}
returns the next document
from the specified port.
$
curl http://localhost:8088/pipelines/mypipe/outputs/result2
<doc/>
2.13. /pipelines/{id}/reset
POSTing to /pipelines/{id}/reset
resets the pipeline: deletes
all inputs, outputs, options, and parameters.
2.14. /stop
POSTing to /stop
stops Piperack.