Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge 0.23 -> main #6250

Merged
merged 57 commits into from Apr 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
82cab4b
Update sbt-http4s-org to 0.13.1 in series/0.22
scala-steward Mar 27, 2022
737c00c
Cleanup site config
armanbilge Mar 27, 2022
c8b39eb
Use tryScheduling within IdleTimeoutStage
hamnis Mar 28, 2022
7b6ba1d
Use in the Http1Connection
danicheg Mar 30, 2022
c79654b
Merge pull request #6197 from scala-steward/update/series/0.22/sbt-ht…
rossabaker Mar 31, 2022
49ad2c2
Merge pull request #6198 from hamnis/0-22/blaze-idletimeout-fix
rossabaker Mar 31, 2022
31841da
Create optimization target
armanbilge Mar 31, 2022
8da371c
Fix the mime loader and make it reproducible
armanbilge Mar 31, 2022
e8ca12e
lazy val -> def for mime constants
armanbilge Mar 31, 2022
064b0f3
Revert "lazy val -> def for mime constants"
armanbilge Mar 31, 2022
d52a9a8
DRY
armanbilge Mar 31, 2022
7e9540e
Use lazy val for extensionMap
armanbilge Mar 31, 2022
6e167bb
Don't link MimeDB on JS
armanbilge Mar 31, 2022
6d70be7
Temporarily publish snapshots from PR
armanbilge Mar 31, 2022
1327969
Update tomcat-catalina, tomcat-coyote, ... to 9.0.62 in series/0.22
scala-steward Apr 1, 2022
bb505f7
[ci skip] Pin http4s-crypto to 0.1.x
armanbilge Apr 1, 2022
b86bb23
[ci skip] undo spurious change
armanbilge Apr 1, 2022
2d1dcaf
Merge pull request #6218 from http4s/0.22-pin-crypto
rossabaker Apr 1, 2022
99f6f49
Update jetty-client, jetty-http, ... to 9.4.46.v20220331 in series/0.22
scala-steward Apr 1, 2022
d48681d
Merge pull request #6214 from scala-steward/update/series/0.22/tomcat…
rossabaker Apr 2, 2022
894b755
Merge pull request #6220 from scala-steward/update/series/0.22/jetty-…
rossabaker Apr 2, 2022
47ee693
Revert "Temporarily publish snapshots from PR"
armanbilge Apr 2, 2022
3d15b80
Revert "Create optimization target"
armanbilge Apr 2, 2022
fea209f
Add/improve comments
armanbilge Apr 2, 2022
a6c6d60
Revert "Revert "Create optimization target""
armanbilge Apr 2, 2022
128f141
Add test for JS artifact size
armanbilge Apr 2, 2022
0c9c431
Test gzip size instead
armanbilge Apr 2, 2022
73752aa
Strengthen bound on JS size, improve comment
armanbilge Apr 2, 2022
8789200
Update scalafmt-core to 3.5.0 in series/0.22
scala-steward Apr 2, 2022
57e0980
Reformat with scalafmt 3.5.0
scala-steward Apr 2, 2022
7f0e937
Update cats-parse to 0.3.7 in series/0.22
scala-steward Apr 2, 2022
b127da5
Regenerate workflow
armanbilge Apr 2, 2022
b162f65
scalafix
armanbilge Apr 2, 2022
eb8e13a
Merge pull request #6224 from scala-steward/update/series/0.22/cats-p…
rossabaker Apr 2, 2022
cc2b033
[ci skip] cats-parse comes from 0.22
rossabaker Apr 2, 2022
dfb064a
Merge pull request #6223 from scala-steward/update/series/0.22/scalaf…
rossabaker Apr 2, 2022
4689d0a
Merge pull request #6226 from rossabaker/cats-parse-from-0.22
armanbilge Apr 2, 2022
ceafc2d
Merge branch 'series/0.22' into series/0.23
rossabaker Apr 2, 2022
75acde9
Refactor the Http1Connection.receiveResponse
danicheg Apr 2, 2022
930ca15
Merge pull request #6208 from danicheg/blaze-client-async-tweak
danicheg Apr 2, 2022
7ca6dc1
Merge pull request #6211 from http4s/issue/5273
armanbilge Apr 2, 2022
461e462
Merge pull request #6227 from rossabaker/merge-0.22-20220402
rossabaker Apr 3, 2022
6c11218
Update cats-effect, cats-effect-laws, ... to 3.3.10 in series/0.23
scala-steward Apr 3, 2022
3eecd71
Merge pull request #6231 from scala-steward/update/series/0.23/cats-e…
armanbilge Apr 4, 2022
01f2fd9
Ignore scala-xml updates
danicheg Apr 4, 2022
27cc8cd
Merge pull request #6236 from danicheg/scala-steward-conf
danicheg Apr 4, 2022
038a95e
Remove war example
rossabaker Apr 4, 2022
3d5c83b
Regenerate workflow
rossabaker Apr 4, 2022
433ecc4
Merge pull request #6238 from rossabaker/remove-war
rossabaker Apr 5, 2022
f3e1c82
Use null-initializers in MimeDB
armanbilge Apr 5, 2022
2d05a57
Use null initializers in MediaType
armanbilge Apr 5, 2022
9358286
Hush MiMa
armanbilge Apr 5, 2022
c70e401
Don't play with fire
armanbilge Apr 5, 2022
17bd355
Scala 3 filters ...
armanbilge Apr 5, 2022
23c8936
Merge pull request #6248 from armanbilge/issue/6242
rossabaker Apr 5, 2022
86844fa
Merge branch 'series/0.23'
armanbilge Apr 5, 2022
db39966
Update MimeDB
armanbilge Apr 5, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Expand Up @@ -140,11 +140,11 @@ jobs:

- name: Make target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
run: mkdir -p ember-core/js/target ember-server/js/target examples/ember-server-h2/target examples/ember/target examples/ember-client-h2/target blaze-client/target server/jvm/target examples/target scalafix-internal/input/target blaze-server/target scalafix-internal/tests/target scalatags/target target examples/docker/target twirl/target unidocs/target .js/target site/target laws/.jvm/target tests/jvm/target client/js/target tomcat-server/target prometheus-metrics/target scalafix-internal/output/target servlet/target examples/tomcat/target examples/jetty/target boopickle/.js/target testing/jvm/target core/js/target testing/js/target ember-server/jvm/target circe/.js/target okhttp-client/target laws/.js/target examples/blaze/target jawn/.js/target tests/js/target .jvm/target scalafix-internal/rules/target .native/target client/jvm/target blaze-core/target circe/.jvm/target dsl/.js/target examples/war/target jetty-client/target ember-client/jvm/target boopickle/.jvm/target play-json/target core/jvm/target scala-xml/target dsl/.jvm/target dropwizard-metrics/target jetty-server/target node-serverless/target ember-core/jvm/target jawn/.jvm/target server/js/target ember-client/js/target bench/target project/target
run: mkdir -p ember-core/js/target ember-server/js/target examples/ember-server-h2/target examples/ember/target examples/ember-client-h2/target blaze-client/target server/jvm/target examples/target scalafix-internal/input/target blaze-server/target scalafix-internal/tests/target scalatags/target target examples/docker/target twirl/target unidocs/target .js/target site/target laws/.jvm/target tests/jvm/target client/js/target tomcat-server/target prometheus-metrics/target scalafix-internal/output/target servlet/target examples/tomcat/target examples/jetty/target boopickle/.js/target testing/jvm/target core/js/target testing/js/target ember-server/jvm/target circe/.js/target okhttp-client/target laws/.js/target examples/blaze/target jawn/.js/target tests/js/target .jvm/target scalafix-internal/rules/target .native/target client/jvm/target blaze-core/target circe/.jvm/target dsl/.js/target jetty-client/target ember-client/jvm/target boopickle/.jvm/target play-json/target core/jvm/target scala-xml/target dsl/.jvm/target dropwizard-metrics/target jetty-server/target node-serverless/target ember-core/jvm/target jawn/.jvm/target server/js/target js-artifact-size-test/target ember-client/js/target bench/target project/target

- name: Compress target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
run: tar cf targets.tar ember-core/js/target ember-server/js/target examples/ember-server-h2/target examples/ember/target examples/ember-client-h2/target blaze-client/target server/jvm/target examples/target scalafix-internal/input/target blaze-server/target scalafix-internal/tests/target scalatags/target target examples/docker/target twirl/target unidocs/target .js/target site/target laws/.jvm/target tests/jvm/target client/js/target tomcat-server/target prometheus-metrics/target scalafix-internal/output/target servlet/target examples/tomcat/target examples/jetty/target boopickle/.js/target testing/jvm/target core/js/target testing/js/target ember-server/jvm/target circe/.js/target okhttp-client/target laws/.js/target examples/blaze/target jawn/.js/target tests/js/target .jvm/target scalafix-internal/rules/target .native/target client/jvm/target blaze-core/target circe/.jvm/target dsl/.js/target examples/war/target jetty-client/target ember-client/jvm/target boopickle/.jvm/target play-json/target core/jvm/target scala-xml/target dsl/.jvm/target dropwizard-metrics/target jetty-server/target node-serverless/target ember-core/jvm/target jawn/.jvm/target server/js/target ember-client/js/target bench/target project/target
run: tar cf targets.tar ember-core/js/target ember-server/js/target examples/ember-server-h2/target examples/ember/target examples/ember-client-h2/target blaze-client/target server/jvm/target examples/target scalafix-internal/input/target blaze-server/target scalafix-internal/tests/target scalatags/target target examples/docker/target twirl/target unidocs/target .js/target site/target laws/.jvm/target tests/jvm/target client/js/target tomcat-server/target prometheus-metrics/target scalafix-internal/output/target servlet/target examples/tomcat/target examples/jetty/target boopickle/.js/target testing/jvm/target core/js/target testing/js/target ember-server/jvm/target circe/.js/target okhttp-client/target laws/.js/target examples/blaze/target jawn/.js/target tests/js/target .jvm/target scalafix-internal/rules/target .native/target client/jvm/target blaze-core/target circe/.jvm/target dsl/.js/target jetty-client/target ember-client/jvm/target boopickle/.jvm/target play-json/target core/jvm/target scala-xml/target dsl/.jvm/target dropwizard-metrics/target jetty-server/target node-serverless/target ember-core/jvm/target jawn/.jvm/target server/js/target js-artifact-size-test/target ember-client/js/target bench/target project/target

- name: Upload target directories
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
Expand Down
4 changes: 3 additions & 1 deletion .scala-steward.conf
Expand Up @@ -37,5 +37,7 @@ updates.ignore = [
{ groupId = "com.eed3si9n", artifactId = "sbt-buildinfo" },
{ groupId = "org.apache.tomcat" },
{ groupId = "com.github.sbt", artifactId = "sbt-native-packager" },
{ groupId = "com.github.tkawachi", artifactId = "sbt-doctest" }
{ groupId = "com.github.tkawachi", artifactId = "sbt-doctest" },
{ groupId = "org.typelevel", artifactId = "cats-parse" },
{ groupId = "org.scala-lang.modules", artifactId = "scala-xml" }
]
2 changes: 1 addition & 1 deletion .scalafmt.conf
@@ -1,4 +1,4 @@
version = 3.4.3
version = 3.5.0

style = default

Expand Down
Expand Up @@ -260,23 +260,9 @@ private final class Http1Connection[F[_]](
idleTimeoutS: F[Either[Throwable, Unit]],
idleRead: Option[Future[ByteBuffer]],
): F[Response[F]] =
F.async[Response[F]] { cb =>
F.delay {
idleRead match {
case Some(read) =>
handleRead(read, cb, closeOnFinish, doesntHaveBody, "Initial Read", idleTimeoutS)
case None =>
handleRead(
channelRead(),
cb,
closeOnFinish,
doesntHaveBody,
"Initial Read",
idleTimeoutS,
)
}
None
}
F.async_[Response[F]] { cb =>
val read = idleRead.getOrElse(channelRead())
handleRead(read, cb, closeOnFinish, doesntHaveBody, "Initial Read", idleTimeoutS)
}

// this method will get some data, and try to continue parsing using the implicit ec
Expand Down
Expand Up @@ -90,18 +90,25 @@ private[http4s] final class IdleTimeoutStage[A](
@tailrec def go(): Unit =
timeoutState.get() match {
case Disabled =>
val newCancel = exec.schedule(timeoutTask, timeout)
if (timeoutState.compareAndSet(Disabled, Enabled(timeoutTask, newCancel))) ()
else {
newCancel.cancel()
go()
tryScheduling(timeoutTask) match {
case Some(newCancel) =>
if (timeoutState.compareAndSet(Disabled, Enabled(timeoutTask, newCancel))) ()
else {
newCancel.cancel()
go()
}
case None => ()
}
case old @ Enabled(_, oldCancel) =>
val newCancel = exec.schedule(timeoutTask, timeout)
if (timeoutState.compareAndSet(old, Enabled(timeoutTask, newCancel))) oldCancel.cancel()
else {
newCancel.cancel()
go()
tryScheduling(timeoutTask) match {
case Some(newCancel) =>
if (timeoutState.compareAndSet(old, Enabled(timeoutTask, newCancel)))
oldCancel.cancel()
else {
newCancel.cancel()
go()
}
case None => ()
}
case _ => ()
}
Expand All @@ -112,18 +119,21 @@ private[http4s] final class IdleTimeoutStage[A](
@tailrec private def resetTimeout(): Unit =
timeoutState.get() match {
case old @ Enabled(timeoutTask, oldCancel) =>
val newCancel = exec.schedule(timeoutTask, timeout)
if (timeoutState.compareAndSet(old, Enabled(timeoutTask, newCancel))) oldCancel.cancel()
else {
newCancel.cancel()
resetTimeout()
tryScheduling(timeoutTask) match {
case Some(newCancel) =>
if (timeoutState.compareAndSet(old, Enabled(timeoutTask, newCancel))) oldCancel.cancel()
else {
newCancel.cancel()
resetTimeout()
}
case None => ()
}
case _ => ()
}

@tailrec def cancelTimeout(): Unit =
timeoutState.get() match {
case old @ IdleTimeoutStage.Enabled(_, cancel) =>
case old @ Enabled(_, cancel) =>
if (timeoutState.compareAndSet(old, Disabled)) cancel.cancel()
else cancelTimeout()
case _ => ()
Expand Down
47 changes: 28 additions & 19 deletions build.sbt
Expand Up @@ -75,14 +75,14 @@ lazy val modules: List[CompositeProject] = List(
twirl,
scalatags,
bench,
jsArtifactSizeTest,
unidocs,
examples,
examplesBlaze,
examplesDocker,
examplesEmber,
examplesJetty,
examplesTomcat,
examplesWar,
scalafixInternalRules,
scalafixInternalInput,
scalafixInternalOutput,
Expand All @@ -100,10 +100,8 @@ lazy val root = tlCrossRootProject
.aggregate(modules: _*)

lazy val core = libraryCrossProject("core")
.enablePlugins(
BuildInfoPlugin,
MimeLoaderPlugin,
)
.enablePlugins(BuildInfoPlugin)
.jvmEnablePlugins(MimeLoaderPlugin)
.settings(
description := "Core http4s library for servers and clients",
startYear := Some(2013),
Expand Down Expand Up @@ -536,6 +534,31 @@ lazy val bench = http4sProject("bench")
)
.dependsOn(core.jvm, circe.jvm, emberCore.jvm)

lazy val jsArtifactSizeTest = http4sProject("js-artifact-size-test")
.enablePlugins(ScalaJSPlugin, NoPublishPlugin)
.settings(
scalaJSUseMainModuleInitializer := true,
Test / test := {
val log = streams.value.log
val file = (Compile / fullOptJS).value.data
val size = io.Using.fileInputStream(file) { in =>
var size = 0L
IO.gzip(in, _ => size += 1)
size
}
val sizeKB = size / 1000
// not a hard target. increase *moderately* if need be
// linking MimeDB results in a 100 KB increase. don't let that happen :)
val targetKB = 350
val msg = s"fullOptJS+gzip generated ${sizeKB} KB artifact (target: <$targetKB KB)"
if (sizeKB < targetKB)
log.info(msg)
else
sys.error(msg)
},
)
.dependsOn(client.js, circe.js)

lazy val unidocs = http4sProject("unidocs")
.enablePlugins(TypelevelUnidocPlugin)
.settings(
Expand All @@ -550,7 +573,6 @@ lazy val unidocs = http4sProject("unidocs")
examplesDocker,
examplesJetty,
examplesTomcat,
examplesWar,
examplesEmber,
exampleEmberServerH2,
exampleEmberClientH2,
Expand Down Expand Up @@ -578,7 +600,6 @@ lazy val docs = http4sProject("site")
cryptobits,
),
description := "Documentation for http4s",
mdocIn := (Compile / sourceDirectory).value / "mdoc",
tlFatalWarningsInCi := false,
fork := false,
)
Expand Down Expand Up @@ -674,18 +695,6 @@ lazy val examplesTomcat = exampleProject("examples-tomcat")
)
.dependsOn(tomcatServer)

// Run this with jetty:start
lazy val examplesWar = exampleProject("examples-war")
.enablePlugins(JettyPlugin)
.settings(
description := "Example of a WAR deployment of an http4s service",
startYear := Some(2014),
fork := true,
libraryDependencies += javaxServletApi % Provided,
Jetty / containerLibs := List(jettyRunner),
)
.dependsOn(servlet)

lazy val scalafixInternalRules = project
.in(file("scalafix-internal/rules"))
.enablePlugins(NoPublishPlugin)
Expand Down
119 changes: 104 additions & 15 deletions core/shared/src/main/scala/org/http4s/MediaType.scala
Expand Up @@ -166,10 +166,7 @@ object MediaRange {
if (subType === "*")
MediaRange.standard.getOrElse(mainType.toLowerCase, new MediaRange(mainType))
else
MediaType.all.getOrElse(
(mainType.toLowerCase, subType.toLowerCase),
new MediaType(mainType.toLowerCase, subType.toLowerCase),
)
MediaType.getMediaType(mainType, subType)

implicit val http4sShowForMediaRange: Show[MediaRange] =
Show.show(s => s"${s.mainType}/*${MediaRange.extensionsToString(s)}")
Expand Down Expand Up @@ -263,13 +260,24 @@ object MediaType extends MimeDB {
// Curiously text/event-stream isn't included in MimeDB
lazy val `text/event-stream` = new MediaType("text", "event-stream")

lazy val all: Map[(String, String), MediaType] =
(`text/event-stream` :: allMediaTypes)
.map(m => (m.mainType.toLowerCase, m.subType.toLowerCase) -> m)
.toMap
// Accessing this would force the entire MimeDB to be linked on JS (roughly 400 KB after fullOptJS).
// Anything that uses it (such as extensionMap) should be lazily initialized and never called in a
// JS application where artifact size matters (i.e. browser applications).
private[this] var _all: Map[(String, String), MediaType] = null
def all: Map[(String, String), MediaType] = {
if (_all eq null)
_all = (`text/event-stream` :: allMediaTypes)
.map(m => (m.mainType.toLowerCase, m.subType.toLowerCase) -> m)
.toMap
_all
}

val extensionMap: Map[String, MediaType] =
allMediaTypes.flatMap(m => m.fileExtensions.map(_ -> m)).toMap
private[this] var _extensionMap: Map[String, MediaType] = null
def extensionMap: Map[String, MediaType] = {
if (_extensionMap eq null)
_extensionMap = allMediaTypes.flatMap(m => m.fileExtensions.map(_ -> m)).toMap
_extensionMap
}

val parser: Parser[MediaType] = {
val mediaType = MediaRange.mediaRangeParser(getMediaType)
Expand All @@ -296,11 +304,17 @@ object MediaType extends MimeDB {
def unsafeParse(s: String): MediaType =
parse(s).fold(throw _, identity)

private[http4s] def getMediaType(mainType: String, subType: String): MediaType =
MediaType.all.getOrElse(
(mainType.toLowerCase, subType.toLowerCase),
new MediaType(mainType.toLowerCase, subType.toLowerCase),
)
private[http4s] def getMediaType(_mainType: String, _subType: String): MediaType = {
val mainType = _mainType.toLowerCase
val subType = _subType.toLowerCase
if (Platform.isJvm)
MediaType.all.getOrElse(
(mainType, subType),
new MediaType(mainType, subType),
)
else // don't link the MimeDB!!!!
new MediaType(mainType, subType, binary = isBinary(mainType, subType))
}

implicit val http4sEqForMediaType: Eq[MediaType] =
Eq.fromUniversalEquals
Expand All @@ -317,4 +331,79 @@ object MediaType extends MimeDB {
writer
}
}

// this is duplicated from project/MimeLoader.scala
// but only includes trues since false is fallback
private[this] def isBinary(mainType: String, subType: String): Boolean =
mainType match {
case "audio" => true
case "image" => true
case "video" => true
case "application" =>
subType match {
case "base64" => true
case "excel" => true
case "font-woff" => true
case "gnutar" => true
case "gzip" => true
case "hal+json" => true
case "java-archive" => true
case "json" => true
case "lha" => true
case "lzx" => true
case "mspowerpoint" => true
case "msword" => true
case "octet-stream" => true
case "pdf" => true
case "problem+json" => true
case "postscript" => true
case "vnd.api+json" => true
case "vnd.google-earth.kmz" => true
case "vnd.ms-fontobject" => true
case "vnd.oasis.opendocument.chart" => true
case "vnd.oasis.opendocument.database" => true
case "vnd.oasis.opendocument.formula" => true
case "vnd.oasis.opendocument.graphics" => true
case "vnd.oasis.opendocument.image" => true
case "vnd.oasis.opendocument.presentation" => true
case "vnd.oasis.opendocument.spreadsheet" => true
case "vnd.oasis.opendocument.text" => true
case "vnd.oasis.opendocument.text-master" => true
case "vnd.oasis.opendocument.text-web" => true
case "vnd.openxmlformats-officedocument.presentationml.presentation" => true
case "vnd.openxmlformats-officedocument.presentationml.slide" => true
case "vnd.openxmlformats-officedocument.presentationml.slideshow" => true
case "vnd.openxmlformats-officedocument.presentationml.template" => true
case "vnd.openxmlformats-officedocument.spreadsheetml.sheet" => true
case "vnd.openxmlformats-officedocument.spreadsheetml.template" => true
case "vnd.openxmlformats-officedocument.wordprocessingml.document" => true
case "vnd.openxmlformats-officedocument.wordprocessingml.template" => true
case "x-7z-compressed" => true
case "x-ace-compressed" => true
case "x-apple-diskimage" => true
case "x-arc-compressed" => true
case "x-bzip" => true
case "x-bzip2" => true
case "x-chrome-extension" => true
case "x-compress" => true
case "x-debian-package" => true
case "x-dvi" => true
case "x-font-truetype" => true
case "x-font-opentype" => true
case "x-gtar" => true
case "x-gzip" => true
case "x-latex" => true
case "x-rar-compressed" => true
case "x-redhat-package-manager" => true
case "x-shockwave-flash" => true
case "x-tar" => true
case "x-tex" => true
case "x-texinfo" => true
case "x-x509-ca-cert" => true
case "x-xpinstall" => true
case "zip" => true
case _ => false
}
case _ => false
}
}