menu | weight | title |
---|---|---|
main |
101 |
Changelog |
Maintenance branches are merged before each new release. This change log is ordered chronologically, so each release contains all changes described below it.
- #3093: Fix connection leak in PoolManager
- #2639: Fix leaking sensitive headers in server RequestLogger
- cats-1.6.1
- jetty-9.4.19.v20190610
- tomcat-9.0.21
- #2453: Fix bug in blaze-client that unnecessarily recycled connections.
- jetty-9.4.15.v20190215
- log4s-1.7.0
- metrics-4.0.5
- mockito-2.25.1 (test only)
- scodec-bits-1.1.9
- tomcat-9.0.17
- #2389: Add
RequestKey
to Logging when eviction is necessary
- #2231: Fix off-by-one error that lets blaze-client wait queue grow one past its limit
- #2181: Honor
redactHeadersWhen
in clientRequestLogger
middleware
- #2178: Redact sensitive headers by default in
Retry
middleware. AddretryWithRedactedHeaders
function that parameterizes the headers predicate.
- #2147: Fix link to v0.19 docs
- #2130: Build with scala-2.12.7 and sbt-1.2.3
- #2101:
haveHeaders
checks by equality, not reference - #2117: Handle unsuccessful responses in
JavaNetClient
- #2116: Test against OpenJDK 11. Retire Oracle JDK 10.
- #2048: Correct misleading logging in
Retry
middleware
- #2078: Replace generic exception on full wait queue with new
WaitQueueFullFailure
- #2095: Add
Monoid[UrlForm]
instance
- cats-1.4.0
- fs2-0.10.6
- jetty-9.4.12.v20180830
- tomcat-9.0.12
- Accumulate errors in
OptionalMultiQueryParamDecoderMatcher
#2000 - New http4s-scalatags module #2002
- Resubmit bodies in
Retry
middleware where allowed by policy #2001 - Dependency upgrades:
- play-json-3.6.10 (for Scala 2.12)
- tomcat-9.0.11
- Fix regression for
AutoSlash
when nested in aRouter
#1948 - Respect
redactHeadersWhen
inLogger
middleware #1952 - Capture
BufferPoolsExports
in prometheus server middleware #1977 - Make
Referer
header extractable #1984 - Log server startup banner in a single call to prevent interspersion #1985
- Add support module for play-json #1946
- Introduce
TranslateUri
middleware, which checks the prefix of the service it's translating against the request. DeprecatedURITranslation
, which chopped the prefix length without checking for a match. #1964 - Dependency upgrades:
- cats-1.2.0
- metrics-4.0.3
- okhttp-3.11.0
- prometheus-client-0.5.0
- scodec-bits-1.1.6
- Bugfix for
AutoSlash
Middleware in Router #1937 - Add
StaticHeaders
middleware that appends static headers to a service #1939
- Add
CirceEntityCodec
to provide an implicitEntityEncoder
orEntityDecoder
from anEncoder
orDecoder
, respectively. #1917 - Add a client backend based on
java.net.HttpURLConnection
. Note that this client blocks and is primarily intended for use in a REPL. #1882 - Dependency upgrades:
- jetty-9.4.11
- tomcat-9.0.10
- Downcase type in
MediaRange
generator #1907 - Fixed bug where
PoolManager
would try to dequeue from an empty queue #1922 - Dependency upgrades:
- argonaut-6.2.2
- fs2-0.10.5
- Deprecated
Part.empty
#1858 - Log requests with an unconsumed body #1861
- Log requests when the service returns
None
or raises an error #1875 - Support streaming parsing of multipart and storing large parts as temp files #1865
- Add an OkHttp client, with HTTP/2 support #1864
- Add
Host
header to requests toClient.fromHttpService
if the request URI is absolute #1874 - Log
"service returned None"
or"service raised error"
in serviceResponseLogger
when the service does not produce a successful response #1879 - Dependency upgrades:
- jetty-9.4.10.v20180503
- json4s-3.5.4
- tomcat-9.0.8
- Prevent zero-padding of servlet input chunks #1835
- Fix deadlock in client loggers.
RequestLogger.apply
andResponseLogger.apply
are each replaced byapply0
to maintain binary compatibility. #1837 - New
http4s-boopickle
module supports entity codecs throughboopickle.Pickler
#1826 - Log as much of the response as is consumed in the client. Previously, failure to consume the entire body prevented any part of the body from being logged. #1846
- Dependency upgrades:
- prometheus-client-java-0.4.0
- Eliminate dependency on Macro Paradise and macro-compat #1816
- Add
Logging
middleware for client #1820 - Make blaze-client tick wheel executor lazy #1822
- Dependency upgrades:
- cats-effect-0.10.1
- fs2-0.10.4
- specs2-4.1.0
- Log any exceptions when writing the header in blaze-server for HTTP/1 #1781
- Drain the response body (thus running its finalizer) when there is an error writing a servlet header or body #1782
- Clean up logging of errors thrown by services. Prevents the possible swallowing of errors thrown during
renderResponse
in blaze-server andHttp4sServlet
#1783 - Fix
Uri.Scheme
parser for schemes beginning withhttp
other thanhttps
#1790 - Fix blaze-client to reset the connection start time on each invocation of the
F[DisposableResponse]
. This fixes the "timeout after 0 milliseconds" error. #1792 - Depdency upgrades:
- blaze-0.12.13
- http4s-websocket-0.2.1
- specs2-4.0.4
- tomcat-9.0.7
- Improved ScalaDoc for BlazeBuilder #1775
- Added a stream constructor for async-http-client #1776
- http4s-prometheus-server-metrics project created. Prometheus Metrics middleware implemented for metrics on http4s server. Exposes an HttpService ready to be scraped by Prometheus, as well pairing to a CollectorRegistry for custom metric registration. #1778
- Multipart parser defaults to fields interpreted as utf-8. #1767
- Fix parsing of multipart bodies across chunk boundaries. #1764
- Add
&
extractor to http4s-dsl. #1758 - Deprecate
EntityEncoder[F, Future[A]]
. TheEntityEncoder
is strict in its argument, which causes any side effect of theFuture
to execute immediately. Wrap yourfuture
inIO.fromFuture(IO(future))
instead. #1759 - Dependency upgrades:
- circe-0.9.3
- Deprecate old
Timeout
middleware methods in favor of new ones that useFiniteDuration
and cancel timed out effects #1725 - Add
expectOr
methods to client for custom error handling on failed expects #1726 - Replace buffered multipart parser with a streaming version. Deprecate all uses of fs2-scodec. #1727
- Dependency upgrades:
- blaze-0.12.2
- fs2-0.10.3
- log4s-1.6.1
- jetty-9.4.9.v20180320
- Remove duplicate logging in pool manager [#1683]((#1683)
- Add request/response specific properties to logging #1709
- Dependency upgrades:
- async-http-client-2.0.39
- cats-1.1.0
- cats-effect-0.10
- circe-0.9.2
- discipline-0.9.0
- jawn-fs2-0.12.2
- log4s-1.5.0
- twirl-1.3.15
- Qualify reference to
identity
inuriLiteral
macro #1697 - Make
Retry
use the correct duration units #1698 - Dependency upgrades:
- tomcat-9.0.6
- Fix the rendering of trailer headers in blaze #1629
- Fix race condition between shutdown and parsing in Http1SeverStage #1675
- Don't use filter in
Arbitrary[``Content-Length``]
#1678 - Opt-in fallthrough for authenticated services #1681
- Dependency upgrades:
- cats-effect-0.9
- fs2-0.10.2
- fs2-reactive-streams-0.5.1
- jawn-fs2-0.12.1
- specs2-4.0.3
- tomcat-9.0.5
- twirl-1.3.4
- Add
filename
method toPart
- Dependency upgrades:
- fs2-0.10.0
- fs2-reactive-streams-0.5.0
- jawn-fs2-0.12.0
- Emit Exit Codes On Server Shutdown #1638 #1637
- Register Termination Signal and Frame in Http4sWSStage #1631
- Trailer Headers Are Now Being Emitted Properly #1629
- Dependency Upgrades:
- alpn-boot-8.1.12.v20180117
- circe-0.9.1
- fs2-0.10.0-RC2
- fs2-reactive-streams-0.3.0
- jawn-fs2-0.12.0-M7
- metrics-4.0.2
- tomcat-9.0.4
- Dependency Upgrades:
- argonaut-6.2.1
- circe-0.9.0
- fs2-0.10.0-M11
- fs2-reactive-streams-0.2.8
- jawn-fs2-0.12.0-M6
- cats-1.0.1
- cats-effect-0.8
- Relax various typeclass constraints from
Effect
toSync
orAsync
. #1587 - Operate on
Segment
instead ofChunk
#1588EntityDecoder.collectBinary
andEntityDecoder.binary
now returnSegment[Byte, Unit]
instead ofChunk[Byte]
.- Add
EntityDecoder.binaryChunk
. - Add
EntityEncoder.segmentEncoder
. http4sMonoidForChunk
replaced byhttp4sMonoidForSegment
.
- Add new generators for core RFC 2616 types. #1593
- Undo obsolete copying of bytes in
StaticFile.fromURL
. #1202 - Optimize conversion of
Chunk.Bytes
andByteVectorChunk
to `ByteBuffer. #1602 - Rename
read
tosend
andwrite
toreceive
in websocket model. #1603 - Remove
MediaRange
mutableRegistry
and addHttpCodec[MediaRange]
instance #1597 - Remove
Monoid[Segment[A, Unit]]
instance, which is now provided by fs2. #1609 - Introduce
WebSocketBuilder
to buildWebSocket
responses. Allows headers (e.g.,Sec-WebSocket-Protocol
) on a successful handshake, as well as customization of the response to failed handshakes. #1607 - Don't catch exceptions thrown by
EntityDecoder.decodeBy
. Complain loudly in logs about exceptions thrown byHttpService
rather than raised inF
. #1592 - Make
abnormal-terminations
andservice-errors
Metrics names plural. #1611 - Refactor blaze client creation. #1523
Http1Client.apply
returnsF[Client[F]]
Http1Client.stream
returnsStream[F, Client[F]]
, bracketed to shut down the client.PooledHttp1Client
constructor is deprecated, replaced by the above.SimpleHttp1Client
is deprecated with no direct equivalent. UseHttp1Client
.
- Improve client timeout and wait queue handling
requestTimeout
andresponseHeadersTimeout
begin from the submission of the request. This includes time spent in the wait queue of the pool. #1570- When a connection is
invalidate
d, try to unblock a waiting request under the same key. Previously, the wait queue would only be checked on recycled connections. - When the connection pool is closed, allow connections in the wait queue to complete.
- Changes to Metrics middleware. #1612
- Decrement the active requests gauge when no request matches
- Don't count non-matching requests as 4xx in case they're composed with other services.
- Don't count failed requests as 5xx in case they're recovered elsewhere. They still get recorded as
service-error
s.
- Dependency upgrades:
- async-http-client-2.0.38
- cats-1.0.0.RC2
- circe-0.9.0-M3
- fs2-0.10.0-M10
- fs2-jawn-0.12.0-M5
- fs2-reactive-streams-0.2.7
- scala-2.10.7 and scala-2.11.12
- Tested on Java 9.
Message.withContentType
now takes aContent-Type
instead of anOption[`Content-Type`]
.withContentTypeOption
takes anOption
, andwithoutContentType
clears it.QValue
has anHttpCodec
instanceAuthMiddleware
never falls through. See #1530 for more.ContentCoding
is no longer aRegistry
, but has anHttpCodec
instance.- Render a banner on server startup. Customize by calling
withBanner(List[String])
orwithoutBanner
on theServerBuilder
. - Parameterize
isZippable
as a predicate of theResponse
inGZip
middleware. - Add constant for
application/vnd.api+json
MediaType. - Limit memory consumption in
GZip
middleware - Add
handleError
,handleErrorWith
,bimap
,biflatMap
,transform
, andtransformWith
toEntityDecoder
. org.http4s.util.StreamApp
andorg.http4s.util.ExitCode
are deprecated in favor offs2.StreamApp
andfs2.StreamApp.ExitCode
, based on what was in http4s.- Dependency upgrades:
- fs2-0.10.0-M9
- fs2-reactive-streams-0.2.6
- jawn-fs2-0.12.0-M4
- specs2-4.0.2
- Fix
StaticFile
to serve files larger thanInt.MaxValue
bytes - Dependency upgrades:
- tomcat-8.5.24
- Add a CSRF server middleware
- Fix
NullPointerException
when starting a Tomcat server related todocBase
- Log version info and server address on server startup
- Dependency upgrades:
- jetty-9.4.8.v20171121
- log4s-1.4.0
- scalaz-7.2.17
- twirl-1.3.13
- Introduced an
HttpCodec
type class that represents a type that can round trip to and from aString
.Uri.Scheme
andTransferCoding
are the first implementors, with more to follow. Added anHttpCodecLaws
to http4s-testing. Uri.Scheme
is now its own type instead of a type alias.TransferCoding
is no longer a case class. Itscoding
member is now aString
, not aCaseInsensitiveString
. Its companion is no longer aRegistry
.- Introduced
org.http4s.syntax.literals
, which contains aStringContext
forAll safely constructing aUri.Scheme
. More will follow. org.http4s.util.StreamApp.ExitCode
moved toorg.http4s.util.ExitCode
- Changed
AuthService[F[_], T]
toAuthService[T, F[_]]
to support partial unification when combining services as aSemigroupK
. - Unseal the
MessageFailure
hierarchy. Previous versions of http4s had aGenericParsingFailure
,GenericDecodeFailure
, andGenericMessageBodyFailure
. This was not compatible with the parameterized effect introduced in v0.18. Now,MessageFailure
is unsealed, so users wanting precise control over the defaulttoHttpResponse
can implement their own failure conditions. MessageFailure
now has anOption[Throwable]
cause.- Removed
KleisliInstances
. TheSemigroupK[Kleisli[F, A, ?]]
is now provided by cats. Users should no longer need to importorg.http4s.implicits._
to get<+>
composition ofHttpService
s NonEmptyList
extensions moved fromorg.http4s.util.nonEmptyList
toorg.http4s.syntax.nonEmptyList
.- There is a classpath difference in log4s version between blaze and http4s in this milestone that will be remedied in M6. We believe these warnings are safe.
- Dependency upgrades:
- cats-1.0.0-RC1
- fs2-0.10.0-M8
- fs2-reactive-streams-0.2.5
- Syntax for building requests moved from
org.http4s.client._
toorg.http4s.client.dsl.Http4sClientDsl[F]
, with concrete typeIO
available asorg.http4s.client.dsl.io._
. This is consistent with http4s-dsl for servers. - Change
StreamApp
to return aStream[F, ExitCode]
. The first exit code returned by the stream is the exit code of the JVM. This allows custom exit codes, and eases dead code warnings in certain constructions that involved mapping overNothing
. AuthMiddleware.apply
now takes anKleisli[OptionT[F, ?], Request[F], T]
instead of aKleisli[F, Request[F], T]
.- Set
Content-Type
header on defaultNotFound
response. - Merges from v0.16.5 and v0.17.5.
- Remove mutable map that backs
Method
registry. All methods in the IANA registry are available throughMethod.all
. Custom methods should be memoized by other means. - Adds an
EntityDecoder[F, Array[Byte]]
andEntityDecoder[F, Array[Char]]
for symmetry with providedEntityEncoder
instances. - Adds
Arbitrary
instances forHeaders
,EntityBody[F]
(currently just single chunk),Entity[F]
, andEntityEncoder[F, A]
. - Adds
EntityEncoderLaws
forEntityEncoder
. - Adds
EntityCodecLaws
. "EntityCodec" is not a type in http4s, but these laws relate anEntityEncoder[F, A]
to anEntityDecoder[F, A]
. - There is a classpath difference in log4s version between blaze and http4s in this milestone that will be remedied in M6. We believe these warnings are safe.
- Merges only.
- Correctly implement sanitization of dot segments in static file paths
according to RFC 3986 5.2.4. Most importantly, this fixes an issue where
...
is reinterpreted as..
and can escape the root of the static file service.
- Merges only.
- There is a classpath difference in log4s version between blaze and http4s in this milestone that will be remedied in M6. We believe these warnings are safe.
- Fix reading of request body in non-blocking servlet backend. It was previously only reading the first byte of each chunk.
- Dependency upgrades:
- fs2-reactive-streams-0.1.1
- Backport removal
java.xml.bind
dependency fromGZip
middleware, to play more nicely with Java 9. - Dependency upgrades:
- metrics-core-3.2.5
- tomcat-8.0.23
- twirl-1.3.12
- Use http4s-dsl with any effect type by either:
- extend
Http4sDsl[F]
- create an object that extends
Http4sDsl[F]
, and extend that. import org.http4s.dsl.io._
is still available for those who wish to specialize oncats.effect.IO
- extend
- Remove
Semigroup[F[MaybeResponse[F]]]
constraint fromBlazeBuilder
. - Fix
AutoSlash
middleware when a service is mounted with a prefix. - Publish internal http4s-parboiled2 as a separate module. This does
not add any new third-party dependencies, but unbreaks
sbt publishLocal
. - Add
Request.from
, which respectsX-Fowarded-For
header. - Make
F
inEffectMessageSyntax
invariant - Add
message.decodeJson[A]
syntax to replace awkwardmessage.as(implicitly, jsonOf[A])
. Brought into scope by importing one of the following, based on your JSON library of choice.import org.http4s.argonaut._
import org.http4s.circe._
import org.http4s.json4s.jackson._
import org.http4s.json4s.native._
AsyncHttpClient.apply
no longer takes abufferSize
. It is made irrelevant by fs2-reactive-streams.MultipartParser.parse
no longer takes aheaderLimit
, which was unused.- Add
maxWaitQueueLimit
(default 256) andmaxConnectionsPerRequestKey
(default 10) toPooledHttp1Client
. - Remove private implicit
ExecutionContext
fromStreamApp
. This had been known to cause diverging implicit resolution that was hard to debug. - Shift execution of the routing of the
HttpService
to theExecutionContext
provided by theJettyBuilder
orTomcatBuilder
. Previously, it only shifted the response task and stream. This was a regression from v0.16. - Add two utility execution contexts. These may be used to increase throughput
as the server builder's
ExecutionContext
. Blocking calls on routing may decrease fairness or even deadlock your service, so use at your own risk:org.http4s.util.execution.direct
org.http4s.util.execution.trampoline
- Deprecate
EffectRequestSyntax
andEffectResponseSyntax
. These were previously used to provide methods such as.putHeaders
and.withBody
on typesF[Request]
andF[Response]
. As an alternative:- Call
.map
or.flatMap
onF[Request]
andF[Response]
to get access to all the same methods. - Variadic headers have been added to all the status code generators in
Http4sDsl[F]
and method generators inimport org.http4s.client._
. For example:POST(uri, urlForm, Header("Authorization", "Bearer s3cr3t"))
Ok("This will have an html content type!", `Content-Type`(`text/html`))
- Call
- Restate
HttpService[F]
as aKleisli[OptionT[F, ?], Request[F], Response[F]]
. - Similarly,
AuthedService[F]
as aKleisli[OptionT[F, ?], AuthedRequest[F], Response[F]]
. MaybeResponse
is removed, because the optionality is now expressed through theOptionT
inHttpService
. Instead of composingHttpService
via aSemigroup
, compose via aSemigroupK
. Importorg.http4s.implicits._
to get aSemigroupK[HttpService]
, and chain services ass1 <+> s2
. We hope to remove the need fororg.http4s.implicits._
in a future version of cats with issue 1428.- The
Service
type alias is deprecated in favor ofKleisli
. It used to represent a partial application of the first type parameter, but since version 0.18, it is identical to `Kleisli. HttpService.lift
,AuthedService.lift
are deprecated in favor ofKleisli.apply
.- Remove
java.xml.bind
dependency fromGZip
middleware to avoid an extra module dependency in Java 9. - Upgraded dependencies:
- jawn-fs2-0.12.0-M2
- log4s-1.4.0
- There is a classpath difference in log4s version between blaze and http4s in this milestone that will be remedied in M6. We believe these warnings are safe.
- Shift execution of HttpService to the
ExecutionContext
provided by theBlazeBuilder
when using HTTP/2. Previously, it only shifted the response task and body stream.
- Fix
java.io.IOException: An invalid argument was supplied
on blaze-client for Windows when writing an empty sequence ofByteBuffer
s. - Set encoding of
captureWriter
to UTF-8 instead of the platform default. - Dependency upgrades:
- blaze-0.12.9
- Remove private implicit strategy from
StreamApp
. This had been known to cause diverging implicit resolution that was hard to debug. - Shift execution of HttpService to the
ExecutionContext
provided by theBlazeBuilder
. Previously, it only shifted the response stream. This was a regression from 0.16. - Split off http4s-parboiled2 module as
"org.http4s" %% "parboiled"
. There are no externally visible changes, but this simplifies and speeds the http4s build.
- Dependency patch upgrades:
- async-http-client-2.0.37
- blaze-0.12.8: changes default number of selector threads to
from
2 * cores + 1
tomax(4, cores + 1)
. - jetty-9.4.7.v20170914
- tomcat-8.5.21
- twirl-1.3.7
- Fix bug where metrics were not captured in
Metrics
middleware. - Pass
redactHeadersWhen
argument fromLogger
toRequestLogger
andResponseLogger
.
- Publish our fork of parboiled2 as http4s-parboiled2 module. It's
the exact same internal code as was in http4s-core, with no external
dependencies. By publishing an extra module, we enable a
publishLocal
workflow. - Charset fixes:
- Deprecate
CharsetRange.isSatisfiedBy
in favor of andAccept-Charset`.isSatisfiedBy`` in favor of
Accept-Charset`.satisfiedBy``. - Fix definition of
satisfiedBy
to respect priority of ```Charset`.*``. - Add
CharsetRange.matches
.
- Deprecate
- ContentCoding fixes:
- Deprecate
ContentCoding.satisfiedBy
andContentCoding.satisfies
in favor of ```Accept-Encoding`.satisfiedBy``. - Deprecate ```Accept-Encoding`.preferred``, which has no reasonable interpretation in the presence of splats.
- Add ```Accept-Language`.qValue``.
- Fix definition of
satisfiedBy
to respect priority ofContentCoding.*
. - Add
ContentCoding.matches
andContentCoding.registered
. - Add
Arbitrary[ContentCoding]
and ```Arbitrary[Accept-Encoding
]`` instances.
- Deprecate
- LanguageTag fixes:
- Deprecate
LanguageTag.satisfiedBy
andLanguageTag.satisfies
in favor of ```Accept-Language`.satisfiedBy``. - Fix definition of
satisfiedBy
to respect priority ofLanguageTag.*
and matches of a partial set of subtags. - Add
LanguageTag.matches
. - Deprecate
LanguageTag.withQuality
in favor of newLanguageTag.withQValue
. - Deprecate ```Accept-Language`.preferred``, which has no reasonable interpretation in the presence of splats.
- Add ```Accept-Language`.qValue``.
- Add
Arbitrary[LanguageTag]
and ```Arbitrary[Accept-Language
]`` instances.
- Deprecate
- Honor
Retry-After
header inRetry
middleware. The response will not be retried until the maximum of the backoff strategy and any time specified by theRetry-After
header of the response. - The
RetryPolicy.defaultRetriable
only works for methods guaranteed to not have a body. In fs2, we can't introspect the stream to guarantee that it can be rerun. To retry requests for idempotent request methods, useRetryPolicy.unsafeRetriable
. To retry requests regardless of method, useRetryPolicy.recklesslyRetriable
. - Fix
Logger
middleware to render JSON bodies as text, not as a hex dump. MultipartParser.parse
returns a stream ofByteVector
instead of a stream ofByte
. This perserves chunking when parsing into the high-levelEntityDecoder[Multipart]
, and substantially improves performance on large files. The high-level API is not affected.
Retry
middleware takes aRetryPolicy
instead of a backoff strategy. ARetryPolicy
is a function of the request, the response, and the number of attempts. Wrap the previousbackoff
inRetryPolicy {}
for compatible behavior.- Expose a
Part.fileData
constructor that accepts anEntityBody
.
- In blaze-server, when doing chunked transfer encoding, flush the header as soon as it is available. It previously buffered until the first chunk was available.
- Add a
responseHeaderTimeout
property toBlazeClientConfig
. This measures the time between the completion of writing the request body to the reception of a complete response header. - Upgraded dependencies:
- async-http-client-2.0.35
This release is the product of a long period of parallel development across different foundation libraries, making a detailed changelog difficult. This is a living document, so if any important points are missed here, please send a PR.
The most important change in http4s-0.18 is that the effect type is
parameterized. Where previous versions were specialized on
scalaz.concurrent.Task
or fs2.Task
, this version supports anything
with a cats.effect.Effect
instance. The easiest way to port an
existing service is to replace your Task
with cats.effect.IO
,
which has a similar API and is already available on your classpath.
If you prefer to bring your own effect, such as monix.eval.Task
or
stick to scalaz.concurrent.Task
or put a transformer on IO
, that's
fine, too!
The parameterization chanages many core signatures throughout http4s:
Request
andResponse
becomeRequest[F[_]]
andResponse[F[_]]
. TheF
is the effect type of the body (i.e.,Stream[F, Byte]
), or what the body.run
s to.HttpService
becomesHttpService[F[_]]
, so that the service returns anF[Response[F]]
. Instead of constructing withHttpService { ... }
, we now declare the effect type of the service, likeHttpService[IO] { ... }
. This determines the type of request and response handled by the service.EntityEncoder[A]
andEntityDecoder[A]
are nowEntityEncoder[F[_], A]
andEntityDecoder[F[_], A]
, respectively. These act as a codec forRequest[F]
andResponse[F]
. In practice, this change tends to be transparent in the DSL.- The server builders now take an
F
parameter, which needs to match the services mounted to them. - The client now takes an
F
parameter, which determines the requests and responses it handles.
Several dependencies are upgraded:
- cats-1.0.0.MF
- circe-0.9.0-M1
- fs2-0.10.0-M6
- fs2-reactive-streams-0.2.2
- jawn-fs2-0.12.0-M1
- Remove
ServiceSyntax.orNotFound(a: A): Task[Response]
in favor ofServiceSyntax.orNotFound: Service[Request, Response]
- Move http4s-blaze-core from
org.http4s.blaze
toorg.http4s.blazecore
to avoid a conflict with the non-http4s blaze-core module. - Change
ServiceOps
to operate on aService[?, MaybeResponse]
. Give it anorNotFound
that returns aService
. TheorNotFound(a: A)
overload is left for compatibility with Scala 2.10. - Build with Lightbend compiler instead of Typelevel compiler so we
don't expose
org.typelevel
dependencies that are incompatible with ntheir counterparts inorg.scala-lang
. - Upgraded dependencies:
- blaze-0.12.7 (fixes eviction notice in http4s-websocket)
- twirl-1.3.4
- Port
ChunkAggregator
to fs2 - Add logging middleware
- Standardize on
ExecutionContext
overStrategy
andExecutorService
- Implement
Age
header - Fix
Client#toHttpService
to not dispose until the body is consumed - Add a buffered implementation of
EntityDecoder[Multipart]
- In async-http-client, don't use
ReactiveStreamsBodyGenerator
unless there is a body to transmit. This fixes anIllegalStateException: unexpected message type
- Add
HSTS
middleware - Add option to serve pre-gzipped resources
- Add RequestLogging and ResponseLogging middlewares
StaticFile
options returnOptionT[Task, ?]
- Set
Content-Length
orTransfer-Encoding: chunked
header when serving from a URL - Explicitly close `URLConnection``s if we are not reading the contents
- Upgrade to:
- async-http-client-2.0.34
- fs2-0.9.7
- metrics-core-3.2.4
- scodec-bits-1.1.5
- Remove laziness from
ArbitraryInstances
- Support an arbitrary predicate for CORS allowed origins
- Support
Access-Control-Expose-Headers
header for CORS - Fix thread safety issue in
EntityDecoder[XML]
- Support IPV6 headers in
X-Forwarded-For
- Add
status
andsuccessful
methods to client - Overload
client.fetchAs
andclient.streaming
to accept aTask[Request]
- Replace
Instant
withHttpDate
to avoid silent truncation and constrain to dates that are legally renderable in HTTP. - Fix bug in hash code of
CaseInsensitiveString
- Update
request.pathInfo
when changingrequest.withUri
. To keep these values in sync,request.copy
has been deprecated, but copy constructors based onwith
have been added. - Remove
name
fromAttributeKey
. - Add
withFragment
andwithoutFragment
toUri
- Construct
Content-Length
withfromLong
to ensure validity, andunsafeFromLong
when you can assert that it's positive. - Add missing instances to
QueryParamDecoder
andQueryParamEncoder
. - Add
response.cookies
method to get a list of cookies fromSet-Cookie
header.Set-Cookie
is no longer aHeader.Extractable
, as it does not adhere to the HTTP spec of being concatenable by commas without changing semantics. - Make servlet
HttpSession
available as a request attribute in servlet backends - Fix
Part.name
to return the name from theContent-Disposition
header instead of the name of theContent-Disposition
header. Accordingly, it is no longer aCaseInsensitiveString
Request.toString
andResponse.toString
now redact sensitive headers. A method to redact arbitrary headers is added toHeaders
.Retry-After
is now modeled as aEither[HttpDate, Long]
to reflect either an http-date or delta-seconds value.- Look for index.html in
StaticFile
when rendering a directory instead of returning401 Unauthorized
. - Limit dates to a minimum of January 1, 1900, per RFC.
- Add
serviceErrorHandler
toServerBuilder
to allow pluggable error handlers when a server backend receives a failed task or a thrown Exception when invoking a service. The default callstoHttpResponse
onMessageFailure
and closes the connection with a500 InternalServerError
on other non-fatal errors. Fatal errors are left to the server. FollowRedirect
does not propagate sensitive headers when redirecting to a different authority.- Add Content-Length header to empty response generators
- Upgraded dependencies:
- async-http-client-2.0.34
- http4s-websocket-0.2.0
- jetty-9.4.6.v20170531
- json4s-3.5.3
- log4s-1.3.6
- metrics-core-3.2.3
- scala-2.12.3-bin-typelevel-4
- scalaz-7.2.15
- tomcat-8.5.20
- Backport rendering of details in
ParseFailure.getMessage
- Oops. Same as v0.15.14.
- Close parens in
Request.toString
- Use "message" instead of "request" in message body failure messages
- Add
problem+json
media type - Tolerate
[
and]
in queries parsing URIs. These characters are parsed, but percent-encoded.
- Fix file corruption issue when serving static files from the classpath
- Fix
WebjarService
so it matches assets. ServerApp
overridesprocess
to leave a single abstract method- Add gzip trailer in
GZip
middleware - Upgraded dependencies:
- circe-0.8.0
- jetty-9.4.5.v20170502
- scalaz-7.2.13
- tomcat-8.5.15
ProcessApp
uses aProcess[Task, Nothing]
rather than aProcess[Task, Unit]
Credentials
is split intoCredentials.AuthParams
for key-value pairs andCredentials.Token
for legacy token-based schemes.OAuthBearerToken
is subsumed byCredentials.Token
.BasicCredentials
no longer extendsCredentials
, but is extractable from one. This model permits the definition of other arbitrary credential schemes.- Add
fromSeq
constructor toUrlForm
- Allow
WebjarService
to pass on methods other thanGET
. It previously threw aMatchError
.
- Patch-level upgrades to dependencies:
- async-http-client-2.0.32
- blaze-0.12.6 (fixes infinite loop in some SSL handshakes)
- jetty-9.3.19.v20170502
- json4s-3.5.2
- tomcat-8.0.44
- Fix GZip middleware to render a correct stream
Timeout
middleware takes an implicitScheduler
andExecutionContext
- Bring back
http4s-async-client
, based onfs2-reactive-stream
- Restore support for WebSockets
- Upgraded dependencies:
- argonaut-6.2
- jetty-9.4.4.v20170414
- tomcat-8.5.14
- Fix
ProcessApp
to terminate on process errors - Set
secure
request attribute correctly in blaze server - Exit with code
-1
whenProcessApp
fails - Make
ResourceService
respectIf-Modified-Since
- Rename
ProcessApp.main
toProcessApp.process
to avoid overload confusio - Avoid intermediate String allocation in Circe's
jsonEncoder
- Adaptive EntityDecoder[Json] for circe: works directly from a ByteBuffer for small bodies, and incrementally through jawn for larger.
- Capture more context in detail message of parse errors
- Upgrade to blaze-0.12.5 to pick up fix for
StackOverflowError
in SSL handshake
- Patch-level upgrades to dependencies
- argonaut-6.2
- scalaz-7.2.12
- Allow preambles and epilogues in multipart bodies
- Limit multipart headers to 40 kilobytes to avoid unbounded buffering of long lines in a header
- Remove
' '
and'?'
from alphabet for generated multipart boundaries, as these are not token characters and are known to cause trouble for some multipart implementations - Fix multipart parsing for unlucky input chunk sizes
- Terminate
ServerApp
even if the server fails to start - Make
ResourceService
respectIf-Modified-Since
- Patch-level upgrades to dependencies:
- async-http-client-2.0.31
- jetty-9.3.18.v20170406
- json4s-3.5.1
- log4s-1.3.4
- metrics-core-3.1.4
- scalacheck-1.13.5
- scalaz-7.1.13 or scalaz-7.2.11
- tomcat-8.0.43
- First release on cats and fs2
- All scalaz types and typeclasses replaced by cats equivalengts
scalaz.concurrent.Task
replaced byfs2.Task
scalaz.stream.Process
replaced byfs2.Stream
- Roughly at feature parity with v0.16.0-M1. Notable exceptions:
- Multipart not yet supported
- Web sockets not yet supported
- Client retry middleware can't check idempotence of requests
- Utilties in
org.http4s.util.io
not yet ported
- Fix type of
AuthedService.empty
- Eliminate
Fallthrough
typeclass. AnHttpService
now returnsMaybeResponse
, which can be aResponse
orPass
. There is aSemigroup[MaybeResponse]
instance that allowsHttpService
s to be chained as a semigroup.service orElse anotherService
is deprecated in favor ofservice |+| anotherService
. - Support configuring blaze and Jetty servers with a custom
SSLContext
. - Upgraded dependencies for various modules:
- async-http-client-2.0.31
- circe-0.7.1
- jetty-9.4.3.v20170317
- json4s-3.5.1
- logback-1.2.1
- log4s-1.3.4
- metrics-3.2.0
- scalacheck-1.13.5
- tomcat-8.0.43
- Deprecate
EntityEncoder[ByteBuffer]
andEntityEncoder[CharBuffer]
. - Add
EntityDecoder[Unit]
. - Move
ResponseClass
es intoStatus
. - Use
SSLContext.getDefault
by default in blaze-client. UseBlazeServerConfig.insecure
to ignore certificate validity. But please don't. - Move
CaseInsensitiveString
syntax toorg.http4s.syntax
. - Bundle an internal version of parboiled2. This decouples core from shapeless, allowing applications to use their preferred version of shapeless.
- Rename
endpointAuthentication
tocheckEndpointAuthentication
. - Add a
WebjarService
for serving files out of web jars. - Implement
Retry-After
header. - Stop building with
delambdafy
on Scala 2.11. - Eliminate finalizer on
BlazeConnection
. - Respond OK to CORS pre-flight requests even if the wrapped service
does not return a successful response. This is to allow
CORS
pre-flight checks of authenticated services. - Deprecate
ServerApp
in favor oforg.http4s.util.ProcessApp
. AProcessApp
is easier to compose all the resources a server needs viaProcess.bracket
. - Implement a
Referer
header.
- Cache charset lookups to avoid synchronization. Resolution of charsets is synchronized, with a cache size of two. This avoids the synchronized call on the HTTP pool.
- Strip fragment from request target in blaze-client. An HTTP request
target should not include the fragment, and certain servers respond
with a
400 Bad Request
in their presence.
- Change default server and client executors to a minimum of four threads.
- Bring scofflaw async-http-client to justice for its brazen violations of Reactive Streams Rule 3.16, requesting of a null subscription.
- Destroy Tomcat instances after stopping, so they don't hold the port
- Deprecate
ArbitraryInstances.genCharsetRangeNoQuality
, which can cause deadlocks - Patch-level upgrades to dependencies:
- async-http-client-2.0.30
- jetty-9.3.16.v20170120
- logback-1.1.11
- metrics-3.1.3
- scala-xml-1.0.6
- scalaz-7.2.9
- tomcat-8.0.41
- twirl-1.2.1
- Log unhandled MessageFailures to
org.http4s.server.message-failures
- Allow services wrapped in CORS middleware to fall through
- Don't log message about invalid CORS headers when no
Origin
header present - Soften log about invalid CORS headers from info to debug
- Call
toHttpResponse
on tasks failed withMessageFailure
s fromHttpService
, to get proper 4xx handling instead of an internal server error.
- Dispose of redirect responses in
FollowRedirect
. Fixes client deadlock under heavy load - Refrain from logging headers with potentially sensitive info in blaze-client
- Add
hashCode
andequals
toHeaders
- Make
challenge
in auth middlewares public to facilitate composing multiple auth mechanisms - Fix blaze-client detection of stale connections
- Add helpers to add cookies to requests
- Backport rendering of details in
ParseFailure.getMessage
Backport rendering of details inOops.ParseFailure.getMessage
- Fix GZip middleware to fallthrough non-matching responses
- Fix UnsupportedOperationException in Arbitrary[Uri]
- Upgrade to Scala 2.12.1 and Scalaz 7.2.8
- Add support for Scala 2.12
- Added
Client.fromHttpService
to assist with testing. - Make all case classes final where possible, sealed where not.
- Codec for Server Sent Events (SSE)
- Added JSONP middleware
- Improve Expires header to more easily build the header and support parsing of the header
- Replce lazy
Raw.parsed
field with a simple null check - Added support for Zipkin headers
- Eliminate response attribute for detecting fallthrough response.
The fallthrough response must be
Response.fallthrough
. - Encode URI path segments created with
/
- Introduce
AuthedRequest
andAuthedService
types. - Replace
CharSequenceEncoder
withCharBufferEncoder
, assuming thatCharBuffer
andString
are the onlyCharSequence
s one would want to encode. - Remove
EnittyEncoder[Char]
andEntityEncoder[Byte]
. Send an array, buffer, or String if you want this. - Add
DefaultHead
middleware forHEAD
implementation. - Decouple
http4s-server
from Dropwizard Metrics. Metrics code is in the newhttp4s-metrics
module. - Allow custom scheduler for timeout middleware.
- Add parametric empty
EntityEncoder
andEntityEncoder[Unit]
. - Replace unlawful
Order[CharsetRange]
withEqual[CharsetRange]
. - Auth middlewares renamed
BasicAuth
andDigestAuth
. BasicAuth
passes client password to store instead of requesting password from store.- Remove realm as an argument to the basic and digest auth stores.
- Basic and digest auth stores return a parameterized type instead of just a String username.
- Upgrade to argonaut-6.2-RC2, circe-0.6.1, json4s-3.5.0
- Fix expansion of
uri
andq
macros by qualifying with_root_
- Include timeout type and duration in blaze client timeouts
- Don't use
"null"
as query string in servlet backends for requests without a query string
- Allow param names in UriTemplate to have encoded, reserved parameters
- Upgrade to blaze-0.12.1, to fix OutOfMemoryError with direct buffers
- Upgrade to Scalaz 7.1.10/7.2.6
- Upgrade to Jetty 9.3.12
- Upgrade to Tomcat 8.0.37
- Retry middleware now only retries requests with idempotent methods and pure bodies and appropriate status codes
- Fix bug where redirects followed when an effectful chunk (i.e.,
Await
) follows pure ones. - Don't uppercase two hex digits after "%25" when percent encoding.
- Tolerate invalid percent-encodings when decoding.
- Omit scoverage dependencies from POM
- Don't treat
Kill
ed responses (i.e., HEAD requests) as abnormal termination in metrics
- Fix blaze-client handling of HEAD requests
- Don't render trailing "/" for URIs with empty paths
- Avoid calling tail of empty list in
/:
extractor
- Follow 301 and 302 responses to POST with a GET request.
- Follow all redirect responses to HEAD with a HEAD request.
- Fix bug where redirect response is disposed prematurely even if not followed.
- Fix bug where payload headers are sent from original request when following a redirect with a GET or HEAD.
- Return a failed task instead of throwing when a client callback throws an exception. Fixes a resource leak.
- Always render
Date
header in GMT. - Fully support the three date formats specified by RFC 7231.
- Always specify peer information in blaze-client SSL engines
- Patch upgrades to latest async-http-client, jetty, scalaz, and scalaz-stream
- Override
getMessage
inUnexpectedStatus
- Added the possibility to specify custom responses to MessageFailures
- Address issue with Retry middleware leaking connections
- Fixed the status code for a semantically invalid request to
422 UnprocessableEntity
- Rename
json
tojsonDecoder
to reduce possibility of implicit shadowing - Introduce the
ServerApp
trait - Deprectate
onShutdown
andawaitShutdown
inServer
- Support for multipart messages
- The Path extractor for Long now supports negative numbers
- Upgrade to scalaz-stream-0.8.2(a) for compatibility with scodec-bits-1.1
- Downgrade to argonaut-6.1 (latest stable release) now that it cross builds for scalaz-7.2
- Upgrade parboiled2 for compatibility with shapeless-2.3.x
- Recalled. Use v0.14.1 instead.
- Address issue with Retry middleware leaking connections.
- Pass the reason string when setting the
Status
for a successfulParseResult
.
- Fixes the CanBuildFrom for RequestCookieJar to avoid duplicates.
- Update version of jawn-parser which contains a fix for Json decoding.
- Remove implicit resolution of
DefaultExecutor
in blaze-client.
- Add support for scalaz-7.2.x (use version 0.13.0a).
- Add a client backed based on async-http-client.
- Encode keys when rendering a query string.
- New entity decoder based on json4s' extract.
- Content-Length now accepts a Long.
- Upgrade to circe-0.3, json4s-3.3, and other patch releases.
- Fix deadlocks in blaze resulting from default executor on single-CPU machines.
- Refactor
DecodeFailure
into a newRequestFailure
hierarchy. - New methods for manipulating
UrlForm
. - All parsed headers get a
parse
method to construct them from their value. - Improve error message for unsupported media type decoding error.
- Introduce
BlazeClientConfig
class to simplify client construction. - Unify client executor service semantics between blaze-client and async-http-client.
- Update default response message for UnsupportedMediaType failures.
- Add a
lenient
flag to blazee configuration to accept illegal characters in headers. - Remove q-value from
MediaRange
andMediaType
, replaced byMediaRangeAndQValue
. - Add
address
toServer
trait. - Lazily construct request body in Servlet NIO to support HTTP 100.
- Common operations pushed down to
MessageOps
. - Fix loop in blaze-client when no connection can be established.
- Privatize most of the blaze internal types.
- Enable configuration of blaze server parser lengths.
- Add trailer support in blaze client.
- Provide an optional external executor to blaze clients.
- Fix Argonaut string interpolation
- Fix bug on rejection of invalid URIs.
- Do not send
Transfer-Encoding
orContent-Length
headers for 304 and others. - Don't quote cookie values.
- Upgrade to jawn-0.8.4 to fix decoding escaped characters in JSON.
Upgrade to jawn-0.8.4 to fix decoding escaped characters in JSON.Oops.
- Encode keys as well as values when rendering a query.
- Don't encode '?' or '/' when encoding a query.
- Refactor the client API for resource safety when not reading the entire body.
- Rewrite client connection pool to support maximum concurrent connections instead of maximum idle connections.
- Optimize body collection for better connection keep-alive rate.
- Move
Service
andHttpService
, because aClient
can be viewed as aService
. - Remove custom
DateTime
in favor ofjava.time.Instant
. - Support status 451 Unavailable For Legal Reasons.
- Various blaze-client optimizations.
- Don't let Blaze
IdentityWriter
write more than Content-Length bytes. - Remove
identity
Transfer-Encoding
, which was removed in HTTP RFC errata. - In blaze,
requireClose
is now the return value ofwriteEnd
. - Remove body from
Request.toString
andResponse.toString
. - Move blaze parser into its own class.
- Trigger a disconnect if an ignored body is too long.
- Configurable thread factories for happier profiling.
- Fix possible deadlock in default client execution context.
- Blaze upgrade to fix parsing HTTP responses without a reason phrase.
- Don't write more than Content-Length bytes in blaze.
- Fix infinite loop in non-blocking Servlet I/O.
- Never write a response body on HEAD requests to blaze.
- Add missing
'&'
between multivalued k/v pairs inUrlFormCodec.encode
- Fix stack safety issue in async servlet I/O.
- Reduce noise from timeout exceptions in
ClientTimeoutStage
. - Address file descriptor leaks in blaze-client.
- Fix
FollowRedirect
middleware for 303 responses. - Support keep-alives for client requests with bodies.
- Honor
connectorPoolSize
andbufferSize
parameters inBlazeBuilder
. - Add convenient
ETag
header constructor. - Wait for final chunk to be written before closing the async context in non-blocking servlet I/O.
- Upgrade to jawn-streamz-0.7.0 to use scalaz-stream-0.8 across the board.
- Upgrade to scalaz-stream 0.8
- Add Circe JSON support module.
- Add ability to require content-type matching with EntityDecoders.
- Cleanup blaze-client internals.
- Handle empty static files.
- Add ability to disable endpoint authentication for the blaze client.
- Add charset encoding for Argonaut JSON EntityEncoder.
- Processes render data in chunked encoding by default.
- Incorporate type name into error message of QueryParam.
- Comma separate Access-Control-Allow-Methods header values.
- Default FallThrough behavior inspects for the FallThrough.fallthroughKey.
- Replace
PartialService
with theFallthrough
typeclass andorElse
syntax. - Rename
withHeaders
toreplaceAllHeaders
- Set https endpoint identification algorithm when possible.
- Stack-safe
ProcessWriter
in blaze. - Configureable number of connector threads and buffer size in blaze-server.
- Trampoline recursive calls in blaze ProcessWriter.
- Handle server hangup and body termination correctly in blaze client.
- Bump http4s-websockets to 1.0.3 to properly decode continuation opcode.
- Fix metrics incompatibility when using Jetty 9.3 backend.
- Preserve original headers when appending as opposed to quoting.
- Preserve original headers when appending as opposed to quoting.
- Upgrade to jawn-0.8.3 to avoid transitive dependency on GPL2 jmh
- Fix bug in servlet nio handler.
- Require Java8.
StaticFile
uses the filename extension exclusively to determine media-type.- Add
/
method toUri
. - Add
UrlFormLifter
middleware to aggregate url-form parameters with the query parameters. - Add local address information to the
Request
type. - Add a Http method 'or' (
|
) extractor. - Add
VirtualHost
middleware for serving multiple sites from one server. - Add websocket configuration to the blaze server builder.
- Redefine default timeout status code to 500.
- Redefine the
Service
arrow result fromTask[Option[_]]
toTask[_]
. - Don't extend
AllInstances
withHttp4s
omnibus import object. - Use UTF-8 as the default encoding for text bodies.
- Numerous bug fixes by numerous contributors!
- Honor the buffer size parameter in gzip middleware.
- Handle service exceptions in servlet backends.
- Respect asyncTimeout in servlet backends.
- Fix prefix mounting bug in blaze-server.
- Do not apply CORS headers to unsuccessful OPTIONS requests.
- Fix bug parsing IPv4 addresses found in URI construction.
- Patch instrumented handler for Jetty to time async contexts correctly.
- Fix race condition with timeout registration and route execution in blaze client
- Replace
ConcurrentHashMap
with synchronizedHashMap
instaticcontent
package. - Fix static content from jars by avoiding
"//"
in path uris when serving static content. - Quote MediaRange extensions.
- Upgrade to jawn-streamz-0.5.0 and blaze-0.8.2.
- Improve error handling in blaze-client.
- Respect the explicit default encoding passed to
decodeString
.
- Authentication middleware integrated into the server package.
- Static content tools integrated into the server package.
- Rename HttpParser to HttpHeaderParser and allow registration and removal of header parsers.
- Make UrlForm EntityDecoder implicitly resolvable.
- Relax UrlForm parser strictness.
- Add 'follow redirect' support as a client middleware.
- Add server middleware for auto retrying uris of form '/foo/' as '/foo'.
- Numerous bug fixes.
- Numerous version bumps.
- Mistake. Go straight to v0.8.1.
- Add QueryParamMatcher to the dsl which returns a ValidationNel.
- Dsl can differentiate between '/foo/' and '/foo'.
- Added http2 support for blaze backend.
- Added a metrics middleware usable on all server backends.
- Websockets are now modeled by an scalaz.stream.Exchange.
- Add
User-Agent
andAllow
header types and parsers. - Allow providing a Host header to the blaze client.
- Upgrade to scalaz-stream-7.0a.
- Added a CORS middleware.
- Numerous bug fixes.
- Numerous version bumps.
- Fix bug in Request URI on servlet backend with non-empty context or servlet paths.
- Allow provided Host header for Blaze requests.
- Avoid loading javax.servlet.WriteListener when deploying to a servlet 3.0 container.
- Forgot to pull origin before releasing. Use v0.6.4 instead.
- Use the thread pool provided to the Jetty servlet builder.
- Avoid throwing exceptions when parsing headers.
- Make trailing slash insignificant in service prefixes on servlet containers.
- Fix mapping of servlet query and mount prefix.
- Update to blaze-0.5.1
- Remove unneeded error message (90b2f76097215)
- GZip middleware will not throw an exception if the AcceptEncoding header is not gzip (ed1b2a0d68a8)
- Remove ResponseBuilder in favor of Response companion.
- Allow '';'' separators for query pairs.
- Make charset on Message an Option.
- Add a
flatMapR
method to EntityDecoder. - Various enhancements to QueryParamEncoder and QueryParamDecoder.
- Make Query an IndexedSeq.
- Add parsers for Location and Proxy-Authenticate headers.
- Move EntityDecoder.apply to
Request.decode
andRequest.decodeWith
- Move headers into
org.http4s.headers
package. - Make UriTranslation respect scriptName/pathInfo split.
- New method to resolve relative Uris.
- Encode query and fragment of Uri.
- Codec and wrapper type for URL-form-encoded bodies.
- Add SSL support to all server builders.
- Add Date header to blaze-server responses.
- Close connection when error happens during body write in blaze-server.
- Use asynchronous servlet I/O on Servlet 3.1 containers.
- ServletContext syntax for easy mounting in a WAR deployment.
- Support Dropwizard Metrics collection for servlet containers.
- Empty strings are a JSON decoding error.
- Add codec instances for Argonaut's CodecJson.
- Add codec instances for Json4s' Reader/Writer.
- New module to support Twirl templates
- Split scala-xml support into http4s-scala-xml module.
- Change inferred type of
scala.xml.Elem
toapplication/xml
.
- Support for signing oauth-1 requests in client.
- Fix blaze-client when receiving HTTP1 response without Content-Length header.
- Change default blaze-client executor to variable size.
- Fix problem with blaze-client timeouts.
- Upgrade to blaze 0.4.1 to fix header parsing issue in blaze http/1.x client and server.
- Upgrade to argonaut-6.1-M5 to match jawn. #157
- Upgrade to jawn-0.7.2. Old version of jawn was incompatible with argonaut. [#157]](#157)
- Include context path in calculation of scriptName/pathInfo. #140
- Fix bug in UriTemplate for query params with multiple keys.
- Fix StackOverflowError in query parser. #147
- Allow ';' separators for query pairs.
- Client syntax has evloved and now will include Accept headers when used with EntityDecoder
- Parse JSON with jawn-streamz.
- EntityDecoder now returns an EitherT to make decoding failure explicit.
- Renamed Writable to EntityEncoder
- New query param typeclasses for encoding and decoding query strings.
- Status equality now discards the reason phrase.
- Match AttributeKeys as singletons.
- Added async timeout listener to servlet backends.
- Start blaze server asynchronously.
- Support specifying timeout and executor in blaze-client.
- Use NIO for encoding files.
- Fix whitespace parsing in Authorization header #87
Uri.query
andUri.fragment
are no longer decoded. #75
- Change HttpService form a
PartialFunction[Request,Task[Response]]
toService[Request, Response]
, a type that encapsulates aRequest => Task[Option[Response]]
- Upgrade to scalaz-stream-0.6a
- Upgrade to blaze-0.3.0
- Drop scala-logging for log4s
- Refactor ServerBuilders into an immutable builder pattern.
- Add a way to control the thread pool used for execution of a Service
- Modernize the Renderable/Renderer framework
- Change Renderable append operator from ~ to <<
- Split out the websocket codec and types into a seperate package
- Added ReplyException, an experimental way to allow an Exception to encode a default Response on for EntityDecoder etc.
- Many bug fixes and slight enhancements
- New client API with Blaze implementation
- Upgrade to scalaz-7.1.0 and scalaz-stream-0.5a
- JSON Writable support through Argonaut and json4s.
- Add EntityDecoders for parsing bodies.
- Moved request and response generators to http4s-dsl to be more flexible to other frameworks'' syntax needs.
- Phased out exception-throwing methods for the construction of various model objects in favor of disjunctions and macro-enforced literals.
- Refactored imports to match the structure followed by scalaz.
- Scala 2.11 support
- Spun off http4s-server module. http4s-core is neutral between server and the future client.
- New builder for running Blaze, Jetty, and Tomcat servers.
- Configurable timeouts in each server backend.
- Replace Chunk with scodec.bits.ByteVector.
- Many enhancements and bugfixes to URI type.
- Drop joda-time dependency for slimmer date-time class.
- Capitalized method names in http4s-dsl.
- Initial public release.