com.seanshubin.http.values:http-values-domain

HTTP as a pure function

License

License

Categories

Categories

Doma Data ORM
GroupId

GroupId

com.seanshubin.http.values
ArtifactId

ArtifactId

http-values-domain
Last Version

Last Version

1.0.1
Release Date

Release Date

Type

Type

jar
Description

Description

com.seanshubin.http.values:http-values-domain
HTTP as a pure function

Download http-values-domain

How to add to project

<!-- https://jarcasting.com/artifacts/com.seanshubin.http.values/http-values-domain/ -->
<dependency>
    <groupId>com.seanshubin.http.values</groupId>
    <artifactId>http-values-domain</artifactId>
    <version>1.0.1</version>
</dependency>
// https://jarcasting.com/artifacts/com.seanshubin.http.values/http-values-domain/
implementation 'com.seanshubin.http.values:http-values-domain:1.0.1'
// https://jarcasting.com/artifacts/com.seanshubin.http.values/http-values-domain/
implementation ("com.seanshubin.http.values:http-values-domain:1.0.1")
'com.seanshubin.http.values:http-values-domain:jar:1.0.1'
<dependency org="com.seanshubin.http.values" name="http-values-domain" rev="1.0.1">
  <artifact name="http-values-domain" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.seanshubin.http.values', module='http-values-domain', version='1.0.1')
)
libraryDependencies += "com.seanshubin.http.values" % "http-values-domain" % "1.0.1"
[com.seanshubin.http.values/http-values-domain "1.0.1"]

Dependencies

compile (2)

Group / Artifact Type Version
org.scala-lang : scala-library jar 2.12.3
javax.servlet : javax.servlet-api jar 4.0.0

test (1)

Group / Artifact Type Version
org.scalatest : scalatest_2.12 jar 3.0.4

Project Modules

There are no modules declared in this project.

Http Values

Http without mutable state

Rationale

Java's servlet api is designed around side effects on the response. It has a signature like this:

javax.servlet.Servlet
public void service(ServletRequest req,
                    ServletResponse res)
             throws ServletException,
                    java.io.IOException

I wanted to treat the http request/response process as a function, like so

// Client
trait Sender {
  def send(request: RequestValue): ResponseValue
}

// Server
trait Receiver {
  def receive(request: RequestValue): ResponseValue
}

This allows implementors to test pure functions rather than dealing with streams.

There is also a good bit of support for handling dispatch in a testable way. A server can compose a bunch of named receivers together, an be confident that any path collisions will fail immediately with a sensible error message, rather than having an arbitrary receiver pick up the request.

Limitations

  • The request and response values are reified immediately. This is usually not a problem unless your application typically ignores large portions of the request or response and thus could be optimized by waiting until they needed to be reified.
  • By design, this library does not handle streaming. If you need streaming this is the wrong tool for the job.

Versions

Version
1.0.1
1.0