From 3860ebdaf0f354b6ec01e9bde0335ea797d8a77e Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:02:36 +0200 Subject: [PATCH 01/58] Implement dynamic resizing of `StreamingForm.Buffer` (#2882) --- .../src/test/scala/zio/http/FormSpec.scala | 27 +++++++++++++++++++ .../main/scala/zio/http/StreamingForm.scala | 23 ++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala b/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala index 9e1b0117fc..1169919168 100644 --- a/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala @@ -271,6 +271,33 @@ object FormSpec extends ZIOHttpSpec { collected.get("file").get.asInstanceOf[FormField.Binary].data == bytes, ) }, + test("StreamingForm dynamically resizes") { + val N = 1000 + val expected = Chunk.fromArray(Array.fill(N)(scala.util.Random.nextInt()).map(_.toByte)) + val form = + Form( + Chunk( + FormField.binaryField( + name = "identifier", + data = Chunk(10.toByte), + mediaType = MediaType.application.`octet-stream`, + ), + FormField.StreamingBinary( + name = "blob", + data = ZStream.fromChunk(expected), + contentType = MediaType.application.`octet-stream`, + ), + ), + ) + val boundary = Boundary("X-INSOMNIA-BOUNDARY") + for { + formBytes <- form.multipartBytes(boundary).runCollect + formByteStream = ZStream.fromChunk(formBytes) + streamingForm = StreamingForm(formByteStream, boundary, 16) + out <- streamingForm.collectAll + res = out.get("blob").get.asInstanceOf[FormField.Binary].data + } yield assertTrue(res == expected) + } @@ timeout(3.seconds), test("decoding random form") { check(Gen.chunkOfBounded(2, 8)(formField)) { fields => for { diff --git a/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala b/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala index 51cc105691..610c535ae6 100644 --- a/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala +++ b/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala @@ -18,6 +18,8 @@ package zio.http import java.nio.charset.Charset +import scala.annotation.tailrec + import zio._ import zio.stacktracer.TracingImplicits.disableAutoTrace @@ -172,14 +174,31 @@ object StreamingForm { new State(FormState.fromBoundary(boundary), None, _inNonStreamingPart = false) } - private final class Buffer(bufferSize: Int) { - private val buffer: Array[Byte] = new Array[Byte](bufferSize) + private final class Buffer(initialSize: Int) { + private var buffer: Array[Byte] = new Array[Byte](initialSize) private var length: Int = 0 + private def ensureHasCapacity(requiredCapacity: Int): Unit = { + @tailrec + def calculateNewCapacity(existing: Int, required: Int): Int = { + val newCap = existing * 2 + if (newCap < required) calculateNewCapacity(newCap, required) + else newCap + } + + val l = buffer.length + if (l <= requiredCapacity) { + val newArray = Array.ofDim[Byte](calculateNewCapacity(l, requiredCapacity)) + java.lang.System.arraycopy(buffer, 0, newArray, 0, l) + buffer = newArray + } else () + } + def addByte( crlfBoundary: Chunk[Byte], byte: Byte, ): Chunk[Take[Nothing, Byte]] = { + ensureHasCapacity(length + crlfBoundary.length) buffer(length) = byte if (length < (crlfBoundary.length - 1)) { // Not enough bytes to check if we have the boundary From 73c8452971a7644bb48e026e85af68355cbaed4d Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:15:10 +0200 Subject: [PATCH 02/58] Don't share the Scope in `ContentTypeSpec` (#2886) * Don't share the Scope in `ContentTypeSpec` * Run `ContentTypeSpec` sequentially * Fix other suites * rerun ci * rerun ci * rerun ci --- zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala | 6 ++++-- zio-http/jvm/src/test/scala/zio/http/KeepAliveSpec.scala | 6 ++++-- .../jvm/src/test/scala/zio/http/StaticFileServerSpec.scala | 6 ++++-- zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala | 3 ++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala index c9fc132d6e..c9774e8150 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala @@ -18,7 +18,7 @@ package zio.http import zio._ import zio.test.Assertion.{equalTo, isNone, isSome} -import zio.test.TestAspect.withLiveClock +import zio.test.TestAspect.{sequential, withLiveClock} import zio.test._ import zio.http.internal.{DynamicServer, HttpRunnableSpec, serverTestLayer} @@ -74,6 +74,8 @@ object ContentTypeSpec extends HttpRunnableSpec { override def spec = { suite("Content-type") { serve.as(List(contentSpec)) - }.provideShared(DynamicServer.live, serverTestLayer, Client.default, Scope.default) @@ withLiveClock + } + .provideSome[DynamicServer & Server & Client](Scope.default) + .provideShared(DynamicServer.live, serverTestLayer, Client.default) @@ withLiveClock @@ sequential } } diff --git a/zio-http/jvm/src/test/scala/zio/http/KeepAliveSpec.scala b/zio-http/jvm/src/test/scala/zio/http/KeepAliveSpec.scala index b8f50f4047..ab825669c5 100644 --- a/zio-http/jvm/src/test/scala/zio/http/KeepAliveSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/KeepAliveSpec.scala @@ -16,7 +16,7 @@ package zio.http -import zio.Scope +import zio._ import zio.test.Assertion.{equalTo, isNone, isSome} import zio.test.TestAspect.{sequential, withLiveClock} import zio.test.{Spec, assert} @@ -66,7 +66,9 @@ object KeepAliveSpec extends HttpRunnableSpec { override def spec: Spec[Any, Throwable] = { suite("KeepAliveSpec") { keepAliveSpec - }.provide(DynamicServer.live, serverTestLayer, Client.default, Scope.default) @@ withLiveClock @@ sequential + } + .provideSome[DynamicServer & Server & Client](Scope.default) + .provide(DynamicServer.live, serverTestLayer, Client.default) @@ withLiveClock @@ sequential } } diff --git a/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala b/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala index 89807edf02..1b9c8ade6f 100644 --- a/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala @@ -20,7 +20,7 @@ import java.io.File import zio._ import zio.test.Assertion._ -import zio.test.TestAspect.{unix, withLiveClock} +import zio.test.TestAspect.{sequential, unix, withLiveClock} import zio.test.assertZIO import zio.http.internal.{DynamicServer, HttpRunnableSpec, serverTestLayer} @@ -46,7 +46,9 @@ object StaticFileServerSpec extends HttpRunnableSpec { override def spec = suite("StaticFileServerSpec") { serve.as(List(staticSpec)) - }.provideShared(DynamicServer.live, serverTestLayer, Client.default, Scope.default) @@ withLiveClock + } + .provideSome[DynamicServer & Server & Client](Scope.default) + .provideShared(DynamicServer.live, serverTestLayer, Client.default) @@ withLiveClock @@ sequential private def staticSpec = suite("Static RandomAccessFile Server")( suite("fromResource")( diff --git a/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala b/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala index 197bce56ee..3f87b59f73 100644 --- a/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala @@ -211,7 +211,8 @@ object WebSocketSpec extends HttpRunnableSpec { override def spec = suite("Server") { serve.as(List(websocketSpec)) } - .provideShared(DynamicServer.live, serverTestLayer, Client.default, Scope.default) @@ + .provideSome[DynamicServer & Server & Client](Scope.default) + .provideShared(DynamicServer.live, serverTestLayer, Client.default) @@ diagnose(30.seconds) @@ withLiveClock @@ sequential final class MessageCollector[A](ref: Ref[List[A]], promise: Promise[Nothing, Unit]) { From d4168a796dc8db3b0e01f5459f95c975130886bf Mon Sep 17 00:00:00 2001 From: Syed Bariman Jan Date: Thu, 6 Jun 2024 18:16:48 +0500 Subject: [PATCH 03/58] Docs/improve readme (#2880) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add line breaks in key features paraghraph * ‎ * ‎ * ‎ * Update README.md --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index edd2f749f5..5ebf20b4a4 100644 --- a/README.md +++ b/README.md @@ -13,17 +13,29 @@ ZIO HTTP is designed in terms of **HTTP as function**, where both server and cli Some of the key features of ZIO HTTP are: **ZIO Native**: ZIO HTTP is built atop ZIO, a type-safe, composable, and asynchronous effect system for Scala. It inherits all the benefits of ZIO, including testability, composability, and type safety. + **Cloud-Native**: ZIO HTTP is designed for cloud-native environments and supports building highly scalable and performant web applications. Built atop ZIO, it features built-in support for concurrency, parallelism, resource management, error handling, structured logging, configuration management, and metrics instrumentation. + **Imperative and Declarative Endpoints**: ZIO HTTP provides a declarative API for defining HTTP endpoints besides the imperative API. With imperative endpoints, both the shape of the endpoint and the logic are defined together, while with declarative endpoints, the description of the endpoint is separated from its logic. Developers can choose the style that best fit their needs. + **Type-Driven API Design**: Beside the fact that ZIO HTTP supports declarative endpoint descriptions, it also provides a type-driven API design that leverages Scala's type system to ensure correctness and safety at compile time. So the implementation of the endpoint is type-checked against the description of the endpoint. + **Middleware Support**: ZIO HTTP offers middleware support for incorporating cross-cutting concerns such as logging, metrics, authentication, and more into your services. + **Error Handling**: Built-in support exists for handling errors at the HTTP layer, distinguishing between handled and unhandled errors. + **WebSockets**: Built-in support for WebSockets allows for the creation of real-time applications using ZIO HTTP. + **Testkit**: ZIO HTTP provides first-class testing utilities that facilitate test writing without requiring a live server instance. + **Interoperability**: Interoperability with existing Scala/Java libraries is provided, enabling seamless integration with functionality from the Scala/Java ecosystem through the importation of blocking and non-blocking operations. + **JSON and Binary Codecs**: Built-in support for ZIO Schema enables encoding and decoding of request/response bodies, supporting various data types including JSON, Protobuf, Avro, and Thrift. + **Template System**: A built-in DSL facilitates writing HTML templates using Scala code. + **OpenAPI Support**: Built-in support is available for generating OpenAPI documentation for HTTP applications, and conversely, for generating HTTP endpoints from OpenAPI documentation. + **ZIO HTTP CLI**: Command-line applications can be built to interact with HTTP APIs by leveraging the power of [ZIO CLI](https://zio.dev/zio-cli) and ZIO HTTP. ## Installation @@ -91,7 +103,7 @@ object GreetingClient extends ZIOAppDefault { ## Documentation -Learn more on the [ZIO Http homepage](https://github.com/zio/zio-http)! +Learn more on the [ZIO Http Docs](https://zio.dev/zio-http/)! ## Contributing From d0e5305970a70b9c61abd6422c3d333bcfcd23bd Mon Sep 17 00:00:00 2001 From: John Sullivan Date: Thu, 6 Jun 2024 09:59:42 -0500 Subject: [PATCH 04/58] Add a resourcePrefix for Middleware.serveResources (#2887) As it is, `Middleware.serveResources(path)` going to serve any file at all under src/main/resources, including e.g. somebody's reference.conf file. I added a resourcePrefix parameter for this, so that the resources served can be limited to, e.g., src/main/resources/public. I also added delegates for serveResources and serveDirectory in Routes, as per this suggestion: https://github.com/zio/zio-http/pull/2450#issuecomment-1741794986 --- .../src/main/scala/zio/http/Middleware.scala | 14 +++++--- .../src/main/scala/zio/http/Routes.scala | 33 +++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/zio-http/shared/src/main/scala/zio/http/Middleware.scala b/zio-http/shared/src/main/scala/zio/http/Middleware.scala index 3a359ede6b..bc4655086f 100644 --- a/zio-http/shared/src/main/scala/zio/http/Middleware.scala +++ b/zio-http/shared/src/main/scala/zio/http/Middleware.scala @@ -334,8 +334,8 @@ object Middleware extends HandlerAspects { } } - def fromResource(implicit trace: Trace): StaticServe[Any, Throwable] = make { (path, _) => - Handler.fromResource(path.dropLeadingSlash.encode) + def fromResource(resourcePrefix: String)(implicit trace: Trace): StaticServe[Any, Throwable] = make { (path, _) => + Handler.fromResource(s"${resourcePrefix}/${path.dropLeadingSlash.encode}") } } @@ -398,9 +398,15 @@ object Middleware extends HandlerAspects { * With this middleware in place, a request to * `https://www.domain.com/assets/folder/file1.jpg` would serve the file * `src/main/resources/folder/file1.jpg`. + * + * Provide a `resourcePrefix` if you want to limit the the resource files + * served. For instance, with `Middleware.serveResources(Path.empty / + * "assets", "public")`, a request to + * `https://www.domain.com/assets/folder/file1.jpg` would serve the file + * `src/main/resources/public/folder/file1.jpg`. */ - def serveResources(path: Path)(implicit trace: Trace): Middleware[Any] = - toMiddleware(path, StaticServe.fromResource) + def serveResources(path: Path, resourcePrefix: String = ".")(implicit trace: Trace): Middleware[Any] = + toMiddleware(path, StaticServe.fromResource(resourcePrefix)) /** * Creates a middleware for managing the flash scope. diff --git a/zio-http/shared/src/main/scala/zio/http/Routes.scala b/zio-http/shared/src/main/scala/zio/http/Routes.scala index 4fbde164da..6788a0c9c4 100644 --- a/zio-http/shared/src/main/scala/zio/http/Routes.scala +++ b/zio-http/shared/src/main/scala/zio/http/Routes.scala @@ -16,6 +16,8 @@ package zio.http +import java.io.File + import zio._ import zio.http.Routes.ApplyContextAspect @@ -293,6 +295,37 @@ object Routes extends RoutesCompanionVersionSpecific { def singleton[Env, Err](h: Handler[Env, Err, (Path, Request), Response])(implicit trace: Trace): Routes[Env, Err] = Routes(Route.route(RoutePattern.any)(h)) + /** + * Creates routes for serving static files from the directory `docRoot` at the + * url path `path`. + * + * Example: `Routes.serveDirectory(Path.empty / "assets", new + * File("/some/local/path"))` + * + * With this routes in place, a request to + * `https://www.domain.com/assets/folder/file1.jpg` would serve the local file + * `/some/local/path/folder/file1.jpg`. + */ + def serveDirectory(path: Path, docRoot: File)(implicit trace: Trace): Routes[Any, Nothing] = + empty @@ Middleware.serveDirectory(path, docRoot) + + /** + * Creates routes for serving static files from resources at the path `path`. + * + * Example: `Routes.serveResources(Path.empty / "assets")` + * + * With this routes in place, a request to + * `https://www.domain.com/assets/folder/file1.jpg` would serve the file + * `src/main/resources/folder/file1.jpg`. + * + * Provide a `resourcePrefix` if you want to limit the the resource files + * served. For instance, with `Routes.serveResources(Path.empty / "assets", + * "public")`, a request to `https://www.domain.com/assets/folder/file1.jpg` + * would serve the file `src/main/resources/public/folder/file1.jpg`. + */ + def serveResources(path: Path, resourcePrefix: String = ".")(implicit trace: Trace): Routes[Any, Nothing] = + empty @@ Middleware.serveResources(path, resourcePrefix) + private[http] final case class Tree[-Env](tree: RoutePattern.Tree[RequestHandler[Env, Response]]) { self => final def ++[Env1 <: Env](that: Tree[Env1]): Tree[Env1] = Tree(self.tree ++ that.tree) From c23fc3d72eba693c8949c037b203373d23a6becc Mon Sep 17 00:00:00 2001 From: John Sullivan Date: Thu, 6 Jun 2024 10:00:23 -0500 Subject: [PATCH 05/58] Some tiny doc fixes. (#2884) When I try the `ExampleSpec` as-is in `3.0.0-RC8`, I get something like: ``` [warn] -- Deprecation Warning: /home/sully/w/badux/src/test/scala/badux/rest/BaduxApiSpec.scala:38:27 --------------------------------------------------------------------- [warn] 38 | val app = Handler.ok.toHttpApp [warn] | ^^^^^^^^^^^^^^^^^^^^ [warn] | method toHttpApp in trait Handler is deprecated since 3.0.0-RC7: Use toRoutes instead. Will be removed in the next release. [warn] one warning found``` --- README.md | 2 +- docs/guides/testing-http-apps.md | 4 ++-- docs/tutorials/testing-http-apps.md | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5ebf20b4a4..8cd079354a 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Some of the key features of ZIO HTTP are: Setup via `build.sbt`: ```scala -libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC7" +libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC8" ``` **NOTES ON VERSIONING:** diff --git a/docs/guides/testing-http-apps.md b/docs/guides/testing-http-apps.md index 1c857beeae..178420c5eb 100644 --- a/docs/guides/testing-http-apps.md +++ b/docs/guides/testing-http-apps.md @@ -9,7 +9,7 @@ Testing HTTP applications is a critical part of the development process. Utilizi We have comprehensive documentation on [ZIO Test](https://zio.dev/reference/test/) which is worth reading to understand how to write tests using ZIO effects. -It is easy to test ZIO HTTP applications beacuse we can think of `HttpApp` as a function of `Request => ZIO[R, Response, Response]`. This means we can effortlessly provide a Request as input to the `HttpApp` and receive the corresponding Response as output using the runZIO method. By doing this we can test the behavior of the `HttpApp` in a controlled environment: +It is easy to test ZIO HTTP applications because we can think of `HttpApp` as a function of `Request => ZIO[R, Response, Response]`. This means we can effortlessly provide a Request as input to the `HttpApp` and receive the corresponding Response as output using the runZIO method. By doing this we can test the behavior of the `HttpApp` in a controlled environment: ```scala mdoc:silent:reset import zio.test._ @@ -20,7 +20,7 @@ object ExampleSpec extends ZIOSpecDefault { def spec = suite("http")( test("should be ok") { - val app = Handler.ok.toHttpApp + val app = Handler.ok.toRoutes val req = Request.get(URL(Path.root)) assertZIO(app.runZIO(req))(equalTo(Response.ok)) } diff --git a/docs/tutorials/testing-http-apps.md b/docs/tutorials/testing-http-apps.md index 1c857beeae..178420c5eb 100644 --- a/docs/tutorials/testing-http-apps.md +++ b/docs/tutorials/testing-http-apps.md @@ -9,7 +9,7 @@ Testing HTTP applications is a critical part of the development process. Utilizi We have comprehensive documentation on [ZIO Test](https://zio.dev/reference/test/) which is worth reading to understand how to write tests using ZIO effects. -It is easy to test ZIO HTTP applications beacuse we can think of `HttpApp` as a function of `Request => ZIO[R, Response, Response]`. This means we can effortlessly provide a Request as input to the `HttpApp` and receive the corresponding Response as output using the runZIO method. By doing this we can test the behavior of the `HttpApp` in a controlled environment: +It is easy to test ZIO HTTP applications because we can think of `HttpApp` as a function of `Request => ZIO[R, Response, Response]`. This means we can effortlessly provide a Request as input to the `HttpApp` and receive the corresponding Response as output using the runZIO method. By doing this we can test the behavior of the `HttpApp` in a controlled environment: ```scala mdoc:silent:reset import zio.test._ @@ -20,7 +20,7 @@ object ExampleSpec extends ZIOSpecDefault { def spec = suite("http")( test("should be ok") { - val app = Handler.ok.toHttpApp + val app = Handler.ok.toRoutes val req = Request.get(URL(Path.root)) assertZIO(app.runZIO(req))(equalTo(Response.ok)) } From 80b604dc6ed57980d87d14166fa2a43f937e0354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Miji=C4=87?= Date: Thu, 6 Jun 2024 17:27:49 +0200 Subject: [PATCH 06/58] Remove invalid `HttpApp` references (#2881) Co-authored-by: John A. De Goes --- zio-http/shared/src/main/scala/zio/http/Routes.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zio-http/shared/src/main/scala/zio/http/Routes.scala b/zio-http/shared/src/main/scala/zio/http/Routes.scala index 6788a0c9c4..b53f2d48b4 100644 --- a/zio-http/shared/src/main/scala/zio/http/Routes.scala +++ b/zio-http/shared/src/main/scala/zio/http/Routes.scala @@ -56,13 +56,13 @@ final case class Routes[-Env, +Err](routes: Chunk[zio.http.Route[Env, Err]]) { s copy(routes = routes ++ that.routes) /** - * Prepend the specified route to this HttpApp + * Prepend the specified route. */ def +:[Env1 <: Env, Err1 >: Err](route: zio.http.Route[Env1, Err1]): Routes[Env1, Err1] = copy(routes = route +: routes) /** - * Appends the specified route to this HttpApp + * Appends the specified route. */ def :+[Env1 <: Env, Err1 >: Err](route: zio.http.Route[Env1, Err1]): Routes[Env1, Err1] = copy(routes = routes :+ route) @@ -104,14 +104,14 @@ final case class Routes[-Env, +Err](routes: Chunk[zio.http.Route[Env, Err]]) { s /** * Allows the transformation of the Err type through an Effectful program - * allowing one to build up a HttpApp in Stages delegates to the Route + * allowing one to build up Routes in Stages delegates to the Route. */ def mapErrorZIO[Err1](fxn: Err => ZIO[Any, Err1, Response])(implicit trace: Trace): Routes[Env, Err1] = new Routes(routes.map(_.mapErrorZIO(fxn))) /** * Allows the transformation of the Err type through a function allowing one - * to build up a HttpApp in Stages delegates to the Route + * to build up Routes in Stages delegates to the Route. */ def mapError[Err1](fxn: Err => Err1): Routes[Env, Err1] = new Routes(routes.map(_.mapError(fxn))) @@ -260,7 +260,7 @@ final case class Routes[-Env, +Err](routes: Chunk[zio.http.Route[Env, Err]]) { s } /** - * Returns new new HttpApp whose handlers are transformed by the specified + * Returns new Routes whose handlers are transformed by the specified * function. */ def transform[Env1]( From a5fdfc1f0528b79d4f7fd2e183515834153ab86b Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Fri, 7 Jun 2024 01:36:25 +0200 Subject: [PATCH 07/58] Fix Client manual interruption (#2889) * Fix client connection manual interruption * Add comment to spec --- .../netty/client/NettyConnectionPool.scala | 9 +++-- .../src/test/scala/zio/http/ClientSpec.scala | 8 ++++- .../src/main/scala/zio/http/ZClient.scala | 36 +++++++++++-------- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala index e657fe7c01..df52b52479 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala @@ -120,9 +120,14 @@ object NettyConnectionPool { case _ => bootstrap }).connect() } - _ <- NettyFutureExecutor.executed(channelFuture) ch <- ZIO.attempt(channelFuture.channel()) - _ <- Scope.addFinalizer(NettyFutureExecutor.executed(ch.close()).when(ch.isOpen).ignoreLogged) + _ <- Scope.addFinalizer { + NettyFutureExecutor.executed { + channelFuture.cancel(true) + ch.close() + }.when(ch.isOpen).ignoreLogged + } + _ <- NettyFutureExecutor.executed(channelFuture) } yield ch } diff --git a/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala index cdc23e1ece..9b4252270b 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala @@ -22,7 +22,7 @@ import scala.annotation.nowarn import zio._ import zio.test.Assertion._ -import zio.test.TestAspect.{sequential, timeout, withLiveClock} +import zio.test.TestAspect.{flaky, sequential, timeout, withLiveClock} import zio.test._ import zio.stream.ZStream @@ -100,6 +100,12 @@ object ClientSpec extends HttpRunnableSpec { val effect = app.deployAndRequest(requestCode).runZIO(()) assertZIO(effect)(isTrue) }, + test("request can be timed out manually while awaiting connection") { + // Unfortunately we have to use a real URL here, as we can't really simulate a long connection time + val url = URL.decode("https://test.com").toOption.get + val resp = ZIO.scoped(ZClient.request(Request.get(url))).timeout(500.millis) + assertZIO(resp)(isNone) + } @@ timeout(5.seconds) @@ flaky(5), ) override def spec = { diff --git a/zio-http/shared/src/main/scala/zio/http/ZClient.scala b/zio-http/shared/src/main/scala/zio/http/ZClient.scala index a10e613ebf..6d207a9986 100644 --- a/zio-http/shared/src/main/scala/zio/http/ZClient.scala +++ b/zio-http/shared/src/main/scala/zio/http/ZClient.scala @@ -682,26 +682,30 @@ object ZClient extends ZClientPlatformSpecific { case location: Location.Absolute => ZIO.uninterruptibleMask { restore => for { - onComplete <- Promise.make[Throwable, ChannelState] - onResponse <- Promise.make[Throwable, Response] + connectionAcquired <- Ref.make(false) + onComplete <- Promise.make[Throwable, ChannelState] + onResponse <- Promise.make[Throwable, Response] inChannelScope = outerScope match { case Some(scope) => (zio: ZIO[Scope, Throwable, Unit]) => scope.extend(zio) case None => (zio: ZIO[Scope, Throwable, Unit]) => ZIO.scoped(zio) } channelFiber <- inChannelScope { for { - connection <- connectionPool - .get( - location, - clientConfig.proxy, - clientConfig.ssl.getOrElse(ClientSSLConfig.Default), - clientConfig.maxInitialLineLength, - clientConfig.maxHeaderSize, - clientConfig.requestDecompression, - clientConfig.idleTimeout, - clientConfig.connectionTimeout, - clientConfig.localAddress, - ) + connection <- restore( + connectionPool + .get( + location, + clientConfig.proxy, + clientConfig.ssl.getOrElse(ClientSSLConfig.Default), + clientConfig.maxInitialLineLength, + clientConfig.maxHeaderSize, + clientConfig.requestDecompression, + clientConfig.idleTimeout, + clientConfig.connectionTimeout, + clientConfig.localAddress, + ), + ) + .zipLeft(connectionAcquired.set(true)) .tapErrorCause(cause => onResponse.failCause(cause)) .map(_.asInstanceOf[driver.Connection]) channelInterface <- @@ -742,7 +746,9 @@ object ZClient extends ZClientPlatformSpecific { }.forkDaemon // Needs to live as long as the channel is alive, as the response body may be streaming _ <- ZIO.addFinalizer(onComplete.interrupt) response <- restore(onResponse.await.onInterrupt { - onComplete.interrupt *> channelFiber.join.orDie + ZIO.unlessZIO(connectionAcquired.get)(channelFiber.interrupt) *> + onComplete.interrupt *> + channelFiber.await }) } yield response } From a78e8638e30d1132c291478618985f607c2b45c8 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:03:34 +0200 Subject: [PATCH 08/58] Add `Server.serve` variant that accepts `Route` (#2805) (#2895) --- zio-http/shared/src/main/scala/zio/http/Server.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/zio-http/shared/src/main/scala/zio/http/Server.scala b/zio-http/shared/src/main/scala/zio/http/Server.scala index c5e0913b8b..29cf6ea61a 100644 --- a/zio-http/shared/src/main/scala/zio/http/Server.scala +++ b/zio-http/shared/src/main/scala/zio/http/Server.scala @@ -408,6 +408,13 @@ object Server extends ServerPlatformSpecific { ZIO.never } + def serve[R]( + route: Route[R, Response], + routes: Route[R, Response]*, + )(implicit trace: Trace, tag: EnvironmentTag[R]): URIO[R with Server, Nothing] = { + serve(Routes(route, routes: _*)) + } + def install[R]( httpApp: Routes[R, Response], )(implicit trace: Trace, tag: EnvironmentTag[R]): URIO[R with Server, Int] = { From 8f484257f66a12de60846b840ba66483ce823536 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 21:49:51 +0200 Subject: [PATCH 09/58] Update README.md (#2877) Co-authored-by: github-actions[bot] --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8cd079354a..dba3122665 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Some of the key features of ZIO HTTP are: Setup via `build.sbt`: ```scala -libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC8" +libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC7" ``` **NOTES ON VERSIONING:** @@ -103,7 +103,7 @@ object GreetingClient extends ZIOAppDefault { ## Documentation -Learn more on the [ZIO Http Docs](https://zio.dev/zio-http/)! +Learn more on the [ZIO Http homepage](https://github.com/zio/zio-http)! ## Contributing From da5bb3166c41ada1dc45159ee7b81950069c8f26 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Sat, 8 Jun 2024 16:08:33 +0200 Subject: [PATCH 10/58] Prefer user given content type over default generation (#2748) (#2896) --- .../zio/http/endpoint/MultipartSpec.scala | 33 +++++++++++++++++++ .../http/codec/internal/EncoderDecoder.scala | 5 +-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala index 128eb4685d..01b559012b 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala @@ -23,6 +23,8 @@ import zio.test._ import zio.stream.ZStream +import zio.schema.{DeriveSchema, Schema} + import zio.http.Method._ import zio.http._ import zio.http.codec._ @@ -275,6 +277,37 @@ object MultipartSpec extends ZIOHttpSpec { ) } }, + test("override default content type if set explicitly") { + import zio._ + import zio.http._ + import zio.http.codec._ + import zio.http.endpoint.EndpointMiddleware.None + import zio.schema.DeriveSchema.gen + import zio.stream.ZStream + + val endpoint: Endpoint[Int, Int, ZNothing, (Book, ZStream[Any, Nothing, Byte]), None] = + Endpoint(RoutePattern.GET / "books" / PathCodec.int("id")) + .outCodec( + HttpCodec.content[Book]("book", MediaType.application.`json`) ++ + HttpCodec.binaryStream("file", MediaType.application.`octet-stream`) ++ + HeaderCodec.contentType.expect(Header.ContentType(MediaType.multipart.`mixed`)), + ) + for { + result <- (endpoint + .implement(handler { (id: Int) => + (Book("John's Book", List("John Doe")), ZStream.from(Chunk.fromArray("the book file".getBytes))) + }) + .toRoutes @@ Middleware.debug).run(path = Path.root / "books" / "123") + } yield assertTrue( + result.status == Status.Ok, + result.headers.getAll(Header.ContentType).map(_.mediaType) == Chunk(MediaType.multipart.`mixed`), + ) + }, ), ) + + case class Book(title: String, authors: List[String]) + object Book { + implicit val schema: Schema[Book] = DeriveSchema.gen[Book] + } } diff --git a/zio-http/shared/src/main/scala/zio/http/codec/internal/EncoderDecoder.scala b/zio-http/shared/src/main/scala/zio/http/codec/internal/EncoderDecoder.scala index 3faa42f576..b4ddc3e2ee 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/internal/EncoderDecoder.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/internal/EncoderDecoder.scala @@ -251,10 +251,11 @@ private[codec] object EncoderDecoder { val status = encodeStatus(inputs.status) val method = encodeMethod(inputs.method) val headers = encodeHeaders(inputs.header) - val contentTypeHeaders = encodeContentType(inputs.content, outputTypes) + def contentTypeHeaders = encodeContentType(inputs.content, outputTypes) val body = encodeBody(inputs.content, outputTypes) - f(URL(path, queryParams = query), status, method, headers ++ contentTypeHeaders, body) + val headers0 = if (headers.contains("content-type")) headers else headers ++ contentTypeHeaders + f(URL(path, queryParams = query), status, method, headers0, body) } private def decodePaths(path: Path, inputs: Array[Any]): Unit = { From e28bcb3640547e5d449bb2ff49f1ffb3b140a312 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Sat, 8 Jun 2024 18:32:17 +0200 Subject: [PATCH 11/58] Endpoints as list in CodeGen to avoid duplicate key elimination (#2836) (#2892) Key is imports. And imports can be the same. We don't need here map semantics, but just a list. --- .../scala/zio/http/gen/scala/CodeGen.scala | 2 +- .../EndpointsWithOverlappingPath.scala | 18 ++ .../http/gen/openapi/EndpointGenSpec.scala | 62 +++++++ .../zio/http/gen/scala/CodeGenSpec.scala | 161 ++++++++++++++++++ 4 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 zio-http-gen/src/test/resources/EndpointsWithOverlappingPath.scala diff --git a/zio-http-gen/src/main/scala/zio/http/gen/scala/CodeGen.scala b/zio-http-gen/src/main/scala/zio/http/gen/scala/CodeGen.scala index da11489647..94ed8a3c0c 100644 --- a/zio-http-gen/src/main/scala/zio/http/gen/scala/CodeGen.scala +++ b/zio-http-gen/src/main/scala/zio/http/gen/scala/CodeGen.scala @@ -65,7 +65,7 @@ object CodeGen { case Code.Object(name, schema, endpoints, objects, caseClasses, enums) => val baseImports = if (endpoints.nonEmpty) EndpointImports else Nil - val (epImports, epContent) = endpoints.map { case (k, v) => + val (epImports, epContent) = endpoints.toList.map { case (k, v) => val (kImports, kContent) = render(basePackage)(k) val (vImports, vContent) = render(basePackage)(v) (kImports ++ vImports, s"$kContent=$vContent") diff --git a/zio-http-gen/src/test/resources/EndpointsWithOverlappingPath.scala b/zio-http-gen/src/test/resources/EndpointsWithOverlappingPath.scala new file mode 100644 index 0000000000..a265b4cbd2 --- /dev/null +++ b/zio-http-gen/src/test/resources/EndpointsWithOverlappingPath.scala @@ -0,0 +1,18 @@ +package test + +import test.component._ + +object Pets { + import zio.http._ + import zio.http.endpoint._ + import zio.http.codec._ + val listPets = Endpoint(Method.GET / "pets") + .query(QueryCodec.queryTo[Int]("limit")) + .in[Unit] + .out[Pets](status = Status.Ok) + + val createPets = Endpoint(Method.POST / "pets") + .in[Pet] + .out[Unit](status = Status.Created) + +} diff --git a/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala b/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala index b28cadd39b..a30bde7e70 100644 --- a/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala +++ b/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala @@ -657,6 +657,68 @@ object EndpointGenSpec extends ZIOSpecDefault { ) assertTrue(scala.files.head == expected) }, + test("endpoints with overlapping prefix") { + val endpoint1 = Endpoint(Method.GET / "api" / "v1" / "users") + val endpoint2 = Endpoint(Method.GET / "api" / "v1" / "users" / "info") + val openAPI = OpenAPIGen.fromEndpoints(endpoint1, endpoint2) + val scala = EndpointGen.fromOpenAPI(openAPI) + val expected1 = Code.File( + List("api", "v1", "Users.scala"), + pkgPath = List("api", "v1"), + imports = List(Code.Import.FromBase(path = "component._")), + objects = List( + Code.Object( + "Users", + Map( + Code.Field("get") -> Code.EndpointCode( + Method.GET, + Code.PathPatternCode(segments = + List(Code.PathSegmentCode("api"), Code.PathSegmentCode("v1"), Code.PathSegmentCode("users")), + ), + queryParamsCode = Set.empty, + headersCode = Code.HeadersCode.empty, + inCode = Code.InCode("Unit"), + outCodes = Nil, + errorsCode = Nil, + ), + ), + ), + ), + caseClasses = Nil, + enums = Nil, + ) + val expected2 = Code.File( + List("api", "v1", "users", "Info.scala"), + pkgPath = List("api", "v1", "users"), + imports = List(Code.Import.FromBase(path = "component._")), + objects = List( + Code.Object( + "Info", + Map( + Code.Field("get") -> Code.EndpointCode( + Method.GET, + Code.PathPatternCode(segments = + List( + Code.PathSegmentCode("api"), + Code.PathSegmentCode("v1"), + Code.PathSegmentCode("users"), + Code.PathSegmentCode("info"), + ), + ), + queryParamsCode = Set.empty, + headersCode = Code.HeadersCode.empty, + inCode = Code.InCode("Unit"), + outCodes = Nil, + errorsCode = Nil, + ), + ), + ), + ), + caseClasses = Nil, + enums = Nil, + ) + assertTrue(scala.files.toSet == Set(expected1, expected2)) + }, ), suite("data gen spec")( test("generates case class, companion object and schema") { diff --git a/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala b/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala index e139209b77..c3b70da766 100644 --- a/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala +++ b/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala @@ -556,5 +556,166 @@ object CodeGenSpec extends ZIOSpecDefault { "/GeneratedUserNameArray.scala", ) }, + test("Endpoints with common prefix") { + val json = """{ + | "openapi": "3.0.0", + | "info": { + | "version": "1.0.0", + | "title": "Swagger Petstore", + | "license": { + | "name": "MIT" + | } + | }, + | "servers": [ + | { + | "url": "http://petstore.swagger.io/v1" + | } + | ], + | "paths": { + | "/pets": { + | "get": { + | "summary": "List all pets", + | "operationId": "listPets", + | "tags": [ + | "pets" + | ], + | "parameters": [ + | { + | "name": "limit", + | "in": "query", + | "description": "How many items to return at one time (max 100)", + | "required": false, + | "schema": { + | "type": "integer", + | "maximum": 100, + | "format": "int32" + | } + | } + | ], + | "responses": { + | "200": { + | "description": "A paged array of pets", + | "headers": { + | "x-next": { + | "description": "A link to the next page of responses", + | "schema": { + | "type": "string" + | } + | } + | }, + | "content": { + | "application/json": { + | "schema": { + | "$ref": "#/components/schemas/Pets" + | } + | } + | } + | }, + | "default": { + | "description": "unexpected error", + | "content": { + | "application/json": { + | "schema": { + | "$ref": "#/components/schemas/Error" + | } + | } + | } + | } + | } + | }, + | "post": { + | "summary": "Create a pet", + | "operationId": "createPets", + | "tags": [ + | "pets" + | ], + | "requestBody": { + | "content": { + | "application/json": { + | "schema": { + | "$ref": "#/components/schemas/Pet" + | } + | } + | }, + | "required": true + | }, + | "responses": { + | "201": { + | "description": "Null response" + | }, + | "default": { + | "description": "unexpected error", + | "content": { + | "application/json": { + | "schema": { + | "$ref": "#/components/schemas/Error" + | } + | } + | } + | } + | } + | } + | } + | }, + | "components": { + | "schemas": { + | "Pet": { + | "type": "object", + | "required": [ + | "id", + | "name" + | ], + | "properties": { + | "id": { + | "type": "integer", + | "format": "int64" + | }, + | "name": { + | "type": "string", + | "minLength": 3 + | }, + | "tag": { + | "type": "string" + | } + | } + | }, + | "Pets": { + | "type": "array", + | "maxItems": 100, + | "items": { + | "$ref": "#/components/schemas/Pet" + | } + | }, + | "Error": { + | "type": "object", + | "required": [ + | "code", + | "message" + | ], + | "properties": { + | "code": { + | "type": "integer", + | "format": "int32" + | }, + | "message": { + | "type": "string" + | } + | } + | } + | } + | } + |}""".stripMargin + val openAPI = OpenAPI.fromJson(json).toOption.get + val code = EndpointGen.fromOpenAPI(openAPI) + val tempDir = Files.createTempDirectory("codegen") + + CodeGen.writeFiles(code, java.nio.file.Paths.get(tempDir.toString, "test"), "test", Some(scalaFmtPath)) + + fileShouldBe( + tempDir, + "test/Pets.scala", + "/EndpointsWithOverlappingPath.scala", + ) + }, ) @@ java11OrNewer @@ flaky @@ blocking // Downloading scalafmt on CI is flaky } From 96333fe65dede609e1e4d47d1b7ab88e14db6213 Mon Sep 17 00:00:00 2001 From: John Sullivan Date: Sat, 8 Jun 2024 11:32:35 -0500 Subject: [PATCH 12/58] add tests for Routes.serveDirectory and Routes.serveResources (#2891) --- .../scala/zio/http/StaticFileRoutesSpec.scala | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala diff --git a/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala b/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala new file mode 100644 index 0000000000..f257c019ed --- /dev/null +++ b/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala @@ -0,0 +1,93 @@ +/* + * Copyright 2021 - 2023 Sporta Technologies PVT LTD & the ZIO HTTP contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package zio.http + +import java.lang.System +import java.nio.file.{Files, Path => NIOPath} + +import zio._ +import zio.test.Assertion._ +import zio.test.TestAspect.{sequential, withLiveClock} +import zio.test.{TestAspect, assert, assertZIO} + +import zio.http.internal.{DynamicServer, HttpRunnableSpec, serverTestLayer} + +object StaticFileRoutesSpec extends HttpRunnableSpec { + + private val createTempFile = ZIO.attempt(Files.createTempFile("", ".jpg")) + private def deleteTempFile(tempPath: NIOPath) = ZIO.attempt(Files.deleteIfExists(tempPath)).ignore + private val createAndDeleteTempFile = createTempFile.flatMap(f => deleteTempFile(f).as(f)) + + override def spec = suite("StaticFileServerSpec") { + serve.as(List(staticSpec)) + } + .provideSome[DynamicServer & Server & Client](Scope.default) + .provideShared(DynamicServer.live, serverTestLayer, Client.default) @@ withLiveClock @@ sequential + + private def staticSpec = suite("Static RandomAccessFile Server")( + suite("serveDirectory")( + test("serve an existing file") { + ZIO.acquireRelease(createTempFile)(deleteTempFile) flatMap { tempPath => + val tempDir = tempPath.getParent.toFile + val tempFile = tempPath.getFileName.toString + val path = Path.empty / "assets" + val routes = Routes.serveDirectory(path, tempDir).sandbox.deploy + val request = Request.get(URL(path / tempFile)) + routes(request) + } map { response => + assert(response.status)(equalTo(Status.Ok)) && + assert(response.header(Header.ContentLength))(isSome(equalTo(Header.ContentLength(0L)))) && + assert(response.header(Header.ContentType))(isSome(equalTo(Header.ContentType(MediaType.image.`jpeg`)))) + } + }, + test("serve a non-existing file") { + createAndDeleteTempFile.flatMap { tempPath => + val tempDir = tempPath.getParent.toFile + val tempFile = tempPath.getFileName.toString + val path = Path.empty / "assets" + val routes = Routes.serveDirectory(path, tempDir).sandbox.deploy + val request = Request.get(URL(path / tempFile)) + assertZIO(routes(request).map(_.status))(equalTo(Status.NotFound)) + } + }, + ), + suite("serveResources")( + test("serve an existing resource") { + val existing = "TestFile.txt" + val path = Path.root / "assets" + val routes = Routes.serveResources(path, ".").sandbox.deploy + val request = Request.get(URL(path / existing)) + for { + response <- routes(request) + body <- response.body.asString + } yield { + assert(response.status)(equalTo(Status.Ok)) && + assert(response.header(Header.ContentLength))(isSome(equalTo(Header.ContentLength(7L)))) && + assert(body)(equalTo("foo\nbar")) && + assert(response.header(Header.ContentType))(isSome(equalTo(Header.ContentType(MediaType.text.plain)))) + } + }, + test("serve a non-existing resource") { + val nonExisting = "Nothing.txt" + val path = Path.root / "assets" + val routes = Routes.serveResources(path, ".").sandbox.deploy + val request = Request.get(URL(path / nonExisting)) + assertZIO(routes(request).map(_.status))(equalTo(Status.NotFound)) + }, + ), + ) @@ TestAspect.blocking +} From d0c868469d49f682ccd429a6bb8a6d788e32930b Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Sat, 8 Jun 2024 20:22:04 +0200 Subject: [PATCH 13/58] Use text over application media type for file serving; add charset (#2890) (#2855) --- .../scala/zio/http/HandlerPlatformSpecific.scala | 13 +++++++++---- .../src/test/scala/zio/http/ContentTypeSpec.scala | 6 ++++-- .../test/scala/zio/http/StaticFileServerSpec.scala | 12 ++++++------ .../shared/src/main/scala/zio/http/Handler.scala | 14 ++++++++++---- .../shared/src/main/scala/zio/http/MediaType.scala | 7 ++++++- .../src/main/scala/zio/http/Middleware.scala | 6 ++++-- 6 files changed, 39 insertions(+), 19 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/HandlerPlatformSpecific.scala b/zio-http/jvm/src/main/scala/zio/http/HandlerPlatformSpecific.scala index dcdc0c76a3..681159b801 100644 --- a/zio-http/jvm/src/main/scala/zio/http/HandlerPlatformSpecific.scala +++ b/zio-http/jvm/src/main/scala/zio/http/HandlerPlatformSpecific.scala @@ -1,6 +1,7 @@ package zio.http import java.io.{File, FileNotFoundException} +import java.nio.charset.Charset import java.util.zip.ZipFile import zio.{Trace, ZIO} @@ -13,21 +14,24 @@ trait HandlerPlatformSpecific { /** * Creates a handler from a resource path */ - def fromResource(path: String)(implicit trace: Trace): Handler[Any, Throwable, Any, Response] = + def fromResource(path: String, charset: Charset = Charsets.Utf8)(implicit + trace: Trace, + ): Handler[Any, Throwable, Any, Response] = Handler.fromZIO { ZIO .attemptBlocking(getClass.getClassLoader.getResource(path)) .map { resource => if (resource == null) Handler.fail(new FileNotFoundException(s"Resource $path not found")) - else fromResourceWithURL(resource) + else fromResourceWithURL(resource, charset) } }.flatten private[zio] def fromResourceWithURL( url: java.net.URL, + charset: Charset, )(implicit trace: Trace): Handler[Any, Throwable, Any, Response] = { url.getProtocol match { - case "file" => Handler.fromFile(new File(url.getPath)) + case "file" => Handler.fromFile(new File(url.getPath), charset) case "jar" => val path = new java.net.URI(url.getPath).getPath // remove "file:" prefix and normalize whitespace val bangIndex = path.indexOf('!') @@ -56,8 +60,9 @@ trait HandlerPlatformSpecific { .flatMap { case (entry, jar) => ZStream.fromInputStream(jar.getInputStream(entry)) } response = Response(body = Body.fromStream(inZStream, contentLength)) } yield mediaType.fold(response) { t => + val charset0 = if (t.mainType == "text" || !t.binary) Some(charset) else None response - .addHeader(Header.ContentType(t)) + .addHeader(Header.ContentType(t, charset = charset0)) } } } diff --git a/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala index c9774e8150..3f04817b81 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala @@ -34,7 +34,9 @@ object ContentTypeSpec extends HttpRunnableSpec { test("js") { val res = Handler.fromResource("TestFile3.js").sandbox.toRoutes.deploy(Request()).map(_.header(Header.ContentType)) - assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.application.`javascript`)))) + assertZIO(res)( + isSome(equalTo(Header.ContentType(MediaType.application.`javascript`, charset = Some(Charsets.Utf8)))), + ) }, test("no extension") { val res = Handler.fromResource("TestFile4").sandbox.toRoutes.deploy(Request()).map(_.header(Header.ContentType)) @@ -43,7 +45,7 @@ object ContentTypeSpec extends HttpRunnableSpec { test("css") { val res = Handler.fromResource("TestFile5.css").sandbox.toRoutes.deploy(Request()).map(_.header(Header.ContentType)) - assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.`css`)))) + assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.`css`, charset = Some(Charsets.Utf8))))) }, test("mp3") { val res = diff --git a/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala b/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala index 1b9c8ade6f..921e75b712 100644 --- a/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala @@ -20,7 +20,7 @@ import java.io.File import zio._ import zio.test.Assertion._ -import zio.test.TestAspect.{sequential, unix, withLiveClock} +import zio.test.TestAspect.{mac, os, sequential, unix, withLiveClock} import zio.test.assertZIO import zio.http.internal.{DynamicServer, HttpRunnableSpec, serverTestLayer} @@ -33,13 +33,13 @@ object StaticFileServerSpec extends HttpRunnableSpec { private val testArchivePath = getClass.getResource("/TestArchive.jar").getPath private val resourceOk = Handler - .fromResourceWithURL(new java.net.URI(s"jar:file:$testArchivePath!/TestFile.txt").toURL) + .fromResourceWithURL(new java.net.URI(s"jar:file:$testArchivePath!/TestFile.txt").toURL, Charsets.Utf8) .sandbox .toRoutes .deploy private val resourceNotFound = Handler - .fromResourceWithURL(new java.net.URI(s"jar:file:$testArchivePath!/NonExistent.txt").toURL) + .fromResourceWithURL(new java.net.URI(s"jar:file:$testArchivePath!/NonExistent.txt").toURL, Charsets.Utf8) .sandbox .toRoutes .deploy @@ -67,7 +67,7 @@ object StaticFileServerSpec extends HttpRunnableSpec { }, test("should have content-type") { val res = fileOk.run().debug("fileOk").map(_.header(Header.ContentType)) - assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.plain)))) + assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.plain, charset = Some(Charsets.Utf8))))) }, test("should respond with empty if file not found") { val res = fileNotFound.run().map(_.status) @@ -90,7 +90,7 @@ object StaticFileServerSpec extends HttpRunnableSpec { val res = Handler.fromFile(tmpFile).sandbox.toRoutes.deploy.run().map(_.status) assertZIO(res)(equalTo(Status.Forbidden)) } - } @@ unix, + } @@ os(o => o.isUnix || o.isMac), ), suite("invalid file")( test("should respond with 500") { @@ -118,7 +118,7 @@ object StaticFileServerSpec extends HttpRunnableSpec { }, test("should have content-type") { val res = resourceOk.run().map(_.header(Header.ContentType)) - assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.plain)))) + assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.plain, charset = Some(Charsets.Utf8))))) }, test("should respond with empty if not found") { val res = resourceNotFound.run().debug("not found").map(_.status) diff --git a/zio-http/shared/src/main/scala/zio/http/Handler.scala b/zio-http/shared/src/main/scala/zio/http/Handler.scala index a88e7552cc..2fec39a6a3 100644 --- a/zio-http/shared/src/main/scala/zio/http/Handler.scala +++ b/zio-http/shared/src/main/scala/zio/http/Handler.scala @@ -848,10 +848,14 @@ object Handler extends HandlerPlatformSpecific with HandlerVersionSpecific { } } - def fromFile[R](makeFile: => File)(implicit trace: Trace): Handler[R, Throwable, Any, Response] = - fromFileZIO(ZIO.attempt(makeFile)) + def fromFile[R](makeFile: => File, charset: Charset = Charsets.Utf8)(implicit + trace: Trace, + ): Handler[R, Throwable, Any, Response] = + fromFileZIO(ZIO.attempt(makeFile), charset) - def fromFileZIO[R](getFile: ZIO[R, Throwable, File])(implicit trace: Trace): Handler[R, Throwable, Any, Response] = { + def fromFileZIO[R](getFile: ZIO[R, Throwable, File], charset: Charset = Charsets.Utf8)(implicit + trace: Trace, + ): Handler[R, Throwable, Any, Response] = { Handler.fromZIO[R, Throwable, Response]( ZIO.blocking { getFile.flatMap { file => @@ -870,7 +874,9 @@ object Handler extends HandlerPlatformSpecific with HandlerVersionSpecific { // not the file extension, to determine how to process a URL. // {{{https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type}}} determineMediaType(pathName) match { - case Some(mediaType) => ZIO.succeed(response.addHeader(Header.ContentType(mediaType))) + case Some(mediaType) => + val charset0 = if (mediaType.mainType == "text" || !mediaType.binary) Some(charset) else None + ZIO.succeed(response.addHeader(Header.ContentType(mediaType, charset = charset0))) case None => ZIO.succeed(response) } } diff --git a/zio-http/shared/src/main/scala/zio/http/MediaType.scala b/zio-http/shared/src/main/scala/zio/http/MediaType.scala index ca08a6668a..91cf3683f9 100644 --- a/zio-http/shared/src/main/scala/zio/http/MediaType.scala +++ b/zio-http/shared/src/main/scala/zio/http/MediaType.scala @@ -36,7 +36,12 @@ final case class MediaType( } object MediaType extends MediaTypes { - private val extensionMap: Map[String, MediaType] = allMediaTypes.flatMap(m => m.fileExtensions.map(_ -> m)).toMap + private val extensionMap: Map[String, MediaType] = + // Some extensions are mapped to multiple media types. + // We prefer the text media types, since this is the correct default for the most common extensions + // like html, xml, javascript, etc. + allMediaTypes.flatMap(m => m.fileExtensions.map(_ -> m)).toMap ++ + text.all.flatMap(m => m.fileExtensions.map(_ -> m)).toMap private[http] val contentTypeMap: Map[String, MediaType] = allMediaTypes.map(m => m.fullType -> m).toMap val mainTypeMap = allMediaTypes.map(m => m.mainType -> m).toMap diff --git a/zio-http/shared/src/main/scala/zio/http/Middleware.scala b/zio-http/shared/src/main/scala/zio/http/Middleware.scala index bc4655086f..62a4f8869b 100644 --- a/zio-http/shared/src/main/scala/zio/http/Middleware.scala +++ b/zio-http/shared/src/main/scala/zio/http/Middleware.scala @@ -16,6 +16,7 @@ package zio.http import java.io.File +import java.nio.charset.Charset import scala.annotation.nowarn @@ -325,8 +326,9 @@ object Middleware extends HandlerAspects { } def fromDirectory(docRoot: File)(implicit trace: Trace): StaticServe[Any, Throwable] = make { (path, _) => - val target = new File(docRoot.getAbsolutePath() + path.encode) - if (target.getCanonicalPath.startsWith(docRoot.getCanonicalPath)) Handler.fromFile(target) + val target = new File(docRoot.getAbsolutePath + path.encode) + if (target.getCanonicalPath.startsWith(docRoot.getCanonicalPath)) + Handler.fromFile(target, Charset.defaultCharset()) else { Handler.fromZIO( ZIO.logWarning(s"attempt to access file outside of docRoot: ${target.getAbsolutePath}"), From f070e41a348ab24d4ba2720da7d60b6972d2f902 Mon Sep 17 00:00:00 2001 From: Ezhil Shanmugham Date: Sun, 9 Jun 2024 18:58:25 +0530 Subject: [PATCH 14/58] fix: broken link in readme (#2883) fix: broken readme link --- README.md | 6 +++--- project/BuildHelper.scala | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dba3122665..d50448eb4e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ZIO HTTP is a scala library for building http apps. It is powered by ZIO and [Ne ZIO HTTP is designed in terms of **HTTP as function**, where both server and client are a function from a request to a response, with a focus on type safety, composability, and testability. -[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-http/workflows/Continuous%20Integration/badge.svg) [![Sonatype Releases](https://img.shields.io/nexus/r/https/oss.sonatype.org/dev.zio/zio-http_2.13.svg?label=Sonatype%20Release)](https://oss.sonatype.org/content/repositories/releases/dev/zio/zio-http_2.13/) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-http_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-http_2.13/) [![javadoc](https://javadoc.io/badge2/dev.zio/zio-http-docs_2.13/javadoc.svg)](https://javadoc.io/doc/dev.zio/zio-http-docs_2.13) [![ZIO Http](https://img.shields.io/github/stars/zio/zio-http?style=social)](https://github.com/zio/zio-http) +[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-http/workflows/Continuous%20Integration/badge.svg) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-http_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-http_2.13/) [![ZIO Http](https://img.shields.io/github/stars/zio/zio-http?style=social)](https://github.com/zio/zio-http) Some of the key features of ZIO HTTP are: @@ -43,7 +43,7 @@ Some of the key features of ZIO HTTP are: Setup via `build.sbt`: ```scala -libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC7" +libraryDependencies += "dev.zio" %% "zio-http" % "" ``` **NOTES ON VERSIONING:** @@ -103,7 +103,7 @@ object GreetingClient extends ZIOAppDefault { ## Documentation -Learn more on the [ZIO Http homepage](https://github.com/zio/zio-http)! +Learn more on the [ZIO Http homepage](https://zio.dev/zio-http)! ## Contributing diff --git a/project/BuildHelper.scala b/project/BuildHelper.scala index 9f5485ac0c..44e6243a86 100644 --- a/project/BuildHelper.scala +++ b/project/BuildHelper.scala @@ -102,7 +102,7 @@ object BuildHelper extends ScalaSettings { ) def meta = Seq( - ThisBuild / homepage := Some(url("https://github.com/zio/zio-http")), + ThisBuild / homepage := Some(url("https://zio.dev/zio-http")), ThisBuild / scmInfo := Some( ScmInfo(url("https://github.com/zio/zio-http"), "scm:git@github.com:zio/zio-http.git"), From fcbbebf0012df602305c59c3a00057bd8f282ca7 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:15:36 +0200 Subject: [PATCH 15/58] Simpler default `Endpoint#implement` (#2811) (#2894) Co-authored-by: John A. De Goes --- docs/reference/endpoint.md | 8 +-- .../zio/http/grpc/ZIOHttpGRPCGenSpec.scala | 6 +- .../http/benchmarks/EndpointBenchmark.scala | 36 +++++----- .../main/scala/example/EndpointExamples.scala | 12 +--- .../example/ServerSentEventEndpoint.scala | 2 +- .../endpoint/BooksEndpointExample.scala | 2 +- .../scala/example/endpoint/CliExamples.scala | 6 +- ...ndpointWithMultipleErrorsUsingEither.scala | 2 +- .../EndpointWithMultipleUnifiedErrors.scala | 2 +- .../style/DeclarativeProgrammingExample.scala | 2 +- .../scala/zio/http/StaticFileRoutesSpec.scala | 7 +- .../scala/zio/http/endpoint/AuthSpec.scala | 4 +- .../zio/http/endpoint/BadRequestSpec.scala | 12 ++-- .../zio/http/endpoint/CustomErrorSpec.scala | 6 +- .../zio/http/endpoint/MultipartSpec.scala | 14 ++-- .../zio/http/endpoint/NotFoundSpec.scala | 8 +-- .../http/endpoint/QueryParameterSpec.scala | 28 ++++---- .../scala/zio/http/endpoint/RequestSpec.scala | 68 +++++++++---------- .../zio/http/endpoint/RoundtripSpec.scala | 30 ++++---- .../http/endpoint/openapi/SwaggerUISpec.scala | 4 +- .../scala/zio/http/endpoint/Endpoint.scala | 27 +++++++- 21 files changed, 152 insertions(+), 134 deletions(-) diff --git a/docs/reference/endpoint.md b/docs/reference/endpoint.md index 22a6bf5f27..46563e41e5 100644 --- a/docs/reference/endpoint.md +++ b/docs/reference/endpoint.md @@ -34,7 +34,7 @@ In the above example, we defined an endpoint on the path `/books` that accepts a After defining the endpoint, we are ready to implement it. We can implement it using the `Endpoint#implement` method, which takes a proper handler function that will be called when the endpoint is invoked and returns a `Route`: ```scala -val booksRoute = endpoint.implement(handler((query: String) => BookRepo.find(query))) +val booksRoute = endpoint.implement(query => BookRepo.find(query)) ``` We can also generate OpenAPI documentation for our endpoint using the `OpenAPIGen.fromEndpoints` constructor: @@ -261,13 +261,13 @@ object EndpointWithMultipleOutputTypes extends ZIOAppDefault { .out[Quiz] def run = Server.serve( - endpoint.implement(handler { + endpoint.implement(_ => ZIO.randomWith(_.nextBoolean) .map(r => if (r) Right(Course("Introduction to Programming", 49.99)) else Left(Quiz("What is the boiling point of water in Celsius?", 2)), ) - }) + ) .toRoutes).provide(Server.default, Scope.default) } ``` @@ -417,7 +417,7 @@ case class Book( The `OpenAPIGen.fromEndpoints` constructor generates OpenAPI documentation from the endpoints. By having the OpenAPI documentation, we can easily generate Swagger UI routes using the `SwaggerUI.routes` constructor: ```scala -val booksRoute = endpoint.implement(handler((query: String) => BookRepo.find(query))) +val booksRoute = endpoint.implement(query => BookRepo.find(query)) val openAPI = OpenAPIGen.fromEndpoints(title = "Library API", version = "1.0", endpoint) val swaggerRoutes = SwaggerUI.routes("docs" / "openapi", openAPI) val routes = Routes(booksRoute) ++ swaggerRoutes diff --git a/sbt-zio-http-grpc-tests/src/test/scala/zio/http/grpc/ZIOHttpGRPCGenSpec.scala b/sbt-zio-http-grpc-tests/src/test/scala/zio/http/grpc/ZIOHttpGRPCGenSpec.scala index 4b9fa8c124..38cf5b4630 100644 --- a/sbt-zio-http-grpc-tests/src/test/scala/zio/http/grpc/ZIOHttpGRPCGenSpec.scala +++ b/sbt-zio-http-grpc-tests/src/test/scala/zio/http/grpc/ZIOHttpGRPCGenSpec.scala @@ -13,11 +13,7 @@ object ZIOHttpGRPCGenSpec extends ZIOSpecDefault { assertTrue(true) }, test("plugin generates Endpoint") { - val impl = V1.test.implement { - Handler.fromFunction[TestMsg] { msg => - msg - } - } + val impl = V1.test.implementPurely { msg => msg } assertTrue(true) }, ) diff --git a/zio-http-benchmarks/src/main/scala-2.13/zio/http/benchmarks/EndpointBenchmark.scala b/zio-http-benchmarks/src/main/scala-2.13/zio/http/benchmarks/EndpointBenchmark.scala index 21f76759e8..0dc79c735d 100644 --- a/zio-http-benchmarks/src/main/scala-2.13/zio/http/benchmarks/EndpointBenchmark.scala +++ b/zio-http-benchmarks/src/main/scala-2.13/zio/http/benchmarks/EndpointBenchmark.scala @@ -95,7 +95,7 @@ class EndpointBenchmark { .out[ExampleData] val handledUsersPosts = - usersPosts.implement { + usersPosts.implementHandler { Handler.fromFunction { case (userId, postId, limit) => ExampleData(userId, postId, limit) } @@ -218,7 +218,7 @@ class EndpointBenchmark { ) / "seventh" / int("id5"), ) .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) .toRoutes // Collect DSL @@ -333,20 +333,20 @@ class EndpointBenchmark { // API DSL - val broadUsers = Endpoint(Method.GET / "users").out[Unit].implement(Handler.unit) + val broadUsers = Endpoint(Method.GET / "users").out[Unit].implementHandler(Handler.unit) val broadUsersId = - Endpoint(Method.GET / "users" / int("userId")).out[Unit].implement(Handler.unit) + Endpoint(Method.GET / "users" / int("userId")).out[Unit].implementHandler(Handler.unit) val boardUsersPosts = Endpoint(Method.GET / "users" / int("userId") / "posts") .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val boardUsersPostsId = Endpoint( Method.GET / "users" / int("userId") / "posts" / int("postId"), ) .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val boardUsersPostsComments = Endpoint( Method.GET / @@ -355,7 +355,7 @@ class EndpointBenchmark { ) / "comments", ) .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val boardUsersPostsCommentsId = Endpoint( Method.GET / @@ -364,14 +364,14 @@ class EndpointBenchmark { ) / "comments" / int("commentId"), ) .out[Unit] - .implement(Handler.unit) - val broadPosts = Endpoint(Method.GET / "posts").out[Unit].implement(Handler.unit) + .implementHandler(Handler.unit) + val broadPosts = Endpoint(Method.GET / "posts").out[Unit].implementHandler(Handler.unit) val broadPostsId = - Endpoint(Method.GET / "posts" / int("postId")).out[Unit].implement(Handler.unit) + Endpoint(Method.GET / "posts" / int("postId")).out[Unit].implementHandler(Handler.unit) val boardPostsComments = Endpoint(Method.GET / "posts" / int("postId") / "comments") .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val boardPostsCommentsId = Endpoint( Method.GET / @@ -380,14 +380,14 @@ class EndpointBenchmark { ), ) .out[Unit] - .implement(Handler.unit) - val broadComments = Endpoint(Method.GET / "comments").out[Unit].implement(Handler.unit) + .implementHandler(Handler.unit) + val broadComments = Endpoint(Method.GET / "comments").out[Unit].implementHandler(Handler.unit) val broadCommentsId = - Endpoint(Method.GET / "comments" / int("commentId")).out[Unit].implement(Handler.unit) + Endpoint(Method.GET / "comments" / int("commentId")).out[Unit].implementHandler(Handler.unit) val broadUsersComments = Endpoint(Method.GET / "users" / int("userId") / "comments") .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val broadUsersCommentsId = Endpoint( Method.GET / @@ -396,7 +396,7 @@ class EndpointBenchmark { ), ) .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val boardUsersPostsCommentsReplies = Endpoint( Method.GET / @@ -406,7 +406,7 @@ class EndpointBenchmark { "replies", ) .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val boardUsersPostsCommentsRepliesId = Endpoint( Method.GET / @@ -415,7 +415,7 @@ class EndpointBenchmark { ) / "comments" / int("commentId") / "replies" / int("replyId"), ) .out[Unit] - .implement(Handler.unit) + .implementHandler(Handler.unit) val broadApiApp = Routes( diff --git a/zio-http-example/src/main/scala/example/EndpointExamples.scala b/zio-http-example/src/main/scala/example/EndpointExamples.scala index 490cc99bf0..c0e420a1b2 100644 --- a/zio-http-example/src/main/scala/example/EndpointExamples.scala +++ b/zio-http-example/src/main/scala/example/EndpointExamples.scala @@ -19,11 +19,7 @@ object EndpointExamples extends ZIOAppDefault { Endpoint(Method.GET / "users" / int("userId")).out[Int] @@ auth val getUserRoute = - getUser.implement { - Handler.fromFunction[Int] { id => - id - } - } + getUser.implement { id => ZIO.succeed(id) } val getUserPosts = Endpoint(Method.GET / "users" / int("userId") / "posts" / int("postId")) @@ -31,10 +27,8 @@ object EndpointExamples extends ZIOAppDefault { .out[List[String]] @@ auth val getUserPostsRoute = - getUserPosts.implement[Any] { - Handler.fromFunctionZIO[(Int, Int, String)] { case (id1: Int, id2: Int, query: String) => - ZIO.succeed(List(s"API2 RESULT parsed: users/$id1/posts/$id2?name=$query")) - } + getUserPosts.implement { case (id1: Int, id2: Int, query: String) => + ZIO.succeed(List(s"API2 RESULT parsed: users/$id1/posts/$id2?name=$query")) } val openAPI = OpenAPIGen.fromEndpoints(title = "Endpoint Example", version = "1.0", getUser, getUserPosts) diff --git a/zio-http-example/src/main/scala/example/ServerSentEventEndpoint.scala b/zio-http-example/src/main/scala/example/ServerSentEventEndpoint.scala index 05eb0dc773..c698f24317 100644 --- a/zio-http-example/src/main/scala/example/ServerSentEventEndpoint.scala +++ b/zio-http-example/src/main/scala/example/ServerSentEventEndpoint.scala @@ -21,7 +21,7 @@ object ServerSentEventEndpoint extends ZIOAppDefault { val sseEndpoint: Endpoint[Unit, Unit, ZNothing, ZStream[Any, Nothing, ServerSentEvent], None] = Endpoint(Method.GET / "sse").outStream[ServerSentEvent] - val sseRoute = sseEndpoint.implement(Handler.succeed(stream)) + val sseRoute = sseEndpoint.implementHandler(Handler.succeed(stream)) val routes: Routes[Any, Response] = sseRoute.toRoutes diff --git a/zio-http-example/src/main/scala/example/endpoint/BooksEndpointExample.scala b/zio-http-example/src/main/scala/example/endpoint/BooksEndpointExample.scala index 29ffab3f65..a907a36e00 100644 --- a/zio-http-example/src/main/scala/example/endpoint/BooksEndpointExample.scala +++ b/zio-http-example/src/main/scala/example/endpoint/BooksEndpointExample.scala @@ -44,7 +44,7 @@ object BooksEndpointExample extends ZIOAppDefault { "Endpoint to query books based on a search query", ) - val booksRoute = endpoint.implement(handler((query: String) => BookRepo.find(query))) + val booksRoute = endpoint.implementHandler(handler((query: String) => BookRepo.find(query))) val openAPI = OpenAPIGen.fromEndpoints(title = "Library API", version = "1.0", endpoint) val swaggerRoutes = SwaggerUI.routes("docs" / "openapi", openAPI) val routes = Routes(booksRoute) ++ swaggerRoutes diff --git a/zio-http-example/src/main/scala/example/endpoint/CliExamples.scala b/zio-http-example/src/main/scala/example/endpoint/CliExamples.scala index da86cc4295..d54713d240 100644 --- a/zio-http-example/src/main/scala/example/endpoint/CliExamples.scala +++ b/zio-http-example/src/main/scala/example/endpoint/CliExamples.scala @@ -81,21 +81,21 @@ object TestCliApp extends zio.cli.ZIOCliDefault with TestCliEndpoints { object TestCliServer extends zio.ZIOAppDefault with TestCliEndpoints { val getUserRoute = - getUser.implement { + getUser.implementHandler { Handler.fromFunctionZIO { case (id, _) => ZIO.succeed(User(id, "Juanito", Some("juanito@test.com"))).debug("Hello") } } val getUserPostsRoute = - getUserPosts.implement { + getUserPosts.implementHandler { Handler.fromFunction { case (userId, postId, name) => List(Post(userId, postId, name)) } } val createUserRoute = - createUser.implement { + createUser.implementHandler { Handler.fromFunction { user => user.name } diff --git a/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleErrorsUsingEither.scala b/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleErrorsUsingEither.scala index 4fe6e24ba5..063eb5e4b5 100644 --- a/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleErrorsUsingEither.scala +++ b/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleErrorsUsingEither.scala @@ -56,7 +56,7 @@ object EndpointWithMultipleErrorsUsingEither extends ZIOAppDefault { ZIO.fail(Left(AuthenticationError("User is not authenticated", 123))) } - val routes = endpoint.implement(getBookHandler).toRoutes @@ Middleware.debug + val routes = endpoint.implementHandler(getBookHandler).toRoutes @@ Middleware.debug def run = Server.serve(routes).provide(Server.default) } diff --git a/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleUnifiedErrors.scala b/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleUnifiedErrors.scala index a77305c81e..257ac314c8 100644 --- a/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleUnifiedErrors.scala +++ b/zio-http-example/src/main/scala/example/endpoint/EndpointWithMultipleUnifiedErrors.scala @@ -62,7 +62,7 @@ object EndpointWithMultipleUnifiedErrors extends ZIOAppDefault { ZIO.fail(AuthenticationError("User is not authenticated", 123)) } - val routes = endpoint.implement(getBookHandler).toRoutes @@ Middleware.debug + val routes = endpoint.implementHandler(getBookHandler).toRoutes @@ Middleware.debug def run = Server.serve(routes).provide(Server.default) } diff --git a/zio-http-example/src/main/scala/example/endpoint/style/DeclarativeProgrammingExample.scala b/zio-http-example/src/main/scala/example/endpoint/style/DeclarativeProgrammingExample.scala index 29bc65f70e..eaf3748f0e 100644 --- a/zio-http-example/src/main/scala/example/endpoint/style/DeclarativeProgrammingExample.scala +++ b/zio-http-example/src/main/scala/example/endpoint/style/DeclarativeProgrammingExample.scala @@ -40,7 +40,7 @@ object DeclarativeProgrammingExample extends ZIOAppDefault { val getBookHandler: Handler[Any, NotFoundError, String, Book] = handler(BookRepo.find(_)) - val routes = endpoint.implement(getBookHandler).toRoutes @@ Middleware.debug + val routes = endpoint.implementHandler(getBookHandler).toRoutes @@ Middleware.debug def run = Server.serve(routes).provide(Server.default) } diff --git a/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala b/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala index f257c019ed..c0ae4010e1 100644 --- a/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala @@ -16,7 +16,6 @@ package zio.http -import java.lang.System import java.nio.file.{Files, Path => NIOPath} import zio._ @@ -32,7 +31,7 @@ object StaticFileRoutesSpec extends HttpRunnableSpec { private def deleteTempFile(tempPath: NIOPath) = ZIO.attempt(Files.deleteIfExists(tempPath)).ignore private val createAndDeleteTempFile = createTempFile.flatMap(f => deleteTempFile(f).as(f)) - override def spec = suite("StaticFileServerSpec") { + override def spec = suite("StaticFileRoutesSpec") { serve.as(List(staticSpec)) } .provideSome[DynamicServer & Server & Client](Scope.default) @@ -78,7 +77,9 @@ object StaticFileRoutesSpec extends HttpRunnableSpec { assert(response.status)(equalTo(Status.Ok)) && assert(response.header(Header.ContentLength))(isSome(equalTo(Header.ContentLength(7L)))) && assert(body)(equalTo("foo\nbar")) && - assert(response.header(Header.ContentType))(isSome(equalTo(Header.ContentType(MediaType.text.plain)))) + assert(response.header(Header.ContentType))( + isSome(equalTo(Header.ContentType(MediaType.text.plain, charset = Some(Charsets.Utf8)))), + ) } }, test("serve a non-existing resource") { diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/AuthSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/AuthSpec.scala index f697d5162c..739f211682 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/AuthSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/AuthSpec.scala @@ -26,7 +26,9 @@ object AuthSpec extends ZIOSpecDefault { test("Auth with context") { val endpoint = Endpoint(Method.GET / "test").out[String](MediaType.text.`plain`) val routes = - Routes(endpoint.implement(handler((_: Unit) => ZIO.serviceWith[AuthContext](_.value)))) @@ basicAuthContext + Routes( + endpoint.implementHandler(handler((_: Unit) => ZIO.serviceWith[AuthContext](_.value))), + ) @@ basicAuthContext val response = routes.run( Request( method = Method.GET, diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/BadRequestSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/BadRequestSpec.scala index 009c6a56e3..aa0cc3999b 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/BadRequestSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/BadRequestSpec.scala @@ -17,7 +17,7 @@ object BadRequestSpec extends ZIOSpecDefault { val endpoint = Endpoint(Method.GET / "test") .query(QueryCodec.queryInt("age")) .out[Unit] - val route = endpoint.implement(handler((_: Int) => ())) + val route = endpoint.implementHandler(handler((_: Int) => ())) val request = Request(method = Method.GET, url = url"/test?age=1&age=2").addHeader(Header.Accept(MediaType.text.`html`)) val expectedBody = @@ -38,7 +38,7 @@ object BadRequestSpec extends ZIOSpecDefault { val endpoint = Endpoint(Method.GET / "test") .query(QueryCodec.queryInt("age")) .out[Unit] - val route = endpoint.implement(handler((_: Int) => ())) + val route = endpoint.implementHandler(handler((_: Int) => ())) val request = Request(method = Method.GET, url = url"/test?age=1&age=2") .addHeader(Header.Accept(MediaType.application.json)) @@ -53,7 +53,7 @@ object BadRequestSpec extends ZIOSpecDefault { val endpoint = Endpoint(Method.GET / "test") .query(QueryCodec.queryInt("age")) .out[Unit] - val route = endpoint.implement(handler((_: Int) => ())) + val route = endpoint.implementHandler(handler((_: Int) => ())) val request = Request(method = Method.GET, url = url"/test?age=1&age=2") .addHeader(Header.Accept(MediaType.application.`atf`)) @@ -69,7 +69,7 @@ object BadRequestSpec extends ZIOSpecDefault { .query(QueryCodec.queryInt("age")) .out[Unit] .emptyErrorResponse - val route = endpoint.implement(handler((_: Int) => ())) + val route = endpoint.implementHandler(handler((_: Int) => ())) val request = Request(method = Method.GET, url = url"/test?age=1&age=2") .addHeader(Header.Accept(MediaType.application.`atf`)) @@ -83,7 +83,7 @@ object BadRequestSpec extends ZIOSpecDefault { val endpoint = Endpoint(Method.GET / "test") .query(QueryCodec.queryInt("age")) .out[Unit] - val route = endpoint.implement(handler((_: Int) => ())) + val route = endpoint.implementHandler(handler((_: Int) => ())) val request = Request(method = Method.GET, url = url"/test?age=1&age=2") .addHeader(Header.Accept(MediaType.application.json)) @@ -99,7 +99,7 @@ object BadRequestSpec extends ZIOSpecDefault { .query(QueryCodec.queryInt("age")) .out[Unit] .outCodecError(default) - val route = endpoint.implement(handler((_: Int) => ())) + val route = endpoint.implementHandler(handler((_: Int) => ())) val request = Request(method = Method.GET, url = url"/test?age=1&age=2") .addHeader(Header.Accept(MediaType.application.json)) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/CustomErrorSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/CustomErrorSpec.scala index 0b59d3a610..b42382f1af 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/CustomErrorSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/CustomErrorSpec.scala @@ -39,7 +39,7 @@ object CustomErrorSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .out[String] .outError[String](Status.Custom(customCode)) - .implement { + .implementHandler { Handler.fromFunctionZIO { userId => ZIO.fail(s"path(users, $userId)") } @@ -66,7 +66,7 @@ object CustomErrorSpec extends ZIOHttpSpec { HttpCodec.error[TestError.UnexpectedError](Status.InternalServerError), HttpCodec.error[TestError.InvalidUser](Status.NotFound), ) - .implement { + .implementHandler { Handler.fromFunctionZIO { userId => if (userId == myUserId) ZIO.fail(TestError.InvalidUser(userId)) else ZIO.fail(TestError.UnexpectedError("something went wrong")) @@ -100,7 +100,7 @@ object CustomErrorSpec extends ZIOHttpSpec { .in[User](Doc.p("User schema with id")) .out[String] .emptyErrorResponse - .implement { + .implementHandler { Handler.fromFunctionZIO { _ => ZIO.succeed("User ID is greater than 0") } diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala index 01b559012b..f3ad67df34 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/MultipartSpec.scala @@ -55,7 +55,7 @@ object MultipartSpec extends ZIOHttpSpec { HttpCodec.content[Int]("height", MediaType.text.`plain`) ++ HttpCodec.content[ImageMetadata]("metadata"), ) - .implement { + .implementHandler { Handler.succeed( ( ZStream.fromChunk(bytes), @@ -111,7 +111,7 @@ object MultipartSpec extends ZIOHttpSpec { HttpCodec.content[Int](MediaType.text.`plain`) ++ HttpCodec.content[ImageMetadata], ) - .implement { + .implementHandler { Handler.succeed( ( ZStream.fromChunk(bytes), @@ -158,7 +158,7 @@ object MultipartSpec extends ZIOHttpSpec { .in[String]("title") .in[ImageMetadata]("metadata", Doc.p("Image metadata with description and creation date and time")) .out[(Long, String, ImageMetadata)] - .implement { + .implementHandler { Handler.fromFunctionZIO { case (stream, title, metadata) => stream.runCount.map(count => (count, title, metadata)) } @@ -238,7 +238,7 @@ object MultipartSpec extends ZIOHttpSpec { } } val route = - endpoint.implement(Handler.identity[Any]) + endpoint.implementHandler(Handler.identity[Any]) val form = Form( @@ -294,9 +294,9 @@ object MultipartSpec extends ZIOHttpSpec { ) for { result <- (endpoint - .implement(handler { (id: Int) => - (Book("John's Book", List("John Doe")), ZStream.from(Chunk.fromArray("the book file".getBytes))) - }) + .implementPurely(_ => + (Book("John's Book", List("John Doe")), ZStream.from(Chunk.fromArray("the book file".getBytes))), + ) .toRoutes @@ Middleware.debug).run(path = Path.root / "books" / "123") } yield assertTrue( result.status == Status.Ok, diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/NotFoundSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/NotFoundSpec.scala index 1594d5fb6b..79ed17e155 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/NotFoundSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/NotFoundSpec.scala @@ -43,7 +43,7 @@ object NotFoundSpec extends ZIOHttpSpec { Routes( Endpoint(GET / "users" / int("userId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { userId => s"path(users, $userId)" } @@ -51,7 +51,7 @@ object NotFoundSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId") / "posts" / int("postId")) .query(query("name")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, name) => s"path(users, $userId, posts, $postId) query(name=$name)" } @@ -68,7 +68,7 @@ object NotFoundSpec extends ZIOHttpSpec { Routes( Endpoint(GET / "users" / int("userId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { userId => s"path(users, $userId)" } @@ -76,7 +76,7 @@ object NotFoundSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId") / "posts" / int("postId")) .query(query("name")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, name) => s"path(users, $userId, posts, $postId) query(name=$name)" } diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/QueryParameterSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/QueryParameterSpec.scala index 884fbb99bf..768de94dff 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/QueryParameterSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/QueryParameterSpec.scala @@ -34,7 +34,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Routes( Endpoint(GET / "users" / int("userId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { userId => s"path(users, $userId)" } @@ -42,7 +42,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId") / "posts" / int("postId")) .query(query("name")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, name) => s"path(users, $userId, posts, $postId) query(name=$name)" } @@ -63,7 +63,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(query("details").optional) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, details) => s"path(users, $userId, $details)" } @@ -83,7 +83,7 @@ object QueryParameterSpec extends ZIOHttpSpec { .query(query("key").optional) .query(query("value").optional) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, key, value) => s"path(users, $userId, $key, $value)" } @@ -103,7 +103,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(queryAll("key")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, keys) => s"""path(users, $userId, ${keys.mkString(", ")})""" } @@ -132,7 +132,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(queryAll("key").optional) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, keys) => s"""path(users, $userId, $keys)""" } @@ -162,7 +162,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(queryAll("key") & queryAll("value")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, keys, values) => s"""path(users, $userId, $keys, $values)""" } @@ -187,7 +187,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(queryAll("multi") & query("single")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, multi, single) => s"""path(users, $userId, $multi, $single)""" } @@ -208,7 +208,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(queryAll("left") | queryAllBool("right")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, eitherOfParameters) => s"path(users, $userId, $eitherOfParameters)" } @@ -238,7 +238,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(queryAll("left") | queryAll("right")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, queryParams) => s"path(users, $userId, $queryParams)" } @@ -267,7 +267,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .query(queryAll("left") | query("right")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, queryParams) => s"path(users, $userId, $queryParams)" } @@ -295,7 +295,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users") .query(queryAllInt("ints")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case queryParams => s"path(users, $queryParams)" } @@ -313,7 +313,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users") .query(queryAllInt("ints")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case queryParams => s"path(users, $queryParams)" } @@ -330,7 +330,7 @@ object QueryParameterSpec extends ZIOHttpSpec { Endpoint(GET / "users") .query(queryInt("ints")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case queryParams => s"path(users, $queryParams)" } diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/RequestSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/RequestSpec.scala index 12af7bba14..1973fcab9d 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/RequestSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/RequestSpec.scala @@ -44,7 +44,7 @@ object RequestSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")) .header(HeaderCodec.name[java.util.UUID]("X-Correlation-ID")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, correlationId) => s"path(users, $userId) header(correlationId=$correlationId)" } @@ -52,7 +52,7 @@ object RequestSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId") / "posts" / int("postId")) .header(HeaderCodec.name[java.util.UUID]("X-Correlation-ID")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, correlationId) => s"path(users, $userId, posts, $postId) header(correlationId=$correlationId)" } @@ -78,7 +78,7 @@ object RequestSpec extends ZIOHttpSpec { .query(query("id")) .out[Int](MediaType.text.`plain`) val routes = - endpoint.implement { + endpoint.implementHandler { Handler.succeed(id) } @@ -100,7 +100,7 @@ object RequestSpec extends ZIOHttpSpec { .query(query("id")) .out[Int](MediaType.text.`plain`) val routes = - endpoint.implement { + endpoint.implementHandler { Handler.succeed(id) } @@ -122,7 +122,7 @@ object RequestSpec extends ZIOHttpSpec { .query(query("id")) .out[Int](Status.NotFound) val routes = - endpoint.implement { + endpoint.implementHandler { Handler.succeed(id) } @@ -140,7 +140,7 @@ object RequestSpec extends ZIOHttpSpec { Endpoint(GET / "posts") .query(queryInt("id")) .out[Int] - val routes = endpoint.implement { Handler.succeed(id) } + val routes = endpoint.implementHandler { Handler.succeed(id) } for { response <- routes.toRoutes.runZIO( Request.get(url"/posts?id=$notAnId").addHeader(Header.Accept(MediaType.application.`json`)), @@ -159,7 +159,7 @@ object RequestSpec extends ZIOHttpSpec { .header(HeaderCodec.name[java.util.UUID]("X-Correlation-ID")) .out[Int] val routes = - endpoint.implement { + endpoint.implementHandler { Handler.succeed(id) } @@ -178,7 +178,7 @@ object RequestSpec extends ZIOHttpSpec { .header(HeaderCodec.name[java.util.UUID]("X-Correlation-ID")) .out[Int] val routes = - endpoint.implement { + endpoint.implementHandler { Handler.succeed(id) } @@ -195,7 +195,7 @@ object RequestSpec extends ZIOHttpSpec { Routes( Endpoint(GET / "users" / int("userId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { userId => s"path(users, $userId)" } @@ -204,7 +204,7 @@ object RequestSpec extends ZIOHttpSpec { .query(query("name")) .query(query("age")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, name, age) => s"path(users, $userId, posts, $postId) query(name=$name, age=$age)" } @@ -225,7 +225,7 @@ object RequestSpec extends ZIOHttpSpec { Endpoint(GET / "users") .query(queryInt("userId") | query("userId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { userId => val value = userId.fold(_.toString, identity) s"path(users) query(userId=$value)" @@ -240,11 +240,11 @@ object RequestSpec extends ZIOHttpSpec { test("broad api") { check(Gen.int, Gen.int, Gen.int, Gen.int) { (userId, postId, commentId, replyId) => val broadUsers = - Endpoint(GET / "users").out[String](Doc.p("Created user id")).implement { + Endpoint(GET / "users").out[String](Doc.p("Created user id")).implementHandler { Handler.succeed("path(users)") } val broadUsersId = - Endpoint(GET / "users" / int("userId")).out[String].implement { + Endpoint(GET / "users" / int("userId")).out[String].implementHandler { Handler.fromFunction { userId => s"path(users, $userId)" } @@ -252,7 +252,7 @@ object RequestSpec extends ZIOHttpSpec { val boardUsersPosts = Endpoint(GET / "users" / int("userId") / "posts") .out[String] - .implement { + .implementHandler { Handler.fromFunction { userId => s"path(users, $userId, posts)" } @@ -260,7 +260,7 @@ object RequestSpec extends ZIOHttpSpec { val boardUsersPostsId = Endpoint(GET / "users" / int("userId") / "posts" / int("postId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId) => s"path(users, $userId, posts, $postId)" } @@ -271,7 +271,7 @@ object RequestSpec extends ZIOHttpSpec { "users" / int("userId") / "posts" / int("postId") / "comments", ) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId) => s"path(users, $userId, posts, $postId, comments)" } @@ -282,15 +282,15 @@ object RequestSpec extends ZIOHttpSpec { "users" / int("userId") / "posts" / int("postId") / "comments" / int("commentId"), ) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, commentId) => s"path(users, $userId, posts, $postId, comments, $commentId)" } } val broadPosts = - Endpoint(GET / "posts").out[String].implement(Handler.succeed("path(posts)")) + Endpoint(GET / "posts").out[String].implementHandler(Handler.succeed("path(posts)")) val broadPostsId = - Endpoint(GET / "posts" / int("postId")).out[String].implement { + Endpoint(GET / "posts" / int("postId")).out[String].implementHandler { Handler.fromFunction { postId => s"path(posts, $postId)" } @@ -298,7 +298,7 @@ object RequestSpec extends ZIOHttpSpec { val boardPostsComments = Endpoint(GET / "posts" / int("postId") / "comments") .out[String] - .implement { + .implementHandler { Handler.fromFunction { postId => s"path(posts, $postId, comments)" } @@ -306,15 +306,15 @@ object RequestSpec extends ZIOHttpSpec { val boardPostsCommentsId = Endpoint(GET / "posts" / int("postId") / "comments" / int("commentId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (postId, commentId) => s"path(posts, $postId, comments, $commentId)" } } val broadComments = - Endpoint(GET / "comments").out[String].implement(Handler.succeed("path(comments)")) + Endpoint(GET / "comments").out[String].implementHandler(Handler.succeed("path(comments)")) val broadCommentsId = - Endpoint(GET / "comments" / int("commentId")).out[String].implement { + Endpoint(GET / "comments" / int("commentId")).out[String].implementHandler { Handler.fromFunction { commentId => s"path(comments, $commentId)" } @@ -322,7 +322,7 @@ object RequestSpec extends ZIOHttpSpec { val broadUsersComments = Endpoint(GET / "users" / int("userId") / "comments") .out[String] - .implement { + .implementHandler { Handler.fromFunction { userId => s"path(users, $userId, comments)" } @@ -330,7 +330,7 @@ object RequestSpec extends ZIOHttpSpec { val broadUsersCommentsId = Endpoint(GET / "users" / int("userId") / "comments" / int("commentId")) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, commentId) => s"path(users, $userId, comments, $commentId)" } @@ -341,7 +341,7 @@ object RequestSpec extends ZIOHttpSpec { "users" / int("userId") / "posts" / int("postId") / "comments" / int("commentId") / "replies", ) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, commentId) => s"path(users, $userId, posts, $postId, comments, $commentId, replies)" } @@ -353,7 +353,7 @@ object RequestSpec extends ZIOHttpSpec { "replies" / int("replyId"), ) .out[String] - .implement { + .implementHandler { Handler.fromFunction { case (userId, postId, commentId, replyId) => s"path(users, $userId, posts, $postId, comments, $commentId, replies, $replyId)" } @@ -411,7 +411,7 @@ object RequestSpec extends ZIOHttpSpec { check(Gen.alphaNumericString, Gen.alphaNumericString) { (queryValue, headerValue) => val headerOrQuery = HeaderCodec.name[String]("X-Header") | QueryCodec.query("header") val endpoint = Endpoint(GET / "test").out[String].inCodec(headerOrQuery) - val routes = endpoint.implement(Handler.identity).toRoutes + val routes = endpoint.implementHandler(Handler.identity).toRoutes val request = Request.get( URL .decode(s"/test?header=$queryValue") @@ -446,7 +446,7 @@ object RequestSpec extends ZIOHttpSpec { val headerOrQuery = HeaderCodec.name[String]("X-Header") | StatusCodec.status(Status.Created) val endpoint = Endpoint(GET / "test").query(QueryCodec.queryBool("Created")).outCodec(headerOrQuery) val routes = - endpoint.implement { + endpoint.implementHandler { Handler.fromFunction { created => if (created) Right(()) else Left("not created") } @@ -485,7 +485,7 @@ object RequestSpec extends ZIOHttpSpec { .in[NewPost](Doc.p("New post")) .out[PostCreated](Status.Created, MediaType.application.`json`) val routes = - endpoint.implement(Handler.succeed(PostCreated(postId))).toRoutes + endpoint.implementHandler(Handler.succeed(PostCreated(postId))).toRoutes val request = Request .post( @@ -513,7 +513,7 @@ object RequestSpec extends ZIOHttpSpec { .in[NewPost] .out[Int] val routes = - endpoint.implement(Handler.succeed(postId)).toRoutes + endpoint.implementHandler(Handler.succeed(postId)).toRoutes for { response <- routes.runZIO( @@ -532,7 +532,7 @@ object RequestSpec extends ZIOHttpSpec { check(Gen.chunkOfBounded(1, 1024)(Gen.byte)) { bytes => val route = Endpoint(GET / "test-byte-stream") .outStream[Byte](Doc.p("Test data")) - .implement(Handler.succeed(ZStream.fromChunk(bytes).rechunk(16))) + .implementHandler(Handler.succeed(ZStream.fromChunk(bytes).rechunk(16))) .toRoutes for { @@ -556,7 +556,7 @@ object RequestSpec extends ZIOHttpSpec { check(Gen.chunkOfBounded(1, 1024)(Gen.byte)) { bytes => val route = Endpoint(GET / "test-byte-stream") .outStream[Byte](Status.Ok, MediaType.image.png) - .implement(Handler.succeed(ZStream.fromChunk(bytes).rechunk(16))) + .implementHandler(Handler.succeed(ZStream.fromChunk(bytes).rechunk(16))) .toRoutes for { @@ -581,7 +581,7 @@ object RequestSpec extends ZIOHttpSpec { val route = Endpoint(POST / "test-byte-stream") .inStream[Byte] .out[Long] - .implement { + .implementHandler { Handler.fromFunctionZIO { byteStream => byteStream.runCount } diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala index d22d583cc1..e8429f6a7f 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala @@ -149,7 +149,7 @@ object RoundtripSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId") / "posts" / int("postId")).out[Post] val usersPostHandler = - usersPostAPI.implement { + usersPostAPI.implementHandler { Handler.fromFunction { case (userId, postId) => Post(postId, "title", "body", userId) } @@ -169,7 +169,7 @@ object RoundtripSpec extends ZIOHttpSpec { .header(HeaderCodec.accept) val usersPostHandler = - usersPostAPI.implement { + usersPostAPI.implementHandler { Handler.fromFunction { case (userId, postId, _) => Post(postId, "title", "body", userId) } @@ -190,7 +190,7 @@ object RoundtripSpec extends ZIOHttpSpec { .header(HeaderCodec.accept) val usersPostHandler = - usersPostAPI.implement { + usersPostAPI.implementHandler { Handler.fromFunction { case (userId, postId, _) => Post(postId, "title", "body", userId) } @@ -212,7 +212,7 @@ object RoundtripSpec extends ZIOHttpSpec { .out[Post] val handler = - api.implement { + api.implementHandler { Handler.fromFunction { case (id, userId, name, details) => Post(id, name.getOrElse("-"), details.getOrElse("-"), userId) } @@ -245,7 +245,7 @@ object RoundtripSpec extends ZIOHttpSpec { .out[String] ?? Doc.p("doc") @nowarn("msg=dead code") - val handler = api.implement { + val handler = api.implementHandler { Handler.fromFunction { case (accountId, name, instanceName, args, env) => throw new RuntimeException("I can't code") s"$accountId, $name, $instanceName, $args, $env" @@ -268,7 +268,7 @@ object RoundtripSpec extends ZIOHttpSpec { .in[Post] .out[String] - val route = api.implement { + val route = api.implementHandler { Handler.fromFunction { case (userId, post) => s"userId: $userId, post: $post" } @@ -283,7 +283,7 @@ object RoundtripSpec extends ZIOHttpSpec { }, test("byte stream input") { val api = Endpoint(PUT / "upload").inStream[Byte].out[Long] - val route = api.implement { + val route = api.implementHandler { Handler.fromFunctionZIO { bytes => bytes.runCount } @@ -300,7 +300,7 @@ object RoundtripSpec extends ZIOHttpSpec { }, test("byte stream output") { val api = Endpoint(GET / "download").query(QueryCodec.queryInt("count")).outStream[Byte] - val route = api.implement { + val route = api.implementHandler { Handler.fromFunctionZIO { count => Random.nextBytes(count).map(chunk => ZStream.fromChunk(chunk).rechunk(1024)) } @@ -320,7 +320,7 @@ object RoundtripSpec extends ZIOHttpSpec { .in[Post]("post") .out[String] - val route = api.implement { + val route = api.implementHandler { Handler.fromFunction { case (name, value, post) => s"name: $name, value: $value, post: $post" } @@ -337,7 +337,7 @@ object RoundtripSpec extends ZIOHttpSpec { val api = Endpoint(POST / "test") .outError[String](Status.Custom(999)) - val route = api.implement(Handler.fail("42")) + val route = api.implementHandler(Handler.fail("42")) testEndpointError( api, @@ -358,7 +358,7 @@ object RoundtripSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")).out[Int] @@ alwaysFailingMiddleware val endpointRoute = - endpoint.implement(Handler.identity) + endpoint.implementHandler(Handler.identity) val routes = endpointRoute.toRoutes @@ -397,7 +397,7 @@ object RoundtripSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")).out[Int] @@ alwaysFailingMiddlewareWithAnotherSignature val endpointRoute = - endpoint.implement(Handler.identity) + endpoint.implementHandler(Handler.identity) val routes = endpointRoute.toRoutes @@ -439,7 +439,7 @@ object RoundtripSpec extends ZIOHttpSpec { Endpoint(GET / "users" / int("userId")).out[Int].outError[String](Status.Custom(999)) val endpointRoute = - endpoint.implement { + endpoint.implementHandler { Handler.fromFunctionZIO { id => ZIO.fail(id) } @@ -482,7 +482,7 @@ object RoundtripSpec extends ZIOHttpSpec { .inStream[Byte]("file") .out[String] - val route = api.implement { + val route = api.implementHandler { Handler.fromFunctionZIO { case (name, value, file) => file.runCount.map { n => s"name: $name, value: $value, count: $n" @@ -506,7 +506,7 @@ object RoundtripSpec extends ZIOHttpSpec { .inStream[Byte]("file") .out[String] - val route = api.implement { + val route = api.implementHandler { Handler.fromFunctionZIO { case (name, metadata, file) => file.runCount.map { n => s"name: $name, metadata: $metadata, count: $n" diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/SwaggerUISpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/SwaggerUISpec.scala index a7bfbb7f61..77f0edc009 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/SwaggerUISpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/SwaggerUISpec.scala @@ -15,7 +15,7 @@ object SwaggerUISpec extends ZIOSpecDefault { test("should return the swagger ui page") { val getUser = Endpoint(Method.GET / "users" / int("userId")).out[Int] - val getUserRoute = getUser.implement { Handler.fromFunction[Int] { id => id } } + val getUserRoute = getUser.implementHandler { Handler.fromFunction[Int] { id => id } } val getUserPosts = Endpoint(Method.GET / "users" / int("userId") / "posts" / int("postId")) @@ -23,7 +23,7 @@ object SwaggerUISpec extends ZIOSpecDefault { .out[List[String]] val getUserPostsRoute = - getUserPosts.implement[Any] { + getUserPosts.implementHandler[Any] { Handler.fromFunctionZIO[(Int, Int, String)] { case (id1: Int, id2: Int, query: String) => ZIO.succeed(List(s"API2 RESULT parsed: users/$id1/posts/$id2?name=$query")) } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/Endpoint.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/Endpoint.scala index 475d7e2840..8905a974c6 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/Endpoint.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/Endpoint.scala @@ -158,7 +158,32 @@ final case class Endpoint[PathInput, Input, Err, Output, Middleware <: EndpointM ): Endpoint[PathInput, combiner.Out, Err, Output, Middleware] = copy(input = self.input ++ codec) - def implement[Env](original: Handler[Env, Err, Input, Output])(implicit trace: Trace): Route[Env, Nothing] = { + def implement[Env](f: Input => ZIO[Env, Err, Output])(implicit + trace: Trace, + ): Route[Env, Nothing] = + implementHandler(Handler.fromFunctionZIO(f)) + + def implementEither(f: Input => Either[Err, Output])(implicit + trace: Trace, + ): Route[Any, Nothing] = + implementHandler[Any](Handler.fromFunctionHandler[Input](in => Handler.fromEither(f(in)))) + + def implementPurely(f: Input => Output)(implicit + trace: Trace, + ): Route[Any, Nothing] = + implementHandler[Any](Handler.fromFunctionHandler[Input](in => Handler.succeed(f(in)))) + + def implementAs(output: Output)(implicit + trace: Trace, + ): Route[Any, Nothing] = + implementHandler[Any](Handler.succeed(output)) + + def implementAsError(err: Err)(implicit + trace: Trace, + ): Route[Any, Nothing] = + implementHandler[Any](Handler.fail(err)) + + def implementHandler[Env](original: Handler[Env, Err, Input, Output])(implicit trace: Trace): Route[Env, Nothing] = { import HttpCodecError.asHttpCodecError val handlers = self.alternatives.map { case (endpoint, condition) => From d1cb10d0037c4f64306f535ff09919eecc8834ca Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:22:24 +0300 Subject: [PATCH 16/58] Remove leading/trailing whitespaces from rendered authorization header (#2900) * Fix client hanging when Authorization header contains trailing whitespace * Allow parsing Authorization header without scheme * Filter empty strings when parsing the authorization header --- .../jvm/src/test/scala/zio/http/ClientSpec.scala | 14 ++++++++++++++ .../scala/zio/http/headers/AuthorizationSpec.scala | 2 +- .../shared/src/main/scala/zio/http/Header.scala | 9 ++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala index 9b4252270b..5315a16abd 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ClientSpec.scala @@ -106,6 +106,20 @@ object ClientSpec extends HttpRunnableSpec { val resp = ZIO.scoped(ZClient.request(Request.get(url))).timeout(500.millis) assertZIO(resp)(isNone) } @@ timeout(5.seconds) @@ flaky(5), + test("authorization header without scheme") { + val app = + Handler + .fromFunction[Request] { req => + req.headers.get(Header.Authorization) match { + case Some(h) => Response.text(h.renderedValue) + case None => Response.unauthorized("missing auth") + } + } + .toRoutes + val responseContent = + app.deploy(Request(headers = Headers(Header.Authorization.Unparsed("", "my-token")))).flatMap(_.body.asString) + assertZIO(responseContent)(equalTo("my-token")) + } @@ timeout(5.seconds), ) override def spec = { diff --git a/zio-http/jvm/src/test/scala/zio/http/headers/AuthorizationSpec.scala b/zio-http/jvm/src/test/scala/zio/http/headers/AuthorizationSpec.scala index bc618ebb79..72d0a2292d 100644 --- a/zio-http/jvm/src/test/scala/zio/http/headers/AuthorizationSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/headers/AuthorizationSpec.scala @@ -32,7 +32,7 @@ object AuthorizationSpec extends ZIOHttpSpec { test("parsing of invalid Authorization values") { assertTrue( Authorization.parse("").isLeft, - Authorization.parse("something").isLeft, + Authorization.parse("something").isRight, ) }, test("parsing and encoding is symmetrical") { diff --git a/zio-http/shared/src/main/scala/zio/http/Header.scala b/zio-http/shared/src/main/scala/zio/http/Header.scala index 858d456ae3..b347cd5438 100644 --- a/zio-http/shared/src/main/scala/zio/http/Header.scala +++ b/zio-http/shared/src/main/scala/zio/http/Header.scala @@ -1055,8 +1055,11 @@ object Header { } def parse(value: String): Either[String, Authorization] = { - val parts = value.split(" ") - if (parts.length >= 2) { + val parts = value.split(" ").filter(_.nonEmpty) + val nParts = parts.length + if (nParts == 1) { + Right(Unparsed("", parts(0))) + } else if (nParts >= 2) { parts(0).toLowerCase match { case "basic" => parseBasic(parts(1)) case "digest" => parseDigest(parts.tail.mkString(" ")) @@ -1074,7 +1077,7 @@ object Header { s"""Digest response="$response",username="$username",realm="$realm",uri=${uri.toString},opaque="$opaque",algorithm=$algo,""" + s"""qop=$qop,cnonce="$cnonce",nonce="$nonce",nc=$nc,userhash=${userhash.toString}""" case Bearer(token) => s"Bearer ${token.value.asString}" - case Unparsed(scheme, params) => s"$scheme ${params.value.asString}" + case Unparsed(scheme, params) => s"$scheme ${params.value.asString}".strip() } private def parseBasic(value: String): Either[String, Authorization] = { From dc0e883617f3cbf8e6794d3c5efae130b68935ab Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:25:06 +0300 Subject: [PATCH 17/58] Implement streaming of multipart field data (#2899) * Implement streaming of multipart field data * Only stream form field data for `fields` method * Make Scala 2.12 happy --- .../src/test/scala/zio/http/FormSpec.scala | 24 ++ .../main/scala/zio/http/StreamingForm.scala | 210 ++++++++---------- 2 files changed, 113 insertions(+), 121 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala b/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala index 1169919168..01274fca2b 100644 --- a/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala @@ -338,6 +338,30 @@ object FormSpec extends ZIOHttpSpec { ) } } @@ samples(10), + test("output stream maintains the same chunk structure as the input stream") { + val form = Form( + Chunk( + FormField.StreamingBinary( + name = "blob", + data = ZStream.fromChunk(Chunk(1, 2).map(_.toByte)) ++ + ZStream.fromChunk(Chunk(3).map(_.toByte)), + contentType = MediaType.application.`octet-stream`, + ), + ), + ) + val boundary = Boundary("X-INSOMNIA-BOUNDARY") + val formByteStream = form.multipartBytes(boundary) + val streamingForm = StreamingForm(formByteStream, boundary) + val expected = Chunk(Chunk[Byte](1, 2), Chunk[Byte](3)) + streamingForm.fields.flatMap { + case sb: FormField.StreamingBinary => sb.data + case _ => ZStream.empty + } + .mapChunks(Chunk.single) + .filter(_.nonEmpty) + .runCollect + .map { c => assertTrue(c == expected) } + }, ) @@ sequential def spec = diff --git a/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala b/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala index 610c535ae6..220a675286 100644 --- a/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala +++ b/zio-http/shared/src/main/scala/zio/http/StreamingForm.scala @@ -23,9 +23,9 @@ import scala.annotation.tailrec import zio._ import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.stream.{Take, ZChannel, ZStream} +import zio.stream.{Take, ZStream} -import zio.http.StreamingForm.{Buffer, ZStreamOps} +import zio.http.StreamingForm.Buffer import zio.http.internal.{FormAST, FormState} final case class StreamingForm(source: ZStream[Any, Throwable, Byte], boundary: Boundary, bufferSize: Int = 8192) { @@ -35,7 +35,7 @@ final case class StreamingForm(source: ZStream[Any, Throwable, Byte], boundary: * Runs the streaming form and collects all parts in memory, returning a Form */ def collectAll(implicit trace: Trace): ZIO[Any, Throwable, Form] = - fields.mapZIO { + streamFormFields(bufferUpToBoundary = true).mapZIO { case sb: FormField.StreamingBinary => sb.collect case other: FormField => @@ -45,36 +45,44 @@ final case class StreamingForm(source: ZStream[Any, Throwable, Byte], boundary: } def fields(implicit trace: Trace): ZStream[Any, Throwable, FormField] = + streamFormFields(bufferUpToBoundary = false) + + private def streamFormFields( + bufferUpToBoundary: Boolean, + )(implicit trace: Trace): ZStream[Any, Throwable, FormField] = ZStream.unwrapScoped { implicit val unsafe: Unsafe = Unsafe.unsafe for { runtime <- ZIO.runtime[Any] - buffer <- ZIO.succeed(new Buffer(bufferSize)) + buffer <- ZIO.succeed(new Buffer(bufferSize, crlfBoundary, bufferUpToBoundary)) abort <- Promise.make[Nothing, Unit] fieldQueue <- Queue.bounded[Take[Throwable, FormField]](4) + state = initialState reader = - source - .mapAccumImmediate(initialState) { (state, byte) => - def handleBoundary(ast: Chunk[FormAST]): (StreamingForm.State, Option[FormField]) = - if (state.inNonStreamingPart) { - FormField.fromFormAST(ast, charset) match { - case Right(formData) => - buffer.reset() - (state.reset, Some(formData)) - case Left(e) => throw e.asException - } - } else { - buffer.reset() - (state.reset, None) + source.runForeachChunk { bytes => + def handleBoundary(ast: Chunk[FormAST]): Option[FormField] = + if (state.inNonStreamingPart) { + FormField.fromFormAST(ast, charset) match { + case Right(formData) => + buffer.reset() + state.reset + Some(formData) + case Left(e) => throw e.asException } + } else { + buffer.reset() + state.reset + None + } + def handleByte(byte: Byte, isLastByte: Boolean): Option[FormField] = { state.formState match { case formState: FormState.FormStateBuffer => val nextFormState = formState.append(byte) state.currentQueue match { case Some(queue) => - val takes = buffer.addByte(crlfBoundary, byte) + val takes = buffer.addByte(byte, isLastByte) if (takes.nonEmpty) { runtime.unsafe.run(queue.offerAll(takes).raceFirst(abort.await)).getOrThrowFiberFailure() } @@ -98,15 +106,15 @@ final case class StreamingForm(source: ZStream[Any, Throwable, Byte], boundary: streamingFormData <- FormField .incomingStreamingBinary(newFormState.tree, newQueue) .mapError(_.asException) - nextState = state.withCurrentQueue(newQueue) - } yield (nextState, Some(streamingFormData)) + _ = state.withCurrentQueue(newQueue) + } yield Some(streamingFormData) }.getOrThrowFiberFailure() } else { - val nextState = state.withInNonStreamingPart(true) - (nextState, None) + val _ = state.withInNonStreamingPart(true) + None } } else { - (state, None) + None } case FormState.BoundaryEncapsulated(ast) => handleBoundary(ast) @@ -114,15 +122,27 @@ final case class StreamingForm(source: ZStream[Any, Throwable, Byte], boundary: handleBoundary(ast) } case _ => - (state, None) + None } } - .mapZIO { field => - fieldQueue.offer(Take.single(field)) + + val builder = Chunk.newBuilder[FormField] + val it = bytes.iterator + var hasNext = it.hasNext + while (hasNext) { + val byte = it.next() + hasNext = it.hasNext + handleByte(byte, !hasNext) match { + case Some(field) => builder += field + case _ => () + } } + val fields = builder.result() + fieldQueue.offer(Take.chunk(fields)).when(fields.nonEmpty) + } // FIXME: .blocking here is temporary until we figure out a better way to avoid running effects within mapAccumImmediate _ <- ZIO - .blocking(reader.runDrain) + .blocking(reader) .catchAllCause(cause => fieldQueue.offer(Take.failCause(cause))) .ensuring(fieldQueue.offer(Take.end)) .forkScoped @@ -140,7 +160,7 @@ final case class StreamingForm(source: ZStream[Any, Throwable, Byte], boundary: private def initialState: StreamingForm.State = StreamingForm.initialState(boundary) - private val crlfBoundary: Chunk[Byte] = Chunk[Byte](13, 10) ++ boundary.encapsulationBoundaryBytes + private def crlfBoundary: Array[Byte] = Array[Byte](13, 10) ++ boundary.encapsulationBoundaryBytes.toArray[Byte] } object StreamingForm { @@ -174,9 +194,10 @@ object StreamingForm { new State(FormState.fromBoundary(boundary), None, _inNonStreamingPart = false) } - private final class Buffer(initialSize: Int) { - private var buffer: Array[Byte] = new Array[Byte](initialSize) - private var length: Int = 0 + private final class Buffer(bufferSize: Int, crlfBoundary: Array[Byte], bufferUpToBoundary: Boolean) { + private var buffer: Array[Byte] = Array.ofDim(bufferSize) + private var index: Int = 0 + private val boundarySize = crlfBoundary.length private def ensureHasCapacity(requiredCapacity: Int): Unit = { @tailrec @@ -194,104 +215,51 @@ object StreamingForm { } else () } - def addByte( - crlfBoundary: Chunk[Byte], - byte: Byte, - ): Chunk[Take[Nothing, Byte]] = { - ensureHasCapacity(length + crlfBoundary.length) - buffer(length) = byte - if (length < (crlfBoundary.length - 1)) { - // Not enough bytes to check if we have the boundary - length += 1 - Chunk.empty - } else { - var foundBoundary = true - var i = 0 - while (i < crlfBoundary.length && foundBoundary) { - if (buffer(length - i) != crlfBoundary(crlfBoundary.length - 1 - i)) { - foundBoundary = false - } - i += 1 - } - - if (foundBoundary) { - // We have found the boundary - val preBoundary = - Chunk.fromArray(Chunk.fromArray(buffer).take(length + 1 - crlfBoundary.length).toArray[Byte]) - length = 0 - Chunk(Take.chunk(preBoundary), Take.end) - } else { - // We don't have the boundary - if (length < (buffer.length - 2)) { - length += 1 - Chunk.empty - } else { - val preBoundary = - Chunk.fromArray(Chunk.fromArray(buffer).take(length + 1 - crlfBoundary.length).toArray[Byte]) - for (i <- crlfBoundary.indices) { - buffer(i) = buffer(length + 1 - crlfBoundary.length + i) - } - length = crlfBoundary.length - Chunk(Take.chunk(preBoundary)) - } + private def matchesPartialBoundary(idx: Int): Boolean = { + val bs = boundarySize + var i = 0 + var result = false + while (i < bs && i <= idx && !result) { + val i0 = idx - i + var i1 = 0 + while (i >= i1 && buffer(i0 + i1) == crlfBoundary(i1) && !result) { + if (i == i1) result = true + i1 += 1 } + i += 1 } + result } - def reset(): Unit = { - length = 0 - } - } + def addByte(byte: Byte, isLastByte: Boolean): Chunk[Take[Nothing, Byte]] = { + val idx = index + ensureHasCapacity(idx + boundarySize + 1) + buffer(idx) = byte + index += 1 - implicit class ZStreamOps[R, E, A](self: ZStream[R, E, A]) { + var i = 0 + var foundFullBoundary = idx >= boundarySize - 1 + while (i < boundarySize && foundFullBoundary) { + if (buffer(idx + 1 - crlfBoundary.length + i) != crlfBoundary(i)) { + foundFullBoundary = false + } + i += 1 + } - private def mapAccumImmediate[S1, B]( - self: Chunk[A], - )(s1: S1)(f1: (S1, A) => (S1, Option[B])): (S1, Option[(B, Chunk[A])]) = { - val iterator = self.chunkIterator - var index = 0 - var s = s1 - var result: Option[B] = None - while (iterator.hasNextAt(index) && result.isEmpty) { - val a = iterator.nextAt(index) - index += 1 - val tuple = f1(s, a) - s = tuple._1 - result = tuple._2 + if (foundFullBoundary) { + reset() + val toTake = idx + 1 - boundarySize + if (toTake == 0) Chunk(Take.end) + else Chunk(Take.chunk(Chunk.fromArray(buffer.take(toTake))), Take.end) + } else if (!bufferUpToBoundary && isLastByte && byte != '-' && !matchesPartialBoundary(idx)) { + reset() + Chunk(Take.chunk(Chunk.fromArray(buffer.take(idx + 1)))) + } else { + Chunk.empty } - (s, result.map(b => (b, self.drop(index)))) } - /** - * Statefully maps over the elements of this stream to sometimes produce new - * elements. Each new element gets immediately emitted regardless of the - * upstream chunk size. - */ - def mapAccumImmediate[S, A1](s: => S)(f: (S, A) => (S, Option[A1]))(implicit trace: Trace): ZStream[R, E, A1] = - ZStream.succeed(s).flatMap { s => - def chunkAccumulator(currS: S, in: Chunk[A]): ZChannel[Any, E, Chunk[A], Any, E, Chunk[A1], Unit] = - mapAccumImmediate(in)(currS)(f) match { - case (nextS, Some((a1, remaining))) => - ZChannel.write(Chunk.single(a1)) *> - accumulator(nextS, remaining) - case (nextS, None) => - accumulator(nextS, Chunk.empty) - } - - def accumulator(currS: S, leftovers: Chunk[A]): ZChannel[Any, E, Chunk[A], Any, E, Chunk[A1], Unit] = - if (leftovers.isEmpty) { - ZChannel.readWithCause( - (in: Chunk[A]) => { - chunkAccumulator(currS, in) - }, - (err: Cause[E]) => ZChannel.refailCause(err), - (_: Any) => ZChannel.unit, - ) - } else { - chunkAccumulator(currS, leftovers) - } - - ZStream.fromChannel(self.channel >>> accumulator(s, Chunk.empty)) - } + def reset(): Unit = + index = 0 } } From abdaf0b3281cb021bd10896831ce975defe6c634 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Tue, 11 Jun 2024 17:58:25 +0200 Subject: [PATCH 18/58] Fix OpenAPI security schema (#2813) (#2893) --- project/Dependencies.scala | 2 +- .../zio/http/endpoint/openapi/OpenAPI.scala | 28 +++----- .../http/endpoint/openapi/OpenAPISpec.scala | 64 +++++++++++++++++++ 3 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 zio-http/shared/src/test/scala/zio/http/endpoint/openapi/OpenAPISpec.scala diff --git a/project/Dependencies.scala b/project/Dependencies.scala index c463b5febf..f8d043a3ad 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -8,7 +8,7 @@ object Dependencies { val ZioVersion = "2.1.1" val ZioCliVersion = "0.5.0" val ZioJsonVersion = "0.6.2" - val ZioSchemaVersion = "1.2.0" + val ZioSchemaVersion = "1.2.1" val SttpVersion = "3.3.18" val ZioConfigVersion = "4.0.2" diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPI.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPI.scala index 76dd5a8105..3c2177147f 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPI.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPI.scala @@ -26,7 +26,7 @@ import zio.Chunk import zio.json.ast._ import zio.schema._ -import zio.schema.annotation.{fieldName, noDiscriminator} +import zio.schema.annotation.{caseName, discriminatorName, fieldName, noDiscriminator} import zio.schema.codec.JsonCodec import zio.schema.codec.json._ @@ -1271,8 +1271,8 @@ object OpenAPI { */ final case class XML(name: String, namespace: URI, prefix: String, attribute: Boolean = false, wrapped: Boolean) + @discriminatorName("type") sealed trait SecurityScheme { - def `type`: String def description: Option[Doc] } @@ -1291,9 +1291,8 @@ object OpenAPI { * @param in * The location of the API key. */ - final case class ApiKey(description: Option[Doc], name: String, in: ApiKey.In) extends SecurityScheme { - override def `type`: String = "apiKey" - } + @caseName("apiKey") + final case class ApiKey(description: Option[Doc], name: String, in: ApiKey.In) extends SecurityScheme object ApiKey { sealed trait In extends Product with Serializable @@ -1319,11 +1318,8 @@ object OpenAPI { * Bearer tokens are usually generated by an authorization server, so this * information is primarily for documentation purposes. */ - final case class Http(description: Option[Doc], scheme: String, bearerFormat: Option[String]) - extends SecurityScheme { - override def `type`: String = "http" - - } + @caseName("http") + final case class Http(description: Option[Doc], scheme: String, bearerFormat: Option[String]) extends SecurityScheme /** * @param description @@ -1332,10 +1328,8 @@ object OpenAPI { * An object containing configuration information for the flow types * supported. */ - final case class OAuth2(description: Option[Doc], flows: OAuthFlows) extends SecurityScheme { - override def `type`: String = "oauth2" - - } + @caseName("oauth2") + final case class OAuth2(description: Option[Doc], flows: OAuthFlows) extends SecurityScheme /** * @param description @@ -1343,10 +1337,8 @@ object OpenAPI { * @param openIdConnectUrl * OpenId Connect URL to discover OAuth2 configuration values. */ - final case class OpenIdConnect(description: Option[Doc], openIdConnectUrl: URI) extends SecurityScheme { - override def `type`: String = "openIdConnect" - - } + @caseName("openIdConnect") + final case class OpenIdConnect(description: Option[Doc], openIdConnectUrl: URI) extends SecurityScheme /** * Allows configuration of the supported OAuth Flows. diff --git a/zio-http/shared/src/test/scala/zio/http/endpoint/openapi/OpenAPISpec.scala b/zio-http/shared/src/test/scala/zio/http/endpoint/openapi/OpenAPISpec.scala new file mode 100644 index 0000000000..da3ab41a08 --- /dev/null +++ b/zio-http/shared/src/test/scala/zio/http/endpoint/openapi/OpenAPISpec.scala @@ -0,0 +1,64 @@ +package zio.http.endpoint.openapi + +import scala.collection.immutable.ListMap + +import zio.json.ast.Json +import zio.test._ + +import zio.http.endpoint.openapi.OpenAPI.SecurityScheme._ + +object OpenAPISpec extends ZIOSpecDefault { + + def toJsonAst(str: String): Json = + Json.decoder.decodeJson(str).toOption.get + + def toJsonAst(api: OpenAPI): Json = + toJsonAst(api.toJson) + + val spec = suite("OpenAPISpec")( + test("auth schema serialization") { + import OpenAPI._ + val securitySchemes: ListMap[Key, ReferenceOr[SecurityScheme]] = ListMap( + Key.fromString("apiKeyAuth").get -> ReferenceOr.Or( + SecurityScheme.ApiKey( + None, + "Authorization", + ApiKey.In.Header, + ), + ), + ) + + val openApi = OpenAPI.empty.copy( + security = List(SecurityRequirement(Map("apiKeyAuth" -> List.empty))), + components = Some(OpenAPI.Components(securitySchemes = securitySchemes)), + ) + val json = openApi.toJsonPretty + val expected = """{ + | "openapi" : "3.1.0", + | "info" : { + | "title" : "", + | "version" : "" + | }, + | "components" : { + | "securitySchemes" : { + | "apiKeyAuth" : + | { + | "type" : "apiKey", + | "name" : "Authorization", + | "in" : "Header" + | } + | } + | }, + | "security" : [ + | { + | "securitySchemes" : { + | "apiKeyAuth" : [] + | } + | } + | ] + |}""".stripMargin + + assertTrue(toJsonAst(json) == toJsonAst(expected)) + }, + ) +} From 68a7abe1aa9ce2a8e0c78e1955fc989d8951b0b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Kleinb=C3=B6lting?= Date: Wed, 12 Jun 2024 16:11:36 +0200 Subject: [PATCH 19/58] fix: Ignore everything after closing boundary when parsing multi form data (#2862) * add working test case * break test * wip * fix bug * make boundaryMatches val * revert buffer to ChunkBuilder * buffer is val * fmt * fmt * Update zio-http/shared/src/main/scala/zio/http/internal/FormState.scala Co-authored-by: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> * Extract closingBoundaryBytesSize and reset boundaryMatches with a new Array[Boolean](closingBoundaryBytesSize) * Update zio-http/shared/src/main/scala/zio/http/internal/FormState.scala Co-authored-by: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> * Replace Array[Boolean] with single boolean --------- Co-authored-by: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> --- .../src/test/scala/zio/http/FormSpec.scala | 26 ++++++++++++++++++- .../scala/zio/http/internal/FormState.scala | 20 ++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala b/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala index 01274fca2b..65897ad0d5 100644 --- a/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/FormSpec.scala @@ -86,7 +86,7 @@ object FormSpec extends ZIOHttpSpec { form2 == form, ) }, - test("encoding with custom paramaters [charset]") { + test("encoding with custom parameters [charset]") { val form = Form( FormField.textField( @@ -144,6 +144,30 @@ object FormSpec extends ZIOHttpSpec { } }, + test("decoding no lf at the end") { + val body = Chunk.fromArray( + s"""|--(((AaB03x)))${CR} + |Content-Disposition: form-data; name="hocon-data"${CR} + |Content-Type: text/plain${CR} + |${CR} + |foos: []${CR} + |--(((AaB03x)))${CR} + |Content-Disposition: form-data; name="json-data"${CR} + |Content-Type: text/plain${CR} + |${CR} + |{ "bars": [] }${CR} + |--(((AaB03x)))--""".stripMargin.getBytes(), + ) + + val form = Form( + FormField.textField("hocon-data", "foos: []", MediaType.text.`plain`), + FormField.textField("json-data", """{ "bars": [] }""", MediaType.text.`plain`), + ) + + Form + .fromMultipartBytes(body) + .map(form2 => assertTrue(form2 == form)) + }, ) val multiFormStreamingSuite: Spec[Any, Throwable] = diff --git a/zio-http/shared/src/main/scala/zio/http/internal/FormState.scala b/zio-http/shared/src/main/scala/zio/http/internal/FormState.scala index 2ca5c03b21..e7b09752af 100644 --- a/zio-http/shared/src/main/scala/zio/http/internal/FormState.scala +++ b/zio-http/shared/src/main/scala/zio/http/internal/FormState.scala @@ -30,7 +30,10 @@ private[http] object FormState { final class FormStateBuffer(boundary: Boundary) extends FormState { self => private val tree0: ChunkBuilder[FormAST] = ChunkBuilder.make[FormAST]() - private val buffer: ChunkBuilder.Byte = new ChunkBuilder.Byte + private val buffer: ChunkBuilder[Byte] = new ChunkBuilder.Byte + private var bufferSize: Int = 0 + private val closingBoundaryBytesSize = boundary.closingBoundaryBytes.size + private var boundaryMatches: Boolean = true private var lastByte: OptionalByte = OptionalByte.None private var isBufferEmpty = true @@ -54,8 +57,14 @@ private[http] object FormState { val crlf = byte == '\n' && !lastByte.isEmpty && lastByte.get == '\r' + val posInLine = bufferSize + (if (this.lastByte.isEmpty) 0 else 1) + boundaryMatches &&= posInLine < closingBoundaryBytesSize && boundary.closingBoundaryBytes(posInLine) == byte + val boundaryDetected = boundaryMatches && posInLine == closingBoundaryBytesSize - 1 + def flush(ast: FormAST): Unit = { buffer.clear() + bufferSize = 0 + boundaryMatches = true lastByte = OptionalByte.None if (crlf && isBufferEmpty && (phase eq Phase.Part1)) phase0 = Phase.Part2 if (ast.isContent && dropContents) () else addToTree(ast) @@ -72,7 +81,11 @@ private[http] object FormState { case ClosingBoundary(_) => BoundaryClosed(tree) } - } else if (crlf && (phase eq Phase.Part2)) { + } else if ((crlf || boundaryDetected) && (phase eq Phase.Part2)) { + if (boundaryDetected) { + buffer += '-' + buffer += '-' + } val ast = FormAST.makePart2(buffer.result(), boundary) ast match { @@ -87,6 +100,7 @@ private[http] object FormState { if (!lastByte.isEmpty) { if (isBufferEmpty) isBufferEmpty = false buffer += lastByte.get + bufferSize += 1 } lastByte = OptionalByte.Some(byte) self @@ -102,6 +116,8 @@ private[http] object FormState { def reset(): Unit = { tree0.clear() buffer.clear() + bufferSize = 0 + boundaryMatches = true isBufferEmpty = true dropContents = false phase0 = Phase.Part1 From 5ea81ef65a81d5da35795a44a0201c95b1a8ecea Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Wed, 12 Jun 2024 22:41:08 +0300 Subject: [PATCH 20/58] Fix for routes with different parameter names (#2903) * Fix route matching for params with different names * Remove nowarn annotation * Optimize * Remove comment --- .../src/test/scala/zio/http/RoutesSpec.scala | 24 +++++++ .../main/scala/zio/http/codec/PathCodec.scala | 63 ++++++++++++++----- 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala b/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala index c6ca58d121..c11c5881e7 100644 --- a/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala @@ -47,5 +47,29 @@ object RoutesSpec extends ZIOHttpSpec { result <- app.runZIO(Request(body = body)) } yield assertTrue(result.body == body) }, + test("routes with different path parameter arities should all be handled") { + val one = Method.GET / string("first") -> Handler.ok + val getone = Request.get("/1") + + val two = Method.GET / string("prefix") / string("second") -> Handler.internalServerError + val gettwo = Request.get("/2/two") + + val onetwo = Routes(one, two) + val twoone = Routes(two, one) + + for { + onetwoone <- onetwo.runZIO(getone) + onetwotwo <- onetwo.runZIO(gettwo) + twooneone <- twoone.runZIO(getone) + twoonetwo <- twoone.runZIO(gettwo) + } yield { + assertTrue( + extractStatus(onetwoone) == Status.Ok, + extractStatus(onetwotwo) == Status.InternalServerError, + extractStatus(twooneone) == Status.Ok, + extractStatus(twoonetwo) == Status.InternalServerError, + ) + } + }, ) } diff --git a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala index 765ddb371b..868c27937f 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala @@ -501,24 +501,57 @@ object PathCodec { result = subtree.value i = i + 1 } else { - // Slower fallback path. Have to evaluate all predicates at this node: val flattened = subtree.othersFlat - var index = 0 subtree = null - - while ((index < flattened.length) && (subtree eq null)) { - val tuple = flattened(index) - val matched = tuple._1.matches(segments, i) - - if (matched >= 0) { - subtree = tuple._2 - result = subtree.value - i = i + matched - } else { - // No match found. Keep looking at alternate routes: - index += 1 - } + flattened.length match { + case 0 => // No predicates to evaluate + case 1 => // Only 1 predicate to evaluate (most common) + val (codec, subtree0) = flattened(0) + val matched = codec.matches(segments, i) + if (matched > 0) { + subtree = subtree0 + result = subtree0.value + i = i + matched + } + case n => // Slowest fallback path. Have to to find the first predicate where the subpath returns a result + val matches = Array.ofDim[Int](n) + var index = 0 + var nPositive = 0 + var lastPositiveIdx = -1 + while (index < n) { + val (codec, _) = flattened(index) + val n = codec.matches(segments, i) + if (n > 0) { + matches(index) = n + nPositive += 1 + lastPositiveIdx = index + } + index += 1 + } + + nPositive match { + case 0 => () + case 1 => + subtree = flattened(lastPositiveIdx)._2 + result = subtree.value + i = i + matches(lastPositiveIdx) + case _ => + index = 0 + while (index < n && (subtree eq null)) { + val matched = matches(index) + if (matched > 0) { + val (_, subtree0) = flattened(index) + val subpath = path.dropLeadingSlash.drop(i + matched) + if (subtree0.get(subpath).nonEmpty) { + subtree = subtree0 + result = subtree.value + i += matched + } + } + index += 1 + } + } } if (subtree eq null) { From baf53994363b0961847ab7730a529cb6517b5497 Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Thu, 13 Jun 2024 15:28:11 +0300 Subject: [PATCH 21/58] Try all resolved IP addresses when client fails to connect (#2905) * Try all resolved IP addresses when client fails to connect * Fix for Scala 2.12 --- .../netty/client/NettyConnectionPool.scala | 52 +++++++++------ .../scala/zio/http/ClientConnectionSpec.scala | 64 +++++++++++++++++++ 2 files changed, 95 insertions(+), 21 deletions(-) create mode 100644 zio-http/jvm/src/test/scala/zio/http/ClientConnectionSpec.scala diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala index df52b52479..bdc52a647d 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyConnectionPool.scala @@ -106,31 +106,41 @@ object NettyConnectionPool { for { resolvedHosts <- dnsResolver.resolve(location.host) - pickedHost <- Random.nextIntBounded(resolvedHosts.size) - host = resolvedHosts(pickedHost) - channelFuture <- ZIO.attempt { - val bootstrap = new Bootstrap() - .channelFactory(channelFactory) - .group(eventLoopGroup) - .remoteAddress(new InetSocketAddress(host, location.port)) - .withOption[Integer](ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout.map(_.toMillis.toInt)) - .handler(initializer) - (localAddress match { - case Some(addr) => bootstrap.localAddress(addr) - case _ => bootstrap - }).connect() - } - ch <- ZIO.attempt(channelFuture.channel()) - _ <- Scope.addFinalizer { - NettyFutureExecutor.executed { - channelFuture.cancel(true) - ch.close() - }.when(ch.isOpen).ignoreLogged + hosts <- Random.shuffle(resolvedHosts.toList) + hostsNec <- ZIO.succeed(NonEmptyChunk.fromIterable(hosts.head, hosts.tail)) + ch <- collectFirstSuccess(hostsNec) { host => + ZIO.suspend { + val bootstrap = new Bootstrap() + .channelFactory(channelFactory) + .group(eventLoopGroup) + .remoteAddress(new InetSocketAddress(host, location.port)) + .withOption[Integer](ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout.map(_.toMillis.toInt)) + .handler(initializer) + localAddress.foreach(bootstrap.localAddress) + + val channelFuture = bootstrap.connect() + val ch = channelFuture.channel() + Scope.addFinalizer { + NettyFutureExecutor.executed { + channelFuture.cancel(true) + ch.close() + }.when(ch.isOpen).ignoreLogged + } *> NettyFutureExecutor.executed(channelFuture).as(ch) + } } - _ <- NettyFutureExecutor.executed(channelFuture) } yield ch } + private def collectFirstSuccess[R, E, A, B]( + as: NonEmptyChunk[A], + )(f: A => ZIO[R, E, B])(implicit trace: Trace): ZIO[R, E, B] = { + ZIO.suspendSucceed { + val it = as.iterator + def loop: ZIO[R, E, B] = f(it.next()).catchAll(e => if (it.hasNext) loop else ZIO.fail(e)) + loop + } + } + /** * Refreshes the idle timeout handler on the channel pipeline. * @return diff --git a/zio-http/jvm/src/test/scala/zio/http/ClientConnectionSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ClientConnectionSpec.scala new file mode 100644 index 0000000000..30f418adae --- /dev/null +++ b/zio-http/jvm/src/test/scala/zio/http/ClientConnectionSpec.scala @@ -0,0 +1,64 @@ +/* + * Copyright 2021 - 2023 Sporta Technologies PVT LTD & the ZIO HTTP contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package zio.http + +import java.net.{InetAddress, UnknownHostException} + +import zio._ +import zio.test.Assertion._ +import zio.test.TestAspect._ +import zio.test._ + +import zio.http.internal.{DynamicServer, HttpRunnableSpec, serverTestLayer} +import zio.http.netty.NettyConfig + +object ClientConnectionSpec extends HttpRunnableSpec { + + private def tests = + List( + test("tries a different IP address when the connection fails") { + val app = Handler.ok.toRoutes.deploy(Request()).map(_.status) + assertZIO(app)(equalTo(Status.Ok)) + } @@ nonFlaky(10), + ) + + override def spec = { + suite("ClientConnectionSpec") { + serve.as(tests) + }.provideSome[DynamicServer & Server & Client](Scope.default) + .provideShared( + DynamicServer.live, + serverTestLayer, + Client.live, + ZLayer.succeed(Client.Config.default.connectionTimeout(10.millis)), + ZLayer.succeed(NettyConfig.defaultWithFastShutdown), + ZLayer.succeed(TestResolver), + ) @@ sequential @@ withLiveClock @@ withLiveRandom + } + + private object TestResolver extends DnsResolver { + import scala.collection.compat._ + + override def resolve(host: String)(implicit trace: Trace): ZIO[Any, UnknownHostException, Chunk[InetAddress]] = { + ZIO.succeed { + Chunk.from((0 to 10).map { i => + InetAddress.getByAddress(Array(127, 0, 0, i.toByte)) + }) + } + } + } +} From ec939890d0a4067b00a648d0b5d6a68b34984dd5 Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Thu, 13 Jun 2024 15:28:46 +0300 Subject: [PATCH 22/58] Avoid allocation of new path when resolving path ambiguities (#2904) * Avoid allocation of new path when resolving path ambiguities * Cleanup --- .../main/scala/zio/http/codec/PathCodec.scala | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala index 868c27937f..9a8a3c01cd 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala @@ -485,13 +485,17 @@ object PathCodec { def add[A1 >: A](segments: Iterable[SegmentCodec[_]], value: A1): SegmentSubtree[A1] = self ++ SegmentSubtree.single(segments, value) - def get(path: Path): Chunk[A] = { - val segments = path.segments - var subtree = self - var result = subtree.value - var i = 0 + def get(path: Path): Chunk[A] = + get(path, 0) - while (i < segments.length) { + private def get(path: Path, from: Int): Chunk[A] = { + val segments = path.segments + val nSegments = segments.length + var subtree = self + var result = subtree.value + var i = from + + while (i < nSegments) { val segment = segments(i) if (subtree.literals.contains(segment)) { @@ -499,7 +503,7 @@ object PathCodec { subtree = subtree.literals(segment) result = subtree.value - i = i + 1 + i += 1 } else { val flattened = subtree.othersFlat @@ -512,7 +516,7 @@ object PathCodec { if (matched > 0) { subtree = subtree0 result = subtree0.value - i = i + matched + i += matched } case n => // Slowest fallback path. Have to to find the first predicate where the subpath returns a result val matches = Array.ofDim[Int](n) @@ -535,15 +539,14 @@ object PathCodec { case 1 => subtree = flattened(lastPositiveIdx)._2 result = subtree.value - i = i + matches(lastPositiveIdx) + i += matches(lastPositiveIdx) case _ => index = 0 while (index < n && (subtree eq null)) { val matched = matches(index) if (matched > 0) { val (_, subtree0) = flattened(index) - val subpath = path.dropLeadingSlash.drop(i + matched) - if (subtree0.get(subpath).nonEmpty) { + if (subtree0.get(path, i + matched).nonEmpty) { subtree = subtree0 result = subtree.value i += matched @@ -556,7 +559,7 @@ object PathCodec { if (subtree eq null) { result = Chunk.empty - i = segments.length + i = nSegments } } } From 36df30fd5d02d33a4fe624ca57fde0076162f084 Mon Sep 17 00:00:00 2001 From: Daniel Aharon Date: Fri, 14 Jun 2024 21:02:20 -0600 Subject: [PATCH 23/58] Htmx attributes are unimportable (#2910) * Htmx attribute test * Add package object for zio-http-htmx * scalafix --- build.sbt | 4 ++++ .../src/main/scala/zio/http/htmx/package.scala | 3 +++ .../src/test/scala/zio/http/htmx/HtmxSpec.scala | 15 +++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 zio-http-htmx/src/main/scala/zio/http/htmx/package.scala create mode 100644 zio-http-htmx/src/test/scala/zio/http/htmx/HtmxSpec.scala diff --git a/build.sbt b/build.sbt index 10bf818f06..ac755ca96e 100644 --- a/build.sbt +++ b/build.sbt @@ -267,6 +267,10 @@ lazy val zioHttpHtmx = (project in file("zio-http-htmx")) .settings( stdSettings("zio-http-htmx"), publishSetting(true), + libraryDependencies ++= Seq( + `zio-test`, + `zio-test-sbt`, + ), ) .dependsOn(zioHttpJVM) diff --git a/zio-http-htmx/src/main/scala/zio/http/htmx/package.scala b/zio-http-htmx/src/main/scala/zio/http/htmx/package.scala new file mode 100644 index 0000000000..69ea6b6cae --- /dev/null +++ b/zio-http-htmx/src/main/scala/zio/http/htmx/package.scala @@ -0,0 +1,3 @@ +package zio.http + +package object htmx extends Attributes diff --git a/zio-http-htmx/src/test/scala/zio/http/htmx/HtmxSpec.scala b/zio-http-htmx/src/test/scala/zio/http/htmx/HtmxSpec.scala new file mode 100644 index 0000000000..8e2ee28681 --- /dev/null +++ b/zio-http-htmx/src/test/scala/zio/http/htmx/HtmxSpec.scala @@ -0,0 +1,15 @@ +package zio.http.htmx + +import zio.test.{ZIOSpecDefault, assertTrue} + +import zio.http.template.button + +case object HtmxSpec extends ZIOSpecDefault { + override def spec = suite("HtmxSpec")( + test("hx-get attribute") { + val view = button(hxGetAttr := "/test", "click") + val expected = """""" + assertTrue(view.encode == expected.stripMargin) + }, + ) +} From a33196351e2523d2330255de6017152c61c54f6e Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Tue, 18 Jun 2024 22:27:28 +1000 Subject: [PATCH 24/58] Fix memory leak in netty connection pool (#2907) * Fix memory leak in netty connection pool * Use a forked effect to monitor the close future for client requests * Use Netty's future listener again * fmt * Remove suspendSucceed --- .../zio/http/netty/AsyncBodyReader.scala | 1 + .../main/scala/zio/http/netty/NettyBody.scala | 10 +- .../http/netty/client/NettyClientDriver.scala | 231 +++++++++--------- .../client/NettyConnectionPoolSpec.scala | 33 ++- 4 files changed, 156 insertions(+), 119 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala b/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala index db11dfa77b..fc97550cd7 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala @@ -44,6 +44,7 @@ abstract class AsyncBodyReader extends SimpleChannelInboundHandler[HttpContent]( case None => false case Some((_, isLast)) => isLast } + buffer.clear() // GC if (ctx.channel.isOpen || readingDone) { state = State.Direct(callback) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala index ee58652262..86afacdfa1 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala @@ -161,9 +161,17 @@ object NettyBody extends BodyEncoding { } catch { case e: Throwable => emit(ZIO.fail(Option(e))) }, - 4096, + streamBufferSize, ) + // No need to create a large buffer when we know the response is small + private[this] def streamBufferSize: Int = { + val cl = knownContentLength.getOrElse(4096L) + if (cl <= 16L) 16 + else if (cl >= 4096) 4096 + else Integer.highestOneBit(cl.toInt - 1) << 1 // Round to next power of 2 + } + override def isComplete: Boolean = false override def isEmpty: Boolean = false diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala index 0a0b4e44a5..f5d815961d 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala @@ -16,8 +16,6 @@ package zio.http.netty.client -import scala.collection.mutable - import zio._ import zio.stacktracer.TracingImplicits.disableAutoTrace @@ -28,10 +26,11 @@ import zio.http.netty._ import zio.http.netty.model.Conversions import zio.http.netty.socket.NettySocketProtocol -import io.netty.channel.{Channel, ChannelFactory, ChannelFuture, ChannelHandler, EventLoopGroup} +import io.netty.channel.{Channel, ChannelFactory, ChannelFuture, EventLoopGroup} import io.netty.handler.codec.PrematureChannelClosureException import io.netty.handler.codec.http.websocketx.{WebSocketClientProtocolHandler, WebSocketFrame => JWebSocketFrame} -import io.netty.handler.codec.http.{FullHttpRequest, HttpObjectAggregator, HttpRequest} +import io.netty.handler.codec.http.{FullHttpRequest, HttpObjectAggregator} +import io.netty.util.concurrent.GenericFutureListener final case class NettyClientDriver private[netty] ( channelFactory: ChannelFactory[Channel], @@ -50,129 +49,123 @@ final case class NettyClientDriver private[netty] ( enableKeepAlive: Boolean, createSocketApp: () => WebSocketApp[Any], webSocketConfig: WebSocketConfig, - )(implicit trace: Trace): ZIO[Scope, Throwable, ChannelInterface] = { - val f = NettyRequestEncoder.encode(req).flatMap { jReq => - for { - _ <- Scope.addFinalizer { - ZIO.attempt { - jReq match { - case fullRequest: FullHttpRequest => - if (fullRequest.refCnt() > 0) - fullRequest.release(fullRequest.refCnt()) - case _ => - } - }.ignore - } - queue <- Queue.unbounded[WebSocketChannelEvent] - nettyChannel = NettyChannel.make[JWebSocketFrame](channel) - webSocketChannel = WebSocketChannel.make(nettyChannel, queue) - app = createSocketApp() - _ <- app.handler.runZIO(webSocketChannel).ignoreLogged.interruptible.forkScoped - } yield { - val pipeline = channel.pipeline() - val toRemove: mutable.Set[ChannelHandler] = new mutable.HashSet[ChannelHandler]() - - if (location.scheme.isWebSocket) { - val httpObjectAggregator = new HttpObjectAggregator(Int.MaxValue) - val inboundHandler = new WebSocketClientInboundHandler(onResponse, onComplete) - - pipeline.addLast(Names.HttpObjectAggregator, httpObjectAggregator) - pipeline.addLast(Names.ClientInboundHandler, inboundHandler) - - toRemove.add(httpObjectAggregator) - toRemove.add(inboundHandler) - - val headers = Conversions.headersToNetty(req.headers) - val config = NettySocketProtocol - .clientBuilder(app.customConfig.getOrElse(webSocketConfig)) - .customHeaders(headers) - .webSocketUri(req.url.encode) - .build() - - // Handles the heavy lifting required to upgrade the connection to a WebSocket connection - - val webSocketClientProtocol = new WebSocketClientProtocolHandler(config) - val webSocket = new WebSocketAppHandler(nettyRuntime, queue, Some(onComplete)) + )(implicit trace: Trace): ZIO[Scope, Throwable, ChannelInterface] = + if (location.scheme.isWebSocket) + requestWebsocket(channel, req, onResponse, onComplete, createSocketApp, webSocketConfig) + else + requestHttp(channel, req, onResponse, onComplete, enableKeepAlive) - pipeline.addLast(Names.WebSocketClientProtocolHandler, webSocketClientProtocol) - pipeline.addLast(Names.WebSocketHandler, webSocket) - - toRemove.add(webSocketClientProtocol) - toRemove.add(webSocket) - - pipeline.fireChannelRegistered() - pipeline.fireChannelActive() - - new ChannelInterface { - override def resetChannel: ZIO[Any, Throwable, ChannelState] = - ZIO.succeed( - ChannelState.Invalid, - ) // channel becomes invalid - reuse of websocket channels not supported currently - - override def interrupt: ZIO[Any, Throwable, Unit] = - NettyFutureExecutor.executed(channel.disconnect()) - } - } else { - val clientInbound = - new ClientInboundHandler( - nettyRuntime, - req, - jReq, - onResponse, - onComplete, - enableKeepAlive, - ) - - pipeline.addLast(Names.ClientInboundHandler, clientInbound) - toRemove.add(clientInbound) - - val clientFailureHandler = new ClientFailureHandler(onResponse, onComplete) - pipeline.addLast(Names.ClientFailureHandler, clientFailureHandler) - toRemove.add(clientFailureHandler) - - pipeline.fireChannelRegistered() - pipeline.fireUserEventTriggered(ClientInboundHandler.SendRequest) - - val frozenToRemove = toRemove.toSet - - new ChannelInterface { - override def resetChannel: ZIO[Any, Throwable, ChannelState] = - ZIO.attempt { - frozenToRemove.foreach(pipeline.remove) - ChannelState.Reusable // channel can be reused - } - - override def interrupt: ZIO[Any, Throwable, Unit] = - NettyFutureExecutor.executed(channel.disconnect()) + private def requestHttp( + channel: Channel, + req: Request, + onResponse: Promise[Throwable, Response], + onComplete: Promise[Throwable, ChannelState], + enableKeepAlive: Boolean, + )(implicit trace: Trace): RIO[Scope, ChannelInterface] = + NettyRequestEncoder + .encode(req) + .tapSome { case fullReq: FullHttpRequest => + Scope.addFinalizer { + ZIO.succeed { + val refCount = fullReq.refCnt() + if (refCount > 0) fullReq.release(refCount) else () } } } - } + .map { jReq => + val closeListener: GenericFutureListener[ChannelFuture] = { (_: ChannelFuture) => + // If onComplete was already set, it means another fiber is already in the process of fulfilling the promises + // so we don't need to fulfill `onResponse` + nettyRuntime.unsafeRunSync { + onComplete.interrupt && onResponse.fail(NettyClientDriver.PrematureChannelClosure) + }(Unsafe.unsafe, trace): Unit + } - f.ensuring { - // If the channel was closed and the promises were not completed, this will lead to the request hanging so we need - // to listen to the close future and complete the promises - ZIO.unless(location.scheme.isWebSocket) { - ZIO.succeedUnsafe { implicit u => - channel.closeFuture().addListener { (_: ChannelFuture) => - // If onComplete was already set, it means another fiber is already in the process of fulfilling the promises - // so we don't need to fulfill `onResponse` - nettyRuntime.unsafeRunSync { - ZIO - .whenZIO(onComplete.interrupt)( - onResponse.fail( - new PrematureChannelClosureException( - "Channel closed while executing the request. This is likely caused due to a client connection misconfiguration", - ), - ), - ) - .unit + val pipeline = channel.pipeline() + + pipeline.addLast( + Names.ClientInboundHandler, + new ClientInboundHandler(nettyRuntime, req, jReq, onResponse, onComplete, enableKeepAlive), + ) + + pipeline.addLast( + Names.ClientFailureHandler, + new ClientFailureHandler(onResponse, onComplete), + ) + + pipeline + .fireChannelRegistered() + .fireUserEventTriggered(ClientInboundHandler.SendRequest) + + channel.closeFuture().addListener(closeListener) + new ChannelInterface { + override def resetChannel: ZIO[Any, Throwable, ChannelState] = { + ZIO.attempt { + channel.closeFuture().removeListener(closeListener) + pipeline.remove(Names.ClientInboundHandler) + pipeline.remove(Names.ClientFailureHandler) + ChannelState.Reusable // channel can be reused } } + + override def interrupt: ZIO[Any, Throwable, Unit] = + ZIO.suspendSucceed { + channel.closeFuture().removeListener(closeListener) + NettyFutureExecutor.executed(channel.disconnect()) + } } } - } + private def requestWebsocket( + channel: Channel, + req: Request, + onResponse: Promise[Throwable, Response], + onComplete: Promise[Throwable, ChannelState], + createSocketApp: () => WebSocketApp[Any], + webSocketConfig: WebSocketConfig, + )(implicit trace: Trace): RIO[Scope, ChannelInterface] = { + for { + queue <- Queue.unbounded[WebSocketChannelEvent] + nettyChannel = NettyChannel.make[JWebSocketFrame](channel) + webSocketChannel = WebSocketChannel.make(nettyChannel, queue) + app = createSocketApp() + _ <- app.handler.runZIO(webSocketChannel).ignoreLogged.interruptible.forkScoped + } yield { + val pipeline = channel.pipeline() + + val httpObjectAggregator = new HttpObjectAggregator(Int.MaxValue) + val inboundHandler = new WebSocketClientInboundHandler(onResponse, onComplete) + + pipeline.addLast(Names.HttpObjectAggregator, httpObjectAggregator) + pipeline.addLast(Names.ClientInboundHandler, inboundHandler) + + val headers = Conversions.headersToNetty(req.headers) + val config = NettySocketProtocol + .clientBuilder(app.customConfig.getOrElse(webSocketConfig)) + .customHeaders(headers) + .webSocketUri(req.url.encode) + .build() + + // Handles the heavy lifting required to upgrade the connection to a WebSocket connection + + val webSocketClientProtocol = new WebSocketClientProtocolHandler(config) + val webSocket = new WebSocketAppHandler(nettyRuntime, queue, Some(onComplete)) + + pipeline.addLast(Names.WebSocketClientProtocolHandler, webSocketClientProtocol) + pipeline.addLast(Names.WebSocketHandler, webSocket) + + pipeline.fireChannelRegistered() + pipeline.fireChannelActive() + + new ChannelInterface { + override def resetChannel: ZIO[Any, Throwable, ChannelState] = + // channel becomes invalid - reuse of websocket channels not supported currently + Exit.succeed(ChannelState.Invalid) + + override def interrupt: ZIO[Any, Throwable, Unit] = + NettyFutureExecutor.executed(channel.disconnect()) + } + } } override def createConnectionPool(dnsResolver: DnsResolver, config: ConnectionPoolConfig)(implicit @@ -196,4 +189,8 @@ object NettyClientDriver { } yield NettyClientDriver(channelFactory, eventLoopGroup, nettyRuntime) } + private val PrematureChannelClosure = new PrematureChannelClosureException( + "Channel closed while executing the request. This is likely caused due to a client connection misconfiguration", + ) + } diff --git a/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala b/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala index b7fe1b575a..e8f841aa7d 100644 --- a/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala @@ -249,6 +249,37 @@ object NettyConnectionPoolSpec extends HttpRunnableSpec { serverTestLayer, ) @@ withLiveClock @@ nonFlaky(10) + private def connectionPoolIssuesSpec = { + suite("ConnectionPoolIssuesSpec")( + test("Reusing connections doesn't cause memory leaks") { + Random.nextString(1024 * 1024).flatMap { text => + val resp = Response.text(text) + Handler + .succeed(resp) + .toRoutes + .deployAndRequest { client => + ZIO.foreachParDiscard(0 to 10) { _ => + ZIO + .scoped[Any](client.request(Request()).flatMap(_.body.asArray)) + .repeatN(200) + } + }(Request()) + .as(assertCompletes) + } + }, + ) + }.provide( + ZLayer(appKeepAliveEnabled.unit), + DynamicServer.live, + serverTestLayer, + Client.customized, + ZLayer.succeed(ZClient.Config.default.dynamicConnectionPool(1, 512, 60.seconds)), + NettyClientDriver.live, + DnsResolver.default, + ZLayer.succeed(NettyConfig.defaultWithFastShutdown), + Scope.default, + ) + def connectionPoolSpec: Spec[Any, Throwable] = suite("ConnectionPool")( suite("fixed")( @@ -310,7 +341,7 @@ object NettyConnectionPoolSpec extends HttpRunnableSpec { ) override def spec: Spec[Scope, Throwable] = { - connectionPoolSpec @@ sequential @@ withLiveClock + (connectionPoolSpec + connectionPoolIssuesSpec) @@ sequential @@ withLiveClock } } From 3401d7d289f478052c8d1ce7a99c6debd377a602 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:28:53 +0200 Subject: [PATCH 25/58] Access latest route pattern when mapping route errors (#2823) (#2915) --- .../src/test/scala/zio/http/RoutesSpec.scala | 18 ++ .../src/main/scala/zio/http/Response.scala | 4 +- .../src/main/scala/zio/http/Route.scala | 175 ++++++++++-------- 3 files changed, 115 insertions(+), 82 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala b/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala index c11c5881e7..b61be9108f 100644 --- a/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala @@ -18,6 +18,8 @@ package zio.http import zio.test._ +import zio.http.codec.PathCodec + object RoutesSpec extends ZIOHttpSpec { def extractStatus(response: Response): Status = response.status @@ -71,5 +73,21 @@ object RoutesSpec extends ZIOHttpSpec { ) } }, + test("nest routes") { + import PathCodec._ + import zio._ + case object IdFormatError + val routes = literal("to") / Routes( + Method.GET / "other" -> handler(ZIO.fail(IdFormatError)), + Method.GET / "do" / string("id") -> handler { (id: String, _: Request) => Response.text(s"GET /to/do/${id}") }, + ).handleError { case IdFormatError => + Response.badRequest + } + routes + .run( + path = Path.root / "to" / "do" / "123", + ) + .map(response => assertTrue(response.status == Status.Ok)) + }, ) } diff --git a/zio-http/shared/src/main/scala/zio/http/Response.scala b/zio-http/shared/src/main/scala/zio/http/Response.scala index 4dab7320dc..57df3fc2f3 100644 --- a/zio-http/shared/src/main/scala/zio/http/Response.scala +++ b/zio-http/shared/src/main/scala/zio/http/Response.scala @@ -159,8 +159,8 @@ object Response { case Left(failure: Throwable) => fromThrowable(failure) case Left(failure: Cause[_]) => fromCause(failure) case _ => - if (cause.isInterruptedOnly) error(Status.RequestTimeout, cause.prettyPrint.take(100)) - else error(Status.InternalServerError, cause.prettyPrint.take(100)) + if (cause.isInterruptedOnly) error(Status.RequestTimeout, cause.prettyPrint.take(10000)) + else error(Status.InternalServerError, cause.prettyPrint.take(10000)) } } diff --git a/zio-http/shared/src/main/scala/zio/http/Route.scala b/zio-http/shared/src/main/scala/zio/http/Route.scala index b47c28fc16..1a2c2eb5b3 100644 --- a/zio-http/shared/src/main/scala/zio/http/Route.scala +++ b/zio-http/shared/src/main/scala/zio/http/Route.scala @@ -71,23 +71,26 @@ sealed trait Route[-Env, +Err] { self => case Provided(route, env) => Provided(route.handleErrorCause(f), env) case Augmented(route, aspect) => Augmented(route.handleErrorCause(f), aspect) case Handled(routePattern, handler, location) => - Handled(routePattern, handler.mapErrorCause(c => f(c.asInstanceOf[Cause[Nothing]])), location) + Handled(routePattern, handler.map(_.mapErrorCause(c => f(c.asInstanceOf[Cause[Nothing]]))), location) case Unhandled(rpm, handler, zippable, location) => - val handler2: Handler[Env, Response, Request, Response] = { - val paramHandler = - Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => - rpm.routePattern.decode(request.method, request.path) match { - case Left(error) => ZIO.dieMessage(error) - case Right(value) => - val params = rpm.zippable.zip(value, ctx) - - handler(zippable.zip(params, request)) + val handler2: Handler[Any, Nothing, RoutePattern[_], Handler[Env, Response, Request, Response]] = { + Handler.fromFunction[RoutePattern[_]] { pattern => + val paramHandler = { + Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => + pattern.asInstanceOf[RoutePattern[rpm.PathInput]].decode(request.method, request.path) match { + case Left(error) => ZIO.dieMessage(error) + case Right(value) => + val params = rpm.zippable.zip(value, ctx) + + handler(zippable.zip(params, request)) + } } } - // Sandbox before applying aspect: - rpm.aspect.applyHandlerContext(paramHandler.mapErrorCause(f)) + // Sandbox before applying aspect: + rpm.aspect.applyHandlerContext(paramHandler.mapErrorCause(f)) + } } Handled(rpm.routePattern, handler2, location) @@ -106,21 +109,23 @@ sealed trait Route[-Env, +Err] { self => case Provided(route, env) => Provided(route.handleErrorCauseZIO(f), env) case Augmented(route, aspect) => Augmented(route.handleErrorCauseZIO(f), aspect) case Handled(routePattern, handler, location) => - Handled(routePattern, handler.mapErrorCauseZIO(c => f(c.asInstanceOf[Cause[Nothing]])), location) + Handled[Env](routePattern, handler.map(_.mapErrorCauseZIO(c => f(c.asInstanceOf[Cause[Nothing]]))), location) case Unhandled(rpm, handler, zippable, location) => - val handler2: Handler[Env, Response, Request, Response] = { - val paramHandler = - Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => - rpm.routePattern.decode(request.method, request.path) match { - case Left(error) => ZIO.dieMessage(error) - case Right(value) => - val params = rpm.zippable.zip(value, ctx) - - handler(zippable.zip(params, request)) + val handler2: Handler[Any, Nothing, RoutePattern[_], Handler[Env, Response, Request, Response]] = { + Handler.fromFunction[RoutePattern[_]] { pattern => + val paramHandler = + Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => + pattern.asInstanceOf[RoutePattern[rpm.PathInput]].decode(request.method, request.path) match { + case Left(error) => ZIO.dieMessage(error) + case Right(value) => + val params = rpm.zippable.zip(value, ctx) + + handler(zippable.zip(params, request)) + } } - } - rpm.aspect.applyHandlerContext(paramHandler.mapErrorCauseZIO(f)) + rpm.aspect.applyHandlerContext(paramHandler.mapErrorCauseZIO(f)) + } } Handled(rpm.routePattern, handler2, location) @@ -134,7 +139,7 @@ sealed trait Route[-Env, +Err] { self => self match { case Provided(route, env) => Provided(route.mapError(fxn), env) case Augmented(route, aspect) => Augmented(route.mapError(fxn), aspect) - case Handled(routePattern, handler, location) => Handled(routePattern, handler, location) + case Handled(routePattern, handler, location) => Handled[Env](routePattern, handler, location) case Unhandled(rpm, handler, zippable, location) => Unhandled(rpm, handler.mapError(fxn), zippable, location) } @@ -149,7 +154,7 @@ sealed trait Route[-Env, +Err] { self => self match { case Provided(route, env) => Provided(route.mapErrorZIO(fxn), env) case Augmented(route, aspect) => Augmented(route.mapErrorZIO(fxn), aspect) - case Handled(routePattern, handler, location) => Handled(routePattern, handler, location) + case Handled(routePattern, handler, location) => Handled[Env](routePattern, handler, location) case Unhandled(rpm, handler, zippable, location) => Unhandled(rpm, handler.mapErrorZIO(fxn), zippable, location) } @@ -173,33 +178,37 @@ sealed trait Route[-Env, +Err] { self => case Provided(route, env) => Provided(route.handleErrorRequestCause(f), env) case Augmented(route, aspect) => Augmented(route.handleErrorRequestCause(f), aspect) case Handled(routePattern, handler, location) => - Handled( + Handled[Env]( routePattern, - Handler.fromFunctionHandler[Request] { (req: Request) => - handler.mapErrorCause(c => f(req, c.asInstanceOf[Cause[Nothing]])) + handler.map { handler => + Handler.fromFunctionHandler[Request] { (req: Request) => + handler.mapErrorCause(c => f(req, c.asInstanceOf[Cause[Nothing]])) + } }, location, ) case Unhandled(rpm, handler, zippable, location) => - val handler2: Handler[Env, Response, Request, Response] = { - val paramHandler = - Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => - rpm.routePattern.decode(request.method, request.path) match { - case Left(error) => ZIO.dieMessage(error) - case Right(value) => - val params = rpm.zippable.zip(value, ctx) - - handler(zippable.zip(params, request)) + val handler2: Handler[Any, Nothing, RoutePattern[_], Handler[Env, Response, Request, Response]] = { + Handler.fromFunction[RoutePattern[_]] { pattern => + val paramHandler = + Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => + pattern.asInstanceOf[RoutePattern[rpm.PathInput]].decode(request.method, request.path) match { + case Left(error) => ZIO.dieMessage(error) + case Right(value) => + val params = rpm.zippable.zip(value, ctx) + + handler(zippable.zip(params, request)) + } } - } - // Sandbox before applying aspect: - rpm.aspect.applyHandlerContext( - Handler.fromFunctionHandler[(rpm.Context, Request)] { case (_, req) => - paramHandler.mapErrorCause(f(req, _)) - }, - ) + // Sandbox before applying aspect: + rpm.aspect.applyHandlerContext( + Handler.fromFunctionHandler[(rpm.Context, Request)] { case (_, req) => + paramHandler.mapErrorCause(f(req, _)) + }, + ) + } } Handled(rpm.routePattern, handler2, location) @@ -219,31 +228,35 @@ sealed trait Route[-Env, +Err] { self => case Provided(route, env) => Provided(route.handleErrorRequestCauseZIO(f), env) case Augmented(route, aspect) => Augmented(route.handleErrorRequestCauseZIO(f), aspect) case Handled(routePattern, handler, location) => - Handled( + Handled[Env]( routePattern, - Handler.fromFunctionHandler[Request] { (req: Request) => - handler.mapErrorCauseZIO(c => f(req, c.asInstanceOf[Cause[Nothing]])) + handler.map { handler => + Handler.fromFunctionHandler[Request] { (req: Request) => + handler.mapErrorCauseZIO(c => f(req, c.asInstanceOf[Cause[Nothing]])) + } }, location, ) case Unhandled(rpm, handler, zippable, location) => - val handler2: Handler[Env, Response, Request, Response] = { - val paramHandler = - Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => - rpm.routePattern.decode(request.method, request.path) match { - case Left(error) => ZIO.dieMessage(error) - case Right(value) => - val params = rpm.zippable.zip(value, ctx) - - handler(zippable.zip(params, request)) + val handler2: Handler[Any, Nothing, RoutePattern[_], Handler[Env, Response, Request, Response]] = { + Handler.fromFunction[RoutePattern[_]] { pattern => + val paramHandler = + Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => + pattern.asInstanceOf[RoutePattern[rpm.PathInput]].decode(request.method, request.path) match { + case Left(error) => ZIO.dieMessage(error) + case Right(value) => + val params = rpm.zippable.zip(value, ctx) + + handler(zippable.zip(params, request)) + } } - } - rpm.aspect.applyHandlerContext( - Handler.fromFunctionHandler[(rpm.Context, Request)] { case (_, req) => - paramHandler.mapErrorCauseZIO(f(req, _)) - }, - ) + rpm.aspect.applyHandlerContext( + Handler.fromFunctionHandler[(rpm.Context, Request)] { case (_, req) => + paramHandler.mapErrorCauseZIO(f(req, _)) + }, + ) + } } Handled(rpm.routePattern, handler2, location) @@ -264,7 +277,7 @@ sealed trait Route[-Env, +Err] { self => self match { case Provided(route, env) => Provided(route.nest(prefix), env) case Augmented(route, aspect) => Augmented(route.nest(prefix), aspect) - case Handled(routePattern, handler, location) => Handled(routePattern.nest(prefix), handler, location) + case Handled(routePattern, handler, location) => Handled[Env](routePattern.nest(prefix), handler, location) case Unhandled(rpm, handler, zippable, location) => Unhandled(rpm.prefix(prefix), handler, zippable, location) @@ -312,14 +325,14 @@ object Route { routePattern: RoutePattern[_], )(handler: Handler[Env, Response, Request, Response])(implicit trace: Trace): Route[Env, Nothing] = { // Sandbox before constructing: - Route.Handled(routePattern, handler.sandbox, Trace.empty) + Route.Handled(routePattern, Handler.fromFunction[RoutePattern[_]](_ => handler.sandbox), Trace.empty) } def handled[Params, Env](rpm: Route.Builder[Env, Params]): HandledConstructor[Env, Params] = new HandledConstructor[Env, Params](rpm) val notFound: Route[Any, Nothing] = - Handled(RoutePattern.any, Handler.notFound, Trace.empty) + Handled(RoutePattern.any, Handler.fromFunction[RoutePattern[_]](_ => Handler.notFound), Trace.empty) def route[Params](routePattern: RoutePattern[Params]): UnhandledConstructor[Any, Params] = route(Route.Builder(routePattern, HandlerAspect.identity)) @@ -331,20 +344,22 @@ object Route { def apply[Env1 <: Env, In]( handler: Handler[Env1, Response, In, Response], )(implicit zippable: Zippable.Out[Params, Request, In], trace: Trace): Route[Env1, Nothing] = { - val handler2: Handler[Env1, Response, Request, Response] = { - val paramHandler = - Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => - rpm.routePattern.decode(request.method, request.path) match { - case Left(error) => ZIO.dieMessage(error) - case Right(value) => - val params = rpm.zippable.zip(value, ctx) - - handler(zippable.zip(params, request)) + val handler2: Handler[Any, Nothing, RoutePattern[_], Handler[Env1, Response, Request, Response]] = { + Handler.fromFunction[RoutePattern[_]] { _ => + val paramHandler = + Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => + rpm.routePattern.decode(request.method, request.path) match { + case Left(error) => ZIO.dieMessage(error) + case Right(value) => + val params = rpm.zippable.zip(value, ctx) + + handler(zippable.zip(params, request)) + } } - } - // Sandbox before applying aspect: - rpm.aspect.applyHandlerContext(paramHandler.sandbox) + // Sandbox before applying aspect: + rpm.aspect.applyHandlerContext(paramHandler.sandbox) + } } Handled(rpm.routePattern, handler2, trace) @@ -442,11 +457,11 @@ object Route { private final case class Handled[-Env]( routePattern: RoutePattern[_], - handler: Handler[Env, Response, Request, Response], + handler: Handler[Any, Nothing, RoutePattern[_], Handler[Env, Response, Request, Response]], location: Trace, ) extends Route[Env, Nothing] { override def toHandler(implicit ev: Nothing <:< Response, trace: Trace): Handler[Env, Response, Request, Response] = - handler + Handler.fromZIO(handler(routePattern)).flatten override def toString() = s"Route.Handled(${routePattern}, ${location})" } From 5a978cbf696ef6b004ed7d9b6797f290e58a5e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Femen=C3=ADa?= <131800808+pablf@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:30:12 +0200 Subject: [PATCH 26/58] Fix ScalaJS regex and regression tests (#2912) fix regex and add tests --- .../src/test/scala/zio/http/RegexSpec.scala | 67 +++++++++++++++++++ .../src/main/scala/zio/http/Header.scala | 6 +- 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 zio-http/js/src/test/scala/zio/http/RegexSpec.scala diff --git a/zio-http/js/src/test/scala/zio/http/RegexSpec.scala b/zio-http/js/src/test/scala/zio/http/RegexSpec.scala new file mode 100644 index 0000000000..b70f042091 --- /dev/null +++ b/zio-http/js/src/test/scala/zio/http/RegexSpec.scala @@ -0,0 +1,67 @@ +package zio.http + +import zio._ +import zio.test._ + +object RegexSpec extends ZIOSpecDefault { + override def spec: Spec[TestEnvironment with Scope, Any] = + suite("RegexSpec")( + suite("Header")( + test("AcceptLanguage") { + ZIO.succeed(Header.AcceptLanguage).isSuccess.map(s => assertTrue(s)) + }, + test("ContentDisposition") { + ZIO.succeed(Header.ContentDisposition).isSuccess.map(s => assertTrue(s)) + }, + test("ContentMd5") { + ZIO.succeed(Header.ContentMd5).isSuccess.map(s => assertTrue(s)) + }, + test("ContentRange") { + ZIO.succeed(Header.ContentRange).isSuccess.map(s => assertTrue(s)) + }, + test("ContentSecurityPolicy.Source") { + ZIO.succeed(Header.ContentSecurityPolicy.Source).isSuccess.map(s => assertTrue(s)) + }, + test("ContentSecurityPolicy.TrustedTypesValue") { + ZIO.succeed(Header.ContentSecurityPolicy.TrustedTypesValue).isSuccess.map(s => assertTrue(s)) + }, + test("ContentSecurityPolicy") { + ZIO.succeed(Header.ContentSecurityPolicy).isSuccess.map(s => assertTrue(s)) + }, + test("ContentTransferEncoding") { + ZIO.succeed(Header.ContentTransferEncoding).isSuccess.map(s => assertTrue(s)) + }, + test("From") { + ZIO.succeed(Header.From).isSuccess.map(s => assertTrue(s)) + }, + test("Trailer") { + ZIO.succeed(Header.Trailer).isSuccess.map(s => assertTrue(s)) + }, + test("UserAgent") { + ZIO.succeed(Header.UserAgent).isSuccess.map(s => assertTrue(s)) + }, + test("WWWAuthenticate") { + ZIO.succeed(Header.WWWAuthenticate).isSuccess.map(s => assertTrue(s)) + }, + test("WWWAuthenticate") { + ZIO.succeed(Header.WWWAuthenticate).isSuccess.map(s => assertTrue(s)) + }, + ), + suite("HttpContentCodec")( + test("HttpContentCodec") { + ZIO.succeed(codec.HttpContentCodec).isSuccess.map(s => assertTrue(s)) + }, + ), + suite("OpenAPI")( + test("Key") { + ZIO.succeed(endpoint.openapi.OpenAPI.Key).isSuccess.map(s => assertTrue(s)) + }, + test("Path") { + ZIO.succeed(endpoint.openapi.OpenAPI.Path).isSuccess.map(s => assertTrue(s)) + }, + test("LiteralOrExpression") { + ZIO.succeed(endpoint.openapi.OpenAPI.LiteralOrExpression).isSuccess.map(s => assertTrue(s)) + }, + ), + ) +} diff --git a/zio-http/shared/src/main/scala/zio/http/Header.scala b/zio-http/shared/src/main/scala/zio/http/Header.scala index b347cd5438..25025e4d0b 100644 --- a/zio-http/shared/src/main/scala/zio/http/Header.scala +++ b/zio-http/shared/src/main/scala/zio/http/Header.scala @@ -4149,9 +4149,9 @@ object Header { final case class Comment(comment: String) extends UserAgent - private val productRegex = """(?i)([a-z0-9]+)(?:/([a-z0-9.]+))?""".r - private val commentRegex = """(?i)\((.*)$""".r - private val completeRegex = s"""^(?i)([a-z0-9]+)(?:/([a-z0-9.]+))(.*)$$""".r + private val productRegex = "(?i)([a-z0-9]+)(?:/([a-z0-9.]+))?".r + private val commentRegex = """(?i)\((.*)""".r + private val completeRegex = "(?i)([a-z0-9]+)(?:/([a-z0-9.]+))(.*)".r def parse(userAgent: String): Either[String, UserAgent] = { userAgent match { From 554660c6a4a1e4b1a7cbf1f1733aecc985c37409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Femen=C3=ADa?= <131800808+pablf@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:30:51 +0200 Subject: [PATCH 27/58] Modify JS client and fix tests (#2909) modify js client and fix tests --- .../zio/http/ZClientPlatformSpecific.scala | 38 ++++++++++++------- .../test/scala/zio/http/JSClientSpec.scala | 24 +++++++++--- .../zio/http/ZClientPlatformSpecific.scala | 17 ++++++++- .../src/main/scala/zio/http/ZClient.scala | 17 --------- 4 files changed, 60 insertions(+), 36 deletions(-) diff --git a/zio-http/js/src/main/scala/zio/http/ZClientPlatformSpecific.scala b/zio-http/js/src/main/scala/zio/http/ZClientPlatformSpecific.scala index 4503581450..1f9a3459c1 100644 --- a/zio-http/js/src/main/scala/zio/http/ZClientPlatformSpecific.scala +++ b/zio-http/js/src/main/scala/zio/http/ZClientPlatformSpecific.scala @@ -2,28 +2,40 @@ package zio.http import zio._ +import zio.http.ZClient.Config import zio.http.internal.FetchDriver trait ZClientPlatformSpecific { -// def customized: ZLayer[Config with ClientDriver with DnsResolver, Throwable, Client] + lazy val customized: ZLayer[Config with ZClient.Driver[Any, Throwable], Throwable, Client] = { + implicit val trace: Trace = Trace.empty + ZLayer.scoped { + for { + config <- ZIO.service[Config] + driver <- ZIO.service[ZClient.Driver[Any, Throwable]] + baseClient = ZClient.fromDriver(driver) + } yield + if (config.addUserAgentHeader) + baseClient.addHeader(ZClient.defaultUAHeader) + else + baseClient + } + } - lazy val live: ZLayer[ZClient.Config, Throwable, Client] = - default + lazy val live: ZLayer[ZClient.Config, Throwable, Client] = { + implicit val trace: Trace = Trace.empty + FetchDriver.live >>> customized + }.fresh - // TODO should probably exist in js too -// def configured( -// path: NonEmptyChunk[String] = NonEmptyChunk("zio", "http", "client"), -// )(implicit trace: Trace): ZLayer[DnsResolver, Throwable, Client] = -// ( -// ZLayer.service[DnsResolver] ++ -// ZLayer(ZIO.config(Config.config.nested(path.head, path.tail: _*))) ++ -// ZLayer(ZIO.config(NettyConfig.config.nested(path.head, path.tail: _*))) -// ).mapError(error => new RuntimeException(s"Configuration error: $error")) >>> live + def configured( + path: NonEmptyChunk[String] = NonEmptyChunk("zio", "http", "client"), + )(implicit trace: Trace): ZLayer[Any, Throwable, Client] = + ZLayer(ZIO.config(Config.config.nested(path.head, path.tail: _*))) + .mapError(error => new RuntimeException(s"Configuration error: $error")) >>> live lazy val default: ZLayer[Any, Throwable, Client] = { implicit val trace: Trace = Trace.empty - FetchDriver.live >>> ZLayer(ZIO.serviceWith[FetchDriver](driver => ZClient.fromDriver(driver))) + ZLayer.succeed(Config.default) >>> live } } diff --git a/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala b/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala index 0b74c56630..a60b9fbcdb 100644 --- a/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala +++ b/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala @@ -6,14 +6,28 @@ import zio.test._ object JSClientSpec extends ZIOSpecDefault { override def spec: Spec[TestEnvironment with Scope, Any] = - suite("ClientSpec")( + suite("JSClientSpec")( suite("HTTP")( - test("Get") { + test("Get without User Agent") { for { + res <- (for { + response <- ZIO.serviceWithZIO[Client] { _.url(url"https://example.com").get("") } + string <- response.body.asString + } yield (response, string)) + .provideSome[Scope](ZLayer.succeed(ZClient.Config.default.addUserAgentHeader(false)) >>> ZClient.live) + (response, string) = res + } yield assertTrue(response.status.isSuccess, string.startsWith("")) + }, + test("Get with User Agent") { + // Should not fail after fixing regex of Header + val client = (for { response <- ZIO.serviceWithZIO[Client] { _.url(url"https://example.com").get("") } string <- response.body.asString - } yield assertTrue(response.status.isSuccess, string.startsWith("")) - } @@ flaky, // calling a real website is not the best idea. + } yield (response, string)).provideSome[Scope](ZClient.default) + for { + isFailure <- client.isFailure + } yield assertTrue(isFailure) + }, // calling a real website is not the best idea. // Should be replaced with a local server, as soon as we have js server support ), // suite("WebSocket")( @@ -48,5 +62,5 @@ object JSClientSpec extends ZIOSpecDefault { // } yield assertTrue(consoleMessages.contains("Server: Hello, World!")) // }.provideSome[Scope & Client](ZLayer(Queue.bounded[String](100))), // ), - ).provideSome[Scope](ZClient.default) + ) } diff --git a/zio-http/jvm/src/main/scala/zio/http/ZClientPlatformSpecific.scala b/zio-http/jvm/src/main/scala/zio/http/ZClientPlatformSpecific.scala index 1cf3ec0ff9..6d6a3e8df8 100644 --- a/zio-http/jvm/src/main/scala/zio/http/ZClientPlatformSpecific.scala +++ b/zio-http/jvm/src/main/scala/zio/http/ZClientPlatformSpecific.scala @@ -8,7 +8,22 @@ import zio.http.netty.client.NettyClientDriver trait ZClientPlatformSpecific { - def customized: ZLayer[Config with ClientDriver with DnsResolver, Throwable, Client] + lazy val customized: ZLayer[Config with ClientDriver with DnsResolver, Throwable, Client] = { + implicit val trace: Trace = Trace.empty + ZLayer.scoped { + for { + config <- ZIO.service[Config] + driver <- ZIO.service[ClientDriver] + dnsResolver <- ZIO.service[DnsResolver] + connectionPool <- driver.createConnectionPool(dnsResolver, config.connectionPool) + baseClient = ZClient.fromDriver(new ZClient.DriverLive(driver)(connectionPool)(config)) + } yield + if (config.addUserAgentHeader) + baseClient.addHeader(ZClient.defaultUAHeader) + else + baseClient + } + } lazy val live: ZLayer[ZClient.Config with NettyConfig with DnsResolver, Throwable, Client] = { implicit val trace: Trace = Trace.empty diff --git a/zio-http/shared/src/main/scala/zio/http/ZClient.scala b/zio-http/shared/src/main/scala/zio/http/ZClient.scala index 6d207a9986..4a6a3a550a 100644 --- a/zio-http/shared/src/main/scala/zio/http/ZClient.scala +++ b/zio-http/shared/src/main/scala/zio/http/ZClient.scala @@ -249,23 +249,6 @@ final case class ZClient[-Env, -In, +Err, +Out]( object ZClient extends ZClientPlatformSpecific { - val customized: ZLayer[Config with ClientDriver with DnsResolver, Throwable, Client] = { - implicit val trace: Trace = Trace.empty - ZLayer.scoped { - for { - config <- ZIO.service[Config] - driver <- ZIO.service[ClientDriver] - dnsResolver <- ZIO.service[DnsResolver] - connectionPool <- driver.createConnectionPool(dnsResolver, config.connectionPool) - baseClient = fromDriver(new DriverLive(driver)(connectionPool)(config)) - } yield - if (config.addUserAgentHeader) - baseClient.addHeader(defaultUAHeader) - else - baseClient - } - } - def fromDriver[Env, Err](driver: Driver[Env, Err]): ZClient[Env, Body, Err, Response] = ZClient( Version.Default, From cf9467ebe538f754c1753cf5582ce61da95b6fff Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:31:41 +0200 Subject: [PATCH 28/58] Add `description` annotation content to docs for open API (#2722) (#2914) --- .../endpoint/openapi/OpenAPIGenSpec.scala | 96 +++++++------------ .../http/endpoint/openapi/JsonSchema.scala | 1 + 2 files changed, 36 insertions(+), 61 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala index 9b037371b2..fcc06023b6 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala @@ -4,7 +4,7 @@ import zio.json.ast.Json import zio.test._ import zio.{Scope, ZIO} -import zio.schema.annotation.{caseName, discriminatorName, noDiscriminator, optionalField, transientField} +import zio.schema.annotation._ import zio.schema.{DeriveSchema, Schema} import zio.http.Method.{GET, POST} @@ -113,6 +113,7 @@ object OpenAPIGenSpec extends ZIOSpecDefault { case class NestedThree(name: String) extends SimpleNestedSealedTrait } + @description("A simple payload") case class Payload(content: String) object Payload { @@ -2251,36 +2252,29 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "/root/{name}" : { | "get" : { | "parameters" : [ - | - | { + | { | "name" : "name", | "in" : "path", | "required" : true, - | "schema" : - | { - | "type" : - | "string" + | "schema" : { + | "type" : "string" | }, | "examples" : { - | "hi" : - | { + | "hi" : { | "value" : "name_value" | } | }, | "style" : "simple" | } | ], - | "requestBody" : - | { + | "requestBody" : { | "content" : { | "application/json" : { - | "schema" : - | { + | "schema" : { | "$ref" : "#/components/schemas/Payload" | }, | "examples" : { - | "hi" : - | { + | "hi" : { | "value" : { | "content" : "input" | } @@ -2291,14 +2285,11 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "required" : true | }, | "responses" : { - | "200" : - | { + | "200" : { | "content" : { | "application/json" : { - | "schema" : - | { - | "type" : - | "string" + | "schema" : { + | "type" : "string" | } | } | } @@ -2309,19 +2300,17 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | }, | "components" : { | "schemas" : { - | "Payload" : - | { - | "type" : - | "object", + | "Payload" : { + | "type" : "object", | "properties" : { | "content" : { - | "type" : - | "string" + | "type" : "string" | } | }, | "required" : [ | "content" - | ] + | ], + | "description" : "A simple payload" | } | } | } @@ -2351,55 +2340,45 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "/root/{name}" : { | "get" : { | "parameters" : [ - | - | { + | { | "name" : "name", | "in" : "path", | "required" : true, - | "schema" : - | { - | "type" : - | "string" + | "schema" : { + | "type" : "string" | }, | "examples" : { - | "hi" : - | { + | "hi" : { | "value" : "name_value" | }, - | "ho" : - | { + | "ho" : { | "value" : "name_value2" | } | }, | "style" : "simple" | } | ], - | "requestBody" : - | { + | "requestBody" : { | "content" : { | "application/json" : { - | "schema" : - | { + | "schema" : { | "anyOf" : [ | { | "$ref" : "#/components/schemas/Payload" | }, | { - | "type" : - | "string" + | "type" : "string" | } | ], | "description" : "" | }, | "examples" : { - | "hi" : - | { + | "hi" : { | "value" : { | "content" : "input" | } | }, - | "ho" : - | { + | "ho" : { | "value" : "input" | } | } @@ -2408,14 +2387,11 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "required" : true | }, | "responses" : { - | "200" : - | { + | "200" : { | "content" : { | "application/json" : { - | "schema" : - | { - | "type" : - | "string" + | "schema" : { + | "type" : "string" | } | } | } @@ -2426,19 +2402,17 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | }, | "components" : { | "schemas" : { - | "Payload" : - | { - | "type" : - | "object", + | "Payload" : { + | "type" : "object", | "properties" : { | "content" : { - | "type" : - | "string" + | "type" : "string" | } | }, | "required" : [ | "content" - | ] + | ], + | "description" : "A simple payload" | } | } | } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala index ca574fc805..205fc82641 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala @@ -523,6 +523,7 @@ object JsonSchema { .map(_.name), ) .deprecated(deprecated(record)) + .description(record.annotations.collectFirst { case description(value) => value }) case collection: Schema.Collection[_, _] => collection match { case Schema.Sequence(elementSchema, _, _, _, _) => From 63c0616f48beb17ab920f53d2836975320e70ad8 Mon Sep 17 00:00:00 2001 From: Bill Frasure Date: Tue, 18 Jun 2024 09:10:03 -0600 Subject: [PATCH 29/58] Update test that was deliberately failing before JS regex fix (#2917) --- zio-http/js/src/test/scala/zio/http/JSClientSpec.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala b/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala index a60b9fbcdb..6e6289efc7 100644 --- a/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala +++ b/zio-http/js/src/test/scala/zio/http/JSClientSpec.scala @@ -19,14 +19,13 @@ object JSClientSpec extends ZIOSpecDefault { } yield assertTrue(response.status.isSuccess, string.startsWith("")) }, test("Get with User Agent") { - // Should not fail after fixing regex of Header val client = (for { response <- ZIO.serviceWithZIO[Client] { _.url(url"https://example.com").get("") } string <- response.body.asString } yield (response, string)).provideSome[Scope](ZClient.default) for { - isFailure <- client.isFailure - } yield assertTrue(isFailure) + isSuccess <- client.isSuccess + } yield assertTrue(isSuccess) }, // calling a real website is not the best idea. // Should be replaced with a local server, as soon as we have js server support ), From 3bc77961c9edab13db8de46d2370c19f494cb271 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Wed, 19 Jun 2024 20:57:27 +0200 Subject: [PATCH 30/58] Generate maps for additional properties in OpenAPI code gen (#2901) (#2921) --- .../zio/http/gen/openapi/EndpointGen.scala | 47 ++++++++---- .../src/test/resources/AnimalWithMap.scala | 13 ++++ .../zio/http/gen/scala/CodeGenSpec.scala | 76 +++++++++++++++++++ .../http/endpoint/openapi/JsonSchema.scala | 1 + 4 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 zio-http-gen/src/test/resources/AnimalWithMap.scala diff --git a/zio-http-gen/src/main/scala/zio/http/gen/openapi/EndpointGen.scala b/zio-http-gen/src/main/scala/zio/http/gen/openapi/EndpointGen.scala index 9dffa2a76b..5695c3f001 100644 --- a/zio-http-gen/src/main/scala/zio/http/gen/openapi/EndpointGen.scala +++ b/zio-http-gen/src/main/scala/zio/http/gen/openapi/EndpointGen.scala @@ -721,9 +721,9 @@ final case class EndpointGen(config: Config) { case JsonSchema.Integer(_) => None case JsonSchema.String(_, _) => None // this could maybe be im proved to generate a string type with validation case JsonSchema.Boolean => None - case JsonSchema.OneOfSchema(schemas) if schemas.exists(_.isPrimitive) => + case JsonSchema.OneOfSchema(schemas) if schemas.exists(_.isPrimitive) => throw new Exception("OneOf schemas with primitive types are not supported") - case JsonSchema.OneOfSchema(schemas) => + case JsonSchema.OneOfSchema(schemas) => val discriminatorInfo = annotations.collectFirst { case JsonSchema.MetaData.Discriminator(discriminator) => discriminator } val discriminator: Option[String] = discriminatorInfo.map(_.propertyName) @@ -783,7 +783,7 @@ final case class EndpointGen(config: Config) { ), ), ) - case JsonSchema.AllOfSchema(schemas) => + case JsonSchema.AllOfSchema(schemas) => val genericFieldIndex = Iterator.from(0) val unvalidatedFields = schemas.map(_.withoutAnnotations).flatMap { case schema @ JsonSchema.Object(_, _, _) => @@ -828,9 +828,9 @@ final case class EndpointGen(config: Config) { enums = Nil, ), ) - case JsonSchema.AnyOfSchema(schemas) if schemas.exists(_.isPrimitive) => + case JsonSchema.AnyOfSchema(schemas) if schemas.exists(_.isPrimitive) => throw new Exception("AnyOf schemas with primitive types are not supported") - case JsonSchema.AnyOfSchema(schemas) => + case JsonSchema.AnyOfSchema(schemas) => val discriminatorInfo = annotations.collectFirst { case JsonSchema.MetaData.Discriminator(discriminator) => discriminator } val discriminator: Option[String] = discriminatorInfo.map(_.propertyName) @@ -887,12 +887,15 @@ final case class EndpointGen(config: Config) { ), ), ) - case JsonSchema.Number(_) => None - case JsonSchema.ArrayType(None) => None - case JsonSchema.ArrayType(Some(schema)) => + case JsonSchema.Number(_) => None + case JsonSchema.ArrayType(None) => None + case JsonSchema.ArrayType(Some(schema)) => schemaToCode(schema, openAPI, name, annotations) - // TODO use additionalProperties - case obj @ JsonSchema.Object(properties, _, _) => + case JsonSchema.Object(properties, additionalProperties, _) + if properties.nonEmpty && additionalProperties.isRight => + // Can't be an object and a map at the same time + throw new Exception("Object with properties and additionalProperties is not supported") + case obj @ JsonSchema.Object(properties, additionalProperties, _) if additionalProperties.isLeft => val unvalidatedFields = fieldsOfObject(openAPI, annotations)(obj) val fields = validateFields(unvalidatedFields) val nested = @@ -925,8 +928,10 @@ final case class EndpointGen(config: Config) { enums = Nil, ), ) - - case JsonSchema.Enum(enums) => + case JsonSchema.Object(_, _, _) => + // properties.isEmpty && additionalProperties.isRight + throw new IllegalArgumentException("Top-level maps are not supported") + case JsonSchema.Enum(enums) => Some( Code.File( List("component", name.capitalize + ".scala"), @@ -947,8 +952,8 @@ final case class EndpointGen(config: Config) { ), ), ) - case JsonSchema.Null => throw new Exception("Null query parameters are not supported") - case JsonSchema.AnyJson => throw new Exception("AnyJson query parameters are not supported") + case JsonSchema.Null => throw new Exception("Null query parameters are not supported") + case JsonSchema.AnyJson => throw new Exception("AnyJson query parameters are not supported") } } @@ -1038,6 +1043,20 @@ final case class EndpointGen(config: Config) { Some(Code.Primitive.ScalaString.seq), ) tpe.map(Code.Field(name, _)) + case JsonSchema.Object(properties, additionalProperties, _) + if properties.nonEmpty && additionalProperties.isRight => + // Can't be an object and a map at the same time + throw new Exception("Object with properties and additionalProperties is not supported") + case JsonSchema.Object(properties, additionalProperties, _) + if properties.isEmpty && additionalProperties.isRight => + Some( + Code.Field( + name, + Code.Collection.Map( + schemaToField(additionalProperties.toOption.get, openAPI, name, annotations).get.fieldType, + ), + ), + ) case JsonSchema.Object(_, _, _) => Some(Code.Field(name, Code.TypeRef(name.capitalize))) case JsonSchema.Enum(_) => diff --git a/zio-http-gen/src/test/resources/AnimalWithMap.scala b/zio-http-gen/src/test/resources/AnimalWithMap.scala new file mode 100644 index 0000000000..2045057554 --- /dev/null +++ b/zio-http-gen/src/test/resources/AnimalWithMap.scala @@ -0,0 +1,13 @@ +package test.component + +import zio.schema._ + +case class Animals( + total: Int, + counts: Map[String, Int], +) +object Animals { + + implicit val codec: Schema[Animals] = DeriveSchema.gen[Animals] + +} diff --git a/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala b/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala index c3b70da766..f7575e841f 100644 --- a/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala +++ b/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala @@ -717,5 +717,81 @@ object CodeGenSpec extends ZIOSpecDefault { "/EndpointsWithOverlappingPath.scala", ) }, + test("Additional properties") { + val json = """{ + | "info": { + | "title": "Animals Service", + | "version": "0.0.1" + | }, + | "servers": [ + | { + | "url": "http://127.0.0.1:5000/" + | } + | ], + | "tags": [ + | { + | "name": "Animals_API" + | } + | ], + | "paths": { + | "/api/v1/zoo": { + | "get": { + | "operationId": "get_animals", + | "tags": [ + | "Animals_API" + | ], + | "description": "Get all animals count", + | "responses": { + | "200": { + | "content": { + | "application/json": { + | "schema": { + | "$ref": "#/components/schemas/Animals" + | } + | } + | } + | } + | } + | } + | } + | }, + | "openapi": "3.0.3", + | "components": { + | "schemas": { + | "Animals": { + | "type": "object", + | "required": [ + | "total", + | "counts" + | ], + | "properties": { + | "total": { + | "type": "integer", + | "format": "int32" + | }, + | "counts": { + | "type": "object", + | "additionalProperties": { + | "type": "integer", + | "format": "int32" + | } + | } + | } + | } + | } + | } + |}""".stripMargin + val openAPI = OpenAPI.fromJson(json).toOption.get + val code = EndpointGen.fromOpenAPI(openAPI) + val tempDir = Files.createTempDirectory("codegen") + + CodeGen.writeFiles(code, java.nio.file.Paths.get(tempDir.toString, "test"), "test", Some(scalaFmtPath)) + + fileShouldBe( + tempDir, + "test/component/Animals.scala", + "/AnimalWithMap.scala", + ) + }, ) @@ java11OrNewer @@ flaky @@ blocking // Downloading scalafmt on CI is flaky } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala index 205fc82641..df2f34d30a 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala @@ -197,6 +197,7 @@ sealed trait JsonSchema extends Product with Serializable { self => def isCollection: Boolean = self match { case _: JsonSchema.ArrayType => true + case obj: JsonSchema.Object => obj.properties.isEmpty && obj.additionalProperties.isRight case _ => false } From 8de4a4150004f0ff9798b7647ce3702bdbd48e58 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 19 Jun 2024 15:32:21 -0400 Subject: [PATCH 31/58] Generate Mime types (#2918) * generate media types * remove unnecessarry settings * regenerate github workflow * format * scalafix --------- Co-authored-by: John A. De Goes --- .github/workflows/ci.yml | 2 +- aliases.sbt | 1 + build.sbt | 7 + .../zio/http/tools/GenerateMediaTypes.scala | 173 + .../test/scala/zio/http/ContentTypeSpec.scala | 4 +- .../src/main/scala/zio/http/MediaTypes.scala | 17443 +++++++++------- 6 files changed, 10094 insertions(+), 7536 deletions(-) create mode 100644 zio-http-tools/src/main/scala/zio/http/tools/GenerateMediaTypes.scala diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 11dfdc3387..098ba8ac81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -98,7 +98,7 @@ jobs: run: sbt '++ ${{ matrix.scala }}' zioHttpShadedTests/test - name: Compress target directories - run: tar cf targets.tar sbt-zio-http-grpc/target zio-http-cli/target target zio-http/jvm/target zio-http-docs/target sbt-zio-http-grpc-tests/target zio-http-gen/target zio-http-benchmarks/target zio-http-example/target zio-http-testkit/target zio-http/js/target zio-http-htmx/target project/target + run: tar cf targets.tar sbt-zio-http-grpc/target zio-http-cli/target target zio-http/jvm/target zio-http-docs/target sbt-zio-http-grpc-tests/target zio-http-gen/target zio-http-benchmarks/target zio-http-tools/target zio-http-example/target zio-http-testkit/target zio-http/js/target zio-http-htmx/target project/target - name: Upload target directories uses: actions/upload-artifact@v4 diff --git a/aliases.sbt b/aliases.sbt index 5685932874..1a952200cf 100644 --- a/aliases.sbt +++ b/aliases.sbt @@ -2,6 +2,7 @@ addCommandAlias("fmt", "scalafmt; Test / scalafmt; sFix;") addCommandAlias("fmtCheck", "scalafmtCheck; Test / scalafmtCheck; sFixCheck") addCommandAlias("sFix", "scalafix OrganizeImports; Test / scalafix OrganizeImports") addCommandAlias("sFixCheck", "scalafix --check OrganizeImports; Test / scalafix --check OrganizeImports") +addCommandAlias("generateMediaTypes", "zioHttpTools/runMain zio.http.tools.GenerateMediaTypes") onLoadMessage := { import scala.Console._ diff --git a/build.sbt b/build.sbt index ac755ca96e..bd5bda7e16 100644 --- a/build.sbt +++ b/build.sbt @@ -128,6 +128,7 @@ lazy val aggregatedProjects: Seq[ProjectReference] = zioHttpHtmx, zioHttpExample, zioHttpTestkit, + zioHttpTools, docs, ) } @@ -290,6 +291,12 @@ lazy val zioHttpExample = (project in file("zio-http-example")) ) .dependsOn(zioHttpJVM, zioHttpCli, zioHttpGen) +lazy val zioHttpTools = (project in file("zio-http-tools")) + .settings(stdSettings("zio-http-tools")) + .settings(publishSetting(false)) + .settings(runSettings(Debug.Main)) + .dependsOn(zioHttpJVM) + lazy val zioHttpGen = (project in file("zio-http-gen")) .settings(stdSettings("zio-http-gen")) .settings(publishSetting(true)) diff --git a/zio-http-tools/src/main/scala/zio/http/tools/GenerateMediaTypes.scala b/zio-http-tools/src/main/scala/zio/http/tools/GenerateMediaTypes.scala new file mode 100644 index 0000000000..c6bee4f001 --- /dev/null +++ b/zio-http-tools/src/main/scala/zio/http/tools/GenerateMediaTypes.scala @@ -0,0 +1,173 @@ +package zio.http.tools + +import scala.io.Source + +import zio._ +import zio.json._ + +///////////////////////// +// READING AND PARSING // +///////////////////////// + +case class MimeType( + source: Option[String], + extensions: Option[List[String]] = None, + compressible: Option[Boolean] = None, + charset: Option[String] = None, +) + +object MimeType { + implicit val decoder: JsonDecoder[MimeType] = DeriveJsonDecoder.gen[MimeType] +} + +case class MimeDb(mimeTypes: Map[String, MimeType]) extends AnyVal { + def extend(extraTypes: Map[String, MimeType]): MimeDb = { + MimeDb(mimeTypes ++ extraTypes) + } +} + +object MimeDb { + implicit val decoder: JsonDecoder[MimeDb] = JsonDecoder.map[String, MimeType].map(MimeDb(_)) + + // These types are not in the mime-db json + val extraTypes = Map( + "text/event-stream" -> MimeType(None, None, Some(true), None), + ) + + // Fetches the MIME types database from the jshttp/mime-db repository and + // returns a MimeDb object + def fetch: Task[MimeDb] = ZIO.attemptBlocking { + val url = "https://raw.githubusercontent.com/jshttp/mime-db/master/db.json" + + val source = Source.fromURL(url) + val jsonData = + try { source.mkString } + finally { source.close() } + + jsonData.fromJson[MimeDb] match { + case Right(db) => db.extend(extraTypes) + case Left(error) => throw new RuntimeException(s"Failed to parse JSON: $error") + } + } +} + +/////////////// +// RENDERING // +/////////////// + +object RenderUtils { + def snakeCase(s: String): String = { + s.toLowerCase.replace("-", "_") + } + + // hello -> "hello" + def renderString(s: String): String = { + "\"" + s + "\"" + } + + // hello there -> `hello there` + def renderEscaped(s: String): String = { + "`" + s + "`" + } +} + +case class MediaTypeInfo( + mainType: String, + subType: String, + compressible: Boolean, + extensions: List[String], +) { + + def binary: Boolean = { + // If the main type is "image", "video", "audio", or "application", it is likely binary. + // Additionally, if the MIME type is not compressible, it is likely binary. + mainType match { + case "image" | "video" | "audio" | "font" | "model" | "multipart" => true + case "application" => !subType.startsWith("xml") && !subType.endsWith("json") && !subType.endsWith("javascript") + case "text" => false + case _ => !compressible + } + } + + // Renders the media type info as a Scala code snippet + def render: String = { + val extensionsString = + if (extensions.isEmpty) "" + else s", ${extensions.map { string => s""""$string"""" }.mkString("List(", ", ", ")")}" + + s""" +lazy val `${subType}`: MediaType = + new MediaType("$mainType", "$subType", compressible = $compressible, binary = $binary$extensionsString) + """ + } +} + +object MediaTypeInfo { + def fromMimeDb(mimeDb: MimeDb): List[MediaTypeInfo] = { + mimeDb.mimeTypes.map { case (mimeType, details) => + val Array(mainType, subType) = mimeType.split('/') + MediaTypeInfo(mainType, subType, details.compressible.getOrElse(false), details.extensions.getOrElse(List.empty)) + }.toList + } +} + +// Renders a group of media types as a Scala code snippet +case class MediaTypeGroup( + mainType: String, + subTypes: List[MediaTypeInfo], +) { + def render: String = { + + s""" +object ${RenderUtils.snakeCase(mainType)} { + ${subTypes.map(_.render).mkString("\n")} + lazy val all: List[MediaType] = List(${subTypes.map(t => RenderUtils.renderEscaped(t.subType)).mkString(", ")}) + lazy val any: MediaType = new MediaType("$mainType", "*") +} + """ + } +} + +object GenerateMediaTypes extends ZIOAppDefault { + val run = + for { + mimeDb <- MimeDb.fetch + mediaTypes = MediaTypeInfo.fromMimeDb(mimeDb) + mediaTypeGroups = + mediaTypes + .groupBy(_.mainType) + .map { case (mainType, subTypes) => + MediaTypeGroup(mainType, subTypes) + } + .toList + file = MediaTypeFile(mediaTypeGroups) + mediaTypesPath = "../zio-http/shared/src/main/scala/zio/http/MediaTypes.scala" + _ <- ZIO.writeFile(mediaTypesPath, file.render) + } yield () +} + +// Renders a list of media type groups as a Scala code snippet +case class MediaTypeFile( + groups: List[MediaTypeGroup], +) { + def render: String = { + s""" +// ⚠️ HEY YOU! IMPORTANT MESSAGE ⚠️ +// ============================== +// +// THIS FILE IS AUTOMATICALLY GENERATED BY `GenerateMediaTypes.scala` +// So don't go editing it now, you hear? Otherwise your changes will +// be overwritten the next time someone runs `sbt generateMediaTypes` + +package zio.http + +private[zio] trait MediaTypes { + private[zio] lazy val allMediaTypes: List[MediaType] = + ${groups.map(main => s"${RenderUtils.snakeCase(main.mainType)}.all").mkString(" ++ ")} + lazy val any: MediaType = new MediaType("*", "*") + +${groups.map(_.render).mkString("\n\n")} +} + """ + } +} diff --git a/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala index 3f04817b81..7e40a9228c 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ContentTypeSpec.scala @@ -35,7 +35,7 @@ object ContentTypeSpec extends HttpRunnableSpec { val res = Handler.fromResource("TestFile3.js").sandbox.toRoutes.deploy(Request()).map(_.header(Header.ContentType)) assertZIO(res)( - isSome(equalTo(Header.ContentType(MediaType.application.`javascript`, charset = Some(Charsets.Utf8)))), + isSome(equalTo(Header.ContentType(MediaType.text.`javascript`, charset = Some(Charsets.Utf8)))), ) }, test("no extension") { @@ -50,7 +50,7 @@ object ContentTypeSpec extends HttpRunnableSpec { test("mp3") { val res = Handler.fromResource("TestFile6.mp3").sandbox.toRoutes.deploy(Request()).map(_.header(Header.ContentType)) - assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.audio.`mpeg`)))) + assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.audio.`mp3`)))) }, test("unidentified extension") { val res = diff --git a/zio-http/shared/src/main/scala/zio/http/MediaTypes.scala b/zio-http/shared/src/main/scala/zio/http/MediaTypes.scala index 88ac1c829f..f9fa13ef35 100644 --- a/zio-http/shared/src/main/scala/zio/http/MediaTypes.scala +++ b/zio-http/shared/src/main/scala/zio/http/MediaTypes.scala @@ -1,7820 +1,10197 @@ -/* - * Copyright 2021 - 2023 Sporta Technologies PVT LTD & the ZIO HTTP contributors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// ⚠️ HEY YOU! IMPORTANT MESSAGE ⚠️ +// ============================== +// +// THIS FILE IS AUTOMATICALLY GENERATED BY `GenerateMediaTypes.scala` +// So don't go editing it now, you hear? Otherwise your changes will +// be overwritten the next time someone runs `sbt generateMediaTypes` package zio.http private[zio] trait MediaTypes { private[zio] lazy val allMediaTypes: List[MediaType] = - Nil ++ x_shader.all ++ x_conference.all ++ video.all ++ text.all ++ multipart.all ++ model.all ++ message.all ++ image.all ++ font.all ++ chemical.all ++ audio.all ++ application.all - private val Compressible: Boolean = true - private val Uncompressible: Boolean = false - private val Binary: Boolean = true - private val NotBinary: Boolean = false - - lazy val any: MediaType = new MediaType("*", "*") - - private[zio] object application_parts { - trait application_0 { - lazy val `1d-interleaved-parityfec`: MediaType = - new MediaType("application", "1d-interleaved-parityfec", Compressible, NotBinary) - lazy val `3gpdash-qoe-report+xml`: MediaType = - new MediaType("application", "3gpdash-qoe-report+xml", Compressible, NotBinary) - lazy val `3gpp-ims+xml`: MediaType = - new MediaType("application", "3gpp-ims+xml", Compressible, NotBinary) - lazy val `3gpphal+json`: MediaType = - new MediaType("application", "3gpphal+json", Compressible, NotBinary) - lazy val `3gpphalforms+json`: MediaType = - new MediaType("application", "3gpphalforms+json", Compressible, NotBinary) - lazy val `a2l`: MediaType = new MediaType("application", "a2l", Compressible, NotBinary) - lazy val `activemessage`: MediaType = - new MediaType("application", "activemessage", Compressible, NotBinary) - lazy val `activity+json`: MediaType = - new MediaType("application", "activity+json", Compressible, NotBinary) - lazy val `alto-costmap+json`: MediaType = - new MediaType("application", "alto-costmap+json", Compressible, NotBinary) - lazy val `alto-costmapfilter+json`: MediaType = - new MediaType("application", "alto-costmapfilter+json", Compressible, NotBinary) - lazy val `alto-directory+json`: MediaType = - new MediaType("application", "alto-directory+json", Compressible, NotBinary) - lazy val `alto-endpointcost+json`: MediaType = - new MediaType("application", "alto-endpointcost+json", Compressible, NotBinary) - lazy val `alto-endpointcostparams+json`: MediaType = - new MediaType("application", "alto-endpointcostparams+json", Compressible, NotBinary) - lazy val `alto-endpointprop+json`: MediaType = - new MediaType("application", "alto-endpointprop+json", Compressible, NotBinary) - lazy val `alto-endpointpropparams+json`: MediaType = - new MediaType("application", "alto-endpointpropparams+json", Compressible, NotBinary) - lazy val `alto-error+json`: MediaType = - new MediaType("application", "alto-error+json", Compressible, NotBinary) - lazy val `alto-networkmap+json`: MediaType = - new MediaType("application", "alto-networkmap+json", Compressible, NotBinary) - lazy val `alto-networkmapfilter+json`: MediaType = - new MediaType("application", "alto-networkmapfilter+json", Compressible, NotBinary) - lazy val `alto-updatestreamcontrol+json`: MediaType = - new MediaType("application", "alto-updatestreamcontrol+json", Compressible, NotBinary) - lazy val `alto-updatestreamparams+json`: MediaType = - new MediaType("application", "alto-updatestreamparams+json", Compressible, NotBinary) - lazy val `aml`: MediaType = new MediaType("application", "aml", Compressible, NotBinary) - lazy val `andrew-inset`: MediaType = - new MediaType("application", "andrew-inset", Compressible, NotBinary, List("ez")) - lazy val `applefile`: MediaType = - new MediaType("application", "applefile", Compressible, NotBinary) - lazy val `applixware`: MediaType = - new MediaType("application", "applixware", Compressible, NotBinary, List("aw")) - lazy val `atf`: MediaType = new MediaType("application", "atf", Compressible, NotBinary) - lazy val `atfx`: MediaType = new MediaType("application", "atfx", Compressible, NotBinary) - lazy val `atom+xml`: MediaType = - new MediaType("application", "atom+xml", Compressible, NotBinary, List("atom")) - lazy val `atomcat+xml`: MediaType = - new MediaType("application", "atomcat+xml", Compressible, NotBinary, List("atomcat")) - lazy val `atomdeleted+xml`: MediaType = new MediaType( - "application", - "atomdeleted+xml", - Compressible, - NotBinary, - List("atomdeleted"), - ) - lazy val `atomicmail`: MediaType = - new MediaType("application", "atomicmail", Compressible, NotBinary) - lazy val `atomsvc+xml`: MediaType = - new MediaType("application", "atomsvc+xml", Compressible, NotBinary, List("atomsvc")) - lazy val `atsc-dwd+xml`: MediaType = - new MediaType("application", "atsc-dwd+xml", Compressible, NotBinary, List("dwd")) - lazy val `atsc-dynamic-event-message`: MediaType = - new MediaType("application", "atsc-dynamic-event-message", Compressible, NotBinary) - lazy val `atsc-held+xml`: MediaType = - new MediaType("application", "atsc-held+xml", Compressible, NotBinary, List("held")) - lazy val `atsc-rdt+json`: MediaType = - new MediaType("application", "atsc-rdt+json", Compressible, NotBinary) - lazy val `atsc-rsat+xml`: MediaType = - new MediaType("application", "atsc-rsat+xml", Compressible, NotBinary, List("rsat")) - lazy val `atxml`: MediaType = new MediaType("application", "atxml", Compressible, NotBinary) - lazy val `auth-policy+xml`: MediaType = - new MediaType("application", "auth-policy+xml", Compressible, NotBinary) - lazy val `bacnet-xdd+zip`: MediaType = - new MediaType("application", "bacnet-xdd+zip", Uncompressible, NotBinary) - lazy val `batch-smtp`: MediaType = - new MediaType("application", "batch-smtp", Compressible, NotBinary) - lazy val `bdoc`: MediaType = - new MediaType("application", "bdoc", Uncompressible, NotBinary, List("bdoc")) - lazy val `beep+xml`: MediaType = - new MediaType("application", "beep+xml", Compressible, NotBinary) - lazy val `calendar+json`: MediaType = - new MediaType("application", "calendar+json", Compressible, NotBinary) - lazy val `calendar+xml`: MediaType = - new MediaType("application", "calendar+xml", Compressible, NotBinary, List("xcs")) - lazy val `call-completion`: MediaType = - new MediaType("application", "call-completion", Compressible, NotBinary) - lazy val `cals-1840`: MediaType = - new MediaType("application", "cals-1840", Compressible, NotBinary) - lazy val `captive+json`: MediaType = - new MediaType("application", "captive+json", Compressible, NotBinary) - lazy val `cbor`: MediaType = new MediaType("application", "cbor", Compressible, NotBinary) - lazy val `cbor-seq`: MediaType = - new MediaType("application", "cbor-seq", Compressible, NotBinary) - lazy val `cccex`: MediaType = new MediaType("application", "cccex", Compressible, NotBinary) - lazy val `ccmp+xml`: MediaType = - new MediaType("application", "ccmp+xml", Compressible, NotBinary) - lazy val `ccxml+xml`: MediaType = - new MediaType("application", "ccxml+xml", Compressible, NotBinary, List("ccxml")) - lazy val `cdfx+xml`: MediaType = - new MediaType("application", "cdfx+xml", Compressible, NotBinary, List("cdfx")) - lazy val `cdmi-capability`: MediaType = - new MediaType("application", "cdmi-capability", Compressible, NotBinary, List("cdmia")) - lazy val `cdmi-container`: MediaType = - new MediaType("application", "cdmi-container", Compressible, NotBinary, List("cdmic")) - lazy val `cdmi-domain`: MediaType = - new MediaType("application", "cdmi-domain", Compressible, NotBinary, List("cdmid")) - lazy val `cdmi-object`: MediaType = - new MediaType("application", "cdmi-object", Compressible, NotBinary, List("cdmio")) - lazy val `cdmi-queue`: MediaType = - new MediaType("application", "cdmi-queue", Compressible, NotBinary, List("cdmiq")) - lazy val `cdni`: MediaType = new MediaType("application", "cdni", Compressible, NotBinary) - lazy val `cea`: MediaType = new MediaType("application", "cea", Compressible, NotBinary) - lazy val `cea-2018+xml`: MediaType = - new MediaType("application", "cea-2018+xml", Compressible, NotBinary) - lazy val `cellml+xml`: MediaType = - new MediaType("application", "cellml+xml", Compressible, NotBinary) - lazy val `cfw`: MediaType = new MediaType("application", "cfw", Compressible, NotBinary) - lazy val `clr`: MediaType = new MediaType("application", "clr", Compressible, NotBinary) - lazy val `clue+xml`: MediaType = - new MediaType("application", "clue+xml", Compressible, NotBinary) - lazy val `clue_info+xml`: MediaType = - new MediaType("application", "clue_info+xml", Compressible, NotBinary) - lazy val `cms`: MediaType = new MediaType("application", "cms", Compressible, NotBinary) - lazy val `cnrp+xml`: MediaType = - new MediaType("application", "cnrp+xml", Compressible, NotBinary) - lazy val `coap-group+json`: MediaType = - new MediaType("application", "coap-group+json", Compressible, NotBinary) - lazy val `coap-payload`: MediaType = - new MediaType("application", "coap-payload", Compressible, NotBinary) - lazy val `commonground`: MediaType = - new MediaType("application", "commonground", Compressible, NotBinary) - lazy val `conference-info+xml`: MediaType = - new MediaType("application", "conference-info+xml", Compressible, NotBinary) - lazy val `cose`: MediaType = new MediaType("application", "cose", Compressible, NotBinary) - lazy val `cose-key`: MediaType = - new MediaType("application", "cose-key", Compressible, NotBinary) - lazy val `cose-key-set`: MediaType = - new MediaType("application", "cose-key-set", Compressible, NotBinary) - lazy val `cpl+xml`: MediaType = - new MediaType("application", "cpl+xml", Compressible, NotBinary) - lazy val `csrattrs`: MediaType = - new MediaType("application", "csrattrs", Compressible, NotBinary) - lazy val `csta+xml`: MediaType = - new MediaType("application", "csta+xml", Compressible, NotBinary) - lazy val `cstadata+xml`: MediaType = - new MediaType("application", "cstadata+xml", Compressible, NotBinary) - lazy val `csvm+json`: MediaType = - new MediaType("application", "csvm+json", Compressible, NotBinary) - lazy val `cu-seeme`: MediaType = - new MediaType("application", "cu-seeme", Compressible, NotBinary, List("cu")) - lazy val `cwt`: MediaType = new MediaType("application", "cwt", Compressible, NotBinary) - lazy val `cybercash`: MediaType = - new MediaType("application", "cybercash", Compressible, NotBinary) - lazy val `dart`: MediaType = new MediaType("application", "dart", Compressible, NotBinary) - lazy val `dash+xml`: MediaType = - new MediaType("application", "dash+xml", Compressible, NotBinary, List("mpd")) - lazy val `dashdelta`: MediaType = - new MediaType("application", "dashdelta", Compressible, NotBinary) - lazy val `davmount+xml`: MediaType = - new MediaType("application", "davmount+xml", Compressible, NotBinary, List("davmount")) - lazy val `dca-rft`: MediaType = - new MediaType("application", "dca-rft", Compressible, NotBinary) - lazy val `dcd`: MediaType = new MediaType("application", "dcd", Compressible, NotBinary) - lazy val `dec-dx`: MediaType = new MediaType("application", "dec-dx", Compressible, NotBinary) - lazy val `dialog-info+xml`: MediaType = - new MediaType("application", "dialog-info+xml", Compressible, NotBinary) - lazy val `dicom`: MediaType = new MediaType("application", "dicom", Compressible, NotBinary) - lazy val `dicom+json`: MediaType = - new MediaType("application", "dicom+json", Compressible, NotBinary) - lazy val `dicom+xml`: MediaType = - new MediaType("application", "dicom+xml", Compressible, NotBinary) - lazy val `dii`: MediaType = new MediaType("application", "dii", Compressible, NotBinary) - lazy val `dit`: MediaType = new MediaType("application", "dit", Compressible, NotBinary) - lazy val `dns`: MediaType = new MediaType("application", "dns", Compressible, NotBinary) - lazy val `dns+json`: MediaType = - new MediaType("application", "dns+json", Compressible, NotBinary) - lazy val `dns-message`: MediaType = - new MediaType("application", "dns-message", Compressible, NotBinary) - lazy val `docbook+xml`: MediaType = - new MediaType("application", "docbook+xml", Compressible, NotBinary, List("dbk")) - lazy val `dots+cbor`: MediaType = - new MediaType("application", "dots+cbor", Compressible, NotBinary) - lazy val `dskpp+xml`: MediaType = - new MediaType("application", "dskpp+xml", Compressible, NotBinary) - lazy val `dssc+der`: MediaType = - new MediaType("application", "dssc+der", Compressible, NotBinary, List("dssc")) - lazy val `dssc+xml`: MediaType = - new MediaType("application", "dssc+xml", Compressible, NotBinary, List("xdssc")) - lazy val `dvcs`: MediaType = new MediaType("application", "dvcs", Compressible, NotBinary) - lazy val `ecmascript`: MediaType = - new MediaType("application", "ecmascript", Compressible, NotBinary, List("es", "ecma")) - lazy val `edi-consent`: MediaType = - new MediaType("application", "edi-consent", Compressible, NotBinary) - lazy val `edi-x12`: MediaType = - new MediaType("application", "edi-x12", Uncompressible, NotBinary) - lazy val `edifact`: MediaType = - new MediaType("application", "edifact", Uncompressible, NotBinary) - lazy val `efi`: MediaType = new MediaType("application", "efi", Compressible, NotBinary) - lazy val `elm+json`: MediaType = - new MediaType("application", "elm+json", Compressible, NotBinary) - lazy val `elm+xml`: MediaType = - new MediaType("application", "elm+xml", Compressible, NotBinary) - lazy val `emergencycalldata.cap+xml`: MediaType = - new MediaType("application", "emergencycalldata.cap+xml", Compressible, NotBinary) - lazy val `emergencycalldata.comment+xml`: MediaType = - new MediaType("application", "emergencycalldata.comment+xml", Compressible, NotBinary) - lazy val `emergencycalldata.control+xml`: MediaType = - new MediaType("application", "emergencycalldata.control+xml", Compressible, NotBinary) - lazy val `emergencycalldata.deviceinfo+xml`: MediaType = - new MediaType("application", "emergencycalldata.deviceinfo+xml", Compressible, NotBinary) - lazy val `emergencycalldata.ecall.msd`: MediaType = - new MediaType("application", "emergencycalldata.ecall.msd", Compressible, NotBinary) - lazy val `emergencycalldata.providerinfo+xml`: MediaType = - new MediaType("application", "emergencycalldata.providerinfo+xml", Compressible, NotBinary) - lazy val `emergencycalldata.serviceinfo+xml`: MediaType = - new MediaType("application", "emergencycalldata.serviceinfo+xml", Compressible, NotBinary) - lazy val `emergencycalldata.subscriberinfo+xml`: MediaType = new MediaType( + application.all ++ x_shader.all ++ model.all ++ image.all ++ text.all ++ font.all ++ video.all ++ message.all ++ audio.all ++ multipart.all ++ chemical.all ++ x_conference.all + lazy val any: MediaType = new MediaType("*", "*") + + object application { + + lazy val `x-bdoc`: MediaType = + new MediaType("application", "x-bdoc", compressible = false, binary = true, List("bdoc")) + + lazy val `vnd.3gpp.mcptt-location-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-location-info+xml", compressible = true, binary = true) + + lazy val `vnd.ctct.ws+xml`: MediaType = + new MediaType("application", "vnd.ctct.ws+xml", compressible = true, binary = true) + + lazy val `vnd.trueapp`: MediaType = + new MediaType("application", "vnd.trueapp", compressible = false, binary = true, List("tra")) + + lazy val `vnd.geogebra.tool`: MediaType = + new MediaType("application", "vnd.geogebra.tool", compressible = false, binary = true, List("ggt")) + + lazy val `vnd.ms-works`: MediaType = + new MediaType( "application", - "emergencycalldata.subscriberinfo+xml", - Compressible, - NotBinary, + "vnd.ms-works", + compressible = false, + binary = true, + List("wps", "wks", "wcm", "wdb"), ) - lazy val `emergencycalldata.veds+xml`: MediaType = - new MediaType("application", "emergencycalldata.veds+xml", Compressible, NotBinary) - lazy val `emma+xml`: MediaType = - new MediaType("application", "emma+xml", Compressible, NotBinary, List("emma")) - lazy val `emotionml+xml`: MediaType = - new MediaType("application", "emotionml+xml", Compressible, NotBinary, List("emotionml")) - lazy val `encaprtp`: MediaType = - new MediaType("application", "encaprtp", Compressible, NotBinary) - lazy val `epp+xml`: MediaType = - new MediaType("application", "epp+xml", Compressible, NotBinary) - lazy val `epub+zip`: MediaType = - new MediaType("application", "epub+zip", Uncompressible, NotBinary, List("epub")) - lazy val `eshop`: MediaType = new MediaType("application", "eshop", Compressible, NotBinary) - lazy val `exi`: MediaType = - new MediaType("application", "exi", Compressible, NotBinary, List("exi")) - lazy val `expect-ct-report+json`: MediaType = - new MediaType("application", "expect-ct-report+json", Compressible, NotBinary) - lazy val `fastinfoset`: MediaType = - new MediaType("application", "fastinfoset", Compressible, NotBinary) - lazy val `fastsoap`: MediaType = - new MediaType("application", "fastsoap", Compressible, NotBinary) - lazy val `fdt+xml`: MediaType = - new MediaType("application", "fdt+xml", Compressible, NotBinary, List("fdt")) - lazy val `fhir+json`: MediaType = - new MediaType("application", "fhir+json", Compressible, NotBinary) - lazy val `fhir+xml`: MediaType = - new MediaType("application", "fhir+xml", Compressible, NotBinary) - lazy val `fido.trusted-apps+json`: MediaType = - new MediaType("application", "fido.trusted-apps+json", Compressible, NotBinary) - lazy val `fits`: MediaType = new MediaType("application", "fits", Compressible, NotBinary) - lazy val `flexfec`: MediaType = - new MediaType("application", "flexfec", Compressible, NotBinary) - lazy val `font-sfnt`: MediaType = - new MediaType("application", "font-sfnt", Compressible, NotBinary) - lazy val `font-tdpfr`: MediaType = - new MediaType("application", "font-tdpfr", Compressible, NotBinary, List("pfr")) - lazy val `font-woff`: MediaType = - new MediaType("application", "font-woff", Uncompressible, Binary) - lazy val `framework-attributes+xml`: MediaType = - new MediaType("application", "framework-attributes+xml", Compressible, NotBinary) - lazy val `geo+json`: MediaType = - new MediaType("application", "geo+json", Compressible, NotBinary, List("geojson")) - lazy val `geo+json-seq`: MediaType = - new MediaType("application", "geo+json-seq", Compressible, NotBinary) - lazy val `geopackage+sqlite3`: MediaType = - new MediaType("application", "geopackage+sqlite3", Compressible, NotBinary) - lazy val `geoxacml+xml`: MediaType = - new MediaType("application", "geoxacml+xml", Compressible, NotBinary) - lazy val `gltf-buffer`: MediaType = - new MediaType("application", "gltf-buffer", Compressible, NotBinary) - lazy val `gml+xml`: MediaType = - new MediaType("application", "gml+xml", Compressible, NotBinary, List("gml")) - lazy val `gpx+xml`: MediaType = - new MediaType("application", "gpx+xml", Compressible, NotBinary, List("gpx")) - lazy val `gxf`: MediaType = - new MediaType("application", "gxf", Compressible, NotBinary, List("gxf")) - lazy val `gzip`: MediaType = - new MediaType("application", "gzip", Uncompressible, Binary, List("gz")) - lazy val `h224`: MediaType = new MediaType("application", "h224", Compressible, NotBinary) - lazy val `held+xml`: MediaType = - new MediaType("application", "held+xml", Compressible, NotBinary) - lazy val `hjson`: MediaType = - new MediaType("application", "hjson", Compressible, NotBinary, List("hjson")) - lazy val `http`: MediaType = new MediaType("application", "http", Compressible, NotBinary) - lazy val `hyperstudio`: MediaType = - new MediaType("application", "hyperstudio", Compressible, NotBinary, List("stk")) - lazy val `ibe-key-request+xml`: MediaType = - new MediaType("application", "ibe-key-request+xml", Compressible, NotBinary) - lazy val `ibe-pkg-reply+xml`: MediaType = - new MediaType("application", "ibe-pkg-reply+xml", Compressible, NotBinary) - lazy val `ibe-pp-data`: MediaType = - new MediaType("application", "ibe-pp-data", Compressible, NotBinary) - lazy val `iges`: MediaType = new MediaType("application", "iges", Compressible, NotBinary) - lazy val `im-iscomposing+xml`: MediaType = - new MediaType("application", "im-iscomposing+xml", Compressible, NotBinary) - lazy val `index`: MediaType = new MediaType("application", "index", Compressible, NotBinary) - lazy val `index.cmd`: MediaType = - new MediaType("application", "index.cmd", Compressible, NotBinary) - lazy val `index.obj`: MediaType = - new MediaType("application", "index.obj", Compressible, NotBinary) - lazy val `index.response`: MediaType = - new MediaType("application", "index.response", Compressible, NotBinary) - lazy val `index.vnd`: MediaType = - new MediaType("application", "index.vnd", Compressible, NotBinary) - lazy val `inkml+xml`: MediaType = - new MediaType("application", "inkml+xml", Compressible, NotBinary, List("ink", "inkml")) - lazy val `iotp`: MediaType = new MediaType("application", "iotp", Compressible, NotBinary) - lazy val `ipfix`: MediaType = - new MediaType("application", "ipfix", Compressible, NotBinary, List("ipfix")) - lazy val `ipp`: MediaType = new MediaType("application", "ipp", Compressible, NotBinary) - lazy val `isup`: MediaType = new MediaType("application", "isup", Compressible, NotBinary) - lazy val `its+xml`: MediaType = - new MediaType("application", "its+xml", Compressible, NotBinary, List("its")) - lazy val `java-archive`: MediaType = new MediaType( + + lazy val `vnd.hc+json`: MediaType = + new MediaType("application", "vnd.hc+json", compressible = true, binary = false) + + lazy val `vnd.ims.lti.v2.toolconsumerprofile+json`: MediaType = + new MediaType("application", "vnd.ims.lti.v2.toolconsumerprofile+json", compressible = true, binary = false) + + lazy val `vnd.3gpp.pfcp`: MediaType = + new MediaType("application", "vnd.3gpp.pfcp", compressible = false, binary = true) + + lazy val `wordperfect5.1`: MediaType = + new MediaType("application", "wordperfect5.1", compressible = false, binary = true) + + lazy val `ace+cbor`: MediaType = + new MediaType("application", "ace+cbor", compressible = false, binary = true) + + lazy val `vnd.kodak-descriptor`: MediaType = + new MediaType("application", "vnd.kodak-descriptor", compressible = false, binary = true, List("sse")) + + lazy val `tetra_isi`: MediaType = + new MediaType("application", "tetra_isi", compressible = false, binary = true) + + lazy val `vnd.collabio.xodocuments.presentation-template`: MediaType = + new MediaType( "application", - "java-archive", - Uncompressible, - Binary, - List("jar", "war", "ear"), + "vnd.collabio.xodocuments.presentation-template", + compressible = false, + binary = true, ) - lazy val `java-serialized-object`: MediaType = new MediaType( + + lazy val `vnd.oasis.opendocument.text`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.text", compressible = false, binary = true, List("odt")) + + lazy val `vnd.fujitsu.oasys2`: MediaType = + new MediaType("application", "vnd.fujitsu.oasys2", compressible = false, binary = true, List("oa2")) + + lazy val `commonground`: MediaType = + new MediaType("application", "commonground", compressible = false, binary = true) + + lazy val `vnd.evolv.ecig.profile`: MediaType = + new MediaType("application", "vnd.evolv.ecig.profile", compressible = false, binary = true) + + lazy val `vnd.gov.sk.xmldatacontainer+xml`: MediaType = + new MediaType("application", "vnd.gov.sk.xmldatacontainer+xml", compressible = true, binary = true) + + lazy val `simple-filter+xml`: MediaType = + new MediaType("application", "simple-filter+xml", compressible = true, binary = true) + + lazy val `vnd.chess-pgn`: MediaType = + new MediaType("application", "vnd.chess-pgn", compressible = false, binary = true) + + lazy val `vnd.oma.lwm2m+tlv`: MediaType = + new MediaType("application", "vnd.oma.lwm2m+tlv", compressible = false, binary = true) + + lazy val `vnd.gov.sk.e-form+xml`: MediaType = + new MediaType("application", "vnd.gov.sk.e-form+xml", compressible = true, binary = true) + + lazy val `jwk-set+json`: MediaType = + new MediaType("application", "jwk-set+json", compressible = true, binary = false) + + lazy val `index.response`: MediaType = + new MediaType("application", "index.response", compressible = false, binary = true) + + lazy val `vnd.novadigm.edx`: MediaType = + new MediaType("application", "vnd.novadigm.edx", compressible = false, binary = true, List("edx")) + + lazy val `mathml-presentation+xml`: MediaType = + new MediaType("application", "mathml-presentation+xml", compressible = true, binary = true) + + lazy val `urc-targetdesc+xml`: MediaType = + new MediaType("application", "urc-targetdesc+xml", compressible = true, binary = true, List("td")) + + lazy val `vnd.nokia.conml+xml`: MediaType = + new MediaType("application", "vnd.nokia.conml+xml", compressible = true, binary = true) + + lazy val `vnd.anser-web-funds-transfer-initiation`: MediaType = + new MediaType( "application", - "java-serialized-object", - Uncompressible, - NotBinary, - List("ser"), + "vnd.anser-web-funds-transfer-initiation", + compressible = false, + binary = true, + List("fti"), ) - lazy val `java-vm`: MediaType = - new MediaType("application", "java-vm", Uncompressible, NotBinary, List("class")) - lazy val `javascript`: MediaType = - new MediaType("application", "javascript", Compressible, NotBinary, List("js", "mjs")) - lazy val `jf2feed+json`: MediaType = - new MediaType("application", "jf2feed+json", Compressible, NotBinary) - lazy val `jose`: MediaType = new MediaType("application", "jose", Compressible, NotBinary) - lazy val `jose+json`: MediaType = - new MediaType("application", "jose+json", Compressible, NotBinary) - lazy val `jrd+json`: MediaType = - new MediaType("application", "jrd+json", Compressible, NotBinary) - lazy val `jscalendar+json`: MediaType = - new MediaType("application", "jscalendar+json", Compressible, NotBinary) - lazy val `json`: MediaType = - new MediaType("application", "json", Compressible, NotBinary, List("json", "map")) - lazy val `json-patch+json`: MediaType = - new MediaType("application", "json-patch+json", Compressible, NotBinary) - lazy val `json-seq`: MediaType = - new MediaType("application", "json-seq", Compressible, NotBinary) - lazy val `json5`: MediaType = - new MediaType("application", "json5", Compressible, NotBinary, List("json5")) - lazy val `jsonml+json`: MediaType = - new MediaType("application", "jsonml+json", Compressible, NotBinary, List("jsonml")) - lazy val `jwk+json`: MediaType = - new MediaType("application", "jwk+json", Compressible, NotBinary) - lazy val `jwk-set+json`: MediaType = - new MediaType("application", "jwk-set+json", Compressible, NotBinary) - lazy val `jwt`: MediaType = new MediaType("application", "jwt", Compressible, NotBinary) - lazy val `kpml-request+xml`: MediaType = - new MediaType("application", "kpml-request+xml", Compressible, NotBinary) - lazy val `kpml-response+xml`: MediaType = - new MediaType("application", "kpml-response+xml", Compressible, NotBinary) - lazy val `ld+json`: MediaType = - new MediaType("application", "ld+json", Compressible, NotBinary, List("jsonld")) - lazy val `lgr+xml`: MediaType = - new MediaType("application", "lgr+xml", Compressible, NotBinary, List("lgr")) - lazy val `link-format`: MediaType = - new MediaType("application", "link-format", Compressible, NotBinary) - lazy val `load-control+xml`: MediaType = - new MediaType("application", "load-control+xml", Compressible, NotBinary) - lazy val `lost+xml`: MediaType = - new MediaType("application", "lost+xml", Compressible, NotBinary, List("lostxml")) - lazy val `lostsync+xml`: MediaType = - new MediaType("application", "lostsync+xml", Compressible, NotBinary) - lazy val `lpf+zip`: MediaType = - new MediaType("application", "lpf+zip", Uncompressible, NotBinary) - lazy val `lxf`: MediaType = new MediaType("application", "lxf", Compressible, NotBinary) - lazy val `mac-binhex40`: MediaType = - new MediaType("application", "mac-binhex40", Compressible, NotBinary, List("hqx")) - lazy val `mac-compactpro`: MediaType = - new MediaType("application", "mac-compactpro", Compressible, NotBinary, List("cpt")) - lazy val `macwriteii`: MediaType = - new MediaType("application", "macwriteii", Compressible, NotBinary) - lazy val `mads+xml`: MediaType = - new MediaType("application", "mads+xml", Compressible, NotBinary, List("mads")) - lazy val `manifest+json`: MediaType = - new MediaType("application", "manifest+json", Compressible, NotBinary, List("webmanifest")) - lazy val `marc`: MediaType = - new MediaType("application", "marc", Compressible, NotBinary, List("mrc")) - lazy val `marcxml+xml`: MediaType = - new MediaType("application", "marcxml+xml", Compressible, NotBinary, List("mrcx")) - lazy val `mathematica`: MediaType = - new MediaType("application", "mathematica", Compressible, NotBinary, List("ma", "nb", "mb")) - lazy val `mathml+xml`: MediaType = - new MediaType("application", "mathml+xml", Compressible, NotBinary, List("mathml")) - lazy val `mathml-content+xml`: MediaType = - new MediaType("application", "mathml-content+xml", Compressible, NotBinary) - lazy val `mathml-presentation+xml`: MediaType = - new MediaType("application", "mathml-presentation+xml", Compressible, NotBinary) - lazy val `mbms-associated-procedure-description+xml`: MediaType = new MediaType( + + lazy val `vnd.dvb.service`: MediaType = + new MediaType("application", "vnd.dvb.service", compressible = false, binary = true, List("svc")) + + lazy val `x-compress`: MediaType = + new MediaType("application", "x-compress", compressible = false, binary = true) + + lazy val `vnd.ms-wmdrm.meter-resp`: MediaType = + new MediaType("application", "vnd.ms-wmdrm.meter-resp", compressible = false, binary = true) + + lazy val `vnd.etsi.pstn+xml`: MediaType = + new MediaType("application", "vnd.etsi.pstn+xml", compressible = true, binary = true) + + lazy val `route-usd+xml`: MediaType = + new MediaType("application", "route-usd+xml", compressible = true, binary = true, List("rusd")) + + lazy val `x-msmoney`: MediaType = + new MediaType("application", "x-msmoney", compressible = false, binary = true, List("mny")) + + lazy val `vnd.tcpdump.pcap`: MediaType = + new MediaType("application", "vnd.tcpdump.pcap", compressible = false, binary = true, List("pcap", "cap", "dmp")) + + lazy val `vnd.smintio.portals.archive`: MediaType = + new MediaType("application", "vnd.smintio.portals.archive", compressible = false, binary = true) + + lazy val `vnd.medcalcdata`: MediaType = + new MediaType("application", "vnd.medcalcdata", compressible = false, binary = true, List("mc1")) + + lazy val `cbor-seq`: MediaType = + new MediaType("application", "cbor-seq", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcdata-msgstore-ctrl-request+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-msgstore-ctrl-request+xml", compressible = true, binary = true) + + lazy val `vnd.oma.poc.groups+xml`: MediaType = + new MediaType("application", "vnd.oma.poc.groups+xml", compressible = true, binary = true) + + lazy val `yang-patch+json`: MediaType = + new MediaType("application", "yang-patch+json", compressible = true, binary = false) + + lazy val `vnd.3gpp2.sms`: MediaType = + new MediaType("application", "vnd.3gpp2.sms", compressible = false, binary = true) + + lazy val `passport`: MediaType = + new MediaType("application", "passport", compressible = false, binary = true) + + lazy val `atomdeleted+xml`: MediaType = + new MediaType("application", "atomdeleted+xml", compressible = true, binary = true, List("atomdeleted")) + + lazy val `x-blorb`: MediaType = + new MediaType("application", "x-blorb", compressible = false, binary = true, List("blb", "blorb")) + + lazy val `marcxml+xml`: MediaType = + new MediaType("application", "marcxml+xml", compressible = true, binary = true, List("mrcx")) + + lazy val `ocsp-request`: MediaType = + new MediaType("application", "ocsp-request", compressible = false, binary = true) + + lazy val `vnd.cirpack.isdn-ext`: MediaType = + new MediaType("application", "vnd.cirpack.isdn-ext", compressible = false, binary = true) + + lazy val `vnd.truedoc`: MediaType = + new MediaType("application", "vnd.truedoc", compressible = false, binary = true) + + lazy val `tzif`: MediaType = + new MediaType("application", "tzif", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.vmldrawing`: MediaType = + new MediaType("application", "vnd.openxmlformats-officedocument.vmldrawing", compressible = false, binary = true) + + lazy val `yang-data+cbor`: MediaType = + new MediaType("application", "yang-data+cbor", compressible = false, binary = true) + + lazy val `vnd.ecowin.series`: MediaType = + new MediaType("application", "vnd.ecowin.series", compressible = false, binary = true) + + lazy val `vnd.groove-identity-message`: MediaType = + new MediaType("application", "vnd.groove-identity-message", compressible = false, binary = true, List("gim")) + + lazy val `vnd.s3sms`: MediaType = + new MediaType("application", "vnd.s3sms", compressible = false, binary = true) + + lazy val `vnd.nacamar.ybrid+json`: MediaType = + new MediaType("application", "vnd.nacamar.ybrid+json", compressible = true, binary = false) + + lazy val `x-ms-xbap`: MediaType = + new MediaType("application", "x-ms-xbap", compressible = false, binary = true, List("xbap")) + + lazy val `vnd.ipld.dag-cbor`: MediaType = + new MediaType("application", "vnd.ipld.dag-cbor", compressible = false, binary = true) + + lazy val `macwriteii`: MediaType = + new MediaType("application", "macwriteii", compressible = false, binary = true) + + lazy val `vnd.ezpix-album`: MediaType = + new MediaType("application", "vnd.ezpix-album", compressible = false, binary = true, List("ez2")) + + lazy val `vnd.openeye.oeb`: MediaType = + new MediaType("application", "vnd.openeye.oeb", compressible = false, binary = true) + + lazy val `vnd.cryptomator.vault`: MediaType = + new MediaType("application", "vnd.cryptomator.vault", compressible = false, binary = true) + + lazy val `3gpp-ims+xml`: MediaType = + new MediaType("application", "3gpp-ims+xml", compressible = true, binary = true) + + lazy val `vnd.sybyl.mol2`: MediaType = + new MediaType("application", "vnd.sybyl.mol2", compressible = false, binary = true) + + lazy val `vnd.informix-visionary`: MediaType = + new MediaType("application", "vnd.informix-visionary", compressible = false, binary = true) + + lazy val `pkcs8-encrypted`: MediaType = + new MediaType("application", "pkcs8-encrypted", compressible = false, binary = true) + + lazy val `vnd.radisys.msml-dialog-base+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-dialog-base+xml", compressible = true, binary = true) + + lazy val `vnd.wmc`: MediaType = + new MediaType("application", "vnd.wmc", compressible = false, binary = true) + + lazy val `vnd.mfmp`: MediaType = + new MediaType("application", "vnd.mfmp", compressible = false, binary = true, List("mfm")) + + lazy val `xcap-att+xml`: MediaType = + new MediaType("application", "xcap-att+xml", compressible = true, binary = true, List("xav")) + + lazy val `spirits-event+xml`: MediaType = + new MediaType("application", "spirits-event+xml", compressible = true, binary = true) + + lazy val `oauth-authz-req+jwt`: MediaType = + new MediaType("application", "oauth-authz-req+jwt", compressible = false, binary = true) + + lazy val `alto-propmapparams+json`: MediaType = + new MediaType("application", "alto-propmapparams+json", compressible = true, binary = false) + + lazy val `pskc+xml`: MediaType = + new MediaType("application", "pskc+xml", compressible = true, binary = true, List("pskcxml")) + + lazy val `vnd.data-vision.rdz`: MediaType = + new MediaType("application", "vnd.data-vision.rdz", compressible = false, binary = true, List("rdz")) + + lazy val `vnd.visio`: MediaType = + new MediaType("application", "vnd.visio", compressible = false, binary = true, List("vsd", "vst", "vss", "vsw")) + + lazy val `vnd.oma.bcast.stkm`: MediaType = + new MediaType("application", "vnd.oma.bcast.stkm", compressible = false, binary = true) + + lazy val `vnd.mfer`: MediaType = + new MediaType("application", "vnd.mfer", compressible = false, binary = true, List("mwf")) + + lazy val `vnd.ntt-local.ogw_remote-access`: MediaType = + new MediaType("application", "vnd.ntt-local.ogw_remote-access", compressible = false, binary = true) + + lazy val `logout+jwt`: MediaType = + new MediaType("application", "logout+jwt", compressible = false, binary = true) + + lazy val `cwt`: MediaType = + new MediaType("application", "cwt", compressible = false, binary = true) + + lazy val `load-control+xml`: MediaType = + new MediaType("application", "load-control+xml", compressible = true, binary = true) + + lazy val `vnd.gentoo.manifest`: MediaType = + new MediaType("application", "vnd.gentoo.manifest", compressible = false, binary = true) + + lazy val `vnd.smaf`: MediaType = + new MediaType("application", "vnd.smaf", compressible = false, binary = true, List("mmf")) + + lazy val `vnd.otps.ct-kip+xml`: MediaType = + new MediaType("application", "vnd.otps.ct-kip+xml", compressible = true, binary = true) + + lazy val `vnd.nokia.pcd+xml`: MediaType = + new MediaType("application", "vnd.nokia.pcd+xml", compressible = true, binary = true) + + lazy val `vnd.scribus`: MediaType = + new MediaType("application", "vnd.scribus", compressible = false, binary = true) + + lazy val `vnd.ntt-local.sip-ta_tcp_stream`: MediaType = + new MediaType("application", "vnd.ntt-local.sip-ta_tcp_stream", compressible = false, binary = true) + + lazy val `geo+json`: MediaType = + new MediaType("application", "geo+json", compressible = true, binary = false, List("geojson")) + + lazy val `ocsp-response`: MediaType = + new MediaType("application", "ocsp-response", compressible = false, binary = true) + + lazy val `vnd.apple.pages`: MediaType = + new MediaType("application", "vnd.apple.pages", compressible = false, binary = true, List("pages")) + + lazy val `vnd.micrografx.igx`: MediaType = + new MediaType("application", "vnd.micrografx.igx", compressible = false, binary = true, List("igx")) + + lazy val `cbor`: MediaType = + new MediaType("application", "cbor", compressible = false, binary = true) + + lazy val `3gpphal+json`: MediaType = + new MediaType("application", "3gpphal+json", compressible = true, binary = false) + + lazy val `vnd.kde.kpresenter`: MediaType = + new MediaType("application", "vnd.kde.kpresenter", compressible = false, binary = true, List("kpr", "kpt")) + + lazy val `json`: MediaType = + new MediaType("application", "json", compressible = true, binary = false, List("json", "map")) + + lazy val `vnd.iptc.g2.conceptitem+xml`: MediaType = + new MediaType("application", "vnd.iptc.g2.conceptitem+xml", compressible = true, binary = true) + + lazy val `vnd.cups-raster`: MediaType = + new MediaType("application", "vnd.cups-raster", compressible = false, binary = true) + + lazy val `vnd.amazon.ebook`: MediaType = + new MediaType("application", "vnd.amazon.ebook", compressible = false, binary = true, List("azw")) + + lazy val `vnd.musician`: MediaType = + new MediaType("application", "vnd.musician", compressible = false, binary = true, List("mus")) + + lazy val `vnd.oftn.l10n+json`: MediaType = + new MediaType("application", "vnd.oftn.l10n+json", compressible = true, binary = false) + + lazy val `sdp`: MediaType = + new MediaType("application", "sdp", compressible = false, binary = true, List("sdp")) + + lazy val `vnd.kde.kformula`: MediaType = + new MediaType("application", "vnd.kde.kformula", compressible = false, binary = true, List("kfo")) + + lazy val `x-nzb`: MediaType = + new MediaType("application", "x-nzb", compressible = false, binary = true, List("nzb")) + + lazy val `vnd.uplanet.cacheop`: MediaType = + new MediaType("application", "vnd.uplanet.cacheop", compressible = false, binary = true) + + lazy val `vnd.ruckus.download`: MediaType = + new MediaType("application", "vnd.ruckus.download", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.base`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.base", compressible = false, binary = true) + + lazy val `x-java-jnlp-file`: MediaType = + new MediaType("application", "x-java-jnlp-file", compressible = false, binary = true, List("jnlp")) + + lazy val `pkcs12`: MediaType = + new MediaType("application", "pkcs12", compressible = false, binary = true) + + lazy val `resource-lists+xml`: MediaType = + new MediaType("application", "resource-lists+xml", compressible = true, binary = true, List("rl")) + + lazy val `odm+xml`: MediaType = + new MediaType("application", "odm+xml", compressible = true, binary = true) + + lazy val `vnd.jsk.isdn-ngn`: MediaType = + new MediaType("application", "vnd.jsk.isdn-ngn", compressible = false, binary = true) + + lazy val `iotp`: MediaType = + new MediaType("application", "iotp", compressible = false, binary = true) + + lazy val `pkix-crl`: MediaType = + new MediaType("application", "pkix-crl", compressible = false, binary = true, List("crl")) + + lazy val `vnd.geogebra.file`: MediaType = + new MediaType("application", "vnd.geogebra.file", compressible = false, binary = true, List("ggb")) + + lazy val `ace+json`: MediaType = + new MediaType("application", "ace+json", compressible = true, binary = false) + + lazy val `x-gca-compressed`: MediaType = + new MediaType("application", "x-gca-compressed", compressible = false, binary = true, List("gca")) + + lazy val `sparql-results+xml`: MediaType = + new MediaType("application", "sparql-results+xml", compressible = true, binary = true, List("srx")) + + lazy val `xspf+xml`: MediaType = + new MediaType("application", "xspf+xml", compressible = true, binary = true, List("xspf")) + + lazy val `vnd.crypto-shade-file`: MediaType = + new MediaType("application", "vnd.crypto-shade-file", compressible = false, binary = true) + + lazy val `vnd.is-xpr`: MediaType = + new MediaType("application", "vnd.is-xpr", compressible = false, binary = true, List("xpr")) + + lazy val `beep+xml`: MediaType = + new MediaType("application", "beep+xml", compressible = true, binary = true) + + lazy val `vnd.filmit.zfc`: MediaType = + new MediaType("application", "vnd.filmit.zfc", compressible = false, binary = true) + + lazy val `vnd.oma.bcast.simple-symbol-container`: MediaType = + new MediaType("application", "vnd.oma.bcast.simple-symbol-container", compressible = false, binary = true) + + lazy val `framework-attributes+xml`: MediaType = + new MediaType("application", "framework-attributes+xml", compressible = true, binary = true) + + lazy val `vnd.collabio.xodocuments.spreadsheet-template`: MediaType = + new MediaType("application", "vnd.collabio.xodocuments.spreadsheet-template", compressible = false, binary = true) + + lazy val `vnd.groove-account`: MediaType = + new MediaType("application", "vnd.groove-account", compressible = false, binary = true, List("gac")) + + lazy val `clue_info+xml`: MediaType = + new MediaType("application", "clue_info+xml", compressible = true, binary = true) + + lazy val `vnd.software602.filler.form+xml`: MediaType = + new MediaType("application", "vnd.software602.filler.form+xml", compressible = true, binary = true, List("fo")) + + lazy val `x-font-sunos-news`: MediaType = + new MediaType("application", "x-font-sunos-news", compressible = false, binary = true) + + lazy val `vnd.fujixerox.docuworks.container`: MediaType = + new MediaType("application", "vnd.fujixerox.docuworks.container", compressible = false, binary = true) + + lazy val `pls+xml`: MediaType = + new MediaType("application", "pls+xml", compressible = true, binary = true, List("pls")) + + lazy val `dicom+json`: MediaType = + new MediaType("application", "dicom+json", compressible = true, binary = false) + + lazy val `vnd.oasis.opendocument.text-template`: MediaType = + new MediaType( "application", - "mbms-associated-procedure-description+xml", - Compressible, - NotBinary, + "vnd.oasis.opendocument.text-template", + compressible = false, + binary = true, + List("ott"), ) - lazy val `mbms-deregister+xml`: MediaType = - new MediaType("application", "mbms-deregister+xml", Compressible, NotBinary) - lazy val `mbms-envelope+xml`: MediaType = - new MediaType("application", "mbms-envelope+xml", Compressible, NotBinary) - lazy val `mbms-msk+xml`: MediaType = - new MediaType("application", "mbms-msk+xml", Compressible, NotBinary) - lazy val `mbms-msk-response+xml`: MediaType = - new MediaType("application", "mbms-msk-response+xml", Compressible, NotBinary) - lazy val `mbms-protection-description+xml`: MediaType = - new MediaType("application", "mbms-protection-description+xml", Compressible, NotBinary) - lazy val `mbms-reception-report+xml`: MediaType = - new MediaType("application", "mbms-reception-report+xml", Compressible, NotBinary) - lazy val `mbms-register+xml`: MediaType = - new MediaType("application", "mbms-register+xml", Compressible, NotBinary) - lazy val `mbms-register-response+xml`: MediaType = - new MediaType("application", "mbms-register-response+xml", Compressible, NotBinary) - lazy val `mbms-schedule+xml`: MediaType = - new MediaType("application", "mbms-schedule+xml", Compressible, NotBinary) - lazy val `mbms-user-service-description+xml`: MediaType = - new MediaType("application", "mbms-user-service-description+xml", Compressible, NotBinary) - lazy val `mbox`: MediaType = - new MediaType("application", "mbox", Compressible, NotBinary, List("mbox")) - lazy val `media-policy-dataset+xml`: MediaType = - new MediaType("application", "media-policy-dataset+xml", Compressible, NotBinary) - lazy val `media_control+xml`: MediaType = - new MediaType("application", "media_control+xml", Compressible, NotBinary) - lazy val `mediaservercontrol+xml`: MediaType = new MediaType( + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml`: MediaType = + new MediaType( "application", - "mediaservercontrol+xml", - Compressible, - NotBinary, - List("mscml"), + "vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml", + compressible = true, + binary = true, ) - lazy val `merge-patch+json`: MediaType = - new MediaType("application", "merge-patch+json", Compressible, NotBinary) - lazy val `metalink+xml`: MediaType = - new MediaType("application", "metalink+xml", Compressible, NotBinary, List("metalink")) - lazy val `metalink4+xml`: MediaType = - new MediaType("application", "metalink4+xml", Compressible, NotBinary, List("meta4")) - lazy val `mets+xml`: MediaType = - new MediaType("application", "mets+xml", Compressible, NotBinary, List("mets")) - lazy val `mf4`: MediaType = new MediaType("application", "mf4", Compressible, NotBinary) - lazy val `mikey`: MediaType = new MediaType("application", "mikey", Compressible, NotBinary) - lazy val `mipc`: MediaType = new MediaType("application", "mipc", Compressible, NotBinary) - lazy val `missing-blocks+cbor-seq`: MediaType = - new MediaType("application", "missing-blocks+cbor-seq", Compressible, NotBinary) - lazy val `mmt-aei+xml`: MediaType = - new MediaType("application", "mmt-aei+xml", Compressible, NotBinary, List("maei")) - lazy val `mmt-usd+xml`: MediaType = - new MediaType("application", "mmt-usd+xml", Compressible, NotBinary, List("musd")) - lazy val `mods+xml`: MediaType = - new MediaType("application", "mods+xml", Compressible, NotBinary, List("mods")) - lazy val `moss-keys`: MediaType = - new MediaType("application", "moss-keys", Compressible, NotBinary) - lazy val `moss-signature`: MediaType = - new MediaType("application", "moss-signature", Compressible, NotBinary) - lazy val `mosskey-data`: MediaType = - new MediaType("application", "mosskey-data", Compressible, NotBinary) - lazy val `mosskey-request`: MediaType = - new MediaType("application", "mosskey-request", Compressible, NotBinary) - lazy val `mp21`: MediaType = - new MediaType("application", "mp21", Compressible, NotBinary, List("m21", "mp21")) - lazy val `mp4`: MediaType = - new MediaType("application", "mp4", Compressible, NotBinary, List("mp4s", "m4p")) - lazy val `mpeg4-generic`: MediaType = - new MediaType("application", "mpeg4-generic", Compressible, NotBinary) - lazy val `mpeg4-iod`: MediaType = - new MediaType("application", "mpeg4-iod", Compressible, NotBinary) - lazy val `mpeg4-iod-xmt`: MediaType = - new MediaType("application", "mpeg4-iod-xmt", Compressible, NotBinary) - lazy val `mrb-consumer+xml`: MediaType = - new MediaType("application", "mrb-consumer+xml", Compressible, NotBinary) - lazy val `mrb-publish+xml`: MediaType = - new MediaType("application", "mrb-publish+xml", Compressible, NotBinary) - lazy val `msc-ivr+xml`: MediaType = - new MediaType("application", "msc-ivr+xml", Compressible, NotBinary) - lazy val `msc-mixer+xml`: MediaType = - new MediaType("application", "msc-mixer+xml", Compressible, NotBinary) - lazy val `msword`: MediaType = - new MediaType("application", "msword", Uncompressible, Binary, List("doc", "dot")) - lazy val `mud+json`: MediaType = - new MediaType("application", "mud+json", Compressible, NotBinary) - lazy val `multipart-core`: MediaType = - new MediaType("application", "multipart-core", Compressible, NotBinary) - lazy val `mxf`: MediaType = - new MediaType("application", "mxf", Compressible, NotBinary, List("mxf")) - lazy val `n-quads`: MediaType = - new MediaType("application", "n-quads", Compressible, NotBinary, List("nq")) - lazy val `n-triples`: MediaType = - new MediaType("application", "n-triples", Compressible, NotBinary, List("nt")) - lazy val `nasdata`: MediaType = - new MediaType("application", "nasdata", Compressible, NotBinary) - lazy val `news-checkgroups`: MediaType = - new MediaType("application", "news-checkgroups", Compressible, NotBinary) - lazy val `news-groupinfo`: MediaType = - new MediaType("application", "news-groupinfo", Compressible, NotBinary) - lazy val `news-transmission`: MediaType = - new MediaType("application", "news-transmission", Compressible, NotBinary) - lazy val `nlsml+xml`: MediaType = - new MediaType("application", "nlsml+xml", Compressible, NotBinary) - lazy val `node`: MediaType = - new MediaType("application", "node", Compressible, NotBinary, List("cjs")) - lazy val `nss`: MediaType = new MediaType("application", "nss", Compressible, NotBinary) - lazy val `oauth-authz-req+jwt`: MediaType = - new MediaType("application", "oauth-authz-req+jwt", Compressible, NotBinary) - lazy val `ocsp-request`: MediaType = - new MediaType("application", "ocsp-request", Compressible, NotBinary) - lazy val `ocsp-response`: MediaType = - new MediaType("application", "ocsp-response", Compressible, NotBinary) - lazy val `octet-stream`: MediaType = new MediaType( + + lazy val `vnd.epson.salt`: MediaType = + new MediaType("application", "vnd.epson.salt", compressible = false, binary = true, List("slt")) + + lazy val `vnd.onepagertatx`: MediaType = + new MediaType("application", "vnd.onepagertatx", compressible = false, binary = true) + + lazy val `vnd.nokia.radio-presets`: MediaType = + new MediaType("application", "vnd.nokia.radio-presets", compressible = false, binary = true, List("rpss")) + + lazy val `x-keepass2`: MediaType = + new MediaType("application", "x-keepass2", compressible = false, binary = true, List("kdbx")) + + lazy val `sieve`: MediaType = + new MediaType("application", "sieve", compressible = false, binary = true, List("siv", "sieve")) + + lazy val `vnd.geometry-explorer`: MediaType = + new MediaType("application", "vnd.geometry-explorer", compressible = false, binary = true, List("gex", "gre")) + + lazy val `vnd.yamaha.openscoreformat`: MediaType = + new MediaType("application", "vnd.yamaha.openscoreformat", compressible = false, binary = true, List("osf")) + + lazy val `msc-mixer+xml`: MediaType = + new MediaType("application", "msc-mixer+xml", compressible = true, binary = true) + + lazy val `vnd.ciedi`: MediaType = + new MediaType("application", "vnd.ciedi", compressible = false, binary = true) + + lazy val `vnd.jcp.javame.midlet-rms`: MediaType = + new MediaType("application", "vnd.jcp.javame.midlet-rms", compressible = false, binary = true, List("rms")) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml`: MediaType = + new MediaType( "application", - "octet-stream", - Uncompressible, - Binary, - List( - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy", - "exe", - "dll", - "deb", - "dmg", - "iso", - "img", - "msi", - "msp", - "msm", - "buffer", - ), + "vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml", + compressible = true, + binary = true, ) - lazy val `oda`: MediaType = - new MediaType("application", "oda", Compressible, NotBinary, List("oda")) - lazy val `odm+xml`: MediaType = - new MediaType("application", "odm+xml", Compressible, NotBinary) - lazy val `odx`: MediaType = new MediaType("application", "odx", Compressible, NotBinary) - lazy val `oebps-package+xml`: MediaType = - new MediaType("application", "oebps-package+xml", Compressible, NotBinary, List("opf")) - lazy val `ogg`: MediaType = - new MediaType("application", "ogg", Uncompressible, NotBinary, List("ogx")) - lazy val `omdoc+xml`: MediaType = - new MediaType("application", "omdoc+xml", Compressible, NotBinary, List("omdoc")) - lazy val `onenote`: MediaType = new MediaType( + + lazy val `edi-consent`: MediaType = + new MediaType("application", "edi-consent", compressible = false, binary = true) + + lazy val `x-virtualbox-hdd`: MediaType = + new MediaType("application", "x-virtualbox-hdd", compressible = true, binary = true, List("hdd")) + + lazy val `vnd.aether.imp`: MediaType = + new MediaType("application", "vnd.aether.imp", compressible = false, binary = true) + + lazy val `json5`: MediaType = + new MediaType("application", "json5", compressible = false, binary = true, List("json5")) + + lazy val `vnd.oma.cab-subs-invite+xml`: MediaType = + new MediaType("application", "vnd.oma.cab-subs-invite+xml", compressible = true, binary = true) + + lazy val `flexfec`: MediaType = + new MediaType("application", "flexfec", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcptt-user-profile+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-user-profile+xml", compressible = true, binary = true) + + lazy val `cybercash`: MediaType = + new MediaType("application", "cybercash", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.presentation`: MediaType = + new MediaType( "application", - "onenote", - Compressible, - NotBinary, - List("onetoc", "onetoc2", "onetmp", "onepkg"), + "vnd.oasis.opendocument.presentation", + compressible = false, + binary = true, + List("odp"), ) - lazy val `opc-nodeset+xml`: MediaType = - new MediaType("application", "opc-nodeset+xml", Compressible, NotBinary) - lazy val `oscore`: MediaType = new MediaType("application", "oscore", Compressible, NotBinary) - lazy val `oxps`: MediaType = - new MediaType("application", "oxps", Compressible, NotBinary, List("oxps")) - lazy val `p2p-overlay+xml`: MediaType = - new MediaType("application", "p2p-overlay+xml", Compressible, NotBinary, List("relo")) - lazy val `parityfec`: MediaType = - new MediaType("application", "parityfec", Compressible, NotBinary) - lazy val `passport`: MediaType = - new MediaType("application", "passport", Compressible, NotBinary) - lazy val `patch-ops-error+xml`: MediaType = - new MediaType("application", "patch-ops-error+xml", Compressible, NotBinary, List("xer")) - lazy val `pdf`: MediaType = - new MediaType("application", "pdf", Uncompressible, Binary, List("pdf")) - lazy val `pdx`: MediaType = new MediaType("application", "pdx", Compressible, NotBinary) - lazy val `pem-certificate-chain`: MediaType = - new MediaType("application", "pem-certificate-chain", Compressible, NotBinary) - lazy val `pgp-encrypted`: MediaType = - new MediaType("application", "pgp-encrypted", Uncompressible, NotBinary, List("pgp")) - lazy val `pgp-keys`: MediaType = - new MediaType("application", "pgp-keys", Compressible, NotBinary) - lazy val `pgp-signature`: MediaType = - new MediaType("application", "pgp-signature", Compressible, NotBinary, List("asc", "sig")) - lazy val `pics-rules`: MediaType = - new MediaType("application", "pics-rules", Compressible, NotBinary, List("prf")) - lazy val `pidf+xml`: MediaType = - new MediaType("application", "pidf+xml", Compressible, NotBinary) - lazy val `pidf-diff+xml`: MediaType = - new MediaType("application", "pidf-diff+xml", Compressible, NotBinary) - lazy val `pkcs10`: MediaType = - new MediaType("application", "pkcs10", Compressible, NotBinary, List("p10")) - lazy val `pkcs12`: MediaType = new MediaType("application", "pkcs12", Compressible, NotBinary) - lazy val `pkcs7-mime`: MediaType = - new MediaType("application", "pkcs7-mime", Compressible, NotBinary, List("p7m", "p7c")) - lazy val `pkcs7-signature`: MediaType = - new MediaType("application", "pkcs7-signature", Compressible, NotBinary, List("p7s")) - lazy val `pkcs8`: MediaType = - new MediaType("application", "pkcs8", Compressible, NotBinary, List("p8")) - lazy val `pkcs8-encrypted`: MediaType = - new MediaType("application", "pkcs8-encrypted", Compressible, NotBinary) - lazy val `pkix-attr-cert`: MediaType = - new MediaType("application", "pkix-attr-cert", Compressible, NotBinary, List("ac")) - lazy val `pkix-cert`: MediaType = - new MediaType("application", "pkix-cert", Compressible, NotBinary, List("cer")) - lazy val `pkix-crl`: MediaType = - new MediaType("application", "pkix-crl", Compressible, NotBinary, List("crl")) - lazy val `pkix-pkipath`: MediaType = - new MediaType("application", "pkix-pkipath", Compressible, NotBinary, List("pkipath")) - lazy val `pkixcmp`: MediaType = - new MediaType("application", "pkixcmp", Compressible, NotBinary, List("pki")) - lazy val `pls+xml`: MediaType = - new MediaType("application", "pls+xml", Compressible, NotBinary, List("pls")) - lazy val `poc-settings+xml`: MediaType = - new MediaType("application", "poc-settings+xml", Compressible, NotBinary) - lazy val `postscript`: MediaType = - new MediaType("application", "postscript", Compressible, Binary, List("ai", "eps", "ps")) - lazy val `ppsp-tracker+json`: MediaType = - new MediaType("application", "ppsp-tracker+json", Compressible, NotBinary) - lazy val `problem+json`: MediaType = - new MediaType("application", "problem+json", Compressible, Binary) - lazy val `problem+xml`: MediaType = - new MediaType("application", "problem+xml", Compressible, NotBinary) - lazy val `provenance+xml`: MediaType = - new MediaType("application", "provenance+xml", Compressible, NotBinary, List("provx")) - lazy val `prs.alvestrand.titrax-sheet`: MediaType = - new MediaType("application", "prs.alvestrand.titrax-sheet", Compressible, NotBinary) - lazy val `prs.cww`: MediaType = - new MediaType("application", "prs.cww", Compressible, NotBinary, List("cww")) - lazy val `prs.cyn`: MediaType = - new MediaType("application", "prs.cyn", Compressible, NotBinary) - lazy val `prs.hpub+zip`: MediaType = - new MediaType("application", "prs.hpub+zip", Uncompressible, NotBinary) - lazy val `prs.nprend`: MediaType = - new MediaType("application", "prs.nprend", Compressible, NotBinary) - lazy val `prs.plucker`: MediaType = - new MediaType("application", "prs.plucker", Compressible, NotBinary) - lazy val `prs.rdf-xml-crypt`: MediaType = - new MediaType("application", "prs.rdf-xml-crypt", Compressible, NotBinary) - lazy val `prs.xsf+xml`: MediaType = - new MediaType("application", "prs.xsf+xml", Compressible, NotBinary) - lazy val `pskc+xml`: MediaType = - new MediaType("application", "pskc+xml", Compressible, NotBinary, List("pskcxml")) - lazy val `pvd+json`: MediaType = - new MediaType("application", "pvd+json", Compressible, NotBinary) - lazy val `qsig`: MediaType = new MediaType("application", "qsig", Compressible, NotBinary) - lazy val `raml+yaml`: MediaType = - new MediaType("application", "raml+yaml", Compressible, NotBinary, List("raml")) - lazy val `raptorfec`: MediaType = - new MediaType("application", "raptorfec", Compressible, NotBinary) - lazy val `rdap+json`: MediaType = - new MediaType("application", "rdap+json", Compressible, NotBinary) - lazy val `rdf+xml`: MediaType = - new MediaType("application", "rdf+xml", Compressible, NotBinary, List("rdf", "owl")) - lazy val `reginfo+xml`: MediaType = - new MediaType("application", "reginfo+xml", Compressible, NotBinary, List("rif")) - lazy val `relax-ng-compact-syntax`: MediaType = new MediaType( + + lazy val `atomcat+xml`: MediaType = + new MediaType("application", "atomcat+xml", compressible = true, binary = true, List("atomcat")) + + lazy val `dash+xml`: MediaType = + new MediaType("application", "dash+xml", compressible = true, binary = true, List("mpd")) + + lazy val `vnd.uri-map`: MediaType = + new MediaType("application", "vnd.uri-map", compressible = false, binary = true) + + lazy val `vnd.radisys.msml-dialog-group+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-dialog-group+xml", compressible = true, binary = true) + + lazy val `xcap-diff+xml`: MediaType = + new MediaType("application", "xcap-diff+xml", compressible = true, binary = true, List("xdf")) + + lazy val `tamp-apex-update-confirm`: MediaType = + new MediaType("application", "tamp-apex-update-confirm", compressible = false, binary = true) + + lazy val `vnd.ms-ims`: MediaType = + new MediaType("application", "vnd.ms-ims", compressible = false, binary = true, List("ims")) + + lazy val `x-virtualbox-vbox-extpack`: MediaType = + new MediaType( "application", - "relax-ng-compact-syntax", - Compressible, - NotBinary, - List("rnc"), + "x-virtualbox-vbox-extpack", + compressible = false, + binary = true, + List("vbox-extpack"), ) - lazy val `remote-printing`: MediaType = - new MediaType("application", "remote-printing", Compressible, NotBinary) - lazy val `reputon+json`: MediaType = - new MediaType("application", "reputon+json", Compressible, NotBinary) - lazy val `resource-lists+xml`: MediaType = - new MediaType("application", "resource-lists+xml", Compressible, NotBinary, List("rl")) - lazy val `resource-lists-diff+xml`: MediaType = new MediaType( + + lazy val `concise-problem-details+cbor`: MediaType = + new MediaType("application", "concise-problem-details+cbor", compressible = false, binary = true) + + lazy val `alto-networkmapfilter+json`: MediaType = + new MediaType("application", "alto-networkmapfilter+json", compressible = true, binary = false) + + lazy val `vnd.noblenet-web`: MediaType = + new MediaType("application", "vnd.noblenet-web", compressible = false, binary = true, List("nnw")) + + lazy val `vnd.tableschema+json`: MediaType = + new MediaType("application", "vnd.tableschema+json", compressible = true, binary = false) + + lazy val `elm+xml`: MediaType = + new MediaType("application", "elm+xml", compressible = true, binary = true) + + lazy val `x-dvi`: MediaType = + new MediaType("application", "x-dvi", compressible = false, binary = true, List("dvi")) + + lazy val `vnd.nokia.iptv.config+xml`: MediaType = + new MediaType("application", "vnd.nokia.iptv.config+xml", compressible = true, binary = true) + + lazy val `whoispp-response`: MediaType = + new MediaType("application", "whoispp-response", compressible = false, binary = true) + + lazy val `vnd.afpc.foca-codedfont`: MediaType = + new MediaType("application", "vnd.afpc.foca-codedfont", compressible = false, binary = true) + + lazy val `x-msmediaview`: MediaType = + new MediaType("application", "x-msmediaview", compressible = false, binary = true, List("mvb", "m13", "m14")) + + lazy val `emergencycalldata.serviceinfo+xml`: MediaType = + new MediaType("application", "emergencycalldata.serviceinfo+xml", compressible = true, binary = true) + + lazy val `vnd.sbm.cid`: MediaType = + new MediaType("application", "vnd.sbm.cid", compressible = false, binary = true) + + lazy val `vnd.yamaha.smaf-audio`: MediaType = + new MediaType("application", "vnd.yamaha.smaf-audio", compressible = false, binary = true, List("saf")) + + lazy val `vnd.3gpp.mcptt-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-info+xml", compressible = true, binary = true) + + lazy val `vnd.oipf.userprofile+xml`: MediaType = + new MediaType("application", "vnd.oipf.userprofile+xml", compressible = true, binary = true) + + lazy val `vnd.eln+zip`: MediaType = + new MediaType("application", "vnd.eln+zip", compressible = false, binary = true) + + lazy val `cose`: MediaType = + new MediaType("application", "cose", compressible = false, binary = true) + + lazy val `prs.rdf-xml-crypt`: MediaType = + new MediaType("application", "prs.rdf-xml-crypt", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.image-template`: MediaType = + new MediaType( "application", - "resource-lists-diff+xml", - Compressible, - NotBinary, - List("rld"), + "vnd.oasis.opendocument.image-template", + compressible = false, + binary = true, + List("oti"), ) - lazy val `rfc+xml`: MediaType = - new MediaType("application", "rfc+xml", Compressible, NotBinary) - lazy val `riscos`: MediaType = new MediaType("application", "riscos", Compressible, NotBinary) - lazy val `rlmi+xml`: MediaType = - new MediaType("application", "rlmi+xml", Compressible, NotBinary) - lazy val `rls-services+xml`: MediaType = - new MediaType("application", "rls-services+xml", Compressible, NotBinary, List("rs")) - lazy val `route-apd+xml`: MediaType = - new MediaType("application", "route-apd+xml", Compressible, NotBinary, List("rapd")) - lazy val `route-s-tsid+xml`: MediaType = - new MediaType("application", "route-s-tsid+xml", Compressible, NotBinary, List("sls")) - lazy val `route-usd+xml`: MediaType = - new MediaType("application", "route-usd+xml", Compressible, NotBinary, List("rusd")) - lazy val `rpki-ghostbusters`: MediaType = - new MediaType("application", "rpki-ghostbusters", Compressible, NotBinary, List("gbr")) - lazy val `rpki-manifest`: MediaType = - new MediaType("application", "rpki-manifest", Compressible, NotBinary, List("mft")) - lazy val `rpki-publication`: MediaType = - new MediaType("application", "rpki-publication", Compressible, NotBinary) - lazy val `rpki-roa`: MediaType = - new MediaType("application", "rpki-roa", Compressible, NotBinary, List("roa")) - lazy val `rpki-updown`: MediaType = - new MediaType("application", "rpki-updown", Compressible, NotBinary) - lazy val `rsd+xml`: MediaType = - new MediaType("application", "rsd+xml", Compressible, NotBinary, List("rsd")) - lazy val `rss+xml`: MediaType = - new MediaType("application", "rss+xml", Compressible, NotBinary, List("rss")) - lazy val `rtf`: MediaType = - new MediaType("application", "rtf", Compressible, NotBinary, List("rtf")) - lazy val `rtploopback`: MediaType = - new MediaType("application", "rtploopback", Compressible, NotBinary) - lazy val `rtx`: MediaType = new MediaType("application", "rtx", Compressible, NotBinary) - lazy val `samlassertion+xml`: MediaType = - new MediaType("application", "samlassertion+xml", Compressible, NotBinary) - lazy val `samlmetadata+xml`: MediaType = - new MediaType("application", "samlmetadata+xml", Compressible, NotBinary) - lazy val `sarif+json`: MediaType = - new MediaType("application", "sarif+json", Compressible, NotBinary) - lazy val `sarif-external-properties+json`: MediaType = - new MediaType("application", "sarif-external-properties+json", Compressible, NotBinary) - lazy val `sbe`: MediaType = new MediaType("application", "sbe", Compressible, NotBinary) - lazy val `sbml+xml`: MediaType = - new MediaType("application", "sbml+xml", Compressible, NotBinary, List("sbml")) - lazy val `scaip+xml`: MediaType = - new MediaType("application", "scaip+xml", Compressible, NotBinary) - lazy val `scim+json`: MediaType = - new MediaType("application", "scim+json", Compressible, NotBinary) - lazy val `scvp-cv-request`: MediaType = - new MediaType("application", "scvp-cv-request", Compressible, NotBinary, List("scq")) - lazy val `scvp-cv-response`: MediaType = - new MediaType("application", "scvp-cv-response", Compressible, NotBinary, List("scs")) - lazy val `scvp-vp-request`: MediaType = - new MediaType("application", "scvp-vp-request", Compressible, NotBinary, List("spq")) - lazy val `scvp-vp-response`: MediaType = - new MediaType("application", "scvp-vp-response", Compressible, NotBinary, List("spp")) - lazy val `sdp`: MediaType = - new MediaType("application", "sdp", Compressible, NotBinary, List("sdp")) - lazy val `secevent+jwt`: MediaType = - new MediaType("application", "secevent+jwt", Compressible, NotBinary) - lazy val `senml+cbor`: MediaType = - new MediaType("application", "senml+cbor", Compressible, NotBinary) - lazy val `senml+json`: MediaType = - new MediaType("application", "senml+json", Compressible, NotBinary) - lazy val `senml+xml`: MediaType = - new MediaType("application", "senml+xml", Compressible, NotBinary, List("senmlx")) - lazy val `senml-etch+cbor`: MediaType = - new MediaType("application", "senml-etch+cbor", Compressible, NotBinary) - lazy val `senml-etch+json`: MediaType = - new MediaType("application", "senml-etch+json", Compressible, NotBinary) - lazy val `senml-exi`: MediaType = - new MediaType("application", "senml-exi", Compressible, NotBinary) - lazy val `sensml+cbor`: MediaType = - new MediaType("application", "sensml+cbor", Compressible, NotBinary) - lazy val `sensml+json`: MediaType = - new MediaType("application", "sensml+json", Compressible, NotBinary) - lazy val `sensml+xml`: MediaType = - new MediaType("application", "sensml+xml", Compressible, NotBinary, List("sensmlx")) - lazy val `sensml-exi`: MediaType = - new MediaType("application", "sensml-exi", Compressible, NotBinary) - lazy val `sep+xml`: MediaType = - new MediaType("application", "sep+xml", Compressible, NotBinary) - lazy val `sep-exi`: MediaType = - new MediaType("application", "sep-exi", Compressible, NotBinary) - lazy val `session-info`: MediaType = - new MediaType("application", "session-info", Compressible, NotBinary) - lazy val `set-payment`: MediaType = - new MediaType("application", "set-payment", Compressible, NotBinary) - lazy val `set-payment-initiation`: MediaType = new MediaType( + + lazy val `vnd.innopath.wamp.notification`: MediaType = + new MediaType("application", "vnd.innopath.wamp.notification", compressible = false, binary = true) + + lazy val `vnd.evolv.ecig.theme`: MediaType = + new MediaType("application", "vnd.evolv.ecig.theme", compressible = false, binary = true) + + lazy val `vnd.onepagertat`: MediaType = + new MediaType("application", "vnd.onepagertat", compressible = false, binary = true) + + lazy val `vnd.wolfram.mathematica`: MediaType = + new MediaType("application", "vnd.wolfram.mathematica", compressible = false, binary = true) + + lazy val `vnd.pwg-xhtml-print+xml`: MediaType = + new MediaType("application", "vnd.pwg-xhtml-print+xml", compressible = true, binary = true, List("xhtm")) + + lazy val `vnd.gnu.taler.merchant+json`: MediaType = + new MediaType("application", "vnd.gnu.taler.merchant+json", compressible = true, binary = false) + + lazy val `voicexml+xml`: MediaType = + new MediaType("application", "voicexml+xml", compressible = true, binary = true, List("vxml")) + + lazy val `vnd.geospace`: MediaType = + new MediaType("application", "vnd.geospace", compressible = false, binary = true, List("g3w")) + + lazy val `vnd.vd-study`: MediaType = + new MediaType("application", "vnd.vd-study", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcvideo-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-info+xml", compressible = true, binary = true) + + lazy val `sbe`: MediaType = + new MediaType("application", "sbe", compressible = false, binary = true) + + lazy val `x-chrome-extension`: MediaType = + new MediaType("application", "x-chrome-extension", compressible = false, binary = true, List("crx")) + + lazy val `vnd.omads-email+xml`: MediaType = + new MediaType("application", "vnd.omads-email+xml", compressible = true, binary = true) + + lazy val `x-ms-wmz`: MediaType = + new MediaType("application", "x-ms-wmz", compressible = false, binary = true, List("wmz")) + + lazy val `vnd.apache.arrow.stream`: MediaType = + new MediaType("application", "vnd.apache.arrow.stream", compressible = false, binary = true) + + lazy val `vnd.kde.kchart`: MediaType = + new MediaType("application", "vnd.kde.kchart", compressible = false, binary = true, List("chrt")) + + lazy val `vnd.crick.clicker.keyboard`: MediaType = + new MediaType("application", "vnd.crick.clicker.keyboard", compressible = false, binary = true, List("clkk")) + + lazy val `vnd.loom`: MediaType = + new MediaType("application", "vnd.loom", compressible = false, binary = true) + + lazy val `vnd.sqlite3`: MediaType = + new MediaType("application", "vnd.sqlite3", compressible = false, binary = true) + + lazy val `vnd.dolby.mlp`: MediaType = + new MediaType("application", "vnd.dolby.mlp", compressible = false, binary = true, List("mlp")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sheet`: MediaType = + new MediaType( "application", - "set-payment-initiation", - Compressible, - NotBinary, - List("setpay"), + "vnd.openxmlformats-officedocument.spreadsheetml.sheet", + compressible = false, + binary = true, + List("xlsx"), ) - lazy val `set-registration`: MediaType = - new MediaType("application", "set-registration", Compressible, NotBinary) - lazy val `set-registration-initiation`: MediaType = new MediaType( + + lazy val `vnd.stardivision.impress`: MediaType = + new MediaType("application", "vnd.stardivision.impress", compressible = false, binary = true, List("sdd")) + + lazy val `vnd.mozilla.xul+xml`: MediaType = + new MediaType("application", "vnd.mozilla.xul+xml", compressible = true, binary = true, List("xul")) + + lazy val `x-zmachine`: MediaType = + new MediaType( "application", - "set-registration-initiation", - Compressible, - NotBinary, - List("setreg"), + "x-zmachine", + compressible = false, + binary = true, + List("z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"), ) - lazy val `sgml`: MediaType = new MediaType("application", "sgml", Compressible, NotBinary) - lazy val `sgml-open-catalog`: MediaType = - new MediaType("application", "sgml-open-catalog", Compressible, NotBinary) - lazy val `shf+xml`: MediaType = - new MediaType("application", "shf+xml", Compressible, NotBinary, List("shf")) - lazy val `sieve`: MediaType = - new MediaType("application", "sieve", Compressible, NotBinary, List("siv", "sieve")) - lazy val `simple-filter+xml`: MediaType = - new MediaType("application", "simple-filter+xml", Compressible, NotBinary) - lazy val `simple-message-summary`: MediaType = - new MediaType("application", "simple-message-summary", Compressible, NotBinary) - lazy val `simplesymbolcontainer`: MediaType = - new MediaType("application", "simplesymbolcontainer", Compressible, NotBinary) - lazy val `sipc`: MediaType = new MediaType("application", "sipc", Compressible, NotBinary) - lazy val `slate`: MediaType = new MediaType("application", "slate", Compressible, NotBinary) - lazy val `smil`: MediaType = new MediaType("application", "smil", Compressible, NotBinary) - lazy val `smil+xml`: MediaType = - new MediaType("application", "smil+xml", Compressible, NotBinary, List("smi", "smil")) - lazy val `smpte336m`: MediaType = - new MediaType("application", "smpte336m", Compressible, NotBinary) - lazy val `soap+fastinfoset`: MediaType = - new MediaType("application", "soap+fastinfoset", Compressible, NotBinary) - lazy val `soap+xml`: MediaType = - new MediaType("application", "soap+xml", Compressible, NotBinary) - lazy val `sparql-query`: MediaType = - new MediaType("application", "sparql-query", Compressible, NotBinary, List("rq")) - lazy val `sparql-results+xml`: MediaType = - new MediaType("application", "sparql-results+xml", Compressible, NotBinary, List("srx")) - lazy val `spirits-event+xml`: MediaType = - new MediaType("application", "spirits-event+xml", Compressible, NotBinary) - lazy val `sql`: MediaType = new MediaType("application", "sql", Compressible, NotBinary) - lazy val `srgs`: MediaType = - new MediaType("application", "srgs", Compressible, NotBinary, List("gram")) - lazy val `srgs+xml`: MediaType = - new MediaType("application", "srgs+xml", Compressible, NotBinary, List("grxml")) - lazy val `sru+xml`: MediaType = - new MediaType("application", "sru+xml", Compressible, NotBinary, List("sru")) - lazy val `ssdl+xml`: MediaType = - new MediaType("application", "ssdl+xml", Compressible, NotBinary, List("ssdl")) - lazy val `ssml+xml`: MediaType = - new MediaType("application", "ssml+xml", Compressible, NotBinary, List("ssml")) - lazy val `stix+json`: MediaType = - new MediaType("application", "stix+json", Compressible, NotBinary) - lazy val `swid+xml`: MediaType = - new MediaType("application", "swid+xml", Compressible, NotBinary, List("swidtag")) - lazy val `tamp-apex-update`: MediaType = - new MediaType("application", "tamp-apex-update", Compressible, NotBinary) - lazy val `tamp-apex-update-confirm`: MediaType = - new MediaType("application", "tamp-apex-update-confirm", Compressible, NotBinary) - lazy val `tamp-community-update`: MediaType = - new MediaType("application", "tamp-community-update", Compressible, NotBinary) - lazy val `tamp-community-update-confirm`: MediaType = - new MediaType("application", "tamp-community-update-confirm", Compressible, NotBinary) - lazy val `tamp-error`: MediaType = - new MediaType("application", "tamp-error", Compressible, NotBinary) - lazy val `tamp-sequence-adjust`: MediaType = - new MediaType("application", "tamp-sequence-adjust", Compressible, NotBinary) - lazy val `tamp-sequence-adjust-confirm`: MediaType = - new MediaType("application", "tamp-sequence-adjust-confirm", Compressible, NotBinary) - lazy val `tamp-status-query`: MediaType = - new MediaType("application", "tamp-status-query", Compressible, NotBinary) - lazy val `tamp-status-response`: MediaType = - new MediaType("application", "tamp-status-response", Compressible, NotBinary) - lazy val `tamp-update`: MediaType = - new MediaType("application", "tamp-update", Compressible, NotBinary) - lazy val `tamp-update-confirm`: MediaType = - new MediaType("application", "tamp-update-confirm", Compressible, NotBinary) - lazy val `tar`: MediaType = new MediaType("application", "tar", Compressible, NotBinary) - lazy val `taxii+json`: MediaType = - new MediaType("application", "taxii+json", Compressible, NotBinary) - lazy val `td+json`: MediaType = - new MediaType("application", "td+json", Compressible, NotBinary) - lazy val `tei+xml`: MediaType = - new MediaType("application", "tei+xml", Compressible, NotBinary, List("tei", "teicorpus")) - lazy val `tetra_isi`: MediaType = - new MediaType("application", "tetra_isi", Compressible, NotBinary) - lazy val `thraud+xml`: MediaType = - new MediaType("application", "thraud+xml", Compressible, NotBinary, List("tfi")) - lazy val `timestamp-query`: MediaType = - new MediaType("application", "timestamp-query", Compressible, NotBinary) - lazy val `timestamp-reply`: MediaType = - new MediaType("application", "timestamp-reply", Compressible, NotBinary) - lazy val `timestamped-data`: MediaType = - new MediaType("application", "timestamped-data", Compressible, NotBinary, List("tsd")) - lazy val `tlsrpt+gzip`: MediaType = - new MediaType("application", "tlsrpt+gzip", Compressible, NotBinary) - lazy val `tlsrpt+json`: MediaType = - new MediaType("application", "tlsrpt+json", Compressible, NotBinary) - lazy val `tnauthlist`: MediaType = - new MediaType("application", "tnauthlist", Compressible, NotBinary) - lazy val `toml`: MediaType = - new MediaType("application", "toml", Compressible, NotBinary, List("toml")) - lazy val `trickle-ice-sdpfrag`: MediaType = - new MediaType("application", "trickle-ice-sdpfrag", Compressible, NotBinary) - lazy val `trig`: MediaType = - new MediaType("application", "trig", Compressible, NotBinary, List("trig")) - lazy val `ttml+xml`: MediaType = - new MediaType("application", "ttml+xml", Compressible, NotBinary, List("ttml")) - lazy val `tve-trigger`: MediaType = - new MediaType("application", "tve-trigger", Compressible, NotBinary) - lazy val `tzif`: MediaType = new MediaType("application", "tzif", Compressible, NotBinary) - lazy val `tzif-leap`: MediaType = - new MediaType("application", "tzif-leap", Compressible, NotBinary) - lazy val `ubjson`: MediaType = - new MediaType("application", "ubjson", Uncompressible, NotBinary, List("ubj")) - lazy val `ulpfec`: MediaType = new MediaType("application", "ulpfec", Compressible, NotBinary) - lazy val `urc-grpsheet+xml`: MediaType = - new MediaType("application", "urc-grpsheet+xml", Compressible, NotBinary) - lazy val `urc-ressheet+xml`: MediaType = - new MediaType("application", "urc-ressheet+xml", Compressible, NotBinary, List("rsheet")) - lazy val `urc-targetdesc+xml`: MediaType = - new MediaType("application", "urc-targetdesc+xml", Compressible, NotBinary, List("td")) - lazy val `urc-uisocketdesc+xml`: MediaType = - new MediaType("application", "urc-uisocketdesc+xml", Compressible, NotBinary) - lazy val `vcard+json`: MediaType = - new MediaType("application", "vcard+json", Compressible, NotBinary) - lazy val `vcard+xml`: MediaType = - new MediaType("application", "vcard+xml", Compressible, NotBinary) - lazy val `vemmi`: MediaType = new MediaType("application", "vemmi", Compressible, NotBinary) - lazy val `vividence.scriptfile`: MediaType = - new MediaType("application", "vividence.scriptfile", Compressible, NotBinary) - lazy val `vnd.1000minds.decision-model+xml`: MediaType = new MediaType( - "application", - "vnd.1000minds.decision-model+xml", - Compressible, - NotBinary, - List("1km"), - ) - lazy val `vnd.3gpp-prose+xml`: MediaType = - new MediaType("application", "vnd.3gpp-prose+xml", Compressible, NotBinary) - lazy val `vnd.3gpp-prose-pc3ch+xml`: MediaType = - new MediaType("application", "vnd.3gpp-prose-pc3ch+xml", Compressible, NotBinary) - lazy val `vnd.3gpp-v2x-local-service-information`: MediaType = new MediaType( - "application", - "vnd.3gpp-v2x-local-service-information", - Compressible, - NotBinary, - ) - lazy val `vnd.3gpp.5gnas`: MediaType = - new MediaType("application", "vnd.3gpp.5gnas", Compressible, NotBinary) - lazy val `vnd.3gpp.access-transfer-events+xml`: MediaType = - new MediaType("application", "vnd.3gpp.access-transfer-events+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.bsf+xml`: MediaType = - new MediaType("application", "vnd.3gpp.bsf+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.gmop+xml`: MediaType = - new MediaType("application", "vnd.3gpp.gmop+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.gtpc`: MediaType = - new MediaType("application", "vnd.3gpp.gtpc", Compressible, NotBinary) - lazy val `vnd.3gpp.interworking-data`: MediaType = - new MediaType("application", "vnd.3gpp.interworking-data", Compressible, NotBinary) - lazy val `vnd.3gpp.lpp`: MediaType = - new MediaType("application", "vnd.3gpp.lpp", Compressible, NotBinary) - lazy val `vnd.3gpp.mc-signalling-ear`: MediaType = - new MediaType("application", "vnd.3gpp.mc-signalling-ear", Compressible, NotBinary) - lazy val `vnd.3gpp.mcdata-affiliation-command+xml`: MediaType = new MediaType( + + lazy val `vnd.3gpp.mc-signalling-ear`: MediaType = + new MediaType("application", "vnd.3gpp.mc-signalling-ear", compressible = false, binary = true) + + lazy val `vnd.dvb.notif-aggregate-root+xml`: MediaType = + new MediaType("application", "vnd.dvb.notif-aggregate-root+xml", compressible = true, binary = true) + + lazy val `vnd.noblenet-directory`: MediaType = + new MediaType("application", "vnd.noblenet-directory", compressible = false, binary = true, List("nnd")) + + lazy val `automationml-aml+xml`: MediaType = + new MediaType("application", "automationml-aml+xml", compressible = true, binary = true, List("aml")) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml`: MediaType = + new MediaType( "application", - "vnd.3gpp.mcdata-affiliation-command+xml", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml", + compressible = true, + binary = true, ) - lazy val `vnd.3gpp.mcdata-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcdata-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcdata-payload`: MediaType = - new MediaType("application", "vnd.3gpp.mcdata-payload", Compressible, NotBinary) - lazy val `vnd.3gpp.mcdata-service-config+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcdata-service-config+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcdata-signalling`: MediaType = - new MediaType("application", "vnd.3gpp.mcdata-signalling", Compressible, NotBinary) - lazy val `vnd.3gpp.mcdata-ue-config+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcdata-ue-config+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcdata-user-profile+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcdata-user-profile+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-affiliation-command+xml`: MediaType = new MediaType( + + lazy val `x-httpd-php`: MediaType = + new MediaType("application", "x-httpd-php", compressible = true, binary = true, List("php")) + + lazy val `vnd.pwg-multiplexed`: MediaType = + new MediaType("application", "vnd.pwg-multiplexed", compressible = false, binary = true) + + lazy val `vnd.pawaafile`: MediaType = + new MediaType("application", "vnd.pawaafile", compressible = false, binary = true, List("paw")) + + lazy val `activemessage`: MediaType = + new MediaType("application", "activemessage", compressible = false, binary = true) + + lazy val `vnd.balsamiq.bmml+xml`: MediaType = + new MediaType("application", "vnd.balsamiq.bmml+xml", compressible = true, binary = true, List("bmml")) + + lazy val `emergencycalldata.deviceinfo+xml`: MediaType = + new MediaType("application", "emergencycalldata.deviceinfo+xml", compressible = true, binary = true) + + lazy val `vnd.android.ota`: MediaType = + new MediaType("application", "vnd.android.ota", compressible = false, binary = true) + + lazy val `vnd.motorola.flexsuite.kmr`: MediaType = + new MediaType("application", "vnd.motorola.flexsuite.kmr", compressible = false, binary = true) + + lazy val `csvm+json`: MediaType = + new MediaType("application", "csvm+json", compressible = true, binary = false) + + lazy val `vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml`: MediaType = + new MediaType( "application", - "vnd.3gpp.mcptt-affiliation-command+xml", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml", + compressible = true, + binary = true, ) - lazy val `vnd.3gpp.mcptt-floor-request+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-floor-request+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-location-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-location-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-mbms-usage-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-mbms-usage-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-service-config+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-service-config+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-signed+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-signed+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-ue-config+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-ue-config+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-ue-init-config+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-ue-init-config+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcptt-user-profile+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcptt-user-profile+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcvideo-affiliation-command+xml`: MediaType = new MediaType( + + lazy val `x-texinfo`: MediaType = + new MediaType("application", "x-texinfo", compressible = false, binary = true, List("texinfo", "texi")) + + lazy val `vnd.fujitsu.oasysgp`: MediaType = + new MediaType("application", "vnd.fujitsu.oasysgp", compressible = false, binary = true, List("fg5")) + + lazy val `vividence.scriptfile`: MediaType = + new MediaType("application", "vividence.scriptfile", compressible = false, binary = true) + + lazy val `vnd.crick.clicker`: MediaType = + new MediaType("application", "vnd.crick.clicker", compressible = false, binary = true, List("clkx")) + + lazy val `vnd.rainstor.data`: MediaType = + new MediaType("application", "vnd.rainstor.data", compressible = false, binary = true) + + lazy val `shf+xml`: MediaType = + new MediaType("application", "shf+xml", compressible = true, binary = true, List("shf")) + + lazy val `vnd.etsi.cug+xml`: MediaType = + new MediaType("application", "vnd.etsi.cug+xml", compressible = true, binary = true) + + lazy val `senml-etch+json`: MediaType = + new MediaType("application", "senml-etch+json", compressible = true, binary = false) + + lazy val `cccex`: MediaType = + new MediaType("application", "cccex", compressible = false, binary = true) + + lazy val `vnd.d2l.coursepackage1p0+zip`: MediaType = + new MediaType("application", "vnd.d2l.coursepackage1p0+zip", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml`: MediaType = + new MediaType( "application", - "vnd.3gpp.mcvideo-affiliation-command+xml", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml", + compressible = true, + binary = true, ) - lazy val `vnd.3gpp.mcvideo-affiliation-info+xml`: MediaType = new MediaType( + + lazy val `vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml`: MediaType = + new MediaType( "application", - "vnd.3gpp.mcvideo-affiliation-info+xml", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml", + compressible = true, + binary = true, ) - lazy val `vnd.3gpp.mcvideo-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcvideo-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcvideo-location-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcvideo-location-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcvideo-mbms-usage-info+xml`: MediaType = new MediaType( + + lazy val `prs.plucker`: MediaType = + new MediaType("application", "prs.plucker", compressible = false, binary = true) + + lazy val `vnd.dxr`: MediaType = + new MediaType("application", "vnd.dxr", compressible = false, binary = true) + + lazy val `vnd.ecowin.chart`: MediaType = + new MediaType("application", "vnd.ecowin.chart", compressible = false, binary = true, List("mag")) + + lazy val `vnd.etsi.aoc+xml`: MediaType = + new MediaType("application", "vnd.etsi.aoc+xml", compressible = true, binary = true) + + lazy val `atsc-rsat+xml`: MediaType = + new MediaType("application", "atsc-rsat+xml", compressible = true, binary = true, List("rsat")) + + lazy val `vnd.cinderella`: MediaType = + new MediaType("application", "vnd.cinderella", compressible = false, binary = true, List("cdy")) + + lazy val `vnd.renlearn.rlprint`: MediaType = + new MediaType("application", "vnd.renlearn.rlprint", compressible = false, binary = true) + + lazy val `dart`: MediaType = + new MediaType("application", "dart", compressible = true, binary = true) + + lazy val `json-patch+json`: MediaType = + new MediaType("application", "json-patch+json", compressible = true, binary = false) + + lazy val `scim+json`: MediaType = + new MediaType("application", "scim+json", compressible = true, binary = false) + + lazy val `pgp-keys`: MediaType = + new MediaType("application", "pgp-keys", compressible = false, binary = true, List("asc")) + + lazy val `vnd.3gpp.mcptt-signed+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-signed+xml", compressible = true, binary = true) + + lazy val `x-tex`: MediaType = + new MediaType("application", "x-tex", compressible = false, binary = true, List("tex")) + + lazy val `x-shar`: MediaType = + new MediaType("application", "x-shar", compressible = false, binary = true, List("shar")) + + lazy val `lgr+xml`: MediaType = + new MediaType("application", "lgr+xml", compressible = true, binary = true, List("lgr")) + + lazy val `x-dgc-compressed`: MediaType = + new MediaType("application", "x-dgc-compressed", compressible = false, binary = true, List("dgc")) + + lazy val `vnd.intertrust.nncp`: MediaType = + new MediaType("application", "vnd.intertrust.nncp", compressible = false, binary = true) + + lazy val `vnd.ms-xpsdocument`: MediaType = + new MediaType("application", "vnd.ms-xpsdocument", compressible = false, binary = true, List("xps")) + + lazy val `1d-interleaved-parityfec`: MediaType = + new MediaType("application", "1d-interleaved-parityfec", compressible = false, binary = true) + + lazy val `vnd.artisan+json`: MediaType = + new MediaType("application", "vnd.artisan+json", compressible = true, binary = false) + + lazy val `vnd.etsi.iptvservice+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvservice+xml", compressible = true, binary = true) + + lazy val `vnd.sun.xml.impress`: MediaType = + new MediaType("application", "vnd.sun.xml.impress", compressible = false, binary = true, List("sxi")) + + lazy val `vnd.fujixerox.art4`: MediaType = + new MediaType("application", "vnd.fujixerox.art4", compressible = false, binary = true) + + lazy val `atsc-held+xml`: MediaType = + new MediaType("application", "atsc-held+xml", compressible = true, binary = true, List("held")) + + lazy val `tamp-update-confirm`: MediaType = + new MediaType("application", "tamp-update-confirm", compressible = false, binary = true) + + lazy val `vnd.sigrok.session`: MediaType = + new MediaType("application", "vnd.sigrok.session", compressible = false, binary = true) + + lazy val `vnd.dvb.notif-container+xml`: MediaType = + new MediaType("application", "vnd.dvb.notif-container+xml", compressible = true, binary = true) + + lazy val `nss`: MediaType = + new MediaType("application", "nss", compressible = false, binary = true) + + lazy val `vnd.denovo.fcselayout-link`: MediaType = + new MediaType("application", "vnd.denovo.fcselayout-link", compressible = false, binary = true, List("fe_launch")) + + lazy val `vnd.etsi.asic-s+zip`: MediaType = + new MediaType("application", "vnd.etsi.asic-s+zip", compressible = false, binary = true) + + lazy val `senml+json`: MediaType = + new MediaType("application", "senml+json", compressible = true, binary = false) + + lazy val `vnd.nokia.pcd+wbxml`: MediaType = + new MediaType("application", "vnd.nokia.pcd+wbxml", compressible = false, binary = true) + + lazy val `city+json`: MediaType = + new MediaType("application", "city+json", compressible = true, binary = false) + + lazy val `vnd.openxmlformats-officedocument.theme+xml`: MediaType = + new MediaType("application", "vnd.openxmlformats-officedocument.theme+xml", compressible = true, binary = true) + + lazy val `dit`: MediaType = + new MediaType("application", "dit", compressible = false, binary = true) + + lazy val `p21`: MediaType = + new MediaType("application", "p21", compressible = false, binary = true) + + lazy val `cals-1840`: MediaType = + new MediaType("application", "cals-1840", compressible = false, binary = true) + + lazy val `yang-data+json`: MediaType = + new MediaType("application", "yang-data+json", compressible = true, binary = false) + + lazy val `vnd.nokia.n-gage.symbian.install`: MediaType = + new MediaType( "application", - "vnd.3gpp.mcvideo-mbms-usage-info+xml", - Compressible, - NotBinary, + "vnd.nokia.n-gage.symbian.install", + compressible = false, + binary = true, + List("n-gage"), ) - lazy val `vnd.3gpp.mcvideo-service-config+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcvideo-service-config+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcvideo-transmission-request+xml`: MediaType = new MediaType( + + lazy val `encaprtp`: MediaType = + new MediaType("application", "encaprtp", compressible = false, binary = true) + + lazy val `vnd.ms-windows.devicepairing`: MediaType = + new MediaType("application", "vnd.ms-windows.devicepairing", compressible = false, binary = true) + + lazy val `vnd.japannet-payment-wakeup`: MediaType = + new MediaType("application", "vnd.japannet-payment-wakeup", compressible = false, binary = true) + + lazy val `problem+xml`: MediaType = + new MediaType("application", "problem+xml", compressible = true, binary = true) + + lazy val `vnd.cluetrust.cartomobile-config-pkg`: MediaType = + new MediaType( "application", - "vnd.3gpp.mcvideo-transmission-request+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.3gpp.mcvideo-ue-config+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcvideo-ue-config+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mcvideo-user-profile+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mcvideo-user-profile+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.mid-call+xml`: MediaType = - new MediaType("application", "vnd.3gpp.mid-call+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.ngap`: MediaType = - new MediaType("application", "vnd.3gpp.ngap", Compressible, NotBinary) - lazy val `vnd.3gpp.pfcp`: MediaType = - new MediaType("application", "vnd.3gpp.pfcp", Compressible, NotBinary) - lazy val `vnd.3gpp.pic-bw-large`: MediaType = - new MediaType("application", "vnd.3gpp.pic-bw-large", Compressible, NotBinary, List("plb")) - lazy val `vnd.3gpp.pic-bw-small`: MediaType = - new MediaType("application", "vnd.3gpp.pic-bw-small", Compressible, NotBinary, List("psb")) - lazy val `vnd.3gpp.pic-bw-var`: MediaType = - new MediaType("application", "vnd.3gpp.pic-bw-var", Compressible, NotBinary, List("pvb")) - lazy val `vnd.3gpp.s1ap`: MediaType = - new MediaType("application", "vnd.3gpp.s1ap", Compressible, NotBinary) - lazy val `vnd.3gpp.sms`: MediaType = - new MediaType("application", "vnd.3gpp.sms", Compressible, NotBinary) - lazy val `vnd.3gpp.sms+xml`: MediaType = - new MediaType("application", "vnd.3gpp.sms+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.srvcc-ext+xml`: MediaType = - new MediaType("application", "vnd.3gpp.srvcc-ext+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.srvcc-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.srvcc-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.state-and-event-info+xml`: MediaType = - new MediaType("application", "vnd.3gpp.state-and-event-info+xml", Compressible, NotBinary) - lazy val `vnd.3gpp.ussd+xml`: MediaType = - new MediaType("application", "vnd.3gpp.ussd+xml", Compressible, NotBinary) - lazy val `vnd.3gpp2.bcmcsinfo+xml`: MediaType = - new MediaType("application", "vnd.3gpp2.bcmcsinfo+xml", Compressible, NotBinary) - lazy val `vnd.3gpp2.sms`: MediaType = - new MediaType("application", "vnd.3gpp2.sms", Compressible, NotBinary) - lazy val `vnd.3gpp2.tcap`: MediaType = - new MediaType("application", "vnd.3gpp2.tcap", Compressible, NotBinary, List("tcap")) - lazy val `vnd.3lightssoftware.imagescal`: MediaType = - new MediaType("application", "vnd.3lightssoftware.imagescal", Compressible, NotBinary) - lazy val `vnd.3m.post-it-notes`: MediaType = - new MediaType("application", "vnd.3m.post-it-notes", Compressible, NotBinary, List("pwn")) - lazy val `vnd.accpac.simply.aso`: MediaType = - new MediaType("application", "vnd.accpac.simply.aso", Compressible, NotBinary, List("aso")) - lazy val `vnd.accpac.simply.imp`: MediaType = - new MediaType("application", "vnd.accpac.simply.imp", Compressible, NotBinary, List("imp")) - lazy val `vnd.acucobol`: MediaType = - new MediaType("application", "vnd.acucobol", Compressible, NotBinary, List("acu")) - lazy val `vnd.acucorp`: MediaType = - new MediaType("application", "vnd.acucorp", Compressible, NotBinary, List("atc", "acutc")) - lazy val part_0: List[MediaType] = List( - `1d-interleaved-parityfec`, - `3gpdash-qoe-report+xml`, - `3gpp-ims+xml`, - `3gpphal+json`, - `3gpphalforms+json`, - `a2l`, - `activemessage`, - `activity+json`, - `alto-costmap+json`, - `alto-costmapfilter+json`, - `alto-directory+json`, - `alto-endpointcost+json`, - `alto-endpointcostparams+json`, - `alto-endpointprop+json`, - `alto-endpointpropparams+json`, - `alto-error+json`, - `alto-networkmap+json`, - `alto-networkmapfilter+json`, - `alto-updatestreamcontrol+json`, - `alto-updatestreamparams+json`, - `aml`, - `andrew-inset`, - `applefile`, - `applixware`, - `atf`, - `atfx`, - `atom+xml`, - `atomcat+xml`, - `atomdeleted+xml`, - `atomicmail`, - `atomsvc+xml`, - `atsc-dwd+xml`, - `atsc-dynamic-event-message`, - `atsc-held+xml`, - `atsc-rdt+json`, - `atsc-rsat+xml`, - `atxml`, - `auth-policy+xml`, - `bacnet-xdd+zip`, - `batch-smtp`, - `bdoc`, - `beep+xml`, - `calendar+json`, - `calendar+xml`, - `call-completion`, - `cals-1840`, - `captive+json`, - `cbor`, - `cbor-seq`, - `cccex`, - `ccmp+xml`, - `ccxml+xml`, - `cdfx+xml`, - `cdmi-capability`, - `cdmi-container`, - `cdmi-domain`, - `cdmi-object`, - `cdmi-queue`, - `cdni`, - `cea`, - `cea-2018+xml`, - `cellml+xml`, - `cfw`, - `clr`, - `clue+xml`, - `clue_info+xml`, - `cms`, - `cnrp+xml`, - `coap-group+json`, - `coap-payload`, - `commonground`, - `conference-info+xml`, - `cose`, - `cose-key`, - `cose-key-set`, - `cpl+xml`, - `csrattrs`, - `csta+xml`, - `cstadata+xml`, - `csvm+json`, - `cu-seeme`, - `cwt`, - `cybercash`, - `dart`, - `dash+xml`, - `dashdelta`, - `davmount+xml`, - `dca-rft`, - `dcd`, - `dec-dx`, - `dialog-info+xml`, - `dicom`, - `dicom+json`, - `dicom+xml`, - `dii`, - `dit`, - `dns`, - `dns+json`, - `dns-message`, - `docbook+xml`, - `dots+cbor`, - `dskpp+xml`, - `dssc+der`, - `dssc+xml`, - `dvcs`, - `ecmascript`, - `edi-consent`, - `edi-x12`, - `edifact`, - `efi`, - `elm+json`, - `elm+xml`, - `emergencycalldata.cap+xml`, - `emergencycalldata.comment+xml`, - `emergencycalldata.control+xml`, - `emergencycalldata.deviceinfo+xml`, - `emergencycalldata.ecall.msd`, - `emergencycalldata.providerinfo+xml`, - `emergencycalldata.serviceinfo+xml`, - `emergencycalldata.subscriberinfo+xml`, - `emergencycalldata.veds+xml`, - `emma+xml`, - `emotionml+xml`, - `encaprtp`, - `epp+xml`, - `epub+zip`, - `eshop`, - `exi`, - `expect-ct-report+json`, - `fastinfoset`, - `fastsoap`, - `fdt+xml`, - `fhir+json`, - `fhir+xml`, - `fido.trusted-apps+json`, - `fits`, - `flexfec`, - `font-sfnt`, - `font-tdpfr`, - `font-woff`, - `framework-attributes+xml`, - `geo+json`, - `geo+json-seq`, - `geopackage+sqlite3`, - `geoxacml+xml`, - `gltf-buffer`, - `gml+xml`, - `gpx+xml`, - `gxf`, - `gzip`, - `h224`, - `held+xml`, - `hjson`, - `http`, - `hyperstudio`, - `ibe-key-request+xml`, - `ibe-pkg-reply+xml`, - `ibe-pp-data`, - `iges`, - `im-iscomposing+xml`, - `index`, - `index.cmd`, - `index.obj`, - `index.response`, - `index.vnd`, - `inkml+xml`, - `iotp`, - `ipfix`, - `ipp`, - `isup`, - `its+xml`, - `java-archive`, - `java-serialized-object`, - `java-vm`, - `javascript`, - `jf2feed+json`, - `jose`, - `jose+json`, - `jrd+json`, - `jscalendar+json`, - `json`, - `json-patch+json`, - `json-seq`, - `json5`, - `jsonml+json`, - `jwk+json`, - `jwk-set+json`, - `jwt`, - `kpml-request+xml`, - `kpml-response+xml`, - `ld+json`, - `lgr+xml`, - `link-format`, - `load-control+xml`, - `lost+xml`, - `lostsync+xml`, - `lpf+zip`, - `lxf`, - `mac-binhex40`, - `mac-compactpro`, - `macwriteii`, - `mads+xml`, - `manifest+json`, - `marc`, - `marcxml+xml`, - `mathematica`, - `mathml+xml`, - `mathml-content+xml`, - `mathml-presentation+xml`, - `mbms-associated-procedure-description+xml`, - `mbms-deregister+xml`, - `mbms-envelope+xml`, - `mbms-msk+xml`, - `mbms-msk-response+xml`, - `mbms-protection-description+xml`, - `mbms-reception-report+xml`, - `mbms-register+xml`, - `mbms-register-response+xml`, - `mbms-schedule+xml`, - `mbms-user-service-description+xml`, - `mbox`, - `media-policy-dataset+xml`, - `media_control+xml`, - `mediaservercontrol+xml`, - `merge-patch+json`, - `metalink+xml`, - `metalink4+xml`, - `mets+xml`, - `mf4`, - `mikey`, - `mipc`, - `missing-blocks+cbor-seq`, - `mmt-aei+xml`, - `mmt-usd+xml`, - `mods+xml`, - `moss-keys`, - `moss-signature`, - `mosskey-data`, - `mosskey-request`, - `mp21`, - `mp4`, - `mpeg4-generic`, - `mpeg4-iod`, - `mpeg4-iod-xmt`, - `mrb-consumer+xml`, - `mrb-publish+xml`, - `msc-ivr+xml`, - `msc-mixer+xml`, - `msword`, - `mud+json`, - `multipart-core`, - `mxf`, - `n-quads`, - `n-triples`, - `nasdata`, - `news-checkgroups`, - `news-groupinfo`, - `news-transmission`, - `nlsml+xml`, - `node`, - `nss`, - `oauth-authz-req+jwt`, - `ocsp-request`, - `ocsp-response`, - `octet-stream`, - `oda`, - `odm+xml`, - `odx`, - `oebps-package+xml`, - `ogg`, - `omdoc+xml`, - `onenote`, - `opc-nodeset+xml`, - `oscore`, - `oxps`, - `p2p-overlay+xml`, - `parityfec`, - `passport`, - `patch-ops-error+xml`, - `pdf`, - `pdx`, - `pem-certificate-chain`, - `pgp-encrypted`, - `pgp-keys`, - `pgp-signature`, - `pics-rules`, - `pidf+xml`, - `pidf-diff+xml`, - `pkcs10`, - `pkcs12`, - `pkcs7-mime`, - `pkcs7-signature`, - `pkcs8`, - `pkcs8-encrypted`, - `pkix-attr-cert`, - `pkix-cert`, - `pkix-crl`, - `pkix-pkipath`, - `pkixcmp`, - `pls+xml`, - `poc-settings+xml`, - `postscript`, - `ppsp-tracker+json`, - `problem+json`, - `problem+xml`, - `provenance+xml`, - `prs.alvestrand.titrax-sheet`, - `prs.cww`, - `prs.cyn`, - `prs.hpub+zip`, - `prs.nprend`, - `prs.plucker`, - `prs.rdf-xml-crypt`, - `prs.xsf+xml`, - `pskc+xml`, - `pvd+json`, - `qsig`, - `raml+yaml`, - `raptorfec`, - `rdap+json`, - `rdf+xml`, - `reginfo+xml`, - `relax-ng-compact-syntax`, - `remote-printing`, - `reputon+json`, - `resource-lists+xml`, - `resource-lists-diff+xml`, - `rfc+xml`, - `riscos`, - `rlmi+xml`, - `rls-services+xml`, - `route-apd+xml`, - `route-s-tsid+xml`, - `route-usd+xml`, - `rpki-ghostbusters`, - `rpki-manifest`, - `rpki-publication`, - `rpki-roa`, - `rpki-updown`, - `rsd+xml`, - `rss+xml`, - `rtf`, - `rtploopback`, - `rtx`, - `samlassertion+xml`, - `samlmetadata+xml`, - `sarif+json`, - `sarif-external-properties+json`, - `sbe`, - `sbml+xml`, - `scaip+xml`, - `scim+json`, - `scvp-cv-request`, - `scvp-cv-response`, - `scvp-vp-request`, - `scvp-vp-response`, - `sdp`, - `secevent+jwt`, - `senml+cbor`, - `senml+json`, - `senml+xml`, - `senml-etch+cbor`, - `senml-etch+json`, - `senml-exi`, - `sensml+cbor`, - `sensml+json`, - `sensml+xml`, - `sensml-exi`, - `sep+xml`, - `sep-exi`, - `session-info`, - `set-payment`, - `set-payment-initiation`, - `set-registration`, - `set-registration-initiation`, - `sgml`, - `sgml-open-catalog`, - `shf+xml`, - `sieve`, - `simple-filter+xml`, - `simple-message-summary`, - `simplesymbolcontainer`, - `sipc`, - `slate`, - `smil`, - `smil+xml`, - `smpte336m`, - `soap+fastinfoset`, - `soap+xml`, - `sparql-query`, - `sparql-results+xml`, - `spirits-event+xml`, - `sql`, - `srgs`, - `srgs+xml`, - `sru+xml`, - `ssdl+xml`, - `ssml+xml`, - `stix+json`, - `swid+xml`, - `tamp-apex-update`, - `tamp-apex-update-confirm`, - `tamp-community-update`, - `tamp-community-update-confirm`, - `tamp-error`, - `tamp-sequence-adjust`, - `tamp-sequence-adjust-confirm`, - `tamp-status-query`, - `tamp-status-response`, - `tamp-update`, - `tamp-update-confirm`, - `tar`, - `taxii+json`, - `td+json`, - `tei+xml`, - `tetra_isi`, - `thraud+xml`, - `timestamp-query`, - `timestamp-reply`, - `timestamped-data`, - `tlsrpt+gzip`, - `tlsrpt+json`, - `tnauthlist`, - `toml`, - `trickle-ice-sdpfrag`, - `trig`, - `ttml+xml`, - `tve-trigger`, - `tzif`, - `tzif-leap`, - `ubjson`, - `ulpfec`, - `urc-grpsheet+xml`, - `urc-ressheet+xml`, - `urc-targetdesc+xml`, - `urc-uisocketdesc+xml`, - `vcard+json`, - `vcard+xml`, - `vemmi`, - `vividence.scriptfile`, - `vnd.1000minds.decision-model+xml`, - `vnd.3gpp-prose+xml`, - `vnd.3gpp-prose-pc3ch+xml`, - `vnd.3gpp-v2x-local-service-information`, - `vnd.3gpp.5gnas`, - `vnd.3gpp.access-transfer-events+xml`, - `vnd.3gpp.bsf+xml`, - `vnd.3gpp.gmop+xml`, - `vnd.3gpp.gtpc`, - `vnd.3gpp.interworking-data`, - `vnd.3gpp.lpp`, - `vnd.3gpp.mc-signalling-ear`, - `vnd.3gpp.mcdata-affiliation-command+xml`, - `vnd.3gpp.mcdata-info+xml`, - `vnd.3gpp.mcdata-payload`, - `vnd.3gpp.mcdata-service-config+xml`, - `vnd.3gpp.mcdata-signalling`, - `vnd.3gpp.mcdata-ue-config+xml`, - `vnd.3gpp.mcdata-user-profile+xml`, - `vnd.3gpp.mcptt-affiliation-command+xml`, - `vnd.3gpp.mcptt-floor-request+xml`, - `vnd.3gpp.mcptt-info+xml`, - `vnd.3gpp.mcptt-location-info+xml`, - `vnd.3gpp.mcptt-mbms-usage-info+xml`, - `vnd.3gpp.mcptt-service-config+xml`, - `vnd.3gpp.mcptt-signed+xml`, - `vnd.3gpp.mcptt-ue-config+xml`, - `vnd.3gpp.mcptt-ue-init-config+xml`, - `vnd.3gpp.mcptt-user-profile+xml`, - `vnd.3gpp.mcvideo-affiliation-command+xml`, - `vnd.3gpp.mcvideo-affiliation-info+xml`, - `vnd.3gpp.mcvideo-info+xml`, - `vnd.3gpp.mcvideo-location-info+xml`, - `vnd.3gpp.mcvideo-mbms-usage-info+xml`, - `vnd.3gpp.mcvideo-service-config+xml`, - `vnd.3gpp.mcvideo-transmission-request+xml`, - `vnd.3gpp.mcvideo-ue-config+xml`, - `vnd.3gpp.mcvideo-user-profile+xml`, - `vnd.3gpp.mid-call+xml`, - `vnd.3gpp.ngap`, - `vnd.3gpp.pfcp`, - `vnd.3gpp.pic-bw-large`, - `vnd.3gpp.pic-bw-small`, - `vnd.3gpp.pic-bw-var`, - `vnd.3gpp.s1ap`, - `vnd.3gpp.sms`, - `vnd.3gpp.sms+xml`, - `vnd.3gpp.srvcc-ext+xml`, - `vnd.3gpp.srvcc-info+xml`, - `vnd.3gpp.state-and-event-info+xml`, - `vnd.3gpp.ussd+xml`, - `vnd.3gpp2.bcmcsinfo+xml`, - `vnd.3gpp2.sms`, - `vnd.3gpp2.tcap`, - `vnd.3lightssoftware.imagescal`, - `vnd.3m.post-it-notes`, - `vnd.accpac.simply.aso`, - `vnd.accpac.simply.imp`, - `vnd.acucobol`, - `vnd.acucorp`, + "vnd.cluetrust.cartomobile-config-pkg", + compressible = false, + binary = true, + List("c11amz"), ) - } - trait application_1 { - lazy val `vnd.adobe.air-application-installer-package+zip`: MediaType = new MediaType( + + lazy val `sensml+xml`: MediaType = + new MediaType("application", "sensml+xml", compressible = true, binary = true, List("sensmlx")) + + lazy val `parityfec`: MediaType = + new MediaType("application", "parityfec", compressible = false, binary = true) + + lazy val `vnd.desmume.movie`: MediaType = + new MediaType("application", "vnd.desmume.movie", compressible = false, binary = true) + + lazy val `vnd.osgi.subsystem`: MediaType = + new MediaType("application", "vnd.osgi.subsystem", compressible = false, binary = true, List("esa")) + + lazy val `vnd.ubisoft.webplayer`: MediaType = + new MediaType("application", "vnd.ubisoft.webplayer", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcdata-user-profile+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-user-profile+xml", compressible = true, binary = true) + + lazy val `jrd+json`: MediaType = + new MediaType("application", "jrd+json", compressible = true, binary = false) + + lazy val `vnd.onepagertamp`: MediaType = + new MediaType("application", "vnd.onepagertamp", compressible = false, binary = true) + + lazy val `vnd.fujitsu.oasysprs`: MediaType = + new MediaType("application", "vnd.fujitsu.oasysprs", compressible = false, binary = true, List("bh2")) + + lazy val `vnd.antix.game-component`: MediaType = + new MediaType("application", "vnd.antix.game-component", compressible = false, binary = true, List("atx")) + + lazy val `gzip`: MediaType = + new MediaType("application", "gzip", compressible = false, binary = true, List("gz")) + + lazy val `vnd.3gpp.gtpc`: MediaType = + new MediaType("application", "vnd.3gpp.gtpc", compressible = false, binary = true) + + lazy val `vnd.capasystems-pg+json`: MediaType = + new MediaType("application", "vnd.capasystems-pg+json", compressible = true, binary = false) + + lazy val `vnd.apexlang`: MediaType = + new MediaType("application", "vnd.apexlang", compressible = false, binary = true) + + lazy val `x-xpinstall`: MediaType = + new MediaType("application", "x-xpinstall", compressible = false, binary = true, List("xpi")) + + lazy val `vnd.uplanet.listcmd-wbxml`: MediaType = + new MediaType("application", "vnd.uplanet.listcmd-wbxml", compressible = false, binary = true) + + lazy val `vnd.muvee.style`: MediaType = + new MediaType("application", "vnd.muvee.style", compressible = false, binary = true, List("msty")) + + lazy val `vnd.immervision-ivp`: MediaType = + new MediaType("application", "vnd.immervision-ivp", compressible = false, binary = true, List("ivp")) + + lazy val `x-font-ghostscript`: MediaType = + new MediaType("application", "x-font-ghostscript", compressible = false, binary = true, List("gsf")) + + lazy val `x-debian-package`: MediaType = + new MediaType("application", "x-debian-package", compressible = false, binary = true, List("deb", "udeb")) + + lazy val `vnd.sun.xml.draw.template`: MediaType = + new MediaType("application", "vnd.sun.xml.draw.template", compressible = false, binary = true, List("std")) + + lazy val `vnd.3gpp.mcdata-payload`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-payload", compressible = false, binary = true) + + lazy val `moss-signature`: MediaType = + new MediaType("application", "moss-signature", compressible = false, binary = true) + + lazy val `vnd.sailingtracker.track`: MediaType = + new MediaType("application", "vnd.sailingtracker.track", compressible = false, binary = true, List("st")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.notesmaster+xml`: MediaType = + new MediaType( "application", - "vnd.adobe.air-application-installer-package+zip", - Uncompressible, - NotBinary, - List("air"), + "vnd.openxmlformats-officedocument.presentationml.notesmaster+xml", + compressible = true, + binary = true, ) - lazy val `vnd.adobe.flash.movie`: MediaType = - new MediaType("application", "vnd.adobe.flash.movie", Compressible, NotBinary) - lazy val `vnd.adobe.formscentral.fcdt`: MediaType = new MediaType( + + lazy val `raml+yaml`: MediaType = + new MediaType("application", "raml+yaml", compressible = true, binary = true, List("raml")) + + lazy val `vnd.fujixerox.hbpl`: MediaType = + new MediaType("application", "vnd.fujixerox.hbpl", compressible = false, binary = true) + + lazy val `vnd.gnu.taler.exchange+json`: MediaType = + new MediaType("application", "vnd.gnu.taler.exchange+json", compressible = true, binary = false) + + lazy val `vnd.oipf.dae.xhtml+xml`: MediaType = + new MediaType("application", "vnd.oipf.dae.xhtml+xml", compressible = true, binary = true) + + lazy val `x-envoy`: MediaType = + new MediaType("application", "x-envoy", compressible = false, binary = true, List("evy")) + + lazy val `vnd.fastcopy-disk-image`: MediaType = + new MediaType("application", "vnd.fastcopy-disk-image", compressible = false, binary = true) + + lazy val `vnd.webturbo`: MediaType = + new MediaType("application", "vnd.webturbo", compressible = false, binary = true, List("wtb")) + + lazy val `linkset+json`: MediaType = + new MediaType("application", "linkset+json", compressible = true, binary = false) + + lazy val `vnd.omads-file+xml`: MediaType = + new MediaType("application", "vnd.omads-file+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.slideshow`: MediaType = + new MediaType( "application", - "vnd.adobe.formscentral.fcdt", - Compressible, - NotBinary, - List("fcdt"), + "vnd.openxmlformats-officedocument.presentationml.slideshow", + compressible = false, + binary = true, + List("ppsx"), ) - lazy val `vnd.adobe.fxp`: MediaType = - new MediaType("application", "vnd.adobe.fxp", Compressible, NotBinary, List("fxp", "fxpl")) - lazy val `vnd.adobe.partial-upload`: MediaType = - new MediaType("application", "vnd.adobe.partial-upload", Compressible, NotBinary) - lazy val `vnd.adobe.xdp+xml`: MediaType = - new MediaType("application", "vnd.adobe.xdp+xml", Compressible, NotBinary, List("xdp")) - lazy val `vnd.adobe.xfdf`: MediaType = - new MediaType("application", "vnd.adobe.xfdf", Compressible, NotBinary, List("xfdf")) - lazy val `vnd.aether.imp`: MediaType = - new MediaType("application", "vnd.aether.imp", Compressible, NotBinary) - lazy val `vnd.afpc.afplinedata`: MediaType = - new MediaType("application", "vnd.afpc.afplinedata", Compressible, NotBinary) - lazy val `vnd.afpc.afplinedata-pagedef`: MediaType = - new MediaType("application", "vnd.afpc.afplinedata-pagedef", Compressible, NotBinary) - lazy val `vnd.afpc.cmoca-cmresource`: MediaType = - new MediaType("application", "vnd.afpc.cmoca-cmresource", Compressible, NotBinary) - lazy val `vnd.afpc.foca-charset`: MediaType = - new MediaType("application", "vnd.afpc.foca-charset", Compressible, NotBinary) - lazy val `vnd.afpc.foca-codedfont`: MediaType = - new MediaType("application", "vnd.afpc.foca-codedfont", Compressible, NotBinary) - lazy val `vnd.afpc.foca-codepage`: MediaType = - new MediaType("application", "vnd.afpc.foca-codepage", Compressible, NotBinary) - lazy val `vnd.afpc.modca`: MediaType = - new MediaType("application", "vnd.afpc.modca", Compressible, NotBinary) - lazy val `vnd.afpc.modca-cmtable`: MediaType = - new MediaType("application", "vnd.afpc.modca-cmtable", Compressible, NotBinary) - lazy val `vnd.afpc.modca-formdef`: MediaType = - new MediaType("application", "vnd.afpc.modca-formdef", Compressible, NotBinary) - lazy val `vnd.afpc.modca-mediummap`: MediaType = - new MediaType("application", "vnd.afpc.modca-mediummap", Compressible, NotBinary) - lazy val `vnd.afpc.modca-objectcontainer`: MediaType = - new MediaType("application", "vnd.afpc.modca-objectcontainer", Compressible, NotBinary) - lazy val `vnd.afpc.modca-overlay`: MediaType = - new MediaType("application", "vnd.afpc.modca-overlay", Compressible, NotBinary) - lazy val `vnd.afpc.modca-pagesegment`: MediaType = - new MediaType("application", "vnd.afpc.modca-pagesegment", Compressible, NotBinary) - lazy val `vnd.ah-barcode`: MediaType = - new MediaType("application", "vnd.ah-barcode", Compressible, NotBinary) - lazy val `vnd.ahead.space`: MediaType = - new MediaType("application", "vnd.ahead.space", Compressible, NotBinary, List("ahead")) - lazy val `vnd.airzip.filesecure.azf`: MediaType = new MediaType( + + lazy val `jwk+json`: MediaType = + new MediaType("application", "jwk+json", compressible = true, binary = false) + + lazy val `vnd.multiad.creator.cif`: MediaType = + new MediaType("application", "vnd.multiad.creator.cif", compressible = false, binary = true) + + lazy val `vq-rtcpxr`: MediaType = + new MediaType("application", "vq-rtcpxr", compressible = false, binary = true) + + lazy val `3gpdash-qoe-report+xml`: MediaType = + new MediaType("application", "3gpdash-qoe-report+xml", compressible = true, binary = true) + + lazy val `soap+fastinfoset`: MediaType = + new MediaType("application", "soap+fastinfoset", compressible = false, binary = true) + + lazy val `vnd.tao.intent-module-archive`: MediaType = + new MediaType("application", "vnd.tao.intent-module-archive", compressible = false, binary = true, List("tao")) + + lazy val `x-msaccess`: MediaType = + new MediaType("application", "x-msaccess", compressible = false, binary = true, List("mdb")) + + lazy val `vnd.xmpie.xlim`: MediaType = + new MediaType("application", "vnd.xmpie.xlim", compressible = false, binary = true) + + lazy val `vnd.quobject-quoxdocument`: MediaType = + new MediaType("application", "vnd.quobject-quoxdocument", compressible = false, binary = true) + + lazy val `tnauthlist`: MediaType = + new MediaType("application", "tnauthlist", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.footer+xml`: MediaType = + new MediaType( "application", - "vnd.airzip.filesecure.azf", - Compressible, - NotBinary, - List("azf"), + "vnd.openxmlformats-officedocument.wordprocessingml.footer+xml", + compressible = true, + binary = true, ) - lazy val `vnd.airzip.filesecure.azs`: MediaType = new MediaType( + + lazy val `vnd.firemonkeys.cloudcell`: MediaType = + new MediaType("application", "vnd.firemonkeys.cloudcell", compressible = false, binary = true) + + lazy val `vnd.nokia.isds-radio-presets`: MediaType = + new MediaType("application", "vnd.nokia.isds-radio-presets", compressible = false, binary = true) + + lazy val `vnd.gmx`: MediaType = + new MediaType("application", "vnd.gmx", compressible = false, binary = true, List("gmx")) + + lazy val `vnd.d3m-problem`: MediaType = + new MediaType("application", "vnd.d3m-problem", compressible = false, binary = true) + + lazy val `vnd.vsf`: MediaType = + new MediaType("application", "vnd.vsf", compressible = false, binary = true, List("vsf")) + + lazy val `sql`: MediaType = + new MediaType("application", "sql", compressible = false, binary = true, List("sql")) + + lazy val `vnd.mason+json`: MediaType = + new MediaType("application", "vnd.mason+json", compressible = true, binary = false) + + lazy val `x-tgif`: MediaType = + new MediaType("application", "x-tgif", compressible = false, binary = true, List("obj")) + + lazy val `x-www-form-urlencoded`: MediaType = + new MediaType("application", "x-www-form-urlencoded", compressible = true, binary = true) + + lazy val `epub+zip`: MediaType = + new MediaType("application", "epub+zip", compressible = false, binary = true, List("epub")) + + lazy val `vnd.onvif.metadata`: MediaType = + new MediaType("application", "vnd.onvif.metadata", compressible = false, binary = true) + + lazy val `odx`: MediaType = + new MediaType("application", "odx", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.slide`: MediaType = + new MediaType( "application", - "vnd.airzip.filesecure.azs", - Compressible, - NotBinary, - List("azs"), + "vnd.openxmlformats-officedocument.presentationml.slide", + compressible = false, + binary = true, + List("sldx"), ) - lazy val `vnd.amadeus+json`: MediaType = - new MediaType("application", "vnd.amadeus+json", Compressible, NotBinary) - lazy val `vnd.amazon.ebook`: MediaType = - new MediaType("application", "vnd.amazon.ebook", Compressible, NotBinary, List("azw")) - lazy val `vnd.amazon.mobi8-ebook`: MediaType = - new MediaType("application", "vnd.amazon.mobi8-ebook", Compressible, NotBinary) - lazy val `vnd.americandynamics.acc`: MediaType = new MediaType( + + lazy val `vnd.dvb.ipdcesgaccess2`: MediaType = + new MediaType("application", "vnd.dvb.ipdcesgaccess2", compressible = false, binary = true) + + lazy val `x-font-framemaker`: MediaType = + new MediaType("application", "x-font-framemaker", compressible = false, binary = true) + + lazy val `vnd.ms-word.template.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.americandynamics.acc", - Compressible, - NotBinary, - List("acc"), + "vnd.ms-word.template.macroenabled.12", + compressible = false, + binary = true, + List("dotm"), ) - lazy val `vnd.amiga.ami`: MediaType = - new MediaType("application", "vnd.amiga.ami", Compressible, NotBinary, List("ami")) - lazy val `vnd.amundsen.maze+xml`: MediaType = - new MediaType("application", "vnd.amundsen.maze+xml", Compressible, NotBinary) - lazy val `vnd.android.ota`: MediaType = - new MediaType("application", "vnd.android.ota", Compressible, NotBinary) - lazy val `vnd.android.package-archive`: MediaType = new MediaType( + + lazy val `vnd.openxmlformats-officedocument.presentationml.slide+xml`: MediaType = + new MediaType( "application", - "vnd.android.package-archive", - Uncompressible, - NotBinary, - List("apk"), + "vnd.openxmlformats-officedocument.presentationml.slide+xml", + compressible = true, + binary = true, ) - lazy val `vnd.anki`: MediaType = - new MediaType("application", "vnd.anki", Compressible, NotBinary) - lazy val `vnd.anser-web-certificate-issue-initiation`: MediaType = new MediaType( + + lazy val `zip`: MediaType = + new MediaType("application", "zip", compressible = false, binary = true, List("zip")) + + lazy val `vnd.dvb.ait`: MediaType = + new MediaType("application", "vnd.dvb.ait", compressible = false, binary = true, List("ait")) + + lazy val `vnd.afpc.modca-objectcontainer`: MediaType = + new MediaType("application", "vnd.afpc.modca-objectcontainer", compressible = false, binary = true) + + lazy val `vnd.sun.xml.writer.global`: MediaType = + new MediaType("application", "vnd.sun.xml.writer.global", compressible = false, binary = true, List("sxg")) + + lazy val `vnd.tmd.mediaflex.api+xml`: MediaType = + new MediaType("application", "vnd.tmd.mediaflex.api+xml", compressible = true, binary = true) + + lazy val `watcherinfo+xml`: MediaType = + new MediaType("application", "watcherinfo+xml", compressible = true, binary = true, List("wif")) + + lazy val `dash-patch+xml`: MediaType = + new MediaType("application", "dash-patch+xml", compressible = true, binary = true, List("mpp")) + + lazy val `x-gnumeric`: MediaType = + new MediaType("application", "x-gnumeric", compressible = false, binary = true, List("gnumeric")) + + lazy val `mods+xml`: MediaType = + new MediaType("application", "mods+xml", compressible = true, binary = true, List("mods")) + + lazy val `spdx+json`: MediaType = + new MediaType("application", "spdx+json", compressible = true, binary = false) + + lazy val `vnd.amadeus+json`: MediaType = + new MediaType("application", "vnd.amadeus+json", compressible = true, binary = false) + + lazy val `andrew-inset`: MediaType = + new MediaType("application", "andrew-inset", compressible = false, binary = true, List("ez")) + + lazy val `vnd.cncf.helm.chart.content.v1.tar+gzip`: MediaType = + new MediaType("application", "vnd.cncf.helm.chart.content.v1.tar+gzip", compressible = false, binary = true) + + lazy val `vnd.shade-save-file`: MediaType = + new MediaType("application", "vnd.shade-save-file", compressible = false, binary = true) + + lazy val `vnd.motorola.flexsuite.wem`: MediaType = + new MediaType("application", "vnd.motorola.flexsuite.wem", compressible = false, binary = true) + + lazy val `x-tcl`: MediaType = + new MediaType("application", "x-tcl", compressible = false, binary = true, List("tcl", "tk")) + + lazy val `vnd.fdf`: MediaType = + new MediaType("application", "vnd.fdf", compressible = false, binary = true, List("fdf")) + + lazy val `tamp-community-update-confirm`: MediaType = + new MediaType("application", "tamp-community-update-confirm", compressible = false, binary = true) + + lazy val `vnd.ms-fontobject`: MediaType = + new MediaType("application", "vnd.ms-fontobject", compressible = true, binary = true, List("eot")) + + lazy val `ccxml+xml`: MediaType = + new MediaType("application", "ccxml+xml", compressible = true, binary = true, List("ccxml")) + + lazy val `vnd.shx`: MediaType = + new MediaType("application", "vnd.shx", compressible = false, binary = true) + + lazy val `vnd.afpc.foca-charset`: MediaType = + new MediaType("application", "vnd.afpc.foca-charset", compressible = false, binary = true) + + lazy val `mp4`: MediaType = + new MediaType("application", "mp4", compressible = false, binary = true, List("mp4", "mpg4", "mp4s", "m4p")) + + lazy val `mxf`: MediaType = + new MediaType("application", "mxf", compressible = false, binary = true, List("mxf")) + + lazy val `vnd.oma.bcast.ltkm`: MediaType = + new MediaType("application", "vnd.oma.bcast.ltkm", compressible = false, binary = true) + + lazy val `vnd.ms-office.activex+xml`: MediaType = + new MediaType("application", "vnd.ms-office.activex+xml", compressible = true, binary = true) + + lazy val `vnd.multiad.creator`: MediaType = + new MediaType("application", "vnd.multiad.creator", compressible = false, binary = true) + + lazy val `edi-x12`: MediaType = + new MediaType("application", "edi-x12", compressible = false, binary = true) + + lazy val `vnd.ms-lrm`: MediaType = + new MediaType("application", "vnd.ms-lrm", compressible = false, binary = true, List("lrm")) + + lazy val `vnd.trid.tpt`: MediaType = + new MediaType("application", "vnd.trid.tpt", compressible = false, binary = true, List("tpt")) + + lazy val `vnd.ms-pki.stl`: MediaType = + new MediaType("application", "vnd.ms-pki.stl", compressible = false, binary = true, List("stl")) + + lazy val `rtploopback`: MediaType = + new MediaType("application", "rtploopback", compressible = false, binary = true) + + lazy val `set-registration-initiation`: MediaType = + new MediaType("application", "set-registration-initiation", compressible = false, binary = true, List("setreg")) + + lazy val `call-completion`: MediaType = + new MediaType("application", "call-completion", compressible = false, binary = true) + + lazy val `vnd.lotus-1-2-3`: MediaType = + new MediaType("application", "vnd.lotus-1-2-3", compressible = false, binary = true, List("123")) + + lazy val `x-mpegurl`: MediaType = + new MediaType("application", "x-mpegurl", compressible = false, binary = true) + + lazy val `mbms-reception-report+xml`: MediaType = + new MediaType("application", "mbms-reception-report+xml", compressible = true, binary = true) + + lazy val `vnd.olpc-sugar`: MediaType = + new MediaType("application", "vnd.olpc-sugar", compressible = false, binary = true, List("xo")) + + lazy val `sipc`: MediaType = + new MediaType("application", "sipc", compressible = false, binary = true) + + lazy val `vnd.eu.kasparian.car+json`: MediaType = + new MediaType("application", "vnd.eu.kasparian.car+json", compressible = true, binary = false) + + lazy val `x-glulx`: MediaType = + new MediaType("application", "x-glulx", compressible = false, binary = true, List("ulx")) + + lazy val `geo+json-seq`: MediaType = + new MediaType("application", "geo+json-seq", compressible = false, binary = true) + + lazy val `vnd.ahead.space`: MediaType = + new MediaType("application", "vnd.ahead.space", compressible = false, binary = true, List("ahead")) + + lazy val `vnd.xmpie.cpkg`: MediaType = + new MediaType("application", "vnd.xmpie.cpkg", compressible = false, binary = true) + + lazy val `cdmi-capability`: MediaType = + new MediaType("application", "cdmi-capability", compressible = false, binary = true, List("cdmia")) + + lazy val `trickle-ice-sdpfrag`: MediaType = + new MediaType("application", "trickle-ice-sdpfrag", compressible = false, binary = true) + + lazy val `vnd.mobius.dis`: MediaType = + new MediaType("application", "vnd.mobius.dis", compressible = false, binary = true, List("dis")) + + lazy val `vnd.cncf.helm.chart.provenance.v1.prov`: MediaType = + new MediaType("application", "vnd.cncf.helm.chart.provenance.v1.prov", compressible = false, binary = true) + + lazy val `vnd.avalon+json`: MediaType = + new MediaType("application", "vnd.avalon+json", compressible = true, binary = false) + + lazy val `vnd.lotus-screencam`: MediaType = + new MediaType("application", "vnd.lotus-screencam", compressible = false, binary = true, List("scm")) + + lazy val `x-perl`: MediaType = + new MediaType("application", "x-perl", compressible = false, binary = true, List("pl", "pm")) + + lazy val `vnd.datapackage+json`: MediaType = + new MediaType("application", "vnd.datapackage+json", compressible = true, binary = false) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.template`: MediaType = + new MediaType( "application", - "vnd.anser-web-certificate-issue-initiation", - Compressible, - NotBinary, - List("cii"), + "vnd.openxmlformats-officedocument.wordprocessingml.template", + compressible = false, + binary = true, + List("dotx"), ) - lazy val `vnd.anser-web-funds-transfer-initiation`: MediaType = new MediaType( + + lazy val `vnd.ms-opentype`: MediaType = + new MediaType("application", "vnd.ms-opentype", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.template`: MediaType = + new MediaType( "application", - "vnd.anser-web-funds-transfer-initiation", - Compressible, - NotBinary, - List("fti"), + "vnd.openxmlformats-officedocument.presentationml.template", + compressible = false, + binary = true, + List("potx"), ) - lazy val `vnd.antix.game-component`: MediaType = new MediaType( + + lazy val `vnd.collabio.xodocuments.spreadsheet`: MediaType = + new MediaType("application", "vnd.collabio.xodocuments.spreadsheet", compressible = false, binary = true) + + lazy val `vnd.cryptomator.encrypted`: MediaType = + new MediaType("application", "vnd.cryptomator.encrypted", compressible = false, binary = true) + + lazy val `vnd.afpc.modca`: MediaType = + new MediaType("application", "vnd.afpc.modca", compressible = false, binary = true) + + lazy val `onenote`: MediaType = + new MediaType( "application", - "vnd.antix.game-component", - Compressible, - NotBinary, - List("atx"), + "onenote", + compressible = false, + binary = true, + List("onetoc", "onetoc2", "onetmp", "onepkg"), ) - lazy val `vnd.apache.thrift.binary`: MediaType = - new MediaType("application", "vnd.apache.thrift.binary", Compressible, NotBinary) - lazy val `vnd.apache.thrift.compact`: MediaType = - new MediaType("application", "vnd.apache.thrift.compact", Compressible, NotBinary) - lazy val `vnd.apache.thrift.json`: MediaType = - new MediaType("application", "vnd.apache.thrift.json", Compressible, NotBinary) - lazy val `vnd.api+json`: MediaType = - new MediaType("application", "vnd.api+json", Compressible, Binary) - lazy val `vnd.aplextor.warrp+json`: MediaType = - new MediaType("application", "vnd.aplextor.warrp+json", Compressible, NotBinary) - lazy val `vnd.apothekende.reservation+json`: MediaType = - new MediaType("application", "vnd.apothekende.reservation+json", Compressible, NotBinary) - lazy val `vnd.apple.installer+xml`: MediaType = new MediaType( + + lazy val `cdmi-domain`: MediaType = + new MediaType("application", "cdmi-domain", compressible = false, binary = true, List("cdmid")) + + lazy val `vnd.hal+xml`: MediaType = + new MediaType("application", "vnd.hal+xml", compressible = true, binary = true, List("hal")) + + lazy val `vnd.canon-cpdl`: MediaType = + new MediaType("application", "vnd.canon-cpdl", compressible = false, binary = true) + + lazy val `vnd.mcd`: MediaType = + new MediaType("application", "vnd.mcd", compressible = false, binary = true, List("mcd")) + + lazy val `vnd.ibm.electronic-media`: MediaType = + new MediaType("application", "vnd.ibm.electronic-media", compressible = false, binary = true) + + lazy val `fhir+xml`: MediaType = + new MediaType("application", "fhir+xml", compressible = true, binary = true) + + lazy val `tamp-error`: MediaType = + new MediaType("application", "tamp-error", compressible = false, binary = true) + + lazy val `vnd.dvb.notif-generic+xml`: MediaType = + new MediaType("application", "vnd.dvb.notif-generic+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp.ussd+xml`: MediaType = + new MediaType("application", "vnd.3gpp.ussd+xml", compressible = true, binary = true) + + lazy val `vnd.semf`: MediaType = + new MediaType("application", "vnd.semf", compressible = false, binary = true, List("semf")) + + lazy val `vnd.dvb.ipdcdftnotifaccess`: MediaType = + new MediaType("application", "vnd.dvb.ipdcdftnotifaccess", compressible = false, binary = true) + + lazy val `vnd.marlin.drm.license+xml`: MediaType = + new MediaType("application", "vnd.marlin.drm.license+xml", compressible = true, binary = true) + + lazy val `ogg`: MediaType = + new MediaType("application", "ogg", compressible = false, binary = true, List("ogx")) + + lazy val `geopackage+sqlite3`: MediaType = + new MediaType("application", "geopackage+sqlite3", compressible = false, binary = true) + + lazy val `dashdelta`: MediaType = + new MediaType("application", "dashdelta", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml`: MediaType = + new MediaType( "application", - "vnd.apple.installer+xml", - Compressible, - NotBinary, - List("mpkg"), + "vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml", + compressible = true, + binary = true, ) - lazy val `vnd.apple.keynote`: MediaType = - new MediaType("application", "vnd.apple.keynote", Compressible, NotBinary, List("key")) - lazy val `vnd.apple.mpegurl`: MediaType = - new MediaType("application", "vnd.apple.mpegurl", Compressible, NotBinary, List("m3u8")) - lazy val `vnd.apple.numbers`: MediaType = - new MediaType("application", "vnd.apple.numbers", Compressible, NotBinary, List("numbers")) - lazy val `vnd.apple.pages`: MediaType = - new MediaType("application", "vnd.apple.pages", Compressible, NotBinary, List("pages")) - lazy val `vnd.apple.pkpass`: MediaType = - new MediaType("application", "vnd.apple.pkpass", Uncompressible, NotBinary, List("pkpass")) - lazy val `vnd.arastra.swi`: MediaType = - new MediaType("application", "vnd.arastra.swi", Compressible, NotBinary) - lazy val `vnd.aristanetworks.swi`: MediaType = - new MediaType("application", "vnd.aristanetworks.swi", Compressible, NotBinary, List("swi")) - lazy val `vnd.artisan+json`: MediaType = - new MediaType("application", "vnd.artisan+json", Compressible, NotBinary) - lazy val `vnd.artsquare`: MediaType = - new MediaType("application", "vnd.artsquare", Compressible, NotBinary) - lazy val `vnd.astraea-software.iota`: MediaType = new MediaType( + + lazy val `vnd.ufdl`: MediaType = + new MediaType("application", "vnd.ufdl", compressible = false, binary = true, List("ufd", "ufdl")) + + lazy val `senml-exi`: MediaType = + new MediaType("application", "senml-exi", compressible = false, binary = true) + + lazy val `vnd.powerbuilder7-s`: MediaType = + new MediaType("application", "vnd.powerbuilder7-s", compressible = false, binary = true) + + lazy val `index`: MediaType = + new MediaType("application", "index", compressible = false, binary = true) + + lazy val `mbms-deregister+xml`: MediaType = + new MediaType("application", "mbms-deregister+xml", compressible = true, binary = true) + + lazy val `vnd.easykaraoke.cdgdownload`: MediaType = + new MediaType("application", "vnd.easykaraoke.cdgdownload", compressible = false, binary = true) + + lazy val `vnd.cups-ppd`: MediaType = + new MediaType("application", "vnd.cups-ppd", compressible = false, binary = true, List("ppd")) + + lazy val `vnd.oma.bcast.sgdu`: MediaType = + new MediaType("application", "vnd.oma.bcast.sgdu", compressible = false, binary = true) + + lazy val `x-chess-pgn`: MediaType = + new MediaType("application", "x-chess-pgn", compressible = false, binary = true, List("pgn")) + + lazy val `vnd.ms-playready.initiator+xml`: MediaType = + new MediaType("application", "vnd.ms-playready.initiator+xml", compressible = true, binary = true) + + lazy val `cose-x509`: MediaType = + new MediaType("application", "cose-x509", compressible = false, binary = true) + + lazy val `vnd.dir-bi.plate-dl-nosuffix`: MediaType = + new MediaType("application", "vnd.dir-bi.plate-dl-nosuffix", compressible = false, binary = true) + + lazy val `vnd.crick.clicker.template`: MediaType = + new MediaType("application", "vnd.crick.clicker.template", compressible = false, binary = true, List("clkt")) + + lazy val `vnd.uiq.theme`: MediaType = + new MediaType("application", "vnd.uiq.theme", compressible = false, binary = true, List("utz")) + + lazy val `json-seq`: MediaType = + new MediaType("application", "json-seq", compressible = false, binary = true) + + lazy val `vnd.lotus-wordpro`: MediaType = + new MediaType("application", "vnd.lotus-wordpro", compressible = false, binary = true, List("lwp")) + + lazy val `vnd.adobe.partial-upload`: MediaType = + new MediaType("application", "vnd.adobe.partial-upload", compressible = false, binary = true) + + lazy val `sep+xml`: MediaType = + new MediaType("application", "sep+xml", compressible = true, binary = true) + + lazy val `vnd.claymore`: MediaType = + new MediaType("application", "vnd.claymore", compressible = false, binary = true, List("cla")) + + lazy val `tar`: MediaType = + new MediaType("application", "tar", compressible = true, binary = true) + + lazy val `rpki-roa`: MediaType = + new MediaType("application", "rpki-roa", compressible = false, binary = true, List("roa")) + + lazy val `clr`: MediaType = + new MediaType("application", "clr", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.formula-template`: MediaType = + new MediaType( "application", - "vnd.astraea-software.iota", - Compressible, - NotBinary, - List("iota"), + "vnd.oasis.opendocument.formula-template", + compressible = false, + binary = true, + List("odft"), ) - lazy val `vnd.audiograph`: MediaType = - new MediaType("application", "vnd.audiograph", Compressible, NotBinary, List("aep")) - lazy val `vnd.autopackage`: MediaType = - new MediaType("application", "vnd.autopackage", Compressible, NotBinary) - lazy val `vnd.avalon+json`: MediaType = - new MediaType("application", "vnd.avalon+json", Compressible, NotBinary) - lazy val `vnd.avistar+xml`: MediaType = - new MediaType("application", "vnd.avistar+xml", Compressible, NotBinary) - lazy val `vnd.balsamiq.bmml+xml`: MediaType = - new MediaType("application", "vnd.balsamiq.bmml+xml", Compressible, NotBinary, List("bmml")) - lazy val `vnd.balsamiq.bmpr`: MediaType = - new MediaType("application", "vnd.balsamiq.bmpr", Compressible, NotBinary) - lazy val `vnd.banana-accounting`: MediaType = - new MediaType("application", "vnd.banana-accounting", Compressible, NotBinary) - lazy val `vnd.bbf.usp.error`: MediaType = - new MediaType("application", "vnd.bbf.usp.error", Compressible, NotBinary) - lazy val `vnd.bbf.usp.msg`: MediaType = - new MediaType("application", "vnd.bbf.usp.msg", Compressible, NotBinary) - lazy val `vnd.bbf.usp.msg+json`: MediaType = - new MediaType("application", "vnd.bbf.usp.msg+json", Compressible, NotBinary) - lazy val `vnd.bekitzur-stech+json`: MediaType = - new MediaType("application", "vnd.bekitzur-stech+json", Compressible, NotBinary) - lazy val `vnd.bint.med-content`: MediaType = - new MediaType("application", "vnd.bint.med-content", Compressible, NotBinary) - lazy val `vnd.biopax.rdf+xml`: MediaType = - new MediaType("application", "vnd.biopax.rdf+xml", Compressible, NotBinary) - lazy val `vnd.blink-idb-value-wrapper`: MediaType = - new MediaType("application", "vnd.blink-idb-value-wrapper", Compressible, NotBinary) - lazy val `vnd.blueice.multipass`: MediaType = - new MediaType("application", "vnd.blueice.multipass", Compressible, NotBinary, List("mpm")) - lazy val `vnd.bluetooth.ep.oob`: MediaType = - new MediaType("application", "vnd.bluetooth.ep.oob", Compressible, NotBinary) - lazy val `vnd.bluetooth.le.oob`: MediaType = - new MediaType("application", "vnd.bluetooth.le.oob", Compressible, NotBinary) - lazy val `vnd.bmi`: MediaType = - new MediaType("application", "vnd.bmi", Compressible, NotBinary, List("bmi")) - lazy val `vnd.bpf`: MediaType = - new MediaType("application", "vnd.bpf", Compressible, NotBinary) - lazy val `vnd.bpf3`: MediaType = - new MediaType("application", "vnd.bpf3", Compressible, NotBinary) - lazy val `vnd.businessobjects`: MediaType = - new MediaType("application", "vnd.businessobjects", Compressible, NotBinary, List("rep")) - lazy val `vnd.byu.uapi+json`: MediaType = - new MediaType("application", "vnd.byu.uapi+json", Compressible, NotBinary) - lazy val `vnd.cab-jscript`: MediaType = - new MediaType("application", "vnd.cab-jscript", Compressible, NotBinary) - lazy val `vnd.canon-cpdl`: MediaType = - new MediaType("application", "vnd.canon-cpdl", Compressible, NotBinary) - lazy val `vnd.canon-lips`: MediaType = - new MediaType("application", "vnd.canon-lips", Compressible, NotBinary) - lazy val `vnd.capasystems-pg+json`: MediaType = - new MediaType("application", "vnd.capasystems-pg+json", Compressible, NotBinary) - lazy val `vnd.cendio.thinlinc.clientconf`: MediaType = - new MediaType("application", "vnd.cendio.thinlinc.clientconf", Compressible, NotBinary) - lazy val `vnd.century-systems.tcp_stream`: MediaType = - new MediaType("application", "vnd.century-systems.tcp_stream", Compressible, NotBinary) - lazy val `vnd.chemdraw+xml`: MediaType = - new MediaType("application", "vnd.chemdraw+xml", Compressible, NotBinary, List("cdxml")) - lazy val `vnd.chess-pgn`: MediaType = - new MediaType("application", "vnd.chess-pgn", Compressible, NotBinary) - lazy val `vnd.chipnuts.karaoke-mmd`: MediaType = new MediaType( - "application", - "vnd.chipnuts.karaoke-mmd", - Compressible, - NotBinary, - List("mmd"), - ) - lazy val `vnd.ciedi`: MediaType = - new MediaType("application", "vnd.ciedi", Compressible, NotBinary) - lazy val `vnd.cinderella`: MediaType = - new MediaType("application", "vnd.cinderella", Compressible, NotBinary, List("cdy")) - lazy val `vnd.cirpack.isdn-ext`: MediaType = - new MediaType("application", "vnd.cirpack.isdn-ext", Compressible, NotBinary) - lazy val `vnd.citationstyles.style+xml`: MediaType = new MediaType( - "application", - "vnd.citationstyles.style+xml", - Compressible, - NotBinary, - List("csl"), - ) - lazy val `vnd.claymore`: MediaType = - new MediaType("application", "vnd.claymore", Compressible, NotBinary, List("cla")) - lazy val `vnd.cloanto.rp9`: MediaType = - new MediaType("application", "vnd.cloanto.rp9", Compressible, NotBinary, List("rp9")) - lazy val `vnd.clonk.c4group`: MediaType = new MediaType( - "application", - "vnd.clonk.c4group", - Compressible, - NotBinary, - List("c4g", "c4d", "c4f", "c4p", "c4u"), - ) - lazy val `vnd.cluetrust.cartomobile-config`: MediaType = new MediaType( - "application", - "vnd.cluetrust.cartomobile-config", - Compressible, - NotBinary, - List("c11amc"), - ) - lazy val `vnd.cluetrust.cartomobile-config-pkg`: MediaType = new MediaType( - "application", - "vnd.cluetrust.cartomobile-config-pkg", - Compressible, - NotBinary, - List("c11amz"), - ) - lazy val `vnd.coffeescript`: MediaType = - new MediaType("application", "vnd.coffeescript", Compressible, NotBinary) - lazy val `vnd.collabio.xodocuments.document`: MediaType = - new MediaType("application", "vnd.collabio.xodocuments.document", Compressible, NotBinary) - lazy val `vnd.collabio.xodocuments.document-template`: MediaType = new MediaType( + + lazy val `vnd.oma.dd2+xml`: MediaType = + new MediaType("application", "vnd.oma.dd2+xml", compressible = true, binary = true, List("dd2")) + + lazy val `vnd.sealed.doc`: MediaType = + new MediaType("application", "vnd.sealed.doc", compressible = false, binary = true) + + lazy val `vnd.wrq-hp3000-labelled`: MediaType = + new MediaType("application", "vnd.wrq-hp3000-labelled", compressible = false, binary = true) + + lazy val `vnd.arastra.swi`: MediaType = + new MediaType("application", "vnd.arastra.swi", compressible = false, binary = true) + + lazy val `vnd.flographit`: MediaType = + new MediaType("application", "vnd.flographit", compressible = false, binary = true, List("gph")) + + lazy val `winhlp`: MediaType = + new MediaType("application", "winhlp", compressible = false, binary = true, List("hlp")) + + lazy val `vnd.dbf`: MediaType = + new MediaType("application", "vnd.dbf", compressible = false, binary = true, List("dbf")) + + lazy val `x-latex`: MediaType = + new MediaType("application", "x-latex", compressible = false, binary = true, List("latex")) + + lazy val `td+json`: MediaType = + new MediaType("application", "td+json", compressible = true, binary = false) + + lazy val `vnd.3gpp-prose-pc3ch+xml`: MediaType = + new MediaType("application", "vnd.3gpp-prose-pc3ch+xml", compressible = true, binary = true) + + lazy val `cda+xml`: MediaType = + new MediaType("application", "cda+xml", compressible = true, binary = true) + + lazy val `vnd.gridmp`: MediaType = + new MediaType("application", "vnd.gridmp", compressible = false, binary = true) + + lazy val `vnd.dataresource+json`: MediaType = + new MediaType("application", "vnd.dataresource+json", compressible = true, binary = false) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml`: MediaType = + new MediaType( "application", - "vnd.collabio.xodocuments.document-template", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml", + compressible = true, + binary = true, ) - lazy val `vnd.collabio.xodocuments.presentation`: MediaType = new MediaType( + + lazy val `news-checkgroups`: MediaType = + new MediaType("application", "news-checkgroups", compressible = false, binary = true) + + lazy val `vnd.solent.sdkm+xml`: MediaType = + new MediaType("application", "vnd.solent.sdkm+xml", compressible = true, binary = true, List("sdkm", "sdkd")) + + lazy val `atfx`: MediaType = + new MediaType("application", "atfx", compressible = false, binary = true) + + lazy val `vnd.globalplatform.card-content-mgt`: MediaType = + new MediaType("application", "vnd.globalplatform.card-content-mgt", compressible = false, binary = true) + + lazy val `vnd.acucobol`: MediaType = + new MediaType("application", "vnd.acucobol", compressible = false, binary = true, List("acu")) + + lazy val `vnd.adobe.fxp`: MediaType = + new MediaType("application", "vnd.adobe.fxp", compressible = false, binary = true, List("fxp", "fxpl")) + + lazy val `vnd.ms-wpl`: MediaType = + new MediaType("application", "vnd.ms-wpl", compressible = false, binary = true, List("wpl")) + + lazy val `x-bzip`: MediaType = + new MediaType("application", "x-bzip", compressible = false, binary = true, List("bz")) + + lazy val `vnd.leap+json`: MediaType = + new MediaType("application", "vnd.leap+json", compressible = true, binary = false) + + lazy val `vnd.dynageo`: MediaType = + new MediaType("application", "vnd.dynageo", compressible = false, binary = true, List("geo")) + + lazy val `sensml+json`: MediaType = + new MediaType("application", "sensml+json", compressible = true, binary = false) + + lazy val `vnd.collection.next+json`: MediaType = + new MediaType("application", "vnd.collection.next+json", compressible = true, binary = false) + + lazy val `coap-payload`: MediaType = + new MediaType("application", "coap-payload", compressible = false, binary = true) + + lazy val `vnd.sss-dtf`: MediaType = + new MediaType("application", "vnd.sss-dtf", compressible = false, binary = true) + + lazy val `postscript`: MediaType = + new MediaType("application", "postscript", compressible = true, binary = true, List("ai", "eps", "ps")) + + lazy val `timestamp-reply`: MediaType = + new MediaType("application", "timestamp-reply", compressible = false, binary = true) + + lazy val `vnd.etsi.mheg5`: MediaType = + new MediaType("application", "vnd.etsi.mheg5", compressible = false, binary = true) + + lazy val `vnd.fuzzysheet`: MediaType = + new MediaType("application", "vnd.fuzzysheet", compressible = false, binary = true, List("fzs")) + + lazy val `vnd.oipf.spdlist+xml`: MediaType = + new MediaType("application", "vnd.oipf.spdlist+xml", compressible = true, binary = true) + + lazy val `x-cocoa`: MediaType = + new MediaType("application", "x-cocoa", compressible = false, binary = true, List("cco")) + + lazy val `vnd.3gpp.gmop+xml`: MediaType = + new MediaType("application", "vnd.3gpp.gmop+xml", compressible = true, binary = true) + + lazy val `vnd.exstream-empower+zip`: MediaType = + new MediaType("application", "vnd.exstream-empower+zip", compressible = false, binary = true) + + lazy val `vnd.omads-folder+xml`: MediaType = + new MediaType("application", "vnd.omads-folder+xml", compressible = true, binary = true) + + lazy val `vnd.google-apps.presentation`: MediaType = + new MediaType("application", "vnd.google-apps.presentation", compressible = false, binary = true, List("gslides")) + + lazy val `vnd.syncml.dm.notification`: MediaType = + new MediaType("application", "vnd.syncml.dm.notification", compressible = false, binary = true) + + lazy val `x-stuffit`: MediaType = + new MediaType("application", "x-stuffit", compressible = false, binary = true, List("sit")) + + lazy val `vnd.motorola.flexsuite.adsi`: MediaType = + new MediaType("application", "vnd.motorola.flexsuite.adsi", compressible = false, binary = true) + + lazy val `xcon-conference-info-diff+xml`: MediaType = + new MediaType("application", "xcon-conference-info-diff+xml", compressible = true, binary = true) + + lazy val `docbook+xml`: MediaType = + new MediaType("application", "docbook+xml", compressible = true, binary = true, List("dbk")) + + lazy val `vnd.eudora.data`: MediaType = + new MediaType("application", "vnd.eudora.data", compressible = false, binary = true) + + lazy val `vnd.ntt-local.content-share`: MediaType = + new MediaType("application", "vnd.ntt-local.content-share", compressible = false, binary = true) + + lazy val `vnd.etsi.iptvprofile+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvprofile+xml", compressible = true, binary = true) + + lazy val `vnd.mediastation.cdkey`: MediaType = + new MediaType("application", "vnd.mediastation.cdkey", compressible = false, binary = true, List("cdkey")) + + lazy val `sgml-open-catalog`: MediaType = + new MediaType("application", "sgml-open-catalog", compressible = false, binary = true) + + lazy val `x-lzh-compressed`: MediaType = + new MediaType("application", "x-lzh-compressed", compressible = false, binary = true, List("lzh", "lha")) + + lazy val `vnd.sealed.eml`: MediaType = + new MediaType("application", "vnd.sealed.eml", compressible = false, binary = true) + + lazy val `aml`: MediaType = + new MediaType("application", "aml", compressible = false, binary = true) + + lazy val `vnd.oma.bcast.sgboot`: MediaType = + new MediaType("application", "vnd.oma.bcast.sgboot", compressible = false, binary = true) + + lazy val `scvp-cv-response`: MediaType = + new MediaType("application", "scvp-cv-response", compressible = false, binary = true, List("scs")) + + lazy val `vnd.cyclonedx+json`: MediaType = + new MediaType("application", "vnd.cyclonedx+json", compressible = true, binary = false) + + lazy val `vnd.ms-wmdrm.meter-chlg-req`: MediaType = + new MediaType("application", "vnd.ms-wmdrm.meter-chlg-req", compressible = false, binary = true) + + lazy val `vnd.fujifilm.fb.jfi+xml`: MediaType = + new MediaType("application", "vnd.fujifilm.fb.jfi+xml", compressible = true, binary = true) + + lazy val `xproc+xml`: MediaType = + new MediaType("application", "xproc+xml", compressible = true, binary = true, List("xpl")) + + lazy val `vnd.rn-realmedia`: MediaType = + new MediaType("application", "vnd.rn-realmedia", compressible = false, binary = true, List("rm")) + + lazy val `ulpfec`: MediaType = + new MediaType("application", "ulpfec", compressible = false, binary = true) + + lazy val `vnd.genozip`: MediaType = + new MediaType("application", "vnd.genozip", compressible = false, binary = true) + + lazy val `vnd.opentimestamps.ots`: MediaType = + new MediaType("application", "vnd.opentimestamps.ots", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.text-web`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.text-web", compressible = false, binary = true, List("oth")) + + lazy val `dcd`: MediaType = + new MediaType("application", "dcd", compressible = false, binary = true) + + lazy val `vnd.oipf.ueprofile+xml`: MediaType = + new MediaType("application", "vnd.oipf.ueprofile+xml", compressible = true, binary = true) + + lazy val `vnd.ms-word.document.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.collabio.xodocuments.presentation", - Compressible, - NotBinary, + "vnd.ms-word.document.macroenabled.12", + compressible = false, + binary = true, + List("docm"), ) - lazy val `vnd.collabio.xodocuments.presentation-template`: MediaType = new MediaType( + + lazy val `vnd.vidsoft.vidconference`: MediaType = + new MediaType("application", "vnd.vidsoft.vidconference", compressible = false, binary = true) + + lazy val `vnd.etsi.iptvdiscovery+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvdiscovery+xml", compressible = true, binary = true) + + lazy val `vnd.oma.poc.invocation-descriptor+xml`: MediaType = + new MediaType("application", "vnd.oma.poc.invocation-descriptor+xml", compressible = true, binary = true) + + lazy val `x-arj`: MediaType = + new MediaType("application", "x-arj", compressible = false, binary = true, List("arj")) + + lazy val `slate`: MediaType = + new MediaType("application", "slate", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.graphics`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.graphics", compressible = false, binary = true, List("odg")) + + lazy val `vnd.patientecommsdoc`: MediaType = + new MediaType("application", "vnd.patientecommsdoc", compressible = false, binary = true) + + lazy val `x-director`: MediaType = + new MediaType( "application", - "vnd.collabio.xodocuments.presentation-template", - Compressible, - NotBinary, + "x-director", + compressible = false, + binary = true, + List("dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"), ) - lazy val `vnd.collabio.xodocuments.spreadsheet`: MediaType = new MediaType( + + lazy val `gpx+xml`: MediaType = + new MediaType("application", "gpx+xml", compressible = true, binary = true, List("gpx")) + + lazy val `vnd.rig.cryptonote`: MediaType = + new MediaType("application", "vnd.rig.cryptonote", compressible = false, binary = true, List("cryptonote")) + + lazy val `vnd.syncml.dmddf+wbxml`: MediaType = + new MediaType("application", "vnd.syncml.dmddf+wbxml", compressible = false, binary = true) + + lazy val `x-javascript`: MediaType = + new MediaType("application", "x-javascript", compressible = true, binary = false) + + lazy val `x-pkcs7-certreqresp`: MediaType = + new MediaType("application", "x-pkcs7-certreqresp", compressible = false, binary = true, List("p7r")) + + lazy val `patch-ops-error+xml`: MediaType = + new MediaType("application", "patch-ops-error+xml", compressible = true, binary = true, List("xer")) + + lazy val `vnd.fujifilm.fb.docuworks`: MediaType = + new MediaType("application", "vnd.fujifilm.fb.docuworks", compressible = false, binary = true) + + lazy val `vnd.etsi.iptvsad-bc+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvsad-bc+xml", compressible = true, binary = true) + + lazy val `vnd.criticaltools.wbs+xml`: MediaType = + new MediaType("application", "vnd.criticaltools.wbs+xml", compressible = true, binary = true, List("wbs")) + + lazy val `pidf-diff+xml`: MediaType = + new MediaType("application", "pidf-diff+xml", compressible = true, binary = true) + + lazy val `vnd.familysearch.gedcom+zip`: MediaType = + new MediaType("application", "vnd.familysearch.gedcom+zip", compressible = false, binary = true) + + lazy val `x-xz`: MediaType = + new MediaType("application", "x-xz", compressible = false, binary = true, List("xz")) + + lazy val `cose-key`: MediaType = + new MediaType("application", "cose-key", compressible = false, binary = true) + + lazy val `jscalendar+json`: MediaType = + new MediaType("application", "jscalendar+json", compressible = true, binary = false) + + lazy val `dicom+xml`: MediaType = + new MediaType("application", "dicom+xml", compressible = true, binary = true) + + lazy val `vnd.kde.kword`: MediaType = + new MediaType("application", "vnd.kde.kword", compressible = false, binary = true, List("kwd", "kwt")) + + lazy val `vnd.syncml.dmddf+xml`: MediaType = + new MediaType("application", "vnd.syncml.dmddf+xml", compressible = true, binary = true, List("ddf")) + + lazy val `vnd.oma.xcap-directory+xml`: MediaType = + new MediaType("application", "vnd.oma.xcap-directory+xml", compressible = true, binary = true) + + lazy val `vnd.nokia.catalogs`: MediaType = + new MediaType("application", "vnd.nokia.catalogs", compressible = false, binary = true) + + lazy val `reputon+json`: MediaType = + new MediaType("application", "reputon+json", compressible = true, binary = false) + + lazy val `vnd.acucorp`: MediaType = + new MediaType("application", "vnd.acucorp", compressible = false, binary = true, List("atc", "acutc")) + + lazy val `vnd.jam`: MediaType = + new MediaType("application", "vnd.jam", compressible = false, binary = true, List("jam")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.styles+xml`: MediaType = + new MediaType( "application", - "vnd.collabio.xodocuments.spreadsheet", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", + compressible = true, + binary = true, ) - lazy val `vnd.collabio.xodocuments.spreadsheet-template`: MediaType = new MediaType( + + lazy val `pvd+json`: MediaType = + new MediaType("application", "pvd+json", compressible = true, binary = false) + + lazy val `vnd.uplanet.list`: MediaType = + new MediaType("application", "vnd.uplanet.list", compressible = false, binary = true) + + lazy val `vnd.verimatrix.vcas`: MediaType = + new MediaType("application", "vnd.verimatrix.vcas", compressible = false, binary = true) + + lazy val `vnd.bint.med-content`: MediaType = + new MediaType("application", "vnd.bint.med-content", compressible = false, binary = true) + + lazy val `ld+json`: MediaType = + new MediaType("application", "ld+json", compressible = true, binary = false, List("jsonld")) + + lazy val `x-virtualbox-ova`: MediaType = + new MediaType("application", "x-virtualbox-ova", compressible = true, binary = true, List("ova")) + + lazy val `tei+xml`: MediaType = + new MediaType("application", "tei+xml", compressible = true, binary = true, List("tei", "teicorpus")) + + lazy val `rpki-ghostbusters`: MediaType = + new MediaType("application", "rpki-ghostbusters", compressible = false, binary = true, List("gbr")) + + lazy val `vnd.oipf.contentaccessstreaming+xml`: MediaType = + new MediaType("application", "vnd.oipf.contentaccessstreaming+xml", compressible = true, binary = true) + + lazy val `atf`: MediaType = + new MediaType("application", "atf", compressible = false, binary = true) + + lazy val `smil`: MediaType = + new MediaType("application", "smil", compressible = false, binary = true) + + lazy val `vnd.afpc.foca-codepage`: MediaType = + new MediaType("application", "vnd.afpc.foca-codepage", compressible = false, binary = true) + + lazy val `vnd.ficlab.flb+zip`: MediaType = + new MediaType("application", "vnd.ficlab.flb+zip", compressible = false, binary = true) + + lazy val `vnd.afpc.afplinedata`: MediaType = + new MediaType("application", "vnd.afpc.afplinedata", compressible = false, binary = true) + + lazy val `opc-nodeset+xml`: MediaType = + new MediaType("application", "opc-nodeset+xml", compressible = true, binary = true) + + lazy val `vnd.ibm.rights-management`: MediaType = + new MediaType("application", "vnd.ibm.rights-management", compressible = false, binary = true, List("irm")) + + lazy val `x-silverlight-app`: MediaType = + new MediaType("application", "x-silverlight-app", compressible = false, binary = true, List("xap")) + + lazy val `x-font-libgrx`: MediaType = + new MediaType("application", "x-font-libgrx", compressible = false, binary = true) + + lazy val `alto-directory+json`: MediaType = + new MediaType("application", "alto-directory+json", compressible = true, binary = false) + + lazy val `zlib`: MediaType = + new MediaType("application", "zlib", compressible = false, binary = true) + + lazy val `vnd.japannet-verification`: MediaType = + new MediaType("application", "vnd.japannet-verification", compressible = false, binary = true) + + lazy val `vnd.patentdive`: MediaType = + new MediaType("application", "vnd.patentdive", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.drawing+xml`: MediaType = + new MediaType("application", "vnd.openxmlformats-officedocument.drawing+xml", compressible = true, binary = true) + + lazy val `vnd.commerce-battelle`: MediaType = + new MediaType("application", "vnd.commerce-battelle", compressible = false, binary = true) + + lazy val `vnd.wap.wmlscriptc`: MediaType = + new MediaType("application", "vnd.wap.wmlscriptc", compressible = false, binary = true, List("wmlsc")) + + lazy val `atxml`: MediaType = + new MediaType("application", "atxml", compressible = false, binary = true) + + lazy val `secevent+jwt`: MediaType = + new MediaType("application", "secevent+jwt", compressible = false, binary = true) + + lazy val `multipart-core`: MediaType = + new MediaType("application", "multipart-core", compressible = false, binary = true) + + lazy val `cms`: MediaType = + new MediaType("application", "cms", compressible = false, binary = true) + + lazy val `vnd.panoply`: MediaType = + new MediaType("application", "vnd.panoply", compressible = false, binary = true) + + lazy val `srgs+xml`: MediaType = + new MediaType("application", "srgs+xml", compressible = true, binary = true, List("grxml")) + + lazy val `x-csh`: MediaType = + new MediaType("application", "x-csh", compressible = false, binary = true, List("csh")) + + lazy val `vnd.oma.bcast.associated-procedure-parameter+xml`: MediaType = + new MediaType( "application", - "vnd.collabio.xodocuments.spreadsheet-template", - Compressible, - NotBinary, + "vnd.oma.bcast.associated-procedure-parameter+xml", + compressible = true, + binary = true, ) - lazy val `vnd.collection+json`: MediaType = - new MediaType("application", "vnd.collection+json", Compressible, NotBinary) - lazy val `vnd.collection.doc+json`: MediaType = - new MediaType("application", "vnd.collection.doc+json", Compressible, NotBinary) - lazy val `vnd.collection.next+json`: MediaType = - new MediaType("application", "vnd.collection.next+json", Compressible, NotBinary) - lazy val `vnd.comicbook+zip`: MediaType = - new MediaType("application", "vnd.comicbook+zip", Uncompressible, NotBinary) - lazy val `vnd.comicbook-rar`: MediaType = - new MediaType("application", "vnd.comicbook-rar", Compressible, NotBinary) - lazy val `vnd.commerce-battelle`: MediaType = - new MediaType("application", "vnd.commerce-battelle", Compressible, NotBinary) - lazy val `vnd.commonspace`: MediaType = - new MediaType("application", "vnd.commonspace", Compressible, NotBinary, List("csp")) - lazy val `vnd.contact.cmsg`: MediaType = - new MediaType("application", "vnd.contact.cmsg", Compressible, NotBinary, List("cdbcmsg")) - lazy val `vnd.coreos.ignition+json`: MediaType = - new MediaType("application", "vnd.coreos.ignition+json", Compressible, NotBinary) - lazy val `vnd.cosmocaller`: MediaType = - new MediaType("application", "vnd.cosmocaller", Compressible, NotBinary, List("cmc")) - lazy val `vnd.crick.clicker`: MediaType = - new MediaType("application", "vnd.crick.clicker", Compressible, NotBinary, List("clkx")) - lazy val `vnd.crick.clicker.keyboard`: MediaType = new MediaType( + + lazy val `vnd.radisys.msml-dialog+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-dialog+xml", compressible = true, binary = true) + + lazy val `vnd.dvb.notif-init+xml`: MediaType = + new MediaType("application", "vnd.dvb.notif-init+xml", compressible = true, binary = true) + + lazy val `vnd.ecowin.seriesrequest`: MediaType = + new MediaType("application", "vnd.ecowin.seriesrequest", compressible = false, binary = true) + + lazy val `vnd.oma.bcast.sgdd+xml`: MediaType = + new MediaType("application", "vnd.oma.bcast.sgdd+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp.pic-bw-var`: MediaType = + new MediaType("application", "vnd.3gpp.pic-bw-var", compressible = false, binary = true, List("pvb")) + + lazy val `iges`: MediaType = + new MediaType("application", "iges", compressible = false, binary = true) + + lazy val `msixbundle`: MediaType = + new MediaType("application", "msixbundle", compressible = false, binary = true, List("msixbundle")) + + lazy val `vnd.noblenet-sealer`: MediaType = + new MediaType("application", "vnd.noblenet-sealer", compressible = false, binary = true, List("nns")) + + lazy val `dec-dx`: MediaType = + new MediaType("application", "dec-dx", compressible = false, binary = true) + + lazy val `manifest+json`: MediaType = + new MediaType("application", "manifest+json", compressible = true, binary = false, List("webmanifest")) + + lazy val `vnd.apple.mpegurl`: MediaType = + new MediaType("application", "vnd.apple.mpegurl", compressible = false, binary = true, List("m3u8")) + + lazy val `vnd.adobe.formscentral.fcdt`: MediaType = + new MediaType("application", "vnd.adobe.formscentral.fcdt", compressible = false, binary = true, List("fcdt")) + + lazy val `vnd.gentoo.gpkg`: MediaType = + new MediaType("application", "vnd.gentoo.gpkg", compressible = false, binary = true) + + lazy val `mosskey-request`: MediaType = + new MediaType("application", "mosskey-request", compressible = false, binary = true) + + lazy val `yang-data+xml`: MediaType = + new MediaType("application", "yang-data+xml", compressible = true, binary = true) + + lazy val `x-abiword`: MediaType = + new MediaType("application", "x-abiword", compressible = false, binary = true, List("abw")) + + lazy val `mbox`: MediaType = + new MediaType("application", "mbox", compressible = false, binary = true, List("mbox")) + + lazy val `vnd.apache.thrift.binary`: MediaType = + new MediaType("application", "vnd.apache.thrift.binary", compressible = false, binary = true) + + lazy val `x-makeself`: MediaType = + new MediaType("application", "x-makeself", compressible = false, binary = true, List("run")) + + lazy val `vnd.debian.binary-package`: MediaType = + new MediaType("application", "vnd.debian.binary-package", compressible = false, binary = true) + + lazy val `vnd.google-earth.kmz`: MediaType = + new MediaType("application", "vnd.google-earth.kmz", compressible = false, binary = true, List("kmz")) + + lazy val `x-shockwave-flash`: MediaType = + new MediaType("application", "x-shockwave-flash", compressible = false, binary = true, List("swf")) + + lazy val `emergencycalldata.providerinfo+xml`: MediaType = + new MediaType("application", "emergencycalldata.providerinfo+xml", compressible = true, binary = true) + + lazy val `fdt+xml`: MediaType = + new MediaType("application", "fdt+xml", compressible = true, binary = true, List("fdt")) + + lazy val `rtx`: MediaType = + new MediaType("application", "rtx", compressible = false, binary = true) + + lazy val `vnd.nokia.landmark+wbxml`: MediaType = + new MediaType("application", "vnd.nokia.landmark+wbxml", compressible = false, binary = true) + + lazy val `vnd.intu.qfx`: MediaType = + new MediaType("application", "vnd.intu.qfx", compressible = false, binary = true, List("qfx")) + + lazy val `lpf+zip`: MediaType = + new MediaType("application", "lpf+zip", compressible = false, binary = true) + + lazy val `vnd.ims.lti.v2.toolsettings+json`: MediaType = + new MediaType("application", "vnd.ims.lti.v2.toolsettings+json", compressible = true, binary = false) + + lazy val `vnd.afpc.modca-overlay`: MediaType = + new MediaType("application", "vnd.afpc.modca-overlay", compressible = false, binary = true) + + lazy val `vnd.osgeo.mapguide.package`: MediaType = + new MediaType("application", "vnd.osgeo.mapguide.package", compressible = false, binary = true, List("mgp")) + + lazy val `vnd.yamaha.remote-setup`: MediaType = + new MediaType("application", "vnd.yamaha.remote-setup", compressible = false, binary = true) + + lazy val `vnd.cyan.dean.root+xml`: MediaType = + new MediaType("application", "vnd.cyan.dean.root+xml", compressible = true, binary = true) + + lazy val `ubjson`: MediaType = + new MediaType("application", "ubjson", compressible = false, binary = false, List("ubj")) + + lazy val `vnd.dolby.mobile.1`: MediaType = + new MediaType("application", "vnd.dolby.mobile.1", compressible = false, binary = true) + + lazy val `mbms-envelope+xml`: MediaType = + new MediaType("application", "mbms-envelope+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.presentation`: MediaType = + new MediaType( "application", - "vnd.crick.clicker.keyboard", - Compressible, - NotBinary, - List("clkk"), + "vnd.openxmlformats-officedocument.presentationml.presentation", + compressible = false, + binary = true, + List("pptx"), ) - lazy val `vnd.crick.clicker.palette`: MediaType = new MediaType( + + lazy val `cdfx+xml`: MediaType = + new MediaType("application", "cdfx+xml", compressible = true, binary = true, List("cdfx")) + + lazy val `vnd.hydrostatix.sof-data`: MediaType = + new MediaType("application", "vnd.hydrostatix.sof-data", compressible = false, binary = true, List("sfd-hdstx")) + + lazy val `vnd.afpc.afplinedata-pagedef`: MediaType = + new MediaType("application", "vnd.afpc.afplinedata-pagedef", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml`: MediaType = + new MediaType( "application", - "vnd.crick.clicker.palette", - Compressible, - NotBinary, - List("clkp"), + "vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml", + compressible = true, + binary = true, ) - lazy val `vnd.crick.clicker.template`: MediaType = new MediaType( + + lazy val `aif+cbor`: MediaType = + new MediaType("application", "aif+cbor", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.template`: MediaType = + new MediaType( "application", - "vnd.crick.clicker.template", - Compressible, - NotBinary, - List("clkt"), + "vnd.openxmlformats-officedocument.spreadsheetml.template", + compressible = false, + binary = true, + List("xltx"), ) - lazy val `vnd.crick.clicker.wordbank`: MediaType = new MediaType( + + lazy val `appxbundle`: MediaType = + new MediaType("application", "appxbundle", compressible = false, binary = true, List("appxbundle")) + + lazy val `vnd.koan`: MediaType = + new MediaType("application", "vnd.koan", compressible = false, binary = true, List("skp", "skd", "skt", "skm")) + + lazy val `vnd.osa.netdeploy`: MediaType = + new MediaType("application", "vnd.osa.netdeploy", compressible = false, binary = true) + + lazy val `mbms-msk+xml`: MediaType = + new MediaType("application", "mbms-msk+xml", compressible = true, binary = true) + + lazy val `vnd.dece.unspecified`: MediaType = + new MediaType("application", "vnd.dece.unspecified", compressible = false, binary = true, List("uvx", "uvvx")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml`: MediaType = + new MediaType( "application", - "vnd.crick.clicker.wordbank", - Compressible, - NotBinary, - List("clkw"), + "vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", + compressible = true, + binary = true, ) - lazy val `vnd.criticaltools.wbs+xml`: MediaType = new MediaType( + + lazy val `vnd.fujifilm.fb.docuworks.binder`: MediaType = + new MediaType("application", "vnd.fujifilm.fb.docuworks.binder", compressible = false, binary = true) + + lazy val `x-ms-application`: MediaType = + new MediaType("application", "x-ms-application", compressible = false, binary = true, List("application")) + + lazy val `n-quads`: MediaType = + new MediaType("application", "n-quads", compressible = false, binary = true, List("nq")) + + lazy val `davmount+xml`: MediaType = + new MediaType("application", "davmount+xml", compressible = true, binary = true, List("davmount")) + + lazy val `vnd.oasis.opendocument.graphics-template`: MediaType = + new MediaType( "application", - "vnd.criticaltools.wbs+xml", - Compressible, - NotBinary, - List("wbs"), + "vnd.oasis.opendocument.graphics-template", + compressible = false, + binary = true, + List("otg"), ) - lazy val `vnd.cryptii.pipe+json`: MediaType = - new MediaType("application", "vnd.cryptii.pipe+json", Compressible, NotBinary) - lazy val `vnd.crypto-shade-file`: MediaType = - new MediaType("application", "vnd.crypto-shade-file", Compressible, NotBinary) - lazy val `vnd.cryptomator.encrypted`: MediaType = - new MediaType("application", "vnd.cryptomator.encrypted", Compressible, NotBinary) - lazy val `vnd.cryptomator.vault`: MediaType = - new MediaType("application", "vnd.cryptomator.vault", Compressible, NotBinary) - lazy val `vnd.ctc-posml`: MediaType = - new MediaType("application", "vnd.ctc-posml", Compressible, NotBinary, List("pml")) - lazy val `vnd.ctct.ws+xml`: MediaType = - new MediaType("application", "vnd.ctct.ws+xml", Compressible, NotBinary) - lazy val `vnd.cups-pdf`: MediaType = - new MediaType("application", "vnd.cups-pdf", Compressible, NotBinary) - lazy val `vnd.cups-postscript`: MediaType = - new MediaType("application", "vnd.cups-postscript", Compressible, NotBinary) - lazy val `vnd.cups-ppd`: MediaType = - new MediaType("application", "vnd.cups-ppd", Compressible, NotBinary, List("ppd")) - lazy val `vnd.cups-raster`: MediaType = - new MediaType("application", "vnd.cups-raster", Compressible, NotBinary) - lazy val `vnd.cups-raw`: MediaType = - new MediaType("application", "vnd.cups-raw", Compressible, NotBinary) - lazy val `vnd.curl`: MediaType = - new MediaType("application", "vnd.curl", Compressible, NotBinary) - lazy val `vnd.curl.car`: MediaType = - new MediaType("application", "vnd.curl.car", Compressible, NotBinary, List("car")) - lazy val `vnd.curl.pcurl`: MediaType = - new MediaType("application", "vnd.curl.pcurl", Compressible, NotBinary, List("pcurl")) - lazy val `vnd.cyan.dean.root+xml`: MediaType = - new MediaType("application", "vnd.cyan.dean.root+xml", Compressible, NotBinary) - lazy val `vnd.cybank`: MediaType = - new MediaType("application", "vnd.cybank", Compressible, NotBinary) - lazy val `vnd.cyclonedx+json`: MediaType = - new MediaType("application", "vnd.cyclonedx+json", Compressible, NotBinary) - lazy val `vnd.cyclonedx+xml`: MediaType = - new MediaType("application", "vnd.cyclonedx+xml", Compressible, NotBinary) - lazy val `vnd.d2l.coursepackage1p0+zip`: MediaType = - new MediaType("application", "vnd.d2l.coursepackage1p0+zip", Uncompressible, NotBinary) - lazy val `vnd.d3m-dataset`: MediaType = - new MediaType("application", "vnd.d3m-dataset", Compressible, NotBinary) - lazy val `vnd.d3m-problem`: MediaType = - new MediaType("application", "vnd.d3m-problem", Compressible, NotBinary) - lazy val `vnd.dart`: MediaType = - new MediaType("application", "vnd.dart", Compressible, NotBinary, List("dart")) - lazy val `vnd.data-vision.rdz`: MediaType = - new MediaType("application", "vnd.data-vision.rdz", Compressible, NotBinary, List("rdz")) - lazy val `vnd.datapackage+json`: MediaType = - new MediaType("application", "vnd.datapackage+json", Compressible, NotBinary) - lazy val `vnd.dataresource+json`: MediaType = - new MediaType("application", "vnd.dataresource+json", Compressible, NotBinary) - lazy val `vnd.dbf`: MediaType = - new MediaType("application", "vnd.dbf", Compressible, NotBinary, List("dbf")) - lazy val `vnd.debian.binary-package`: MediaType = - new MediaType("application", "vnd.debian.binary-package", Compressible, NotBinary) - lazy val `vnd.dece.data`: MediaType = new MediaType( + + lazy val `vnd.emclient.accessrequest+xml`: MediaType = + new MediaType("application", "vnd.emclient.accessrequest+xml", compressible = true, binary = true) + + lazy val `vnd.efi.img`: MediaType = + new MediaType("application", "vnd.efi.img", compressible = false, binary = true) + + lazy val `x-iwork-pages-sffpages`: MediaType = + new MediaType("application", "x-iwork-pages-sffpages", compressible = false, binary = true, List("pages")) + + lazy val `mipc`: MediaType = + new MediaType("application", "mipc", compressible = false, binary = true) + + lazy val `vnd.lotus-approach`: MediaType = + new MediaType("application", "vnd.lotus-approach", compressible = false, binary = true, List("apr")) + + lazy val `vnd.bmi`: MediaType = + new MediaType("application", "vnd.bmi", compressible = false, binary = true, List("bmi")) + + lazy val `vnd.dece.ttml+xml`: MediaType = + new MediaType("application", "vnd.dece.ttml+xml", compressible = true, binary = true, List("uvt", "uvvt")) + + lazy val `vnd.shana.informed.formtemplate`: MediaType = + new MediaType("application", "vnd.shana.informed.formtemplate", compressible = false, binary = true, List("itp")) + + lazy val `vnd.3gpp.mcdata-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-info+xml", compressible = true, binary = true) + + lazy val `vnd.oma-scws-http-request`: MediaType = + new MediaType("application", "vnd.oma-scws-http-request", compressible = false, binary = true) + + lazy val `vnd.hbci`: MediaType = + new MediaType("application", "vnd.hbci", compressible = false, binary = true, List("hbci")) + + lazy val `x-xfig`: MediaType = + new MediaType("application", "x-xfig", compressible = false, binary = true, List("fig")) + + lazy val `vnd.3gpp.ngap`: MediaType = + new MediaType("application", "vnd.3gpp.ngap", compressible = false, binary = true) + + lazy val `route-s-tsid+xml`: MediaType = + new MediaType("application", "route-s-tsid+xml", compressible = true, binary = true, List("sls")) + + lazy val `vnd.kenameaapp`: MediaType = + new MediaType("application", "vnd.kenameaapp", compressible = false, binary = true, List("htke")) + + lazy val `vnd.kahootz`: MediaType = + new MediaType("application", "vnd.kahootz", compressible = false, binary = true, List("ktz", "ktr")) + + lazy val `vnd.cluetrust.cartomobile-config`: MediaType = + new MediaType( "application", - "vnd.dece.data", - Compressible, - NotBinary, - List("uvf", "uvvf", "uvd", "uvvd"), + "vnd.cluetrust.cartomobile-config", + compressible = false, + binary = true, + List("c11amc"), ) - lazy val `vnd.dece.ttml+xml`: MediaType = new MediaType( + + lazy val `vnd.uplanet.alert`: MediaType = + new MediaType("application", "vnd.uplanet.alert", compressible = false, binary = true) + + lazy val `vnd.rar`: MediaType = + new MediaType("application", "vnd.rar", compressible = false, binary = true, List("rar")) + + lazy val `vnd.nokia.landmark+xml`: MediaType = + new MediaType("application", "vnd.nokia.landmark+xml", compressible = true, binary = true) + + lazy val `vnd.ms-windows.nwprinting.oob`: MediaType = + new MediaType("application", "vnd.ms-windows.nwprinting.oob", compressible = false, binary = true) + + lazy val `vnd.yamaha.hv-script`: MediaType = + new MediaType("application", "vnd.yamaha.hv-script", compressible = false, binary = true, List("hvs")) + + lazy val `x-install-instructions`: MediaType = + new MediaType("application", "x-install-instructions", compressible = false, binary = true, List("install")) + + lazy val `vnd.evolv.ecig.settings`: MediaType = + new MediaType("application", "vnd.evolv.ecig.settings", compressible = false, binary = true) + + lazy val `vnd.pg.osasli`: MediaType = + new MediaType("application", "vnd.pg.osasli", compressible = false, binary = true, List("ei6")) + + lazy val `pkcs8`: MediaType = + new MediaType("application", "pkcs8", compressible = false, binary = true, List("p8")) + + lazy val `at+jwt`: MediaType = + new MediaType("application", "at+jwt", compressible = false, binary = true) + + lazy val `vnd.ntt-local.sip-ta_remote`: MediaType = + new MediaType("application", "vnd.ntt-local.sip-ta_remote", compressible = false, binary = true) + + lazy val `vnd.dm.delegation+xml`: MediaType = + new MediaType("application", "vnd.dm.delegation+xml", compressible = true, binary = true) + + lazy val `vnd.intergeo`: MediaType = + new MediaType("application", "vnd.intergeo", compressible = false, binary = true, List("i2g")) + + lazy val `tamp-apex-update`: MediaType = + new MediaType("application", "tamp-apex-update", compressible = false, binary = true) + + lazy val `x-bzip2`: MediaType = + new MediaType("application", "x-bzip2", compressible = false, binary = true, List("bz2", "boz")) + + lazy val `vnd.fujixerox.docuworks`: MediaType = + new MediaType("application", "vnd.fujixerox.docuworks", compressible = false, binary = true, List("xdw")) + + lazy val `ccmp+xml`: MediaType = + new MediaType("application", "ccmp+xml", compressible = true, binary = true) + + lazy val `vnd.ffsns`: MediaType = + new MediaType("application", "vnd.ffsns", compressible = false, binary = true) + + lazy val `x-chat`: MediaType = + new MediaType("application", "x-chat", compressible = false, binary = true, List("chat")) + + lazy val `vnd.ves.encrypted`: MediaType = + new MediaType("application", "vnd.ves.encrypted", compressible = false, binary = true) + + lazy val `vnd.xmpie.ppkg`: MediaType = + new MediaType("application", "vnd.xmpie.ppkg", compressible = false, binary = true) + + lazy val `held+xml`: MediaType = + new MediaType("application", "held+xml", compressible = true, binary = true) + + lazy val `vnd.ms-wmdrm.lic-resp`: MediaType = + new MediaType("application", "vnd.ms-wmdrm.lic-resp", compressible = false, binary = true) + + lazy val `qsig`: MediaType = + new MediaType("application", "qsig", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.presentation-template`: MediaType = + new MediaType( "application", - "vnd.dece.ttml+xml", - Compressible, - NotBinary, - List("uvt", "uvvt"), + "vnd.oasis.opendocument.presentation-template", + compressible = false, + binary = true, + List("otp"), ) - lazy val `vnd.dece.unspecified`: MediaType = new MediaType( - "application", - "vnd.dece.unspecified", - Compressible, - NotBinary, - List("uvx", "uvvx"), - ) - lazy val `vnd.dece.zip`: MediaType = - new MediaType("application", "vnd.dece.zip", Compressible, NotBinary, List("uvz", "uvvz")) - lazy val `vnd.denovo.fcselayout-link`: MediaType = new MediaType( - "application", - "vnd.denovo.fcselayout-link", - Compressible, - NotBinary, - List("fe_launch"), - ) - lazy val `vnd.desmume.movie`: MediaType = - new MediaType("application", "vnd.desmume.movie", Compressible, NotBinary) - lazy val `vnd.dir-bi.plate-dl-nosuffix`: MediaType = - new MediaType("application", "vnd.dir-bi.plate-dl-nosuffix", Compressible, NotBinary) - lazy val `vnd.dm.delegation+xml`: MediaType = - new MediaType("application", "vnd.dm.delegation+xml", Compressible, NotBinary) - lazy val `vnd.dna`: MediaType = - new MediaType("application", "vnd.dna", Compressible, NotBinary, List("dna")) - lazy val `vnd.document+json`: MediaType = - new MediaType("application", "vnd.document+json", Compressible, NotBinary) - lazy val `vnd.dolby.mlp`: MediaType = - new MediaType("application", "vnd.dolby.mlp", Compressible, NotBinary, List("mlp")) - lazy val `vnd.dolby.mobile.1`: MediaType = - new MediaType("application", "vnd.dolby.mobile.1", Compressible, NotBinary) - lazy val `vnd.dolby.mobile.2`: MediaType = - new MediaType("application", "vnd.dolby.mobile.2", Compressible, NotBinary) - lazy val `vnd.doremir.scorecloud-binary-document`: MediaType = new MediaType( - "application", - "vnd.doremir.scorecloud-binary-document", - Compressible, - NotBinary, - ) - lazy val `vnd.dpgraph`: MediaType = - new MediaType("application", "vnd.dpgraph", Compressible, NotBinary, List("dpg")) - lazy val `vnd.dreamfactory`: MediaType = - new MediaType("application", "vnd.dreamfactory", Compressible, NotBinary, List("dfac")) - lazy val `vnd.drive+json`: MediaType = - new MediaType("application", "vnd.drive+json", Compressible, NotBinary) - lazy val `vnd.ds-keypoint`: MediaType = - new MediaType("application", "vnd.ds-keypoint", Compressible, NotBinary, List("kpxx")) - lazy val `vnd.dtg.local`: MediaType = - new MediaType("application", "vnd.dtg.local", Compressible, NotBinary) - lazy val `vnd.dtg.local.flash`: MediaType = - new MediaType("application", "vnd.dtg.local.flash", Compressible, NotBinary) - lazy val `vnd.dtg.local.html`: MediaType = - new MediaType("application", "vnd.dtg.local.html", Compressible, NotBinary) - lazy val `vnd.dvb.ait`: MediaType = - new MediaType("application", "vnd.dvb.ait", Compressible, NotBinary, List("ait")) - lazy val `vnd.dvb.dvbisl+xml`: MediaType = - new MediaType("application", "vnd.dvb.dvbisl+xml", Compressible, NotBinary) - lazy val `vnd.dvb.dvbj`: MediaType = - new MediaType("application", "vnd.dvb.dvbj", Compressible, NotBinary) - lazy val `vnd.dvb.esgcontainer`: MediaType = - new MediaType("application", "vnd.dvb.esgcontainer", Compressible, NotBinary) - lazy val `vnd.dvb.ipdcdftnotifaccess`: MediaType = - new MediaType("application", "vnd.dvb.ipdcdftnotifaccess", Compressible, NotBinary) - lazy val `vnd.dvb.ipdcesgaccess`: MediaType = - new MediaType("application", "vnd.dvb.ipdcesgaccess", Compressible, NotBinary) - lazy val `vnd.dvb.ipdcesgaccess2`: MediaType = - new MediaType("application", "vnd.dvb.ipdcesgaccess2", Compressible, NotBinary) - lazy val `vnd.dvb.ipdcesgpdd`: MediaType = - new MediaType("application", "vnd.dvb.ipdcesgpdd", Compressible, NotBinary) - lazy val `vnd.dvb.ipdcroaming`: MediaType = - new MediaType("application", "vnd.dvb.ipdcroaming", Compressible, NotBinary) - lazy val `vnd.dvb.iptv.alfec-base`: MediaType = - new MediaType("application", "vnd.dvb.iptv.alfec-base", Compressible, NotBinary) - lazy val `vnd.dvb.iptv.alfec-enhancement`: MediaType = - new MediaType("application", "vnd.dvb.iptv.alfec-enhancement", Compressible, NotBinary) - lazy val `vnd.dvb.notif-aggregate-root+xml`: MediaType = - new MediaType("application", "vnd.dvb.notif-aggregate-root+xml", Compressible, NotBinary) - lazy val `vnd.dvb.notif-container+xml`: MediaType = - new MediaType("application", "vnd.dvb.notif-container+xml", Compressible, NotBinary) - lazy val `vnd.dvb.notif-generic+xml`: MediaType = - new MediaType("application", "vnd.dvb.notif-generic+xml", Compressible, NotBinary) - lazy val `vnd.dvb.notif-ia-msglist+xml`: MediaType = - new MediaType("application", "vnd.dvb.notif-ia-msglist+xml", Compressible, NotBinary) - lazy val `vnd.dvb.notif-ia-registration-request+xml`: MediaType = new MediaType( - "application", - "vnd.dvb.notif-ia-registration-request+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.dvb.notif-ia-registration-response+xml`: MediaType = new MediaType( + + lazy val `vnd.iptc.g2.packageitem+xml`: MediaType = + new MediaType("application", "vnd.iptc.g2.packageitem+xml", compressible = true, binary = true) + + lazy val `vnd.realvnc.bed`: MediaType = + new MediaType("application", "vnd.realvnc.bed", compressible = false, binary = true, List("bed")) + + lazy val `mets+xml`: MediaType = + new MediaType("application", "mets+xml", compressible = true, binary = true, List("mets")) + + lazy val `atsc-dynamic-event-message`: MediaType = + new MediaType("application", "atsc-dynamic-event-message", compressible = false, binary = true) + + lazy val `nasdata`: MediaType = + new MediaType("application", "nasdata", compressible = false, binary = true) + + lazy val `x-pilot`: MediaType = + new MediaType("application", "x-pilot", compressible = false, binary = true, List("prc", "pdb")) + + lazy val `java-serialized-object`: MediaType = + new MediaType("application", "java-serialized-object", compressible = false, binary = true, List("ser")) + + lazy val `x-stuffitx`: MediaType = + new MediaType("application", "x-stuffitx", compressible = false, binary = true, List("sitx")) + + lazy val `simple-message-summary`: MediaType = + new MediaType("application", "simple-message-summary", compressible = false, binary = true) + + lazy val `zstd`: MediaType = + new MediaType("application", "zstd", compressible = false, binary = true) + + lazy val `news-transmission`: MediaType = + new MediaType("application", "news-transmission", compressible = false, binary = true) + + lazy val `vnd.fujitsu.oasys`: MediaType = + new MediaType("application", "vnd.fujitsu.oasys", compressible = false, binary = true, List("oas")) + + lazy val `vnd.adobe.xfdf`: MediaType = + new MediaType("application", "vnd.adobe.xfdf", compressible = false, binary = true, List("xfdf")) + + lazy val `dssc+xml`: MediaType = + new MediaType("application", "dssc+xml", compressible = true, binary = true, List("xdssc")) + + lazy val `vnd.netfpx`: MediaType = + new MediaType("application", "vnd.netfpx", compressible = false, binary = true) + + lazy val `vnd.etsi.tsl+xml`: MediaType = + new MediaType("application", "vnd.etsi.tsl+xml", compressible = true, binary = true) + + lazy val `vnd.palm`: MediaType = + new MediaType("application", "vnd.palm", compressible = false, binary = true, List("pdb", "pqa", "oprc")) + + lazy val `expect-ct-report+json`: MediaType = + new MediaType("application", "expect-ct-report+json", compressible = true, binary = false) + + lazy val `applixware`: MediaType = + new MediaType("application", "applixware", compressible = false, binary = true, List("aw")) + + lazy val `vnd.adobe.air-application-installer-package+zip`: MediaType = + new MediaType( "application", - "vnd.dvb.notif-ia-registration-response+xml", - Compressible, - NotBinary, + "vnd.adobe.air-application-installer-package+zip", + compressible = false, + binary = true, + List("air"), ) - lazy val `vnd.dvb.notif-init+xml`: MediaType = - new MediaType("application", "vnd.dvb.notif-init+xml", Compressible, NotBinary) - lazy val `vnd.dvb.pfr`: MediaType = - new MediaType("application", "vnd.dvb.pfr", Compressible, NotBinary) - lazy val `vnd.dvb.service`: MediaType = - new MediaType("application", "vnd.dvb.service", Compressible, NotBinary, List("svc")) - lazy val `vnd.dxr`: MediaType = - new MediaType("application", "vnd.dxr", Compressible, NotBinary) - lazy val `vnd.dynageo`: MediaType = - new MediaType("application", "vnd.dynageo", Compressible, NotBinary, List("geo")) - lazy val `vnd.dzr`: MediaType = - new MediaType("application", "vnd.dzr", Compressible, NotBinary) - lazy val `vnd.easykaraoke.cdgdownload`: MediaType = - new MediaType("application", "vnd.easykaraoke.cdgdownload", Compressible, NotBinary) - lazy val `vnd.ecdis-update`: MediaType = - new MediaType("application", "vnd.ecdis-update", Compressible, NotBinary) - lazy val `vnd.ecip.rlp`: MediaType = - new MediaType("application", "vnd.ecip.rlp", Compressible, NotBinary) - lazy val `vnd.ecowin.chart`: MediaType = - new MediaType("application", "vnd.ecowin.chart", Compressible, NotBinary, List("mag")) - lazy val `vnd.ecowin.filerequest`: MediaType = - new MediaType("application", "vnd.ecowin.filerequest", Compressible, NotBinary) - lazy val `vnd.ecowin.fileupdate`: MediaType = - new MediaType("application", "vnd.ecowin.fileupdate", Compressible, NotBinary) - lazy val `vnd.ecowin.series`: MediaType = - new MediaType("application", "vnd.ecowin.series", Compressible, NotBinary) - lazy val `vnd.ecowin.seriesrequest`: MediaType = - new MediaType("application", "vnd.ecowin.seriesrequest", Compressible, NotBinary) - lazy val `vnd.ecowin.seriesupdate`: MediaType = - new MediaType("application", "vnd.ecowin.seriesupdate", Compressible, NotBinary) - lazy val `vnd.efi.img`: MediaType = - new MediaType("application", "vnd.efi.img", Compressible, NotBinary) - lazy val `vnd.efi.iso`: MediaType = - new MediaType("application", "vnd.efi.iso", Compressible, NotBinary) - lazy val `vnd.emclient.accessrequest+xml`: MediaType = - new MediaType("application", "vnd.emclient.accessrequest+xml", Compressible, NotBinary) - lazy val `vnd.enliven`: MediaType = - new MediaType("application", "vnd.enliven", Compressible, NotBinary, List("nml")) - lazy val `vnd.enphase.envoy`: MediaType = - new MediaType("application", "vnd.enphase.envoy", Compressible, NotBinary) - lazy val `vnd.eprints.data+xml`: MediaType = - new MediaType("application", "vnd.eprints.data+xml", Compressible, NotBinary) - lazy val `vnd.epson.esf`: MediaType = - new MediaType("application", "vnd.epson.esf", Compressible, NotBinary, List("esf")) - lazy val `vnd.epson.msf`: MediaType = - new MediaType("application", "vnd.epson.msf", Compressible, NotBinary, List("msf")) - lazy val `vnd.epson.quickanime`: MediaType = - new MediaType("application", "vnd.epson.quickanime", Compressible, NotBinary, List("qam")) - lazy val `vnd.epson.salt`: MediaType = - new MediaType("application", "vnd.epson.salt", Compressible, NotBinary, List("slt")) - lazy val `vnd.epson.ssf`: MediaType = - new MediaType("application", "vnd.epson.ssf", Compressible, NotBinary, List("ssf")) - lazy val `vnd.ericsson.quickcall`: MediaType = - new MediaType("application", "vnd.ericsson.quickcall", Compressible, NotBinary) - lazy val `vnd.espass-espass+zip`: MediaType = - new MediaType("application", "vnd.espass-espass+zip", Uncompressible, NotBinary) - lazy val `vnd.eszigno3+xml`: MediaType = new MediaType( + + lazy val `vnd.dart`: MediaType = + new MediaType("application", "vnd.dart", compressible = true, binary = true, List("dart")) + + lazy val `vnd.osgi.dp`: MediaType = + new MediaType("application", "vnd.osgi.dp", compressible = false, binary = true, List("dp")) + + lazy val `vnd.sun.xml.impress.template`: MediaType = + new MediaType("application", "vnd.sun.xml.impress.template", compressible = false, binary = true, List("sti")) + + lazy val `vnd.cups-raw`: MediaType = + new MediaType("application", "vnd.cups-raw", compressible = false, binary = true) + + lazy val `alto-cdnifilter+json`: MediaType = + new MediaType("application", "alto-cdnifilter+json", compressible = true, binary = false) + + lazy val `vnd.shana.informed.formdata`: MediaType = + new MediaType("application", "vnd.shana.informed.formdata", compressible = false, binary = true, List("ifm")) + + lazy val `its+xml`: MediaType = + new MediaType("application", "its+xml", compressible = true, binary = true, List("its")) + + lazy val `vnd.zul`: MediaType = + new MediaType("application", "vnd.zul", compressible = false, binary = true, List("zir", "zirz")) + + lazy val `vnd.pvi.ptid1`: MediaType = + new MediaType("application", "vnd.pvi.ptid1", compressible = false, binary = true, List("ptid")) + + lazy val `vnd.3gpp.mcvideo-location-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-location-info+xml", compressible = true, binary = true) + + lazy val `alto-endpointcost+json`: MediaType = + new MediaType("application", "alto-endpointcost+json", compressible = true, binary = false) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.settings+xml`: MediaType = + new MediaType( "application", - "vnd.eszigno3+xml", - Compressible, - NotBinary, - List("es3", "et3"), + "vnd.openxmlformats-officedocument.wordprocessingml.settings+xml", + compressible = true, + binary = true, ) - lazy val `vnd.etsi.aoc+xml`: MediaType = - new MediaType("application", "vnd.etsi.aoc+xml", Compressible, NotBinary) - lazy val `vnd.etsi.asic-e+zip`: MediaType = - new MediaType("application", "vnd.etsi.asic-e+zip", Uncompressible, NotBinary) - lazy val `vnd.etsi.asic-s+zip`: MediaType = - new MediaType("application", "vnd.etsi.asic-s+zip", Uncompressible, NotBinary) - lazy val `vnd.etsi.cug+xml`: MediaType = - new MediaType("application", "vnd.etsi.cug+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvcommand+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvcommand+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvdiscovery+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvdiscovery+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvprofile+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvprofile+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvsad-bc+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvsad-bc+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvsad-cod+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvsad-cod+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvsad-npvr+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvsad-npvr+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvservice+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvservice+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvsync+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvsync+xml", Compressible, NotBinary) - lazy val `vnd.etsi.iptvueprofile+xml`: MediaType = - new MediaType("application", "vnd.etsi.iptvueprofile+xml", Compressible, NotBinary) - lazy val `vnd.etsi.mcid+xml`: MediaType = - new MediaType("application", "vnd.etsi.mcid+xml", Compressible, NotBinary) - lazy val `vnd.etsi.mheg5`: MediaType = - new MediaType("application", "vnd.etsi.mheg5", Compressible, NotBinary) - lazy val `vnd.etsi.overload-control-policy-dataset+xml`: MediaType = new MediaType( + + lazy val `stix+json`: MediaType = + new MediaType("application", "stix+json", compressible = true, binary = false) + + lazy val `vnd.wqd`: MediaType = + new MediaType("application", "vnd.wqd", compressible = false, binary = true, List("wqd")) + + lazy val `vnd.japannet-setstore-wakeup`: MediaType = + new MediaType("application", "vnd.japannet-setstore-wakeup", compressible = false, binary = true) + + lazy val `vnd.ericsson.quickcall`: MediaType = + new MediaType("application", "vnd.ericsson.quickcall", compressible = false, binary = true) + + lazy val `efi`: MediaType = + new MediaType("application", "efi", compressible = false, binary = true) + + lazy val `vnd.android.package-archive`: MediaType = + new MediaType("application", "vnd.android.package-archive", compressible = false, binary = true, List("apk")) + + lazy val `vnd.3gpp.mcptt-ue-config+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-ue-config+xml", compressible = true, binary = true) + + lazy val `vnd.ms-powerpoint.presentation.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.etsi.overload-control-policy-dataset+xml", - Compressible, - NotBinary, + "vnd.ms-powerpoint.presentation.macroenabled.12", + compressible = false, + binary = true, + List("pptm"), ) - lazy val `vnd.etsi.pstn+xml`: MediaType = - new MediaType("application", "vnd.etsi.pstn+xml", Compressible, NotBinary) - lazy val `vnd.etsi.sci+xml`: MediaType = - new MediaType("application", "vnd.etsi.sci+xml", Compressible, NotBinary) - lazy val `vnd.etsi.simservs+xml`: MediaType = - new MediaType("application", "vnd.etsi.simservs+xml", Compressible, NotBinary) - lazy val `vnd.etsi.timestamp-token`: MediaType = - new MediaType("application", "vnd.etsi.timestamp-token", Compressible, NotBinary) - lazy val `vnd.etsi.tsl+xml`: MediaType = - new MediaType("application", "vnd.etsi.tsl+xml", Compressible, NotBinary) - lazy val `vnd.etsi.tsl.der`: MediaType = - new MediaType("application", "vnd.etsi.tsl.der", Compressible, NotBinary) - lazy val `vnd.eudora.data`: MediaType = - new MediaType("application", "vnd.eudora.data", Compressible, NotBinary) - lazy val `vnd.evolv.ecig.profile`: MediaType = - new MediaType("application", "vnd.evolv.ecig.profile", Compressible, NotBinary) - lazy val `vnd.evolv.ecig.settings`: MediaType = - new MediaType("application", "vnd.evolv.ecig.settings", Compressible, NotBinary) - lazy val `vnd.evolv.ecig.theme`: MediaType = - new MediaType("application", "vnd.evolv.ecig.theme", Compressible, NotBinary) - lazy val `vnd.exstream-empower+zip`: MediaType = - new MediaType("application", "vnd.exstream-empower+zip", Uncompressible, NotBinary) - lazy val `vnd.exstream-package`: MediaType = - new MediaType("application", "vnd.exstream-package", Compressible, NotBinary) - lazy val `vnd.ezpix-album`: MediaType = - new MediaType("application", "vnd.ezpix-album", Compressible, NotBinary, List("ez2")) - lazy val `vnd.ezpix-package`: MediaType = - new MediaType("application", "vnd.ezpix-package", Compressible, NotBinary, List("ez3")) - lazy val `vnd.f-secure.mobile`: MediaType = - new MediaType("application", "vnd.f-secure.mobile", Compressible, NotBinary) - lazy val `vnd.fastcopy-disk-image`: MediaType = - new MediaType("application", "vnd.fastcopy-disk-image", Compressible, NotBinary) - lazy val `vnd.fdf`: MediaType = - new MediaType("application", "vnd.fdf", Compressible, NotBinary, List("fdf")) - lazy val `vnd.fdsn.mseed`: MediaType = - new MediaType("application", "vnd.fdsn.mseed", Compressible, NotBinary, List("mseed")) - lazy val `vnd.fdsn.seed`: MediaType = new MediaType( + + lazy val `set-registration`: MediaType = + new MediaType("application", "set-registration", compressible = false, binary = true) + + lazy val `vnd.laszip`: MediaType = + new MediaType("application", "vnd.laszip", compressible = false, binary = true) + + lazy val `vnd.stardivision.writer`: MediaType = + new MediaType("application", "vnd.stardivision.writer", compressible = false, binary = true, List("sdw", "vor")) + + lazy val `gml+xml`: MediaType = + new MediaType("application", "gml+xml", compressible = true, binary = true, List("gml")) + + lazy val `ppsp-tracker+json`: MediaType = + new MediaType("application", "ppsp-tracker+json", compressible = true, binary = false) + + lazy val `cdmi-container`: MediaType = + new MediaType("application", "cdmi-container", compressible = false, binary = true, List("cdmic")) + + lazy val `x-mswrite`: MediaType = + new MediaType("application", "x-mswrite", compressible = false, binary = true, List("wri")) + + lazy val `x-sv4crc`: MediaType = + new MediaType("application", "x-sv4crc", compressible = false, binary = true, List("sv4crc")) + + lazy val `vnd.ms-printdevicecapabilities+xml`: MediaType = + new MediaType("application", "vnd.ms-printdevicecapabilities+xml", compressible = true, binary = true) + + lazy val `vnd.mobius.mbk`: MediaType = + new MediaType("application", "vnd.mobius.mbk", compressible = false, binary = true, List("mbk")) + + lazy val `vnd.fujifilm.fb.docuworks.container`: MediaType = + new MediaType("application", "vnd.fujifilm.fb.docuworks.container", compressible = false, binary = true) + + lazy val `tamp-sequence-adjust-confirm`: MediaType = + new MediaType("application", "tamp-sequence-adjust-confirm", compressible = false, binary = true) + + lazy val `fastinfoset`: MediaType = + new MediaType("application", "fastinfoset", compressible = false, binary = true) + + lazy val `vnd.veryant.thin`: MediaType = + new MediaType("application", "vnd.veryant.thin", compressible = false, binary = true) + + lazy val `vcard+json`: MediaType = + new MediaType("application", "vcard+json", compressible = true, binary = false) + + lazy val `vnd.audiograph`: MediaType = + new MediaType("application", "vnd.audiograph", compressible = false, binary = true, List("aep")) + + lazy val `vnd.heroku+json`: MediaType = + new MediaType("application", "vnd.heroku+json", compressible = true, binary = false) + + lazy val `vnd.mobius.msl`: MediaType = + new MediaType("application", "vnd.mobius.msl", compressible = false, binary = true, List("msl")) + + lazy val `vnd.dvb.pfr`: MediaType = + new MediaType("application", "vnd.dvb.pfr", compressible = false, binary = true) + + lazy val `vnd.enliven`: MediaType = + new MediaType("application", "vnd.enliven", compressible = false, binary = true, List("nml")) + + lazy val `x-dtbook+xml`: MediaType = + new MediaType("application", "x-dtbook+xml", compressible = true, binary = true, List("dtb")) + + lazy val `pdx`: MediaType = + new MediaType("application", "pdx", compressible = false, binary = true) + + lazy val `vnd.3gpp-prose-pc8+xml`: MediaType = + new MediaType("application", "vnd.3gpp-prose-pc8+xml", compressible = true, binary = true) + + lazy val `atom+xml`: MediaType = + new MediaType("application", "atom+xml", compressible = true, binary = true, List("atom")) + + lazy val `vnd.fut-misnet`: MediaType = + new MediaType("application", "vnd.fut-misnet", compressible = false, binary = true) + + lazy val `x-iwork-numbers-sffnumbers`: MediaType = + new MediaType("application", "x-iwork-numbers-sffnumbers", compressible = false, binary = true, List("numbers")) + + lazy val `vnd.micro+json`: MediaType = + new MediaType("application", "vnd.micro+json", compressible = true, binary = false) + + lazy val `vnd.blueice.multipass`: MediaType = + new MediaType("application", "vnd.blueice.multipass", compressible = false, binary = true, List("mpm")) + + lazy val `vnd.3gpp.mcvideo-transmission-request+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-transmission-request+xml", compressible = true, binary = true) + + lazy val `mbms-associated-procedure-description+xml`: MediaType = + new MediaType("application", "mbms-associated-procedure-description+xml", compressible = true, binary = true) + + lazy val `vnd.bbf.usp.msg+json`: MediaType = + new MediaType("application", "vnd.bbf.usp.msg+json", compressible = true, binary = false) + + lazy val `vnd.radisys.msml-conf+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-conf+xml", compressible = true, binary = true) + + lazy val `vnd.futoin+json`: MediaType = + new MediaType("application", "vnd.futoin+json", compressible = true, binary = false) + + lazy val `vnd.mophun.application`: MediaType = + new MediaType("application", "vnd.mophun.application", compressible = false, binary = true, List("mpn")) + + lazy val `x-rar-compressed`: MediaType = + new MediaType("application", "x-rar-compressed", compressible = false, binary = true, List("rar")) + + lazy val `vnd.3gpp.mcvideo-affiliation-command+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-affiliation-command+xml", compressible = true, binary = true) + + lazy val `vnd.publishare-delta-tree`: MediaType = + new MediaType("application", "vnd.publishare-delta-tree", compressible = false, binary = true, List("qps")) + + lazy val `vnd.font-fontforge-sfd`: MediaType = + new MediaType("application", "vnd.font-fontforge-sfd", compressible = false, binary = true) + + lazy val `vnd.autopackage`: MediaType = + new MediaType("application", "vnd.autopackage", compressible = false, binary = true) + + lazy val `vnd.airzip.filesecure.azs`: MediaType = + new MediaType("application", "vnd.airzip.filesecure.azs", compressible = false, binary = true, List("azs")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml`: MediaType = + new MediaType( "application", - "vnd.fdsn.seed", - Compressible, - NotBinary, - List("seed", "dataless"), + "vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml", + compressible = true, + binary = true, ) - lazy val `vnd.ffsns`: MediaType = - new MediaType("application", "vnd.ffsns", Compressible, NotBinary) - lazy val `vnd.ficlab.flb+zip`: MediaType = - new MediaType("application", "vnd.ficlab.flb+zip", Uncompressible, NotBinary) - lazy val `vnd.filmit.zfc`: MediaType = - new MediaType("application", "vnd.filmit.zfc", Compressible, NotBinary) - lazy val `vnd.fints`: MediaType = - new MediaType("application", "vnd.fints", Compressible, NotBinary) - lazy val `vnd.firemonkeys.cloudcell`: MediaType = - new MediaType("application", "vnd.firemonkeys.cloudcell", Compressible, NotBinary) - lazy val `vnd.flographit`: MediaType = - new MediaType("application", "vnd.flographit", Compressible, NotBinary, List("gph")) - lazy val `vnd.fluxtime.clip`: MediaType = - new MediaType("application", "vnd.fluxtime.clip", Compressible, NotBinary, List("ftc")) - lazy val `vnd.font-fontforge-sfd`: MediaType = - new MediaType("application", "vnd.font-fontforge-sfd", Compressible, NotBinary) - lazy val `vnd.framemaker`: MediaType = new MediaType( + + lazy val `vnd.americandynamics.acc`: MediaType = + new MediaType("application", "vnd.americandynamics.acc", compressible = false, binary = true, List("acc")) + + lazy val `xslt+xml`: MediaType = + new MediaType("application", "xslt+xml", compressible = true, binary = true, List("xsl", "xslt")) + + lazy val `rls-services+xml`: MediaType = + new MediaType("application", "rls-services+xml", compressible = true, binary = true, List("rs")) + + lazy val `moss-keys`: MediaType = + new MediaType("application", "moss-keys", compressible = false, binary = true) + + lazy val `vnd.ibm.afplinedata`: MediaType = + new MediaType("application", "vnd.ibm.afplinedata", compressible = false, binary = true) + + lazy val `x-font-bdf`: MediaType = + new MediaType("application", "x-font-bdf", compressible = false, binary = true, List("bdf")) + + lazy val `vnd.hp-hps`: MediaType = + new MediaType("application", "vnd.hp-hps", compressible = false, binary = true, List("hps")) + + lazy val `vnd.apothekende.reservation+json`: MediaType = + new MediaType("application", "vnd.apothekende.reservation+json", compressible = true, binary = false) + + lazy val `vnd.hzn-3d-crossword`: MediaType = + new MediaType("application", "vnd.hzn-3d-crossword", compressible = false, binary = true) + + lazy val `vnd.japannet-registration`: MediaType = + new MediaType("application", "vnd.japannet-registration", compressible = false, binary = true) + + lazy val `vnd.sun.xml.calc`: MediaType = + new MediaType("application", "vnd.sun.xml.calc", compressible = false, binary = true, List("sxc")) + + lazy val `vnd.wolfram.mathematica.package`: MediaType = + new MediaType("application", "vnd.wolfram.mathematica.package", compressible = false, binary = true) + + lazy val `vnd.framemaker`: MediaType = + new MediaType( "application", "vnd.framemaker", - Compressible, - NotBinary, + compressible = false, + binary = true, List("fm", "frame", "maker", "book"), ) - lazy val `vnd.frogans.fnc`: MediaType = - new MediaType("application", "vnd.frogans.fnc", Compressible, NotBinary, List("fnc")) - lazy val `vnd.frogans.ltf`: MediaType = - new MediaType("application", "vnd.frogans.ltf", Compressible, NotBinary, List("ltf")) - lazy val `vnd.fsc.weblaunch`: MediaType = - new MediaType("application", "vnd.fsc.weblaunch", Compressible, NotBinary, List("fsc")) - lazy val `vnd.fujifilm.fb.docuworks`: MediaType = - new MediaType("application", "vnd.fujifilm.fb.docuworks", Compressible, NotBinary) - lazy val `vnd.fujifilm.fb.docuworks.binder`: MediaType = - new MediaType("application", "vnd.fujifilm.fb.docuworks.binder", Compressible, NotBinary) - lazy val `vnd.fujifilm.fb.docuworks.container`: MediaType = - new MediaType("application", "vnd.fujifilm.fb.docuworks.container", Compressible, NotBinary) - lazy val `vnd.fujifilm.fb.jfi+xml`: MediaType = - new MediaType("application", "vnd.fujifilm.fb.jfi+xml", Compressible, NotBinary) - lazy val `vnd.fujitsu.oasys`: MediaType = - new MediaType("application", "vnd.fujitsu.oasys", Compressible, NotBinary, List("oas")) - lazy val `vnd.fujitsu.oasys2`: MediaType = - new MediaType("application", "vnd.fujitsu.oasys2", Compressible, NotBinary, List("oa2")) - lazy val `vnd.fujitsu.oasys3`: MediaType = - new MediaType("application", "vnd.fujitsu.oasys3", Compressible, NotBinary, List("oa3")) - lazy val `vnd.fujitsu.oasysgp`: MediaType = - new MediaType("application", "vnd.fujitsu.oasysgp", Compressible, NotBinary, List("fg5")) - lazy val `vnd.fujitsu.oasysprs`: MediaType = - new MediaType("application", "vnd.fujitsu.oasysprs", Compressible, NotBinary, List("bh2")) - lazy val `vnd.fujixerox.art-ex`: MediaType = - new MediaType("application", "vnd.fujixerox.art-ex", Compressible, NotBinary) - lazy val `vnd.fujixerox.art4`: MediaType = - new MediaType("application", "vnd.fujixerox.art4", Compressible, NotBinary) - lazy val `vnd.fujixerox.ddd`: MediaType = - new MediaType("application", "vnd.fujixerox.ddd", Compressible, NotBinary, List("ddd")) - lazy val `vnd.fujixerox.docuworks`: MediaType = new MediaType( + + lazy val `vnd.3gpp.5gnas`: MediaType = + new MediaType("application", "vnd.3gpp.5gnas", compressible = false, binary = true) + + lazy val `vnd.zzazz.deck+xml`: MediaType = + new MediaType("application", "vnd.zzazz.deck+xml", compressible = true, binary = true, List("zaz")) + + lazy val `index.obj`: MediaType = + new MediaType("application", "index.obj", compressible = false, binary = true) + + lazy val `vnd.pagerduty+json`: MediaType = + new MediaType("application", "vnd.pagerduty+json", compressible = true, binary = false) + + lazy val `vnd.uplanet.bearer-choice`: MediaType = + new MediaType("application", "vnd.uplanet.bearer-choice", compressible = false, binary = true) + + lazy val `vnd.llamagraphics.life-balance.desktop`: MediaType = + new MediaType( "application", - "vnd.fujixerox.docuworks", - Compressible, - NotBinary, - List("xdw"), + "vnd.llamagraphics.life-balance.desktop", + compressible = false, + binary = true, + List("lbd"), ) - lazy val `vnd.fujixerox.docuworks.binder`: MediaType = new MediaType( + + lazy val `ttml+xml`: MediaType = + new MediaType("application", "ttml+xml", compressible = true, binary = true, List("ttml")) + + lazy val `vnd.xmi+xml`: MediaType = + new MediaType("application", "vnd.xmi+xml", compressible = true, binary = true) + + lazy val `vnd.nebumind.line`: MediaType = + new MediaType("application", "vnd.nebumind.line", compressible = false, binary = true) + + lazy val `x-pkcs7-certificates`: MediaType = + new MediaType("application", "x-pkcs7-certificates", compressible = false, binary = true, List("p7b", "spc")) + + lazy val `sparql-query`: MediaType = + new MediaType("application", "sparql-query", compressible = false, binary = true, List("rq")) + + lazy val `vnd.hp-hpid`: MediaType = + new MediaType("application", "vnd.hp-hpid", compressible = false, binary = true, List("hpid")) + + lazy val `mrb-consumer+xml`: MediaType = + new MediaType("application", "mrb-consumer+xml", compressible = true, binary = true) + + lazy val `vnd.sbm.mid2`: MediaType = + new MediaType("application", "vnd.sbm.mid2", compressible = false, binary = true) + + lazy val `mosskey-data`: MediaType = + new MediaType("application", "mosskey-data", compressible = false, binary = true) + + lazy val `vnd.hp-pcl`: MediaType = + new MediaType("application", "vnd.hp-pcl", compressible = false, binary = true, List("pcl")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.tags+xml`: MediaType = + new MediaType( "application", - "vnd.fujixerox.docuworks.binder", - Compressible, - NotBinary, - List("xbd"), + "vnd.openxmlformats-officedocument.presentationml.tags+xml", + compressible = true, + binary = true, ) - lazy val `vnd.fujixerox.docuworks.container`: MediaType = - new MediaType("application", "vnd.fujixerox.docuworks.container", Compressible, NotBinary) - lazy val `vnd.fujixerox.hbpl`: MediaType = - new MediaType("application", "vnd.fujixerox.hbpl", Compressible, NotBinary) - lazy val `vnd.fut-misnet`: MediaType = - new MediaType("application", "vnd.fut-misnet", Compressible, NotBinary) - lazy val `vnd.futoin+cbor`: MediaType = - new MediaType("application", "vnd.futoin+cbor", Compressible, NotBinary) - lazy val `vnd.futoin+json`: MediaType = - new MediaType("application", "vnd.futoin+json", Compressible, NotBinary) - lazy val `vnd.fuzzysheet`: MediaType = - new MediaType("application", "vnd.fuzzysheet", Compressible, NotBinary, List("fzs")) - lazy val `vnd.genomatix.tuxedo`: MediaType = - new MediaType("application", "vnd.genomatix.tuxedo", Compressible, NotBinary, List("txd")) - lazy val `vnd.gentics.grd+json`: MediaType = - new MediaType("application", "vnd.gentics.grd+json", Compressible, NotBinary) - lazy val `vnd.geo+json`: MediaType = - new MediaType("application", "vnd.geo+json", Compressible, NotBinary) - lazy val `vnd.geocube+xml`: MediaType = - new MediaType("application", "vnd.geocube+xml", Compressible, NotBinary) - lazy val `vnd.geogebra.file`: MediaType = - new MediaType("application", "vnd.geogebra.file", Compressible, NotBinary, List("ggb")) - lazy val `vnd.geogebra.slides`: MediaType = - new MediaType("application", "vnd.geogebra.slides", Compressible, NotBinary) - lazy val `vnd.geogebra.tool`: MediaType = - new MediaType("application", "vnd.geogebra.tool", Compressible, NotBinary, List("ggt")) - lazy val `vnd.geometry-explorer`: MediaType = new MediaType( + + lazy val `linkset`: MediaType = + new MediaType("application", "linkset", compressible = false, binary = true) + + lazy val `vnd.coreos.ignition+json`: MediaType = + new MediaType("application", "vnd.coreos.ignition+json", compressible = true, binary = false) + + lazy val `vnd.ims.imsccv1p2`: MediaType = + new MediaType("application", "vnd.ims.imsccv1p2", compressible = false, binary = true) + + lazy val `vnd.dzr`: MediaType = + new MediaType("application", "vnd.dzr", compressible = false, binary = true) + + lazy val `vnd.hcl-bireports`: MediaType = + new MediaType("application", "vnd.hcl-bireports", compressible = false, binary = true) + + lazy val `vnd.mophun.certificate`: MediaType = + new MediaType("application", "vnd.mophun.certificate", compressible = false, binary = true, List("mpc")) + + lazy val `vnd.ims.lti.v2.toolproxy+json`: MediaType = + new MediaType("application", "vnd.ims.lti.v2.toolproxy+json", compressible = true, binary = false) + + lazy val `vnd.piaccess.application-licence`: MediaType = + new MediaType("application", "vnd.piaccess.application-licence", compressible = false, binary = true) + + lazy val `vnd.cloanto.rp9`: MediaType = + new MediaType("application", "vnd.cloanto.rp9", compressible = false, binary = true, List("rp9")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.slidemaster+xml`: MediaType = + new MediaType( "application", - "vnd.geometry-explorer", - Compressible, - NotBinary, - List("gex", "gre"), + "vnd.openxmlformats-officedocument.presentationml.slidemaster+xml", + compressible = true, + binary = true, ) - lazy val `vnd.geonext`: MediaType = - new MediaType("application", "vnd.geonext", Compressible, NotBinary, List("gxt")) - lazy val `vnd.geoplan`: MediaType = - new MediaType("application", "vnd.geoplan", Compressible, NotBinary, List("g2w")) - lazy val `vnd.geospace`: MediaType = - new MediaType("application", "vnd.geospace", Compressible, NotBinary, List("g3w")) - lazy val `vnd.gerber`: MediaType = - new MediaType("application", "vnd.gerber", Compressible, NotBinary) - lazy val `vnd.globalplatform.card-content-mgt`: MediaType = - new MediaType("application", "vnd.globalplatform.card-content-mgt", Compressible, NotBinary) - lazy val `vnd.globalplatform.card-content-mgt-response`: MediaType = new MediaType( + + lazy val `vnd.paos.xml`: MediaType = + new MediaType("application", "vnd.paos.xml", compressible = false, binary = true) + + lazy val `vnd.dvb.notif-ia-registration-response+xml`: MediaType = + new MediaType("application", "vnd.dvb.notif-ia-registration-response+xml", compressible = true, binary = true) + + lazy val `x-cpio`: MediaType = + new MediaType("application", "x-cpio", compressible = false, binary = true, List("cpio")) + + lazy val `vnd.recordare.musicxml`: MediaType = + new MediaType("application", "vnd.recordare.musicxml", compressible = false, binary = true, List("mxl")) + + lazy val `atomicmail`: MediaType = + new MediaType("application", "atomicmail", compressible = false, binary = true) + + lazy val `vnd.uplanet.cacheop-wbxml`: MediaType = + new MediaType("application", "vnd.uplanet.cacheop-wbxml", compressible = false, binary = true) + + lazy val `set-payment-initiation`: MediaType = + new MediaType("application", "set-payment-initiation", compressible = false, binary = true, List("setpay")) + + lazy val `vnd.stardivision.draw`: MediaType = + new MediaType("application", "vnd.stardivision.draw", compressible = false, binary = true, List("sda")) + + lazy val `vnd.nimn`: MediaType = + new MediaType("application", "vnd.nimn", compressible = false, binary = true) + + lazy val `vnd.powerbuilder7`: MediaType = + new MediaType("application", "vnd.powerbuilder7", compressible = false, binary = true) + + lazy val `vnd.apple.pkpass`: MediaType = + new MediaType("application", "vnd.apple.pkpass", compressible = false, binary = true, List("pkpass")) + + lazy val `vnd.uplanet.listcmd`: MediaType = + new MediaType("application", "vnd.uplanet.listcmd", compressible = false, binary = true) + + lazy val `oebps-package+xml`: MediaType = + new MediaType("application", "oebps-package+xml", compressible = true, binary = true, List("opf")) + + lazy val `vnd.wfa.dpp`: MediaType = + new MediaType("application", "vnd.wfa.dpp", compressible = false, binary = true) + + lazy val `gltf-buffer`: MediaType = + new MediaType("application", "gltf-buffer", compressible = false, binary = true) + + lazy val `x-dtbresource+xml`: MediaType = + new MediaType("application", "x-dtbresource+xml", compressible = true, binary = true, List("res")) + + lazy val `x-deb`: MediaType = + new MediaType("application", "x-deb", compressible = false, binary = true) + + lazy val `vnd.street-stream`: MediaType = + new MediaType("application", "vnd.street-stream", compressible = false, binary = true) + + lazy val `vnd.3gpp-v2x-local-service-information`: MediaType = + new MediaType("application", "vnd.3gpp-v2x-local-service-information", compressible = false, binary = true) + + lazy val `vnd.dvb.ipdcesgpdd`: MediaType = + new MediaType("application", "vnd.dvb.ipdcesgpdd", compressible = false, binary = true) + + lazy val `vnd.fdsn.mseed`: MediaType = + new MediaType("application", "vnd.fdsn.mseed", compressible = false, binary = true, List("mseed")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml`: MediaType = + new MediaType( "application", - "vnd.globalplatform.card-content-mgt-response", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml", + compressible = true, + binary = true, ) - lazy val `vnd.gmx`: MediaType = - new MediaType("application", "vnd.gmx", Compressible, NotBinary, List("gmx")) - lazy val `vnd.google-apps.document`: MediaType = new MediaType( + + lazy val `vnd.uplanet.channel-wbxml`: MediaType = + new MediaType("application", "vnd.uplanet.channel-wbxml", compressible = false, binary = true) + + lazy val `vnd.yamaha.hv-voice`: MediaType = + new MediaType("application", "vnd.yamaha.hv-voice", compressible = false, binary = true, List("hvp")) + + lazy val `alto-propmap+json`: MediaType = + new MediaType("application", "alto-propmap+json", compressible = true, binary = false) + + lazy val `vnd.1000minds.decision-model+xml`: MediaType = + new MediaType("application", "vnd.1000minds.decision-model+xml", compressible = true, binary = true, List("1km")) + + lazy val `mathematica`: MediaType = + new MediaType("application", "mathematica", compressible = false, binary = true, List("ma", "nb", "mb")) + + lazy val `problem+json`: MediaType = + new MediaType("application", "problem+json", compressible = true, binary = false) + + lazy val `vnd.iptc.g2.newsitem+xml`: MediaType = + new MediaType("application", "vnd.iptc.g2.newsitem+xml", compressible = true, binary = true) + + lazy val `vnd.nokia.landmarkcollection+xml`: MediaType = + new MediaType("application", "vnd.nokia.landmarkcollection+xml", compressible = true, binary = true) + + lazy val `x-xliff+xml`: MediaType = + new MediaType("application", "x-xliff+xml", compressible = true, binary = true, List("xlf")) + + lazy val `atsc-dwd+xml`: MediaType = + new MediaType("application", "atsc-dwd+xml", compressible = true, binary = true, List("dwd")) + + lazy val `automationml-amlx+zip`: MediaType = + new MediaType("application", "automationml-amlx+zip", compressible = false, binary = true, List("amlx")) + + lazy val `vnd.bluetooth.ep.oob`: MediaType = + new MediaType("application", "vnd.bluetooth.ep.oob", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.styles+xml`: MediaType = + new MediaType( "application", - "vnd.google-apps.document", - Uncompressible, - NotBinary, - List("gdoc"), + "vnd.openxmlformats-officedocument.wordprocessingml.styles+xml", + compressible = true, + binary = true, ) - lazy val `vnd.google-apps.presentation`: MediaType = new MediaType( + + lazy val `vnd.cendio.thinlinc.clientconf`: MediaType = + new MediaType("application", "vnd.cendio.thinlinc.clientconf", compressible = false, binary = true) + + lazy val `vnd.etsi.overload-control-policy-dataset+xml`: MediaType = + new MediaType("application", "vnd.etsi.overload-control-policy-dataset+xml", compressible = true, binary = true) + + lazy val `urc-uisocketdesc+xml`: MediaType = + new MediaType("application", "urc-uisocketdesc+xml", compressible = true, binary = true) + + lazy val `vnd.radisys.msml+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml+xml", compressible = true, binary = true) + + lazy val `vnd.dvb.dvbj`: MediaType = + new MediaType("application", "vnd.dvb.dvbj", compressible = false, binary = true) + + lazy val `vnd.windows.devicepairing`: MediaType = + new MediaType("application", "vnd.windows.devicepairing", compressible = false, binary = true) + + lazy val `vnd.comicbook-rar`: MediaType = + new MediaType("application", "vnd.comicbook-rar", compressible = false, binary = true) + + lazy val `captive+json`: MediaType = + new MediaType("application", "captive+json", compressible = true, binary = false) + + lazy val `vnd.etsi.iptvcommand+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvcommand+xml", compressible = true, binary = true) + + lazy val `vnd.cups-postscript`: MediaType = + new MediaType("application", "vnd.cups-postscript", compressible = false, binary = true) + + lazy val `vnd.gentoo.catmetadata+xml`: MediaType = + new MediaType("application", "vnd.gentoo.catmetadata+xml", compressible = true, binary = true) + + lazy val `vnd.collection+json`: MediaType = + new MediaType("application", "vnd.collection+json", compressible = true, binary = false) + + lazy val `vnd.oma.lwm2m+json`: MediaType = + new MediaType("application", "vnd.oma.lwm2m+json", compressible = true, binary = false) + + lazy val `vnd.hp-jlyt`: MediaType = + new MediaType("application", "vnd.hp-jlyt", compressible = false, binary = true, List("jlt")) + + lazy val `vnd.veritone.aion+json`: MediaType = + new MediaType("application", "vnd.veritone.aion+json", compressible = true, binary = false) + + lazy val `wasm`: MediaType = + new MediaType("application", "wasm", compressible = true, binary = true, List("wasm")) + + lazy val `vnd.oma.drm.risd+xml`: MediaType = + new MediaType("application", "vnd.oma.drm.risd+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml`: MediaType = + new MediaType( "application", - "vnd.google-apps.presentation", - Uncompressible, - NotBinary, - List("gslides"), + "vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml", + compressible = true, + binary = true, ) - lazy val `vnd.google-apps.spreadsheet`: MediaType = new MediaType( + + lazy val `vnd.adobe.xdp+xml`: MediaType = + new MediaType("application", "vnd.adobe.xdp+xml", compressible = true, binary = true, List("xdp")) + + lazy val `vnd.adobe.flash.movie`: MediaType = + new MediaType("application", "vnd.adobe.flash.movie", compressible = false, binary = true) + + lazy val `vnd.novadigm.ext`: MediaType = + new MediaType("application", "vnd.novadigm.ext", compressible = false, binary = true, List("ext")) + + lazy val `vnd.las.las+json`: MediaType = + new MediaType("application", "vnd.las.las+json", compressible = true, binary = false) + + lazy val `x-msbinder`: MediaType = + new MediaType("application", "x-msbinder", compressible = false, binary = true, List("obd")) + + lazy val `coap-group+json`: MediaType = + new MediaType("application", "coap-group+json", compressible = true, binary = false) + + lazy val `vnd.oma-scws-config`: MediaType = + new MediaType("application", "vnd.oma-scws-config", compressible = false, binary = true) + + lazy val `vnd.xfdl`: MediaType = + new MediaType("application", "vnd.xfdl", compressible = false, binary = true, List("xfdl")) + + lazy val `vnd.oma.bcast.notification+xml`: MediaType = + new MediaType("application", "vnd.oma.bcast.notification+xml", compressible = true, binary = true) + + lazy val `x-msclip`: MediaType = + new MediaType("application", "x-msclip", compressible = false, binary = true, List("clp")) + + lazy val `vnd.apple.installer+xml`: MediaType = + new MediaType("application", "vnd.apple.installer+xml", compressible = true, binary = true, List("mpkg")) + + lazy val `vnd.marlin.drm.actiontoken+xml`: MediaType = + new MediaType("application", "vnd.marlin.drm.actiontoken+xml", compressible = true, binary = true) + + lazy val `marc`: MediaType = + new MediaType("application", "marc", compressible = false, binary = true, List("mrc")) + + lazy val `vnd.etsi.iptvsync+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvsync+xml", compressible = true, binary = true) + + lazy val `x-conference`: MediaType = + new MediaType("application", "x-conference", compressible = false, binary = true, List("nsc")) + + lazy val `vnd.epson.esf`: MediaType = + new MediaType("application", "vnd.epson.esf", compressible = false, binary = true, List("esf")) + + lazy val `vnd.oma.bcast.provisioningtrigger`: MediaType = + new MediaType("application", "vnd.oma.bcast.provisioningtrigger", compressible = false, binary = true) + + lazy val `vnd.dna`: MediaType = + new MediaType("application", "vnd.dna", compressible = false, binary = true, List("dna")) + + lazy val `soap+xml`: MediaType = + new MediaType("application", "soap+xml", compressible = true, binary = true) + + lazy val `vnd.etsi.simservs+xml`: MediaType = + new MediaType("application", "vnd.etsi.simservs+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.document`: MediaType = + new MediaType( "application", - "vnd.google-apps.spreadsheet", - Uncompressible, - NotBinary, - List("gsheet"), + "vnd.openxmlformats-officedocument.wordprocessingml.document", + compressible = false, + binary = true, + List("docx"), ) - lazy val `vnd.google-earth.kml+xml`: MediaType = new MediaType( + + lazy val `vnd.microsoft.portable-executable`: MediaType = + new MediaType("application", "vnd.microsoft.portable-executable", compressible = false, binary = true) + + lazy val `vnd.ms-powerpoint.addin.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.google-earth.kml+xml", - Compressible, - NotBinary, - List("kml"), + "vnd.ms-powerpoint.addin.macroenabled.12", + compressible = false, + binary = true, + List("ppam"), ) - lazy val `vnd.google-earth.kmz`: MediaType = - new MediaType("application", "vnd.google-earth.kmz", Uncompressible, Binary, List("kmz")) - lazy val `vnd.gov.sk.e-form+xml`: MediaType = - new MediaType("application", "vnd.gov.sk.e-form+xml", Compressible, NotBinary) - lazy val `vnd.gov.sk.e-form+zip`: MediaType = - new MediaType("application", "vnd.gov.sk.e-form+zip", Uncompressible, NotBinary) - lazy val `vnd.gov.sk.xmldatacontainer+xml`: MediaType = - new MediaType("application", "vnd.gov.sk.xmldatacontainer+xml", Compressible, NotBinary) - lazy val `vnd.grafeq`: MediaType = - new MediaType("application", "vnd.grafeq", Compressible, NotBinary, List("gqf", "gqs")) - lazy val `vnd.gridmp`: MediaType = - new MediaType("application", "vnd.gridmp", Compressible, NotBinary) - lazy val `vnd.groove-account`: MediaType = - new MediaType("application", "vnd.groove-account", Compressible, NotBinary, List("gac")) - lazy val `vnd.groove-help`: MediaType = - new MediaType("application", "vnd.groove-help", Compressible, NotBinary, List("ghf")) - lazy val `vnd.groove-identity-message`: MediaType = new MediaType( + + lazy val `vnd.think-cell.ppttc+json`: MediaType = + new MediaType("application", "vnd.think-cell.ppttc+json", compressible = true, binary = false) + + lazy val `vnd.avistar+xml`: MediaType = + new MediaType("application", "vnd.avistar+xml", compressible = true, binary = true) + + lazy val `vnd.las.las+xml`: MediaType = + new MediaType("application", "vnd.las.las+xml", compressible = true, binary = true, List("lasxml")) + + lazy val `vnd.ms-powerpoint.slideshow.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.groove-identity-message", - Compressible, - NotBinary, - List("gim"), + "vnd.ms-powerpoint.slideshow.macroenabled.12", + compressible = false, + binary = true, + List("ppsm"), ) - lazy val `vnd.groove-injector`: MediaType = - new MediaType("application", "vnd.groove-injector", Compressible, NotBinary, List("grv")) - lazy val `vnd.groove-tool-message`: MediaType = new MediaType( + + lazy val `vnd.ims.lti.v2.toolproxy.id+json`: MediaType = + new MediaType("application", "vnd.ims.lti.v2.toolproxy.id+json", compressible = true, binary = false) + + lazy val `vnd.nintendo.nitro.rom`: MediaType = + new MediaType("application", "vnd.nintendo.nitro.rom", compressible = false, binary = true) + + lazy val `vnd.apache.arrow.file`: MediaType = + new MediaType("application", "vnd.apache.arrow.file", compressible = false, binary = true) + + lazy val `ipfix`: MediaType = + new MediaType("application", "ipfix", compressible = false, binary = true, List("ipfix")) + + lazy val `vnd.3gpp.mcptt-floor-request+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-floor-request+xml", compressible = true, binary = true) + + lazy val `alto-updatestreamparams+json`: MediaType = + new MediaType("application", "alto-updatestreamparams+json", compressible = true, binary = false) + + lazy val `vnd.ibm.minipay`: MediaType = + new MediaType("application", "vnd.ibm.minipay", compressible = false, binary = true, List("mpy")) + + lazy val `vnd.document+json`: MediaType = + new MediaType("application", "vnd.document+json", compressible = true, binary = false) + + lazy val `vnd.groove-tool-template`: MediaType = + new MediaType("application", "vnd.groove-tool-template", compressible = false, binary = true, List("tpl")) + + lazy val `vnd.oasis.opendocument.chart-template`: MediaType = + new MediaType( "application", - "vnd.groove-tool-message", - Compressible, - NotBinary, - List("gtm"), + "vnd.oasis.opendocument.chart-template", + compressible = false, + binary = true, + List("otc"), ) - lazy val `vnd.groove-tool-template`: MediaType = new MediaType( + + lazy val `vnd.ms-wmdrm.lic-chlg-req`: MediaType = + new MediaType("application", "vnd.ms-wmdrm.lic-chlg-req", compressible = false, binary = true) + + lazy val `vnd.wasmflow.wafl`: MediaType = + new MediaType("application", "vnd.wasmflow.wafl", compressible = false, binary = true) + + lazy val `vnd.google-earth.kml+xml`: MediaType = + new MediaType("application", "vnd.google-earth.kml+xml", compressible = true, binary = true, List("kml")) + + lazy val `alto-endpointcostparams+json`: MediaType = + new MediaType("application", "alto-endpointcostparams+json", compressible = true, binary = false) + + lazy val `vnd.radisys.msml-dialog-transform+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-dialog-transform+xml", compressible = true, binary = true) + + lazy val `emergencycalldata.ecall.msd`: MediaType = + new MediaType("application", "emergencycalldata.ecall.msd", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcptt-affiliation-command+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-affiliation-command+xml", compressible = true, binary = true) + + lazy val `mbms-schedule+xml`: MediaType = + new MediaType("application", "mbms-schedule+xml", compressible = true, binary = true) + + lazy val `vnd.nervana`: MediaType = + new MediaType("application", "vnd.nervana", compressible = false, binary = true) + + lazy val `vnd.smart.notebook`: MediaType = + new MediaType("application", "vnd.smart.notebook", compressible = false, binary = true) + + lazy val `vnd.pcos`: MediaType = + new MediaType("application", "vnd.pcos", compressible = false, binary = true) + + lazy val `vnd.valve.source.material`: MediaType = + new MediaType("application", "vnd.valve.source.material", compressible = false, binary = true) + + lazy val `java-archive`: MediaType = + new MediaType("application", "java-archive", compressible = false, binary = true, List("jar", "war", "ear")) + + lazy val `vnd.miele+json`: MediaType = + new MediaType("application", "vnd.miele+json", compressible = true, binary = false) + + lazy val `vnd.3gpp.mcptt-mbms-usage-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-mbms-usage-info+xml", compressible = true, binary = true) + + lazy val `vnd.infotech.project`: MediaType = + new MediaType("application", "vnd.infotech.project", compressible = false, binary = true) + + lazy val `vnd.yamaha.tunnel-udpencap`: MediaType = + new MediaType("application", "vnd.yamaha.tunnel-udpencap", compressible = false, binary = true) + + lazy val `appx`: MediaType = + new MediaType("application", "appx", compressible = false, binary = true, List("appx")) + + lazy val `smpte336m`: MediaType = + new MediaType("application", "smpte336m", compressible = false, binary = true) + + lazy val `x-sv4cpio`: MediaType = + new MediaType("application", "x-sv4cpio", compressible = false, binary = true, List("sv4cpio")) + + lazy val `mbms-user-service-description+xml`: MediaType = + new MediaType("application", "mbms-user-service-description+xml", compressible = true, binary = true) + + lazy val `jwt`: MediaType = + new MediaType("application", "jwt", compressible = false, binary = true) + + lazy val `vnd.fdsn.seed`: MediaType = + new MediaType("application", "vnd.fdsn.seed", compressible = false, binary = true, List("seed", "dataless")) + + lazy val `ipp`: MediaType = + new MediaType("application", "ipp", compressible = false, binary = true) + + lazy val `vnd.yamaha.through-ngn`: MediaType = + new MediaType("application", "vnd.yamaha.through-ngn", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.spreadsheet`: MediaType = + new MediaType( "application", - "vnd.groove-tool-template", - Compressible, - NotBinary, - List("tpl"), - ) - lazy val `vnd.groove-vcard`: MediaType = - new MediaType("application", "vnd.groove-vcard", Compressible, NotBinary, List("vcg")) - lazy val `vnd.hal+json`: MediaType = - new MediaType("application", "vnd.hal+json", Compressible, NotBinary) - lazy val `vnd.hal+xml`: MediaType = - new MediaType("application", "vnd.hal+xml", Compressible, NotBinary, List("hal")) - lazy val `vnd.handheld-entertainment+xml`: MediaType = new MediaType( - "application", - "vnd.handheld-entertainment+xml", - Compressible, - NotBinary, - List("zmm"), - ) - lazy val `vnd.hbci`: MediaType = - new MediaType("application", "vnd.hbci", Compressible, NotBinary, List("hbci")) - lazy val `vnd.hc+json`: MediaType = - new MediaType("application", "vnd.hc+json", Compressible, NotBinary) - lazy val `vnd.hcl-bireports`: MediaType = - new MediaType("application", "vnd.hcl-bireports", Compressible, NotBinary) - lazy val `vnd.hdt`: MediaType = - new MediaType("application", "vnd.hdt", Compressible, NotBinary) - lazy val `vnd.heroku+json`: MediaType = - new MediaType("application", "vnd.heroku+json", Compressible, NotBinary) - lazy val `vnd.hhe.lesson-player`: MediaType = - new MediaType("application", "vnd.hhe.lesson-player", Compressible, NotBinary, List("les")) - lazy val `vnd.hp-hpgl`: MediaType = - new MediaType("application", "vnd.hp-hpgl", Compressible, NotBinary, List("hpgl")) - lazy val `vnd.hp-hpid`: MediaType = - new MediaType("application", "vnd.hp-hpid", Compressible, NotBinary, List("hpid")) - lazy val `vnd.hp-hps`: MediaType = - new MediaType("application", "vnd.hp-hps", Compressible, NotBinary, List("hps")) - lazy val `vnd.hp-jlyt`: MediaType = - new MediaType("application", "vnd.hp-jlyt", Compressible, NotBinary, List("jlt")) - lazy val `vnd.hp-pcl`: MediaType = - new MediaType("application", "vnd.hp-pcl", Compressible, NotBinary, List("pcl")) - lazy val `vnd.hp-pclxl`: MediaType = - new MediaType("application", "vnd.hp-pclxl", Compressible, NotBinary, List("pclxl")) - lazy val `vnd.httphone`: MediaType = - new MediaType("application", "vnd.httphone", Compressible, NotBinary) - lazy val `vnd.hydrostatix.sof-data`: MediaType = new MediaType( - "application", - "vnd.hydrostatix.sof-data", - Compressible, - NotBinary, - List("sfd-hdstx"), + "vnd.oasis.opendocument.spreadsheet", + compressible = false, + binary = true, + List("ods"), ) - lazy val `vnd.hyper+json`: MediaType = - new MediaType("application", "vnd.hyper+json", Compressible, NotBinary) - lazy val `vnd.hyper-item+json`: MediaType = - new MediaType("application", "vnd.hyper-item+json", Compressible, NotBinary) - lazy val `vnd.hyperdrive+json`: MediaType = - new MediaType("application", "vnd.hyperdrive+json", Compressible, NotBinary) - lazy val `vnd.hzn-3d-crossword`: MediaType = - new MediaType("application", "vnd.hzn-3d-crossword", Compressible, NotBinary) - lazy val `vnd.ibm.afplinedata`: MediaType = - new MediaType("application", "vnd.ibm.afplinedata", Compressible, NotBinary) - lazy val `vnd.ibm.electronic-media`: MediaType = - new MediaType("application", "vnd.ibm.electronic-media", Compressible, NotBinary) - lazy val `vnd.ibm.minipay`: MediaType = - new MediaType("application", "vnd.ibm.minipay", Compressible, NotBinary, List("mpy")) - lazy val `vnd.ibm.modcap`: MediaType = new MediaType( + + lazy val `vnd.etsi.iptvsad-npvr+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvsad-npvr+xml", compressible = true, binary = true) + + lazy val `mpeg4-iod-xmt`: MediaType = + new MediaType("application", "mpeg4-iod-xmt", compressible = false, binary = true) + + lazy val `vnd.wv.csp+xml`: MediaType = + new MediaType("application", "vnd.wv.csp+xml", compressible = true, binary = true) + + lazy val `vnd.vectorworks`: MediaType = + new MediaType("application", "vnd.vectorworks", compressible = false, binary = true) + + lazy val `vnd.mynfc`: MediaType = + new MediaType("application", "vnd.mynfc", compressible = false, binary = true, List("taglet")) + + lazy val `vnd.century-systems.tcp_stream`: MediaType = + new MediaType("application", "vnd.century-systems.tcp_stream", compressible = false, binary = true) + + lazy val `clue+xml`: MediaType = + new MediaType("application", "clue+xml", compressible = true, binary = true) + + lazy val `senml+cbor`: MediaType = + new MediaType("application", "senml+cbor", compressible = false, binary = true) + + lazy val `elm+json`: MediaType = + new MediaType("application", "elm+json", compressible = true, binary = false) + + lazy val `vnd.music-niff`: MediaType = + new MediaType("application", "vnd.music-niff", compressible = false, binary = true) + + lazy val `vnd.ibm.modcap`: MediaType = + new MediaType( "application", "vnd.ibm.modcap", - Compressible, - NotBinary, + compressible = false, + binary = true, List("afp", "listafp", "list3820"), ) - lazy val `vnd.ibm.rights-management`: MediaType = new MediaType( + + lazy val `vnd.ctc-posml`: MediaType = + new MediaType("application", "vnd.ctc-posml", compressible = false, binary = true, List("pml")) + + lazy val `p2p-overlay+xml`: MediaType = + new MediaType("application", "p2p-overlay+xml", compressible = true, binary = true, List("relo")) + + lazy val `rfc+xml`: MediaType = + new MediaType("application", "rfc+xml", compressible = true, binary = true) + + lazy val `x-authorware-seg`: MediaType = + new MediaType("application", "x-authorware-seg", compressible = false, binary = true, List("aas")) + + lazy val `vnd.sealed.csf`: MediaType = + new MediaType("application", "vnd.sealed.csf", compressible = false, binary = true) + + lazy val `samlmetadata+xml`: MediaType = + new MediaType("application", "samlmetadata+xml", compressible = true, binary = true) + + lazy val `ssdl+xml`: MediaType = + new MediaType("application", "ssdl+xml", compressible = true, binary = true, List("ssdl")) + + lazy val `missing-blocks+cbor-seq`: MediaType = + new MediaType("application", "missing-blocks+cbor-seq", compressible = false, binary = true) + + lazy val `vnd.mobius.txf`: MediaType = + new MediaType("application", "vnd.mobius.txf", compressible = false, binary = true, List("txf")) + + lazy val `vnd.radisys.msml-audit-conn+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-audit-conn+xml", compressible = true, binary = true) + + lazy val `vnd.futoin+cbor`: MediaType = + new MediaType("application", "vnd.futoin+cbor", compressible = false, binary = true) + + lazy val `vnd.intertrust.digibox`: MediaType = + new MediaType("application", "vnd.intertrust.digibox", compressible = false, binary = true) + + lazy val `vnd.radisys.msml-audit+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-audit+xml", compressible = true, binary = true) + + lazy val `vnd.oma-scws-http-response`: MediaType = + new MediaType("application", "vnd.oma-scws-http-response", compressible = false, binary = true) + + lazy val `x-tar`: MediaType = + new MediaType("application", "x-tar", compressible = true, binary = true, List("tar")) + + lazy val `vnd.banana-accounting`: MediaType = + new MediaType("application", "vnd.banana-accounting", compressible = false, binary = true) + + lazy val `token-introspection+jwt`: MediaType = + new MediaType("application", "token-introspection+jwt", compressible = false, binary = true) + + lazy val `kpml-response+xml`: MediaType = + new MediaType("application", "kpml-response+xml", compressible = true, binary = true) + + lazy val `vnd.sealed.mht`: MediaType = + new MediaType("application", "vnd.sealed.mht", compressible = false, binary = true) + + lazy val `vnd.yamaha.hv-dic`: MediaType = + new MediaType("application", "vnd.yamaha.hv-dic", compressible = false, binary = true, List("hvd")) + + lazy val `applefile`: MediaType = + new MediaType("application", "applefile", compressible = false, binary = true) + + lazy val `xhtml+xml`: MediaType = + new MediaType("application", "xhtml+xml", compressible = true, binary = true, List("xhtml", "xht")) + + lazy val `mmt-aei+xml`: MediaType = + new MediaType("application", "mmt-aei+xml", compressible = true, binary = true, List("maei")) + + lazy val `vnd.oma.bcast.drm-trigger+xml`: MediaType = + new MediaType("application", "vnd.oma.bcast.drm-trigger+xml", compressible = true, binary = true) + + lazy val `vnd.sealed.xls`: MediaType = + new MediaType("application", "vnd.sealed.xls", compressible = false, binary = true) + + lazy val `vnd.snesdev-page-table`: MediaType = + new MediaType("application", "vnd.snesdev-page-table", compressible = false, binary = true) + + lazy val `exi`: MediaType = + new MediaType("application", "exi", compressible = false, binary = true, List("exi")) + + lazy val `vnd.wap.wmlc`: MediaType = + new MediaType("application", "vnd.wap.wmlc", compressible = false, binary = true, List("wmlc")) + + lazy val `vnd.oma.cab-feature-handler+xml`: MediaType = + new MediaType("application", "vnd.oma.cab-feature-handler+xml", compressible = true, binary = true) + + lazy val `media_control+xml`: MediaType = + new MediaType("application", "media_control+xml", compressible = true, binary = true) + + lazy val `vnd.curl.car`: MediaType = + new MediaType("application", "vnd.curl.car", compressible = false, binary = true, List("car")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.viewprops+xml`: MediaType = + new MediaType( "application", - "vnd.ibm.rights-management", - Compressible, - NotBinary, - List("irm"), + "vnd.openxmlformats-officedocument.presentationml.viewprops+xml", + compressible = true, + binary = true, ) - lazy val `vnd.ibm.secure-container`: MediaType = new MediaType( + + lazy val `xaml+xml`: MediaType = + new MediaType("application", "xaml+xml", compressible = true, binary = true, List("xaml")) + + lazy val `vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml`: MediaType = + new MediaType( "application", - "vnd.ibm.secure-container", - Compressible, - NotBinary, - List("sc"), + "vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml", + compressible = true, + binary = true, ) - lazy val `vnd.iccprofile`: MediaType = - new MediaType("application", "vnd.iccprofile", Compressible, NotBinary, List("icc", "icm")) - lazy val `vnd.ieee.1905`: MediaType = - new MediaType("application", "vnd.ieee.1905", Compressible, NotBinary) - lazy val `vnd.igloader`: MediaType = - new MediaType("application", "vnd.igloader", Compressible, NotBinary, List("igl")) - lazy val `vnd.imagemeter.folder+zip`: MediaType = - new MediaType("application", "vnd.imagemeter.folder+zip", Uncompressible, NotBinary) - lazy val `vnd.imagemeter.image+zip`: MediaType = - new MediaType("application", "vnd.imagemeter.image+zip", Uncompressible, NotBinary) - lazy val `vnd.immervision-ivp`: MediaType = - new MediaType("application", "vnd.immervision-ivp", Compressible, NotBinary, List("ivp")) - lazy val `vnd.immervision-ivu`: MediaType = - new MediaType("application", "vnd.immervision-ivu", Compressible, NotBinary, List("ivu")) - lazy val `vnd.ims.imsccv1p1`: MediaType = - new MediaType("application", "vnd.ims.imsccv1p1", Compressible, NotBinary) - lazy val `vnd.ims.imsccv1p2`: MediaType = - new MediaType("application", "vnd.ims.imsccv1p2", Compressible, NotBinary) - lazy val `vnd.ims.imsccv1p3`: MediaType = - new MediaType("application", "vnd.ims.imsccv1p3", Compressible, NotBinary) - lazy val `vnd.ims.lis.v2.result+json`: MediaType = - new MediaType("application", "vnd.ims.lis.v2.result+json", Compressible, NotBinary) - lazy val `vnd.ims.lti.v2.toolconsumerprofile+json`: MediaType = new MediaType( + + lazy val `tlsrpt+gzip`: MediaType = + new MediaType("application", "tlsrpt+gzip", compressible = false, binary = true) + + lazy val `vnd.citationstyles.style+xml`: MediaType = + new MediaType("application", "vnd.citationstyles.style+xml", compressible = true, binary = true, List("csl")) + + lazy val `urc-grpsheet+xml`: MediaType = + new MediaType("application", "urc-grpsheet+xml", compressible = true, binary = true) + + lazy val `vnd.frogans.fnc`: MediaType = + new MediaType("application", "vnd.frogans.fnc", compressible = false, binary = true, List("fnc")) + + lazy val `vnd.onepager`: MediaType = + new MediaType("application", "vnd.onepager", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml`: MediaType = + new MediaType( "application", - "vnd.ims.lti.v2.toolconsumerprofile+json", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml", + compressible = true, + binary = true, ) - lazy val `vnd.ims.lti.v2.toolproxy+json`: MediaType = - new MediaType("application", "vnd.ims.lti.v2.toolproxy+json", Compressible, NotBinary) - lazy val `vnd.ims.lti.v2.toolproxy.id+json`: MediaType = - new MediaType("application", "vnd.ims.lti.v2.toolproxy.id+json", Compressible, NotBinary) - lazy val `vnd.ims.lti.v2.toolsettings+json`: MediaType = - new MediaType("application", "vnd.ims.lti.v2.toolsettings+json", Compressible, NotBinary) - lazy val `vnd.ims.lti.v2.toolsettings.simple+json`: MediaType = new MediaType( + + lazy val `vnd.dvb.iptv.alfec-base`: MediaType = + new MediaType("application", "vnd.dvb.iptv.alfec-base", compressible = false, binary = true) + + lazy val `vnd.joost.joda-archive`: MediaType = + new MediaType("application", "vnd.joost.joda-archive", compressible = false, binary = true, List("joda")) + + lazy val `pgp-encrypted`: MediaType = + new MediaType("application", "pgp-encrypted", compressible = false, binary = true, List("pgp")) + + lazy val `x-freearc`: MediaType = + new MediaType("application", "x-freearc", compressible = false, binary = true, List("arc")) + + lazy val `vnd.3gpp.lpp`: MediaType = + new MediaType("application", "vnd.3gpp.lpp", compressible = false, binary = true) + + lazy val `vnd.curl.pcurl`: MediaType = + new MediaType("application", "vnd.curl.pcurl", compressible = false, binary = true, List("pcurl")) + + lazy val `rpki-manifest`: MediaType = + new MediaType("application", "rpki-manifest", compressible = false, binary = true, List("mft")) + + lazy val `vnd.3gpp.sms+xml`: MediaType = + new MediaType("application", "vnd.3gpp.sms+xml", compressible = true, binary = true) + + lazy val `vnd.spotfire.sfs`: MediaType = + new MediaType("application", "vnd.spotfire.sfs", compressible = false, binary = true, List("sfs")) + + lazy val `vnd.liberty-request+xml`: MediaType = + new MediaType("application", "vnd.liberty-request+xml", compressible = true, binary = true) + + lazy val `node`: MediaType = + new MediaType("application", "node", compressible = false, binary = true, List("cjs")) + + lazy val `xacml+xml`: MediaType = + new MediaType("application", "xacml+xml", compressible = true, binary = true) + + lazy val `vnd.ecowin.seriesupdate`: MediaType = + new MediaType("application", "vnd.ecowin.seriesupdate", compressible = false, binary = true) + + lazy val `vnd.geonext`: MediaType = + new MediaType("application", "vnd.geonext", compressible = false, binary = true, List("gxt")) + + lazy val `prs.xsf+xml`: MediaType = + new MediaType("application", "prs.xsf+xml", compressible = true, binary = true, List("xsf")) + + lazy val `srgs`: MediaType = + new MediaType("application", "srgs", compressible = false, binary = true, List("gram")) + + lazy val `vnd.etsi.timestamp-token`: MediaType = + new MediaType("application", "vnd.etsi.timestamp-token", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcdata-signalling`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-signalling", compressible = false, binary = true) + + lazy val `x-font-dos`: MediaType = + new MediaType("application", "x-font-dos", compressible = false, binary = true) + + lazy val `x-pki-message`: MediaType = + new MediaType("application", "x-pki-message", compressible = false, binary = true) + + lazy val `vnd.hsl`: MediaType = + new MediaType("application", "vnd.hsl", compressible = false, binary = true) + + lazy val `vnd.motorola.flexsuite.ttc`: MediaType = + new MediaType("application", "vnd.motorola.flexsuite.ttc", compressible = false, binary = true) + + lazy val `x-mspublisher`: MediaType = + new MediaType("application", "x-mspublisher", compressible = false, binary = true, List("pub")) + + lazy val `vnd.3lightssoftware.imagescal`: MediaType = + new MediaType("application", "vnd.3lightssoftware.imagescal", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.connections+xml`: MediaType = + new MediaType( "application", - "vnd.ims.lti.v2.toolsettings.simple+json", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.spreadsheetml.connections+xml", + compressible = true, + binary = true, ) - lazy val `vnd.informedcontrol.rms+xml`: MediaType = - new MediaType("application", "vnd.informedcontrol.rms+xml", Compressible, NotBinary) - lazy val `vnd.informix-visionary`: MediaType = - new MediaType("application", "vnd.informix-visionary", Compressible, NotBinary) - lazy val `vnd.infotech.project`: MediaType = - new MediaType("application", "vnd.infotech.project", Compressible, NotBinary) - lazy val `vnd.infotech.project+xml`: MediaType = - new MediaType("application", "vnd.infotech.project+xml", Compressible, NotBinary) - lazy val `vnd.innopath.wamp.notification`: MediaType = - new MediaType("application", "vnd.innopath.wamp.notification", Compressible, NotBinary) - lazy val `vnd.insors.igm`: MediaType = - new MediaType("application", "vnd.insors.igm", Compressible, NotBinary, List("igm")) - lazy val `vnd.intercon.formnet`: MediaType = new MediaType( + + lazy val `vnd.fujitsu.oasys3`: MediaType = + new MediaType("application", "vnd.fujitsu.oasys3", compressible = false, binary = true, List("oa3")) + + lazy val `wspolicy+xml`: MediaType = + new MediaType("application", "wspolicy+xml", compressible = true, binary = true, List("wspolicy")) + + lazy val `xml-external-parsed-entity`: MediaType = + new MediaType("application", "xml-external-parsed-entity", compressible = false, binary = false) + + lazy val `vnd.shp`: MediaType = + new MediaType("application", "vnd.shp", compressible = false, binary = true) + + lazy val `vnd.hyper+json`: MediaType = + new MediaType("application", "vnd.hyper+json", compressible = true, binary = false) + + lazy val `vnd.age`: MediaType = + new MediaType("application", "vnd.age", compressible = false, binary = true, List("age")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml`: MediaType = + new MediaType( "application", - "vnd.intercon.formnet", - Compressible, - NotBinary, - List("xpw", "xpx"), + "vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", + compressible = true, + binary = true, ) - lazy val `vnd.intergeo`: MediaType = - new MediaType("application", "vnd.intergeo", Compressible, NotBinary, List("i2g")) - lazy val `vnd.intertrust.digibox`: MediaType = - new MediaType("application", "vnd.intertrust.digibox", Compressible, NotBinary) - lazy val `vnd.intertrust.nncp`: MediaType = - new MediaType("application", "vnd.intertrust.nncp", Compressible, NotBinary) - lazy val `vnd.intu.qbo`: MediaType = - new MediaType("application", "vnd.intu.qbo", Compressible, NotBinary, List("qbo")) - lazy val `vnd.intu.qfx`: MediaType = - new MediaType("application", "vnd.intu.qfx", Compressible, NotBinary, List("qfx")) - lazy val `vnd.iptc.g2.catalogitem+xml`: MediaType = - new MediaType("application", "vnd.iptc.g2.catalogitem+xml", Compressible, NotBinary) - lazy val `vnd.iptc.g2.conceptitem+xml`: MediaType = - new MediaType("application", "vnd.iptc.g2.conceptitem+xml", Compressible, NotBinary) - lazy val `vnd.iptc.g2.knowledgeitem+xml`: MediaType = - new MediaType("application", "vnd.iptc.g2.knowledgeitem+xml", Compressible, NotBinary) - lazy val `vnd.iptc.g2.newsitem+xml`: MediaType = - new MediaType("application", "vnd.iptc.g2.newsitem+xml", Compressible, NotBinary) - lazy val `vnd.iptc.g2.newsmessage+xml`: MediaType = - new MediaType("application", "vnd.iptc.g2.newsmessage+xml", Compressible, NotBinary) - lazy val `vnd.iptc.g2.packageitem+xml`: MediaType = - new MediaType("application", "vnd.iptc.g2.packageitem+xml", Compressible, NotBinary) - lazy val `vnd.iptc.g2.planningitem+xml`: MediaType = - new MediaType("application", "vnd.iptc.g2.planningitem+xml", Compressible, NotBinary) - lazy val `vnd.ipunplugged.rcprofile`: MediaType = new MediaType( + + lazy val `vnd.crick.clicker.wordbank`: MediaType = + new MediaType("application", "vnd.crick.clicker.wordbank", compressible = false, binary = true, List("clkw")) + + lazy val `x-amf`: MediaType = + new MediaType("application", "x-amf", compressible = false, binary = true) + + lazy val `vnd.eszigno3+xml`: MediaType = + new MediaType("application", "vnd.eszigno3+xml", compressible = true, binary = true, List("es3", "et3")) + + lazy val `ecmascript`: MediaType = + new MediaType("application", "ecmascript", compressible = true, binary = true, List("ecma")) + + lazy val `vnd.rs-274x`: MediaType = + new MediaType("application", "vnd.rs-274x", compressible = false, binary = true) + + lazy val `lostsync+xml`: MediaType = + new MediaType("application", "lostsync+xml", compressible = true, binary = true) + + lazy val `vnd.curl`: MediaType = + new MediaType("application", "vnd.curl", compressible = false, binary = true) + + lazy val `vnd.api+json`: MediaType = + new MediaType("application", "vnd.api+json", compressible = true, binary = false) + + lazy val `vnd.ims.imsccv1p3`: MediaType = + new MediaType("application", "vnd.ims.imsccv1p3", compressible = false, binary = true) + + lazy val `vnd.logipipe.circuit+zip`: MediaType = + new MediaType("application", "vnd.logipipe.circuit+zip", compressible = false, binary = true) + + lazy val `x-authorware-bin`: MediaType = + new MediaType( "application", - "vnd.ipunplugged.rcprofile", - Compressible, - NotBinary, - List("rcprofile"), + "x-authorware-bin", + compressible = false, + binary = true, + List("aab", "x32", "u32", "vox"), ) - lazy val `vnd.irepository.package+xml`: MediaType = new MediaType( + + lazy val `geoxacml+xml`: MediaType = + new MediaType("application", "geoxacml+xml", compressible = true, binary = true) + + lazy val `toml`: MediaType = + new MediaType("application", "toml", compressible = true, binary = true, List("toml")) + + lazy val `vnd.anser-web-certificate-issue-initiation`: MediaType = + new MediaType( "application", - "vnd.irepository.package+xml", - Compressible, - NotBinary, - List("irp"), + "vnd.anser-web-certificate-issue-initiation", + compressible = false, + binary = true, + List("cii"), ) - lazy val `vnd.is-xpr`: MediaType = - new MediaType("application", "vnd.is-xpr", Compressible, NotBinary, List("xpr")) - lazy val `vnd.isac.fcs`: MediaType = - new MediaType("application", "vnd.isac.fcs", Compressible, NotBinary, List("fcs")) - lazy val `vnd.iso11783-10+zip`: MediaType = - new MediaType("application", "vnd.iso11783-10+zip", Uncompressible, NotBinary) - lazy val `vnd.jam`: MediaType = - new MediaType("application", "vnd.jam", Compressible, NotBinary, List("jam")) - lazy val `vnd.japannet-directory-service`: MediaType = - new MediaType("application", "vnd.japannet-directory-service", Compressible, NotBinary) - lazy val `vnd.japannet-jpnstore-wakeup`: MediaType = - new MediaType("application", "vnd.japannet-jpnstore-wakeup", Compressible, NotBinary) - lazy val `vnd.japannet-payment-wakeup`: MediaType = - new MediaType("application", "vnd.japannet-payment-wakeup", Compressible, NotBinary) - lazy val `vnd.japannet-registration`: MediaType = - new MediaType("application", "vnd.japannet-registration", Compressible, NotBinary) - lazy val `vnd.japannet-registration-wakeup`: MediaType = - new MediaType("application", "vnd.japannet-registration-wakeup", Compressible, NotBinary) - lazy val `vnd.japannet-setstore-wakeup`: MediaType = - new MediaType("application", "vnd.japannet-setstore-wakeup", Compressible, NotBinary) - lazy val `vnd.japannet-verification`: MediaType = - new MediaType("application", "vnd.japannet-verification", Compressible, NotBinary) - lazy val `vnd.japannet-verification-wakeup`: MediaType = - new MediaType("application", "vnd.japannet-verification-wakeup", Compressible, NotBinary) - lazy val `vnd.jcp.javame.midlet-rms`: MediaType = new MediaType( + + lazy val `scvp-vp-request`: MediaType = + new MediaType("application", "scvp-vp-request", compressible = false, binary = true, List("spq")) + + lazy val `vnd.openxmlformats-officedocument.themeoverride+xml`: MediaType = + new MediaType( "application", - "vnd.jcp.javame.midlet-rms", - Compressible, - NotBinary, - List("rms"), + "vnd.openxmlformats-officedocument.themeoverride+xml", + compressible = true, + binary = true, ) - lazy val `vnd.jisp`: MediaType = - new MediaType("application", "vnd.jisp", Compressible, NotBinary, List("jisp")) - lazy val `vnd.joost.joda-archive`: MediaType = new MediaType( + + lazy val `vnd.psfs`: MediaType = + new MediaType("application", "vnd.psfs", compressible = false, binary = true) + + lazy val `voucher-cms+json`: MediaType = + new MediaType("application", "voucher-cms+json", compressible = true, binary = false) + + lazy val `xmpp+xml`: MediaType = + new MediaType("application", "xmpp+xml", compressible = true, binary = true) + + lazy val `bdoc`: MediaType = + new MediaType("application", "bdoc", compressible = false, binary = true, List("bdoc")) + + lazy val `vnd.wfa.p2p`: MediaType = + new MediaType("application", "vnd.wfa.p2p", compressible = false, binary = true) + + lazy val `vnd.uplanet.channel`: MediaType = + new MediaType("application", "vnd.uplanet.channel", compressible = false, binary = true) + + lazy val `mbms-protection-description+xml`: MediaType = + new MediaType("application", "mbms-protection-description+xml", compressible = true, binary = true) + + lazy val `vnd.sus-calendar`: MediaType = + new MediaType("application", "vnd.sus-calendar", compressible = false, binary = true, List("sus", "susp")) + + lazy val `senml-etch+cbor`: MediaType = + new MediaType("application", "senml-etch+cbor", compressible = false, binary = true) + + lazy val `vnd.motorola.flexsuite`: MediaType = + new MediaType("application", "vnd.motorola.flexsuite", compressible = false, binary = true) + + lazy val `x-authorware-map`: MediaType = + new MediaType("application", "x-authorware-map", compressible = false, binary = true, List("aam")) + + lazy val `vnd.3gpp.seal-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.seal-info+xml", compressible = true, binary = true) + + lazy val `dssc+der`: MediaType = + new MediaType("application", "dssc+der", compressible = false, binary = true, List("dssc")) + + lazy val `vnd.rapid`: MediaType = + new MediaType("application", "vnd.rapid", compressible = false, binary = true) + + lazy val `vnd.sun.xml.writer.template`: MediaType = + new MediaType("application", "vnd.sun.xml.writer.template", compressible = false, binary = true, List("stw")) + + lazy val `vnd.3gpp.mcdata-service-config+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-service-config+xml", compressible = true, binary = true) + + lazy val `mikey`: MediaType = + new MediaType("application", "mikey", compressible = false, binary = true) + + lazy val `vnd.ms-excel.sheet.binary.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.joost.joda-archive", - Compressible, - NotBinary, - List("joda"), + "vnd.ms-excel.sheet.binary.macroenabled.12", + compressible = false, + binary = true, + List("xlsb"), ) - lazy val `vnd.jsk.isdn-ngn`: MediaType = - new MediaType("application", "vnd.jsk.isdn-ngn", Compressible, NotBinary) - lazy val `vnd.kahootz`: MediaType = - new MediaType("application", "vnd.kahootz", Compressible, NotBinary, List("ktz", "ktr")) - lazy val `vnd.kde.karbon`: MediaType = - new MediaType("application", "vnd.kde.karbon", Compressible, NotBinary, List("karbon")) - lazy val `vnd.kde.kchart`: MediaType = - new MediaType("application", "vnd.kde.kchart", Compressible, NotBinary, List("chrt")) - lazy val `vnd.kde.kformula`: MediaType = - new MediaType("application", "vnd.kde.kformula", Compressible, NotBinary, List("kfo")) - lazy val `vnd.kde.kivio`: MediaType = - new MediaType("application", "vnd.kde.kivio", Compressible, NotBinary, List("flw")) - lazy val `vnd.kde.kontour`: MediaType = - new MediaType("application", "vnd.kde.kontour", Compressible, NotBinary, List("kon")) - lazy val `vnd.kde.kpresenter`: MediaType = new MediaType( + + lazy val `batch-smtp`: MediaType = + new MediaType("application", "batch-smtp", compressible = false, binary = true) + + lazy val `vnd.powerbuilder6-s`: MediaType = + new MediaType("application", "vnd.powerbuilder6-s", compressible = false, binary = true) + + lazy val `cpl+xml`: MediaType = + new MediaType("application", "cpl+xml", compressible = true, binary = true, List("cpl")) + + lazy val `cellml+xml`: MediaType = + new MediaType("application", "cellml+xml", compressible = true, binary = true) + + lazy val `vnd.oma.poc.final-report+xml`: MediaType = + new MediaType("application", "vnd.oma.poc.final-report+xml", compressible = true, binary = true) + + lazy val `x-mobipocket-ebook`: MediaType = + new MediaType("application", "x-mobipocket-ebook", compressible = false, binary = true, List("prc", "mobi")) + + lazy val `vnd.ipld.dag-json`: MediaType = + new MediaType("application", "vnd.ipld.dag-json", compressible = false, binary = false) + + lazy val `isup`: MediaType = + new MediaType("application", "isup", compressible = false, binary = true) + + lazy val `cwl+json`: MediaType = + new MediaType("application", "cwl+json", compressible = true, binary = false) + + lazy val `omdoc+xml`: MediaType = + new MediaType("application", "omdoc+xml", compressible = true, binary = true, List("omdoc")) + + lazy val `vnd.artsquare`: MediaType = + new MediaType("application", "vnd.artsquare", compressible = false, binary = true) + + lazy val `vnd.obn`: MediaType = + new MediaType("application", "vnd.obn", compressible = false, binary = true) + + lazy val `vnd.neurolanguage.nlu`: MediaType = + new MediaType("application", "vnd.neurolanguage.nlu", compressible = false, binary = true, List("nlu")) + + lazy val `vnd.lotus-organizer`: MediaType = + new MediaType("application", "vnd.lotus-organizer", compressible = false, binary = true, List("org")) + + lazy val `x-font-snf`: MediaType = + new MediaType("application", "x-font-snf", compressible = false, binary = true, List("snf")) + + lazy val `vnd.syft+json`: MediaType = + new MediaType("application", "vnd.syft+json", compressible = true, binary = false) + + lazy val `vnd.uoml+xml`: MediaType = + new MediaType("application", "vnd.uoml+xml", compressible = true, binary = true, List("uoml", "uo")) + + lazy val `x-msschedule`: MediaType = + new MediaType("application", "x-msschedule", compressible = false, binary = true, List("scd")) + + lazy val `vnd.afpc.cmoca-cmresource`: MediaType = + new MediaType("application", "vnd.afpc.cmoca-cmresource", compressible = false, binary = true) + + lazy val `x-mscardfile`: MediaType = + new MediaType("application", "x-mscardfile", compressible = false, binary = true, List("crd")) + + lazy val `vnd.stepmania.stepchart`: MediaType = + new MediaType("application", "vnd.stepmania.stepchart", compressible = false, binary = true, List("sm")) + + lazy val `eshop`: MediaType = + new MediaType("application", "eshop", compressible = false, binary = true) + + lazy val `emotionml+xml`: MediaType = + new MediaType("application", "emotionml+xml", compressible = true, binary = true, List("emotionml")) + + lazy val `tve-trigger`: MediaType = + new MediaType("application", "tve-trigger", compressible = false, binary = true) + + lazy val `vnd.exstream-package`: MediaType = + new MediaType("application", "vnd.exstream-package", compressible = false, binary = true) + + lazy val `vnd.svd`: MediaType = + new MediaType("application", "vnd.svd", compressible = false, binary = true, List("svd")) + + lazy val `vnd.openxmlformats-officedocument.drawingml.diagramdata+xml`: MediaType = + new MediaType( "application", - "vnd.kde.kpresenter", - Compressible, - NotBinary, - List("kpr", "kpt"), + "vnd.openxmlformats-officedocument.drawingml.diagramdata+xml", + compressible = true, + binary = true, ) - lazy val `vnd.kde.kspread`: MediaType = - new MediaType("application", "vnd.kde.kspread", Compressible, NotBinary, List("ksp")) - lazy val `vnd.kde.kword`: MediaType = - new MediaType("application", "vnd.kde.kword", Compressible, NotBinary, List("kwd", "kwt")) - lazy val `vnd.kenameaapp`: MediaType = - new MediaType("application", "vnd.kenameaapp", Compressible, NotBinary, List("htke")) - lazy val `vnd.kidspiration`: MediaType = - new MediaType("application", "vnd.kidspiration", Compressible, NotBinary, List("kia")) - lazy val `vnd.kinar`: MediaType = - new MediaType("application", "vnd.kinar", Compressible, NotBinary, List("kne", "knp")) - lazy val `vnd.koan`: MediaType = new MediaType( + + lazy val `vnd.afpc.modca-formdef`: MediaType = + new MediaType("application", "vnd.afpc.modca-formdef", compressible = false, binary = true) + + lazy val `vnd.3gpp.state-and-event-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.state-and-event-info+xml", compressible = true, binary = true) + + lazy val `mbms-msk-response+xml`: MediaType = + new MediaType("application", "mbms-msk-response+xml", compressible = true, binary = true) + + lazy val `vnd.sealedmedia.softseal.html`: MediaType = + new MediaType("application", "vnd.sealedmedia.softseal.html", compressible = false, binary = true) + + lazy val `vnd.groove-tool-message`: MediaType = + new MediaType("application", "vnd.groove-tool-message", compressible = false, binary = true, List("gtm")) + + lazy val `vnd.ecip.rlp`: MediaType = + new MediaType("application", "vnd.ecip.rlp", compressible = false, binary = true) + + lazy val `hl7v2+xml`: MediaType = + new MediaType("application", "hl7v2+xml", compressible = true, binary = true) + + lazy val `vnd.afpc.modca-pagesegment`: MediaType = + new MediaType("application", "vnd.afpc.modca-pagesegment", compressible = false, binary = true) + + lazy val `vnd.httphone`: MediaType = + new MediaType("application", "vnd.httphone", compressible = false, binary = true) + + lazy val `vnd.smart.teacher`: MediaType = + new MediaType("application", "vnd.smart.teacher", compressible = false, binary = true, List("teacher")) + + lazy val `vnd.oasis.opendocument.text-master`: MediaType = + new MediaType( "application", - "vnd.koan", - Compressible, - NotBinary, - List("skp", "skd", "skt", "skm"), + "vnd.oasis.opendocument.text-master", + compressible = false, + binary = true, + List("odm"), ) - lazy val `vnd.kodak-descriptor`: MediaType = - new MediaType("application", "vnd.kodak-descriptor", Compressible, NotBinary, List("sse")) - lazy val `vnd.las`: MediaType = - new MediaType("application", "vnd.las", Compressible, NotBinary) - lazy val `vnd.las.las+json`: MediaType = - new MediaType("application", "vnd.las.las+json", Compressible, NotBinary) - lazy val `vnd.las.las+xml`: MediaType = - new MediaType("application", "vnd.las.las+xml", Compressible, NotBinary, List("lasxml")) - lazy val `vnd.laszip`: MediaType = - new MediaType("application", "vnd.laszip", Compressible, NotBinary) - lazy val `vnd.leap+json`: MediaType = - new MediaType("application", "vnd.leap+json", Compressible, NotBinary) - lazy val `vnd.liberty-request+xml`: MediaType = - new MediaType("application", "vnd.liberty-request+xml", Compressible, NotBinary) - lazy val `vnd.llamagraphics.life-balance.desktop`: MediaType = new MediaType( + + lazy val `mediaservercontrol+xml`: MediaType = + new MediaType("application", "mediaservercontrol+xml", compressible = true, binary = true, List("mscml")) + + lazy val `ibe-key-request+xml`: MediaType = + new MediaType("application", "ibe-key-request+xml", compressible = true, binary = true) + + lazy val `index.cmd`: MediaType = + new MediaType("application", "index.cmd", compressible = false, binary = true) + + lazy val `dns+json`: MediaType = + new MediaType("application", "dns+json", compressible = true, binary = false) + + lazy val `rsd+xml`: MediaType = + new MediaType("application", "rsd+xml", compressible = true, binary = true, List("rsd")) + + lazy val `vnd.chemdraw+xml`: MediaType = + new MediaType("application", "vnd.chemdraw+xml", compressible = true, binary = true, List("cdxml")) + + lazy val `mathml-content+xml`: MediaType = + new MediaType("application", "mathml-content+xml", compressible = true, binary = true) + + lazy val `vnd.motorola.flexsuite.fis`: MediaType = + new MediaType("application", "vnd.motorola.flexsuite.fis", compressible = false, binary = true) + + lazy val `vnd.vcx`: MediaType = + new MediaType("application", "vnd.vcx", compressible = false, binary = true, List("vcx")) + + lazy val `tm+json`: MediaType = + new MediaType("application", "tm+json", compressible = true, binary = false) + + lazy val `vnd.frogans.ltf`: MediaType = + new MediaType("application", "vnd.frogans.ltf", compressible = false, binary = true, List("ltf")) + + lazy val `pgp-signature`: MediaType = + new MediaType("application", "pgp-signature", compressible = false, binary = true, List("sig", "asc")) + + lazy val `x-redhat-package-manager`: MediaType = + new MediaType("application", "x-redhat-package-manager", compressible = false, binary = true, List("rpm")) + + lazy val `vnd.wap.wbxml`: MediaType = + new MediaType("application", "vnd.wap.wbxml", compressible = false, binary = true, List("wbxml")) + + lazy val `oscore`: MediaType = + new MediaType("application", "oscore", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.spreadsheet-template`: MediaType = + new MediaType( "application", - "vnd.llamagraphics.life-balance.desktop", - Compressible, - NotBinary, - List("lbd"), + "vnd.oasis.opendocument.spreadsheet-template", + compressible = false, + binary = true, + List("ots"), ) - lazy val `vnd.llamagraphics.life-balance.exchange+xml`: MediaType = new MediaType( + + lazy val `vnd.maxmind.maxmind-db`: MediaType = + new MediaType("application", "vnd.maxmind.maxmind-db", compressible = false, binary = true) + + lazy val `fastsoap`: MediaType = + new MediaType("application", "fastsoap", compressible = false, binary = true) + + lazy val `vnd.llamagraphics.life-balance.exchange+xml`: MediaType = + new MediaType( "application", "vnd.llamagraphics.life-balance.exchange+xml", - Compressible, - NotBinary, + compressible = true, + binary = true, List("lbe"), ) - lazy val `vnd.logipipe.circuit+zip`: MediaType = - new MediaType("application", "vnd.logipipe.circuit+zip", Uncompressible, NotBinary) - lazy val `vnd.loom`: MediaType = - new MediaType("application", "vnd.loom", Compressible, NotBinary) - lazy val `vnd.lotus-1-2-3`: MediaType = - new MediaType("application", "vnd.lotus-1-2-3", Compressible, NotBinary, List("123")) - lazy val `vnd.lotus-approach`: MediaType = - new MediaType("application", "vnd.lotus-approach", Compressible, NotBinary, List("apr")) - lazy val `vnd.lotus-freelance`: MediaType = - new MediaType("application", "vnd.lotus-freelance", Compressible, NotBinary, List("pre")) - lazy val `vnd.lotus-notes`: MediaType = - new MediaType("application", "vnd.lotus-notes", Compressible, NotBinary, List("nsf")) - lazy val `vnd.lotus-organizer`: MediaType = - new MediaType("application", "vnd.lotus-organizer", Compressible, NotBinary, List("org")) - lazy val `vnd.lotus-screencam`: MediaType = - new MediaType("application", "vnd.lotus-screencam", Compressible, NotBinary, List("scm")) - lazy val `vnd.lotus-wordpro`: MediaType = - new MediaType("application", "vnd.lotus-wordpro", Compressible, NotBinary, List("lwp")) - lazy val `vnd.macports.portpkg`: MediaType = new MediaType( + + lazy val `mads+xml`: MediaType = + new MediaType("application", "mads+xml", compressible = true, binary = true, List("mads")) + + lazy val `vnd.triscape.mxs`: MediaType = + new MediaType("application", "vnd.triscape.mxs", compressible = false, binary = true, List("mxs")) + + lazy val `x-ace-compressed`: MediaType = + new MediaType("application", "x-ace-compressed", compressible = false, binary = true, List("ace")) + + lazy val `x-iwork-keynote-sffkey`: MediaType = + new MediaType("application", "x-iwork-keynote-sffkey", compressible = false, binary = true, List("key")) + + lazy val `sarif-external-properties+json`: MediaType = + new MediaType("application", "sarif-external-properties+json", compressible = true, binary = false) + + lazy val `vnd.sss-cod`: MediaType = + new MediaType("application", "vnd.sss-cod", compressible = false, binary = true) + + lazy val `mrb-publish+xml`: MediaType = + new MediaType("application", "mrb-publish+xml", compressible = true, binary = true) + + lazy val `vnd.oipf.pae.gem`: MediaType = + new MediaType("application", "vnd.oipf.pae.gem", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml`: MediaType = + new MediaType( "application", - "vnd.macports.portpkg", - Compressible, - NotBinary, - List("portpkg"), + "vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml", + compressible = true, + binary = true, ) - lazy val `vnd.mapbox-vector-tile`: MediaType = - new MediaType("application", "vnd.mapbox-vector-tile", Compressible, NotBinary, List("mvt")) - lazy val `vnd.marlin.drm.actiontoken+xml`: MediaType = - new MediaType("application", "vnd.marlin.drm.actiontoken+xml", Compressible, NotBinary) - lazy val `vnd.marlin.drm.conftoken+xml`: MediaType = - new MediaType("application", "vnd.marlin.drm.conftoken+xml", Compressible, NotBinary) - lazy val `vnd.marlin.drm.license+xml`: MediaType = - new MediaType("application", "vnd.marlin.drm.license+xml", Compressible, NotBinary) - lazy val `vnd.marlin.drm.mdcf`: MediaType = - new MediaType("application", "vnd.marlin.drm.mdcf", Compressible, NotBinary) - lazy val `vnd.mason+json`: MediaType = - new MediaType("application", "vnd.mason+json", Compressible, NotBinary) - lazy val `vnd.maxmind.maxmind-db`: MediaType = - new MediaType("application", "vnd.maxmind.maxmind-db", Compressible, NotBinary) - lazy val `vnd.mcd`: MediaType = - new MediaType("application", "vnd.mcd", Compressible, NotBinary, List("mcd")) - lazy val `vnd.medcalcdata`: MediaType = - new MediaType("application", "vnd.medcalcdata", Compressible, NotBinary, List("mc1")) - lazy val `vnd.mediastation.cdkey`: MediaType = new MediaType( + + lazy val `xop+xml`: MediaType = + new MediaType("application", "xop+xml", compressible = true, binary = true, List("xop")) + + lazy val `vnd.intu.qbo`: MediaType = + new MediaType("application", "vnd.intu.qbo", compressible = false, binary = true, List("qbo")) + + lazy val `set-payment`: MediaType = + new MediaType("application", "set-payment", compressible = false, binary = true) + + lazy val `appinstaller`: MediaType = + new MediaType("application", "appinstaller", compressible = false, binary = true, List("appinstaller")) + + lazy val `vnd.biopax.rdf+xml`: MediaType = + new MediaType("application", "vnd.biopax.rdf+xml", compressible = true, binary = true) + + lazy val `vnd.uplanet.signal`: MediaType = + new MediaType("application", "vnd.uplanet.signal", compressible = false, binary = true) + + lazy val `vnd.macports.portpkg`: MediaType = + new MediaType("application", "vnd.macports.portpkg", compressible = false, binary = true, List("portpkg")) + + lazy val `activity+json`: MediaType = + new MediaType("application", "activity+json", compressible = true, binary = false) + + lazy val `whoispp-query`: MediaType = + new MediaType("application", "whoispp-query", compressible = false, binary = true) + + lazy val `auth-policy+xml`: MediaType = + new MediaType("application", "auth-policy+xml", compressible = true, binary = true) + + lazy val `x-sea`: MediaType = + new MediaType("application", "x-sea", compressible = false, binary = true, List("sea")) + + lazy val `vnd.semd`: MediaType = + new MediaType("application", "vnd.semd", compressible = false, binary = true, List("semd")) + + lazy val `vnd.google-apps.spreadsheet`: MediaType = + new MediaType("application", "vnd.google-apps.spreadsheet", compressible = false, binary = true, List("gsheet")) + + lazy val `x-virtualbox-vmdk`: MediaType = + new MediaType("application", "x-virtualbox-vmdk", compressible = true, binary = true, List("vmdk")) + + lazy val `vnd.aristanetworks.swi`: MediaType = + new MediaType("application", "vnd.aristanetworks.swi", compressible = false, binary = true, List("swi")) + + lazy val `xcap-el+xml`: MediaType = + new MediaType("application", "xcap-el+xml", compressible = true, binary = true, List("xel")) + + lazy val `emma+xml`: MediaType = + new MediaType("application", "emma+xml", compressible = true, binary = true, List("emma")) + + lazy val `cdni`: MediaType = + new MediaType("application", "cdni", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.table+xml`: MediaType = + new MediaType( "application", - "vnd.mediastation.cdkey", - Compressible, - NotBinary, - List("cdkey"), + "vnd.openxmlformats-officedocument.spreadsheetml.table+xml", + compressible = true, + binary = true, ) - lazy val `vnd.meridian-slingshot`: MediaType = - new MediaType("application", "vnd.meridian-slingshot", Compressible, NotBinary) - lazy val `vnd.mfer`: MediaType = - new MediaType("application", "vnd.mfer", Compressible, NotBinary, List("mwf")) - lazy val `vnd.mfmp`: MediaType = - new MediaType("application", "vnd.mfmp", Compressible, NotBinary, List("mfm")) - lazy val `vnd.micro+json`: MediaType = - new MediaType("application", "vnd.micro+json", Compressible, NotBinary) - lazy val `vnd.micrografx.flo`: MediaType = - new MediaType("application", "vnd.micrografx.flo", Compressible, NotBinary, List("flo")) - lazy val `vnd.micrografx.igx`: MediaType = - new MediaType("application", "vnd.micrografx.igx", Compressible, NotBinary, List("igx")) - lazy val `vnd.microsoft.portable-executable`: MediaType = - new MediaType("application", "vnd.microsoft.portable-executable", Compressible, NotBinary) - lazy val `vnd.microsoft.windows.thumbnail-cache`: MediaType = new MediaType( + + lazy val `x-doom`: MediaType = + new MediaType("application", "x-doom", compressible = false, binary = true, List("wad")) + + lazy val `vnd.etsi.sci+xml`: MediaType = + new MediaType("application", "vnd.etsi.sci+xml", compressible = true, binary = true) + + lazy val `swid+cbor`: MediaType = + new MediaType("application", "swid+cbor", compressible = false, binary = true) + + lazy val `font-tdpfr`: MediaType = + new MediaType("application", "font-tdpfr", compressible = false, binary = true, List("pfr")) + + lazy val `vnd.gentics.grd+json`: MediaType = + new MediaType("application", "vnd.gentics.grd+json", compressible = true, binary = false) + + lazy val `x-ustar`: MediaType = + new MediaType("application", "x-ustar", compressible = false, binary = true, List("ustar")) + + lazy val `urc-ressheet+xml`: MediaType = + new MediaType("application", "urc-ressheet+xml", compressible = true, binary = true, List("rsheet")) + + lazy val `vnd.dtg.local`: MediaType = + new MediaType("application", "vnd.dtg.local", compressible = false, binary = true) + + lazy val `http`: MediaType = + new MediaType("application", "http", compressible = false, binary = true) + + lazy val `vnd.dvb.dvbisl+xml`: MediaType = + new MediaType("application", "vnd.dvb.dvbisl+xml", compressible = true, binary = true) + + lazy val `vnd.cryptii.pipe+json`: MediaType = + new MediaType("application", "vnd.cryptii.pipe+json", compressible = true, binary = false) + + lazy val `vnd.quark.quarkxpress`: MediaType = + new MediaType( "application", - "vnd.microsoft.windows.thumbnail-cache", - Compressible, - NotBinary, + "vnd.quark.quarkxpress", + compressible = false, + binary = true, + List("qxd", "qxt", "qwd", "qwt", "qxl", "qxb"), ) - lazy val `vnd.miele+json`: MediaType = - new MediaType("application", "vnd.miele+json", Compressible, NotBinary) - lazy val `vnd.mif`: MediaType = - new MediaType("application", "vnd.mif", Compressible, NotBinary, List("mif")) - lazy val `vnd.minisoft-hp3000-save`: MediaType = - new MediaType("application", "vnd.minisoft-hp3000-save", Compressible, NotBinary) - lazy val `vnd.mitsubishi.misty-guard.trustweb`: MediaType = - new MediaType("application", "vnd.mitsubishi.misty-guard.trustweb", Compressible, NotBinary) - lazy val `vnd.mobius.daf`: MediaType = - new MediaType("application", "vnd.mobius.daf", Compressible, NotBinary, List("daf")) - lazy val `vnd.mobius.dis`: MediaType = - new MediaType("application", "vnd.mobius.dis", Compressible, NotBinary, List("dis")) - lazy val `vnd.mobius.mbk`: MediaType = - new MediaType("application", "vnd.mobius.mbk", Compressible, NotBinary, List("mbk")) - lazy val `vnd.mobius.mqy`: MediaType = - new MediaType("application", "vnd.mobius.mqy", Compressible, NotBinary, List("mqy")) - lazy val `vnd.mobius.msl`: MediaType = - new MediaType("application", "vnd.mobius.msl", Compressible, NotBinary, List("msl")) - lazy val `vnd.mobius.plc`: MediaType = - new MediaType("application", "vnd.mobius.plc", Compressible, NotBinary, List("plc")) - lazy val `vnd.mobius.txf`: MediaType = - new MediaType("application", "vnd.mobius.txf", Compressible, NotBinary, List("txf")) - lazy val `vnd.mophun.application`: MediaType = - new MediaType("application", "vnd.mophun.application", Compressible, NotBinary, List("mpn")) - lazy val `vnd.mophun.certificate`: MediaType = - new MediaType("application", "vnd.mophun.certificate", Compressible, NotBinary, List("mpc")) - lazy val `vnd.motorola.flexsuite`: MediaType = - new MediaType("application", "vnd.motorola.flexsuite", Compressible, NotBinary) - lazy val `vnd.motorola.flexsuite.adsi`: MediaType = - new MediaType("application", "vnd.motorola.flexsuite.adsi", Compressible, NotBinary) - lazy val `vnd.motorola.flexsuite.fis`: MediaType = - new MediaType("application", "vnd.motorola.flexsuite.fis", Compressible, NotBinary) - lazy val `vnd.motorola.flexsuite.gotap`: MediaType = - new MediaType("application", "vnd.motorola.flexsuite.gotap", Compressible, NotBinary) - lazy val `vnd.motorola.flexsuite.kmr`: MediaType = - new MediaType("application", "vnd.motorola.flexsuite.kmr", Compressible, NotBinary) - lazy val `vnd.motorola.flexsuite.ttc`: MediaType = - new MediaType("application", "vnd.motorola.flexsuite.ttc", Compressible, NotBinary) - lazy val `vnd.motorola.flexsuite.wem`: MediaType = - new MediaType("application", "vnd.motorola.flexsuite.wem", Compressible, NotBinary) - lazy val `vnd.motorola.iprm`: MediaType = - new MediaType("application", "vnd.motorola.iprm", Compressible, NotBinary) - lazy val `vnd.mozilla.xul+xml`: MediaType = - new MediaType("application", "vnd.mozilla.xul+xml", Compressible, NotBinary, List("xul")) - lazy val `vnd.ms-3mfdocument`: MediaType = - new MediaType("application", "vnd.ms-3mfdocument", Compressible, NotBinary) - lazy val `vnd.ms-artgalry`: MediaType = - new MediaType("application", "vnd.ms-artgalry", Compressible, NotBinary, List("cil")) - lazy val `vnd.ms-asf`: MediaType = - new MediaType("application", "vnd.ms-asf", Compressible, NotBinary) - lazy val `vnd.ms-cab-compressed`: MediaType = - new MediaType("application", "vnd.ms-cab-compressed", Compressible, NotBinary, List("cab")) - lazy val `vnd.ms-color.iccprofile`: MediaType = - new MediaType("application", "vnd.ms-color.iccprofile", Compressible, NotBinary) - lazy val `vnd.ms-excel`: MediaType = new MediaType( + + lazy val `vnd.kde.kontour`: MediaType = + new MediaType("application", "vnd.kde.kontour", compressible = false, binary = true, List("kon")) + + lazy val `vnd.igloader`: MediaType = + new MediaType("application", "vnd.igloader", compressible = false, binary = true, List("igl")) + + lazy val `vnd.yamaha.smaf-phrase`: MediaType = + new MediaType("application", "vnd.yamaha.smaf-phrase", compressible = false, binary = true, List("spf")) + + lazy val `vnd.drive+json`: MediaType = + new MediaType("application", "vnd.drive+json", compressible = true, binary = false) + + lazy val `jsonml+json`: MediaType = + new MediaType("application", "jsonml+json", compressible = true, binary = false, List("jsonml")) + + lazy val `oblivious-dns-message`: MediaType = + new MediaType("application", "oblivious-dns-message", compressible = false, binary = true) + + lazy val `vnd.hyper-item+json`: MediaType = + new MediaType("application", "vnd.hyper-item+json", compressible = true, binary = false) + + lazy val `x-virtualbox-vdi`: MediaType = + new MediaType("application", "x-virtualbox-vdi", compressible = true, binary = true, List("vdi")) + + lazy val `vcard+xml`: MediaType = + new MediaType("application", "vcard+xml", compressible = true, binary = true) + + lazy val `vnd.commonspace`: MediaType = + new MediaType("application", "vnd.commonspace", compressible = false, binary = true, List("csp")) + + lazy val `vnd.shana.informed.interchange`: MediaType = + new MediaType("application", "vnd.shana.informed.interchange", compressible = false, binary = true, List("iif")) + + lazy val `x-virtualbox-ovf`: MediaType = + new MediaType("application", "x-virtualbox-ovf", compressible = true, binary = true, List("ovf")) + + lazy val `vnd.ms-powerpoint.slide.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.ms-excel", - Uncompressible, - NotBinary, - List("xls", "xlm", "xla", "xlc", "xlt", "xlw"), + "vnd.ms-powerpoint.slide.macroenabled.12", + compressible = false, + binary = true, + List("sldm"), ) - lazy val `vnd.ms-excel.addin.macroenabled.12`: MediaType = new MediaType( + + lazy val `vnd.tmobile-livetv`: MediaType = + new MediaType("application", "vnd.tmobile-livetv", compressible = false, binary = true, List("tmo")) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml`: MediaType = + new MediaType( "application", - "vnd.ms-excel.addin.macroenabled.12", - Compressible, - NotBinary, - List("xlam"), - ) - lazy val `vnd.ms-excel.sheet.binary.macroenabled.12`: MediaType = new MediaType( - "application", - "vnd.ms-excel.sheet.binary.macroenabled.12", - Compressible, - NotBinary, - List("xlsb"), - ) - lazy val `vnd.ms-excel.sheet.macroenabled.12`: MediaType = new MediaType( - "application", - "vnd.ms-excel.sheet.macroenabled.12", - Compressible, - NotBinary, - List("xlsm"), - ) - lazy val `vnd.ms-excel.template.macroenabled.12`: MediaType = new MediaType( - "application", - "vnd.ms-excel.template.macroenabled.12", - Compressible, - NotBinary, - List("xltm"), - ) - lazy val `vnd.ms-fontobject`: MediaType = - new MediaType("application", "vnd.ms-fontobject", Compressible, Binary, List("eot")) - lazy val `vnd.ms-htmlhelp`: MediaType = - new MediaType("application", "vnd.ms-htmlhelp", Compressible, NotBinary, List("chm")) - lazy val `vnd.ms-ims`: MediaType = - new MediaType("application", "vnd.ms-ims", Compressible, NotBinary, List("ims")) - lazy val `vnd.ms-lrm`: MediaType = - new MediaType("application", "vnd.ms-lrm", Compressible, NotBinary, List("lrm")) - lazy val `vnd.ms-office.activex+xml`: MediaType = - new MediaType("application", "vnd.ms-office.activex+xml", Compressible, NotBinary) - lazy val `vnd.ms-officetheme`: MediaType = - new MediaType("application", "vnd.ms-officetheme", Compressible, NotBinary, List("thmx")) - lazy val `vnd.ms-opentype`: MediaType = - new MediaType("application", "vnd.ms-opentype", Compressible, NotBinary) - lazy val `vnd.ms-outlook`: MediaType = - new MediaType("application", "vnd.ms-outlook", Uncompressible, NotBinary, List("msg")) - lazy val `vnd.ms-package.obfuscated-opentype`: MediaType = - new MediaType("application", "vnd.ms-package.obfuscated-opentype", Compressible, NotBinary) - lazy val `vnd.ms-pki.seccat`: MediaType = - new MediaType("application", "vnd.ms-pki.seccat", Compressible, NotBinary, List("cat")) - lazy val `vnd.ms-pki.stl`: MediaType = - new MediaType("application", "vnd.ms-pki.stl", Compressible, NotBinary, List("stl")) - lazy val `vnd.ms-playready.initiator+xml`: MediaType = - new MediaType("application", "vnd.ms-playready.initiator+xml", Compressible, NotBinary) - lazy val `vnd.ms-powerpoint`: MediaType = new MediaType( - "application", - "vnd.ms-powerpoint", - Uncompressible, - NotBinary, - List("ppt", "pps", "pot"), + "vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml", + compressible = true, + binary = true, ) - lazy val `vnd.ms-powerpoint.addin.macroenabled.12`: MediaType = new MediaType( + + lazy val `vnd.mobius.daf`: MediaType = + new MediaType("application", "vnd.mobius.daf", compressible = false, binary = true, List("daf")) + + lazy val `fhir+json`: MediaType = + new MediaType("application", "fhir+json", compressible = true, binary = false) + + lazy val `vnd.epson.ssf`: MediaType = + new MediaType("application", "vnd.epson.ssf", compressible = false, binary = true, List("ssf")) + + lazy val `dicom`: MediaType = + new MediaType("application", "dicom", compressible = false, binary = true) + + lazy val `x-cbr`: MediaType = + new MediaType( "application", - "vnd.ms-powerpoint.addin.macroenabled.12", - Compressible, - NotBinary, - List("ppam"), + "x-cbr", + compressible = false, + binary = true, + List("cbr", "cba", "cbt", "cbz", "cb7"), ) - lazy val `vnd.ms-powerpoint.presentation.macroenabled.12`: MediaType = new MediaType( + + lazy val `vnd.nokia.conml+wbxml`: MediaType = + new MediaType("application", "vnd.nokia.conml+wbxml", compressible = false, binary = true) + + lazy val `vnd.wv.ssp+xml`: MediaType = + new MediaType("application", "vnd.wv.ssp+xml", compressible = true, binary = true) + + lazy val `vnd.etsi.tsl.der`: MediaType = + new MediaType("application", "vnd.etsi.tsl.der", compressible = false, binary = true) + + lazy val `prs.hpub+zip`: MediaType = + new MediaType("application", "prs.hpub+zip", compressible = false, binary = true) + + lazy val `vnd.japannet-directory-service`: MediaType = + new MediaType("application", "vnd.japannet-directory-service", compressible = false, binary = true) + + lazy val `sarif+json`: MediaType = + new MediaType("application", "sarif+json", compressible = true, binary = false) + + lazy val `vnd.siren+json`: MediaType = + new MediaType("application", "vnd.siren+json", compressible = true, binary = false) + + lazy val `gxf`: MediaType = + new MediaType("application", "gxf", compressible = false, binary = true, List("gxf")) + + lazy val `vnd.openstreetmap.data+xml`: MediaType = + new MediaType("application", "vnd.openstreetmap.data+xml", compressible = true, binary = true, List("osm")) + + lazy val `vnd.amundsen.maze+xml`: MediaType = + new MediaType("application", "vnd.amundsen.maze+xml", compressible = true, binary = true) + + lazy val `x-eva`: MediaType = + new MediaType("application", "x-eva", compressible = false, binary = true, List("eva")) + + lazy val `vnd.hyperdrive+json`: MediaType = + new MediaType("application", "vnd.hyperdrive+json", compressible = true, binary = false) + + lazy val `n-triples`: MediaType = + new MediaType("application", "n-triples", compressible = false, binary = true, List("nt")) + + lazy val `vnd.clonk.c4group`: MediaType = + new MediaType( "application", - "vnd.ms-powerpoint.presentation.macroenabled.12", - Compressible, - NotBinary, - List("pptm"), + "vnd.clonk.c4group", + compressible = false, + binary = true, + List("c4g", "c4d", "c4f", "c4p", "c4u"), ) - lazy val `vnd.ms-powerpoint.slide.macroenabled.12`: MediaType = new MediaType( + + lazy val `vnd.stepmania.package`: MediaType = + new MediaType("application", "vnd.stepmania.package", compressible = false, binary = true, List("smzip")) + + lazy val `vnd.radisys.msml-audit-conf+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-audit-conf+xml", compressible = true, binary = true) + + lazy val `vnd.ms-asf`: MediaType = + new MediaType("application", "vnd.ms-asf", compressible = false, binary = true) + + lazy val `vnd.collabio.xodocuments.document`: MediaType = + new MediaType("application", "vnd.collabio.xodocuments.document", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcvideo-service-config+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-service-config+xml", compressible = true, binary = true) + + lazy val `tamp-status-response`: MediaType = + new MediaType("application", "tamp-status-response", compressible = false, binary = true) + + lazy val `alto-updatestreamcontrol+json`: MediaType = + new MediaType("application", "alto-updatestreamcontrol+json", compressible = true, binary = false) + + lazy val `vnd.msa-disk-image`: MediaType = + new MediaType("application", "vnd.msa-disk-image", compressible = false, binary = true) + + lazy val `x-cfs-compressed`: MediaType = + new MediaType("application", "x-cfs-compressed", compressible = false, binary = true, List("cfs")) + + lazy val `vnd.oma.cab-address-book+xml`: MediaType = + new MediaType("application", "vnd.oma.cab-address-book+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml`: MediaType = + new MediaType( "application", - "vnd.ms-powerpoint.slide.macroenabled.12", - Compressible, - NotBinary, - List("sldm"), + "vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml", + compressible = true, + binary = true, ) - lazy val `vnd.ms-powerpoint.slideshow.macroenabled.12`: MediaType = new MediaType( + + lazy val `xfdf`: MediaType = + new MediaType("application", "xfdf", compressible = false, binary = true, List("xfdf")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml`: MediaType = + new MediaType( "application", - "vnd.ms-powerpoint.slideshow.macroenabled.12", - Compressible, - NotBinary, - List("ppsm"), + "vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml", + compressible = true, + binary = true, ) - lazy val `vnd.ms-powerpoint.template.macroenabled.12`: MediaType = new MediaType( + + lazy val `vnd.iccprofile`: MediaType = + new MediaType("application", "vnd.iccprofile", compressible = false, binary = true, List("icc", "icm")) + + lazy val `rpki-updown`: MediaType = + new MediaType("application", "rpki-updown", compressible = false, binary = true) + + lazy val `tamp-community-update`: MediaType = + new MediaType("application", "tamp-community-update", compressible = false, binary = true) + + lazy val `vnd.dolby.mobile.2`: MediaType = + new MediaType("application", "vnd.dolby.mobile.2", compressible = false, binary = true) + + lazy val `vnd.nearst.inv+json`: MediaType = + new MediaType("application", "vnd.nearst.inv+json", compressible = true, binary = false) + + lazy val `lxf`: MediaType = + new MediaType("application", "lxf", compressible = false, binary = true) + + lazy val `vnd.wordperfect`: MediaType = + new MediaType("application", "vnd.wordperfect", compressible = false, binary = true, List("wpd")) + + lazy val `epp+xml`: MediaType = + new MediaType("application", "epp+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-package.digital-signature-xmlsignature+xml`: MediaType = + new MediaType( "application", - "vnd.ms-powerpoint.template.macroenabled.12", - Compressible, - NotBinary, - List("potm"), - ) - lazy val `vnd.ms-printdevicecapabilities+xml`: MediaType = - new MediaType("application", "vnd.ms-printdevicecapabilities+xml", Compressible, NotBinary) - lazy val `vnd.ms-printing.printticket+xml`: MediaType = - new MediaType("application", "vnd.ms-printing.printticket+xml", Compressible, NotBinary) - lazy val `vnd.ms-printschematicket+xml`: MediaType = - new MediaType("application", "vnd.ms-printschematicket+xml", Compressible, NotBinary) - lazy val `vnd.ms-project`: MediaType = - new MediaType("application", "vnd.ms-project", Compressible, NotBinary, List("mpp", "mpt")) - lazy val `vnd.ms-tnef`: MediaType = - new MediaType("application", "vnd.ms-tnef", Compressible, NotBinary) - lazy val `vnd.ms-windows.devicepairing`: MediaType = - new MediaType("application", "vnd.ms-windows.devicepairing", Compressible, NotBinary) - lazy val `vnd.ms-windows.nwprinting.oob`: MediaType = - new MediaType("application", "vnd.ms-windows.nwprinting.oob", Compressible, NotBinary) - lazy val `vnd.ms-windows.printerpairing`: MediaType = - new MediaType("application", "vnd.ms-windows.printerpairing", Compressible, NotBinary) - lazy val `vnd.ms-windows.wsd.oob`: MediaType = - new MediaType("application", "vnd.ms-windows.wsd.oob", Compressible, NotBinary) - lazy val `vnd.ms-wmdrm.lic-chlg-req`: MediaType = - new MediaType("application", "vnd.ms-wmdrm.lic-chlg-req", Compressible, NotBinary) - lazy val part_1: List[MediaType] = List( - `vnd.adobe.air-application-installer-package+zip`, - `vnd.adobe.flash.movie`, - `vnd.adobe.formscentral.fcdt`, - `vnd.adobe.fxp`, - `vnd.adobe.partial-upload`, - `vnd.adobe.xdp+xml`, - `vnd.adobe.xfdf`, - `vnd.aether.imp`, - `vnd.afpc.afplinedata`, - `vnd.afpc.afplinedata-pagedef`, - `vnd.afpc.cmoca-cmresource`, - `vnd.afpc.foca-charset`, - `vnd.afpc.foca-codedfont`, - `vnd.afpc.foca-codepage`, - `vnd.afpc.modca`, - `vnd.afpc.modca-cmtable`, - `vnd.afpc.modca-formdef`, - `vnd.afpc.modca-mediummap`, - `vnd.afpc.modca-objectcontainer`, - `vnd.afpc.modca-overlay`, - `vnd.afpc.modca-pagesegment`, - `vnd.ah-barcode`, - `vnd.ahead.space`, - `vnd.airzip.filesecure.azf`, - `vnd.airzip.filesecure.azs`, - `vnd.amadeus+json`, - `vnd.amazon.ebook`, - `vnd.amazon.mobi8-ebook`, - `vnd.americandynamics.acc`, - `vnd.amiga.ami`, - `vnd.amundsen.maze+xml`, - `vnd.android.ota`, - `vnd.android.package-archive`, - `vnd.anki`, - `vnd.anser-web-certificate-issue-initiation`, - `vnd.anser-web-funds-transfer-initiation`, - `vnd.antix.game-component`, - `vnd.apache.thrift.binary`, - `vnd.apache.thrift.compact`, - `vnd.apache.thrift.json`, - `vnd.api+json`, - `vnd.aplextor.warrp+json`, - `vnd.apothekende.reservation+json`, - `vnd.apple.installer+xml`, - `vnd.apple.keynote`, - `vnd.apple.mpegurl`, - `vnd.apple.numbers`, - `vnd.apple.pages`, - `vnd.apple.pkpass`, - `vnd.arastra.swi`, - `vnd.aristanetworks.swi`, - `vnd.artisan+json`, - `vnd.artsquare`, - `vnd.astraea-software.iota`, - `vnd.audiograph`, - `vnd.autopackage`, - `vnd.avalon+json`, - `vnd.avistar+xml`, - `vnd.balsamiq.bmml+xml`, - `vnd.balsamiq.bmpr`, - `vnd.banana-accounting`, - `vnd.bbf.usp.error`, - `vnd.bbf.usp.msg`, - `vnd.bbf.usp.msg+json`, - `vnd.bekitzur-stech+json`, - `vnd.bint.med-content`, - `vnd.biopax.rdf+xml`, - `vnd.blink-idb-value-wrapper`, - `vnd.blueice.multipass`, - `vnd.bluetooth.ep.oob`, - `vnd.bluetooth.le.oob`, - `vnd.bmi`, - `vnd.bpf`, - `vnd.bpf3`, - `vnd.businessobjects`, - `vnd.byu.uapi+json`, - `vnd.cab-jscript`, - `vnd.canon-cpdl`, - `vnd.canon-lips`, - `vnd.capasystems-pg+json`, - `vnd.cendio.thinlinc.clientconf`, - `vnd.century-systems.tcp_stream`, - `vnd.chemdraw+xml`, - `vnd.chess-pgn`, - `vnd.chipnuts.karaoke-mmd`, - `vnd.ciedi`, - `vnd.cinderella`, - `vnd.cirpack.isdn-ext`, - `vnd.citationstyles.style+xml`, - `vnd.claymore`, - `vnd.cloanto.rp9`, - `vnd.clonk.c4group`, - `vnd.cluetrust.cartomobile-config`, - `vnd.cluetrust.cartomobile-config-pkg`, - `vnd.coffeescript`, - `vnd.collabio.xodocuments.document`, - `vnd.collabio.xodocuments.document-template`, - `vnd.collabio.xodocuments.presentation`, - `vnd.collabio.xodocuments.presentation-template`, - `vnd.collabio.xodocuments.spreadsheet`, - `vnd.collabio.xodocuments.spreadsheet-template`, - `vnd.collection+json`, - `vnd.collection.doc+json`, - `vnd.collection.next+json`, - `vnd.comicbook+zip`, - `vnd.comicbook-rar`, - `vnd.commerce-battelle`, - `vnd.commonspace`, - `vnd.contact.cmsg`, - `vnd.coreos.ignition+json`, - `vnd.cosmocaller`, - `vnd.crick.clicker`, - `vnd.crick.clicker.keyboard`, - `vnd.crick.clicker.palette`, - `vnd.crick.clicker.template`, - `vnd.crick.clicker.wordbank`, - `vnd.criticaltools.wbs+xml`, - `vnd.cryptii.pipe+json`, - `vnd.crypto-shade-file`, - `vnd.cryptomator.encrypted`, - `vnd.cryptomator.vault`, - `vnd.ctc-posml`, - `vnd.ctct.ws+xml`, - `vnd.cups-pdf`, - `vnd.cups-postscript`, - `vnd.cups-ppd`, - `vnd.cups-raster`, - `vnd.cups-raw`, - `vnd.curl`, - `vnd.curl.car`, - `vnd.curl.pcurl`, - `vnd.cyan.dean.root+xml`, - `vnd.cybank`, - `vnd.cyclonedx+json`, - `vnd.cyclonedx+xml`, - `vnd.d2l.coursepackage1p0+zip`, - `vnd.d3m-dataset`, - `vnd.d3m-problem`, - `vnd.dart`, - `vnd.data-vision.rdz`, - `vnd.datapackage+json`, - `vnd.dataresource+json`, - `vnd.dbf`, - `vnd.debian.binary-package`, - `vnd.dece.data`, - `vnd.dece.ttml+xml`, - `vnd.dece.unspecified`, - `vnd.dece.zip`, - `vnd.denovo.fcselayout-link`, - `vnd.desmume.movie`, - `vnd.dir-bi.plate-dl-nosuffix`, - `vnd.dm.delegation+xml`, - `vnd.dna`, - `vnd.document+json`, - `vnd.dolby.mlp`, - `vnd.dolby.mobile.1`, - `vnd.dolby.mobile.2`, - `vnd.doremir.scorecloud-binary-document`, - `vnd.dpgraph`, - `vnd.dreamfactory`, - `vnd.drive+json`, - `vnd.ds-keypoint`, - `vnd.dtg.local`, - `vnd.dtg.local.flash`, - `vnd.dtg.local.html`, - `vnd.dvb.ait`, - `vnd.dvb.dvbisl+xml`, - `vnd.dvb.dvbj`, - `vnd.dvb.esgcontainer`, - `vnd.dvb.ipdcdftnotifaccess`, - `vnd.dvb.ipdcesgaccess`, - `vnd.dvb.ipdcesgaccess2`, - `vnd.dvb.ipdcesgpdd`, - `vnd.dvb.ipdcroaming`, - `vnd.dvb.iptv.alfec-base`, - `vnd.dvb.iptv.alfec-enhancement`, - `vnd.dvb.notif-aggregate-root+xml`, - `vnd.dvb.notif-container+xml`, - `vnd.dvb.notif-generic+xml`, - `vnd.dvb.notif-ia-msglist+xml`, - `vnd.dvb.notif-ia-registration-request+xml`, - `vnd.dvb.notif-ia-registration-response+xml`, - `vnd.dvb.notif-init+xml`, - `vnd.dvb.pfr`, - `vnd.dvb.service`, - `vnd.dxr`, - `vnd.dynageo`, - `vnd.dzr`, - `vnd.easykaraoke.cdgdownload`, - `vnd.ecdis-update`, - `vnd.ecip.rlp`, - `vnd.ecowin.chart`, - `vnd.ecowin.filerequest`, - `vnd.ecowin.fileupdate`, - `vnd.ecowin.series`, - `vnd.ecowin.seriesrequest`, - `vnd.ecowin.seriesupdate`, - `vnd.efi.img`, - `vnd.efi.iso`, - `vnd.emclient.accessrequest+xml`, - `vnd.enliven`, - `vnd.enphase.envoy`, - `vnd.eprints.data+xml`, - `vnd.epson.esf`, - `vnd.epson.msf`, - `vnd.epson.quickanime`, - `vnd.epson.salt`, - `vnd.epson.ssf`, - `vnd.ericsson.quickcall`, - `vnd.espass-espass+zip`, - `vnd.eszigno3+xml`, - `vnd.etsi.aoc+xml`, - `vnd.etsi.asic-e+zip`, - `vnd.etsi.asic-s+zip`, - `vnd.etsi.cug+xml`, - `vnd.etsi.iptvcommand+xml`, - `vnd.etsi.iptvdiscovery+xml`, - `vnd.etsi.iptvprofile+xml`, - `vnd.etsi.iptvsad-bc+xml`, - `vnd.etsi.iptvsad-cod+xml`, - `vnd.etsi.iptvsad-npvr+xml`, - `vnd.etsi.iptvservice+xml`, - `vnd.etsi.iptvsync+xml`, - `vnd.etsi.iptvueprofile+xml`, - `vnd.etsi.mcid+xml`, - `vnd.etsi.mheg5`, - `vnd.etsi.overload-control-policy-dataset+xml`, - `vnd.etsi.pstn+xml`, - `vnd.etsi.sci+xml`, - `vnd.etsi.simservs+xml`, - `vnd.etsi.timestamp-token`, - `vnd.etsi.tsl+xml`, - `vnd.etsi.tsl.der`, - `vnd.eudora.data`, - `vnd.evolv.ecig.profile`, - `vnd.evolv.ecig.settings`, - `vnd.evolv.ecig.theme`, - `vnd.exstream-empower+zip`, - `vnd.exstream-package`, - `vnd.ezpix-album`, - `vnd.ezpix-package`, - `vnd.f-secure.mobile`, - `vnd.fastcopy-disk-image`, - `vnd.fdf`, - `vnd.fdsn.mseed`, - `vnd.fdsn.seed`, - `vnd.ffsns`, - `vnd.ficlab.flb+zip`, - `vnd.filmit.zfc`, - `vnd.fints`, - `vnd.firemonkeys.cloudcell`, - `vnd.flographit`, - `vnd.fluxtime.clip`, - `vnd.font-fontforge-sfd`, - `vnd.framemaker`, - `vnd.frogans.fnc`, - `vnd.frogans.ltf`, - `vnd.fsc.weblaunch`, - `vnd.fujifilm.fb.docuworks`, - `vnd.fujifilm.fb.docuworks.binder`, - `vnd.fujifilm.fb.docuworks.container`, - `vnd.fujifilm.fb.jfi+xml`, - `vnd.fujitsu.oasys`, - `vnd.fujitsu.oasys2`, - `vnd.fujitsu.oasys3`, - `vnd.fujitsu.oasysgp`, - `vnd.fujitsu.oasysprs`, - `vnd.fujixerox.art-ex`, - `vnd.fujixerox.art4`, - `vnd.fujixerox.ddd`, - `vnd.fujixerox.docuworks`, - `vnd.fujixerox.docuworks.binder`, - `vnd.fujixerox.docuworks.container`, - `vnd.fujixerox.hbpl`, - `vnd.fut-misnet`, - `vnd.futoin+cbor`, - `vnd.futoin+json`, - `vnd.fuzzysheet`, - `vnd.genomatix.tuxedo`, - `vnd.gentics.grd+json`, - `vnd.geo+json`, - `vnd.geocube+xml`, - `vnd.geogebra.file`, - `vnd.geogebra.slides`, - `vnd.geogebra.tool`, - `vnd.geometry-explorer`, - `vnd.geonext`, - `vnd.geoplan`, - `vnd.geospace`, - `vnd.gerber`, - `vnd.globalplatform.card-content-mgt`, - `vnd.globalplatform.card-content-mgt-response`, - `vnd.gmx`, - `vnd.google-apps.document`, - `vnd.google-apps.presentation`, - `vnd.google-apps.spreadsheet`, - `vnd.google-earth.kml+xml`, - `vnd.google-earth.kmz`, - `vnd.gov.sk.e-form+xml`, - `vnd.gov.sk.e-form+zip`, - `vnd.gov.sk.xmldatacontainer+xml`, - `vnd.grafeq`, - `vnd.gridmp`, - `vnd.groove-account`, - `vnd.groove-help`, - `vnd.groove-identity-message`, - `vnd.groove-injector`, - `vnd.groove-tool-message`, - `vnd.groove-tool-template`, - `vnd.groove-vcard`, - `vnd.hal+json`, - `vnd.hal+xml`, - `vnd.handheld-entertainment+xml`, - `vnd.hbci`, - `vnd.hc+json`, - `vnd.hcl-bireports`, - `vnd.hdt`, - `vnd.heroku+json`, - `vnd.hhe.lesson-player`, - `vnd.hp-hpgl`, - `vnd.hp-hpid`, - `vnd.hp-hps`, - `vnd.hp-jlyt`, - `vnd.hp-pcl`, - `vnd.hp-pclxl`, - `vnd.httphone`, - `vnd.hydrostatix.sof-data`, - `vnd.hyper+json`, - `vnd.hyper-item+json`, - `vnd.hyperdrive+json`, - `vnd.hzn-3d-crossword`, - `vnd.ibm.afplinedata`, - `vnd.ibm.electronic-media`, - `vnd.ibm.minipay`, - `vnd.ibm.modcap`, - `vnd.ibm.rights-management`, - `vnd.ibm.secure-container`, - `vnd.iccprofile`, - `vnd.ieee.1905`, - `vnd.igloader`, - `vnd.imagemeter.folder+zip`, - `vnd.imagemeter.image+zip`, - `vnd.immervision-ivp`, - `vnd.immervision-ivu`, - `vnd.ims.imsccv1p1`, - `vnd.ims.imsccv1p2`, - `vnd.ims.imsccv1p3`, - `vnd.ims.lis.v2.result+json`, - `vnd.ims.lti.v2.toolconsumerprofile+json`, - `vnd.ims.lti.v2.toolproxy+json`, - `vnd.ims.lti.v2.toolproxy.id+json`, - `vnd.ims.lti.v2.toolsettings+json`, - `vnd.ims.lti.v2.toolsettings.simple+json`, - `vnd.informedcontrol.rms+xml`, - `vnd.informix-visionary`, - `vnd.infotech.project`, - `vnd.infotech.project+xml`, - `vnd.innopath.wamp.notification`, - `vnd.insors.igm`, - `vnd.intercon.formnet`, - `vnd.intergeo`, - `vnd.intertrust.digibox`, - `vnd.intertrust.nncp`, - `vnd.intu.qbo`, - `vnd.intu.qfx`, - `vnd.iptc.g2.catalogitem+xml`, - `vnd.iptc.g2.conceptitem+xml`, - `vnd.iptc.g2.knowledgeitem+xml`, - `vnd.iptc.g2.newsitem+xml`, - `vnd.iptc.g2.newsmessage+xml`, - `vnd.iptc.g2.packageitem+xml`, - `vnd.iptc.g2.planningitem+xml`, - `vnd.ipunplugged.rcprofile`, - `vnd.irepository.package+xml`, - `vnd.is-xpr`, - `vnd.isac.fcs`, - `vnd.iso11783-10+zip`, - `vnd.jam`, - `vnd.japannet-directory-service`, - `vnd.japannet-jpnstore-wakeup`, - `vnd.japannet-payment-wakeup`, - `vnd.japannet-registration`, - `vnd.japannet-registration-wakeup`, - `vnd.japannet-setstore-wakeup`, - `vnd.japannet-verification`, - `vnd.japannet-verification-wakeup`, - `vnd.jcp.javame.midlet-rms`, - `vnd.jisp`, - `vnd.joost.joda-archive`, - `vnd.jsk.isdn-ngn`, - `vnd.kahootz`, - `vnd.kde.karbon`, - `vnd.kde.kchart`, - `vnd.kde.kformula`, - `vnd.kde.kivio`, - `vnd.kde.kontour`, - `vnd.kde.kpresenter`, - `vnd.kde.kspread`, - `vnd.kde.kword`, - `vnd.kenameaapp`, - `vnd.kidspiration`, - `vnd.kinar`, - `vnd.koan`, - `vnd.kodak-descriptor`, - `vnd.las`, - `vnd.las.las+json`, - `vnd.las.las+xml`, - `vnd.laszip`, - `vnd.leap+json`, - `vnd.liberty-request+xml`, - `vnd.llamagraphics.life-balance.desktop`, - `vnd.llamagraphics.life-balance.exchange+xml`, - `vnd.logipipe.circuit+zip`, - `vnd.loom`, - `vnd.lotus-1-2-3`, - `vnd.lotus-approach`, - `vnd.lotus-freelance`, - `vnd.lotus-notes`, - `vnd.lotus-organizer`, - `vnd.lotus-screencam`, - `vnd.lotus-wordpro`, - `vnd.macports.portpkg`, - `vnd.mapbox-vector-tile`, - `vnd.marlin.drm.actiontoken+xml`, - `vnd.marlin.drm.conftoken+xml`, - `vnd.marlin.drm.license+xml`, - `vnd.marlin.drm.mdcf`, - `vnd.mason+json`, - `vnd.maxmind.maxmind-db`, - `vnd.mcd`, - `vnd.medcalcdata`, - `vnd.mediastation.cdkey`, - `vnd.meridian-slingshot`, - `vnd.mfer`, - `vnd.mfmp`, - `vnd.micro+json`, - `vnd.micrografx.flo`, - `vnd.micrografx.igx`, - `vnd.microsoft.portable-executable`, - `vnd.microsoft.windows.thumbnail-cache`, - `vnd.miele+json`, - `vnd.mif`, - `vnd.minisoft-hp3000-save`, - `vnd.mitsubishi.misty-guard.trustweb`, - `vnd.mobius.daf`, - `vnd.mobius.dis`, - `vnd.mobius.mbk`, - `vnd.mobius.mqy`, - `vnd.mobius.msl`, - `vnd.mobius.plc`, - `vnd.mobius.txf`, - `vnd.mophun.application`, - `vnd.mophun.certificate`, - `vnd.motorola.flexsuite`, - `vnd.motorola.flexsuite.adsi`, - `vnd.motorola.flexsuite.fis`, - `vnd.motorola.flexsuite.gotap`, - `vnd.motorola.flexsuite.kmr`, - `vnd.motorola.flexsuite.ttc`, - `vnd.motorola.flexsuite.wem`, - `vnd.motorola.iprm`, - `vnd.mozilla.xul+xml`, - `vnd.ms-3mfdocument`, - `vnd.ms-artgalry`, - `vnd.ms-asf`, - `vnd.ms-cab-compressed`, - `vnd.ms-color.iccprofile`, - `vnd.ms-excel`, - `vnd.ms-excel.addin.macroenabled.12`, - `vnd.ms-excel.sheet.binary.macroenabled.12`, - `vnd.ms-excel.sheet.macroenabled.12`, - `vnd.ms-excel.template.macroenabled.12`, - `vnd.ms-fontobject`, - `vnd.ms-htmlhelp`, - `vnd.ms-ims`, - `vnd.ms-lrm`, - `vnd.ms-office.activex+xml`, - `vnd.ms-officetheme`, - `vnd.ms-opentype`, - `vnd.ms-outlook`, - `vnd.ms-package.obfuscated-opentype`, - `vnd.ms-pki.seccat`, - `vnd.ms-pki.stl`, - `vnd.ms-playready.initiator+xml`, - `vnd.ms-powerpoint`, - `vnd.ms-powerpoint.addin.macroenabled.12`, - `vnd.ms-powerpoint.presentation.macroenabled.12`, - `vnd.ms-powerpoint.slide.macroenabled.12`, - `vnd.ms-powerpoint.slideshow.macroenabled.12`, - `vnd.ms-powerpoint.template.macroenabled.12`, - `vnd.ms-printdevicecapabilities+xml`, - `vnd.ms-printing.printticket+xml`, - `vnd.ms-printschematicket+xml`, - `vnd.ms-project`, - `vnd.ms-tnef`, - `vnd.ms-windows.devicepairing`, - `vnd.ms-windows.nwprinting.oob`, - `vnd.ms-windows.printerpairing`, - `vnd.ms-windows.wsd.oob`, - `vnd.ms-wmdrm.lic-chlg-req`, + "vnd.openxmlformats-package.digital-signature-xmlsignature+xml", + compressible = true, + binary = true, ) - } - trait application_2 { - lazy val `vnd.ms-wmdrm.lic-resp`: MediaType = - new MediaType("application", "vnd.ms-wmdrm.lic-resp", Compressible, NotBinary) - lazy val `vnd.ms-wmdrm.meter-chlg-req`: MediaType = - new MediaType("application", "vnd.ms-wmdrm.meter-chlg-req", Compressible, NotBinary) - lazy val `vnd.ms-wmdrm.meter-resp`: MediaType = - new MediaType("application", "vnd.ms-wmdrm.meter-resp", Compressible, NotBinary) - lazy val `vnd.ms-word.document.macroenabled.12`: MediaType = new MediaType( + + lazy val `vnd.sss-ntf`: MediaType = + new MediaType("application", "vnd.sss-ntf", compressible = false, binary = true) + + lazy val `vnd.oma.cab-user-prefs+xml`: MediaType = + new MediaType("application", "vnd.oma.cab-user-prefs+xml", compressible = true, binary = true) + + lazy val `vnd.ecowin.filerequest`: MediaType = + new MediaType("application", "vnd.ecowin.filerequest", compressible = false, binary = true) + + lazy val `vnd.ms-artgalry`: MediaType = + new MediaType("application", "vnd.ms-artgalry", compressible = false, binary = true, List("cil")) + + lazy val `dialog-info+xml`: MediaType = + new MediaType("application", "dialog-info+xml", compressible = true, binary = true) + + lazy val `x-font-pcf`: MediaType = + new MediaType("application", "x-font-pcf", compressible = false, binary = true, List("pcf")) + + lazy val `vnd.openblox.game-binary`: MediaType = + new MediaType("application", "vnd.openblox.game-binary", compressible = false, binary = true) + + lazy val `x-x509-ca-cert`: MediaType = + new MediaType("application", "x-x509-ca-cert", compressible = false, binary = true, List("der", "crt", "pem")) + + lazy val `vnd.ipld.raw`: MediaType = + new MediaType("application", "vnd.ipld.raw", compressible = false, binary = true) + + lazy val `xcap-ns+xml`: MediaType = + new MediaType("application", "xcap-ns+xml", compressible = true, binary = true, List("xns")) + + lazy val `vnd.cosmocaller`: MediaType = + new MediaType("application", "vnd.cosmocaller", compressible = false, binary = true, List("cmc")) + + lazy val `x-sh`: MediaType = + new MediaType("application", "x-sh", compressible = true, binary = true, List("sh")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml`: MediaType = + new MediaType( "application", - "vnd.ms-word.document.macroenabled.12", - Compressible, - NotBinary, - List("docm"), + "vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml", + compressible = true, + binary = true, ) - lazy val `vnd.ms-word.template.macroenabled.12`: MediaType = new MediaType( + + lazy val `vnd.sealed.tiff`: MediaType = + new MediaType("application", "vnd.sealed.tiff", compressible = false, binary = true) + + lazy val `fits`: MediaType = + new MediaType("application", "fits", compressible = false, binary = true) + + lazy val `vnd.wfa.wsc`: MediaType = + new MediaType("application", "vnd.wfa.wsc", compressible = false, binary = true) + + lazy val `x400-bp`: MediaType = + new MediaType("application", "x400-bp", compressible = false, binary = true) + + lazy val `vnd.lotus-freelance`: MediaType = + new MediaType("application", "vnd.lotus-freelance", compressible = false, binary = true, List("pre")) + + lazy val `vnd.medicalholodeck.recordxr`: MediaType = + new MediaType("application", "vnd.medicalholodeck.recordxr", compressible = false, binary = true) + + lazy val `vnd.powerbuilder6`: MediaType = + new MediaType("application", "vnd.powerbuilder6", compressible = false, binary = true, List("pbd")) + + lazy val `x-virtualbox-vbox`: MediaType = + new MediaType("application", "x-virtualbox-vbox", compressible = true, binary = true, List("vbox")) + + lazy val `vnd.kde.karbon`: MediaType = + new MediaType("application", "vnd.kde.karbon", compressible = false, binary = true, List("karbon")) + + lazy val `sensml+cbor`: MediaType = + new MediaType("application", "sensml+cbor", compressible = false, binary = true) + + lazy val `msc-ivr+xml`: MediaType = + new MediaType("application", "msc-ivr+xml", compressible = true, binary = true) + + lazy val `msix`: MediaType = + new MediaType("application", "msix", compressible = false, binary = true, List("msix")) + + lazy val `vnd.oci.image.manifest.v1+json`: MediaType = + new MediaType("application", "vnd.oci.image.manifest.v1+json", compressible = true, binary = false) + + lazy val `fido.trusted-apps+json`: MediaType = + new MediaType("application", "fido.trusted-apps+json", compressible = true, binary = false) + + lazy val `vnd.ieee.1905`: MediaType = + new MediaType("application", "vnd.ieee.1905", compressible = false, binary = true) + + lazy val `x-font-type1`: MediaType = + new MediaType( "application", - "vnd.ms-word.template.macroenabled.12", - Compressible, - NotBinary, - List("dotm"), + "x-font-type1", + compressible = false, + binary = true, + List("pfa", "pfb", "pfm", "afm"), ) - lazy val `vnd.ms-works`: MediaType = new MediaType( + + lazy val `vnd.yaoweme`: MediaType = + new MediaType("application", "vnd.yaoweme", compressible = false, binary = true) + + lazy val `rss+xml`: MediaType = + new MediaType("application", "rss+xml", compressible = true, binary = true, List("rss")) + + lazy val `emergencycalldata.control+xml`: MediaType = + new MediaType("application", "emergencycalldata.control+xml", compressible = true, binary = true) + + lazy val `x-gtar`: MediaType = + new MediaType("application", "x-gtar", compressible = false, binary = true, List("gtar")) + + lazy val `octet-stream`: MediaType = + new MediaType( "application", - "vnd.ms-works", - Compressible, - NotBinary, - List("wps", "wks", "wcm", "wdb"), + "octet-stream", + compressible = false, + binary = true, + List( + "bin", + "dms", + "lrf", + "mar", + "so", + "dist", + "distz", + "pkg", + "bpk", + "dump", + "elc", + "deploy", + "exe", + "dll", + "deb", + "dmg", + "iso", + "img", + "msi", + "msp", + "msm", + "buffer", + ), ) - lazy val `vnd.ms-wpl`: MediaType = - new MediaType("application", "vnd.ms-wpl", Compressible, NotBinary, List("wpl")) - lazy val `vnd.ms-xpsdocument`: MediaType = - new MediaType("application", "vnd.ms-xpsdocument", Uncompressible, NotBinary, List("xps")) - lazy val `vnd.msa-disk-image`: MediaType = - new MediaType("application", "vnd.msa-disk-image", Compressible, NotBinary) - lazy val `vnd.mseq`: MediaType = - new MediaType("application", "vnd.mseq", Compressible, NotBinary, List("mseq")) - lazy val `vnd.msign`: MediaType = - new MediaType("application", "vnd.msign", Compressible, NotBinary) - lazy val `vnd.multiad.creator`: MediaType = - new MediaType("application", "vnd.multiad.creator", Compressible, NotBinary) - lazy val `vnd.multiad.creator.cif`: MediaType = - new MediaType("application", "vnd.multiad.creator.cif", Compressible, NotBinary) - lazy val `vnd.music-niff`: MediaType = - new MediaType("application", "vnd.music-niff", Compressible, NotBinary) - lazy val `vnd.musician`: MediaType = - new MediaType("application", "vnd.musician", Compressible, NotBinary, List("mus")) - lazy val `vnd.muvee.style`: MediaType = - new MediaType("application", "vnd.muvee.style", Compressible, NotBinary, List("msty")) - lazy val `vnd.mynfc`: MediaType = - new MediaType("application", "vnd.mynfc", Compressible, NotBinary, List("taglet")) - lazy val `vnd.ncd.control`: MediaType = - new MediaType("application", "vnd.ncd.control", Compressible, NotBinary) - lazy val `vnd.ncd.reference`: MediaType = - new MediaType("application", "vnd.ncd.reference", Compressible, NotBinary) - lazy val `vnd.nearst.inv+json`: MediaType = - new MediaType("application", "vnd.nearst.inv+json", Compressible, NotBinary) - lazy val `vnd.nebumind.line`: MediaType = - new MediaType("application", "vnd.nebumind.line", Compressible, NotBinary) - lazy val `vnd.nervana`: MediaType = - new MediaType("application", "vnd.nervana", Compressible, NotBinary) - lazy val `vnd.netfpx`: MediaType = - new MediaType("application", "vnd.netfpx", Compressible, NotBinary) - lazy val `vnd.neurolanguage.nlu`: MediaType = - new MediaType("application", "vnd.neurolanguage.nlu", Compressible, NotBinary, List("nlu")) - lazy val `vnd.nimn`: MediaType = - new MediaType("application", "vnd.nimn", Compressible, NotBinary) - lazy val `vnd.nintendo.nitro.rom`: MediaType = - new MediaType("application", "vnd.nintendo.nitro.rom", Compressible, NotBinary) - lazy val `vnd.nintendo.snes.rom`: MediaType = - new MediaType("application", "vnd.nintendo.snes.rom", Compressible, NotBinary) - lazy val `vnd.nitf`: MediaType = - new MediaType("application", "vnd.nitf", Compressible, NotBinary, List("ntf", "nitf")) - lazy val `vnd.noblenet-directory`: MediaType = - new MediaType("application", "vnd.noblenet-directory", Compressible, NotBinary, List("nnd")) - lazy val `vnd.noblenet-sealer`: MediaType = - new MediaType("application", "vnd.noblenet-sealer", Compressible, NotBinary, List("nns")) - lazy val `vnd.noblenet-web`: MediaType = - new MediaType("application", "vnd.noblenet-web", Compressible, NotBinary, List("nnw")) - lazy val `vnd.nokia.catalogs`: MediaType = - new MediaType("application", "vnd.nokia.catalogs", Compressible, NotBinary) - lazy val `vnd.nokia.conml+wbxml`: MediaType = - new MediaType("application", "vnd.nokia.conml+wbxml", Compressible, NotBinary) - lazy val `vnd.nokia.conml+xml`: MediaType = - new MediaType("application", "vnd.nokia.conml+xml", Compressible, NotBinary) - lazy val `vnd.nokia.iptv.config+xml`: MediaType = - new MediaType("application", "vnd.nokia.iptv.config+xml", Compressible, NotBinary) - lazy val `vnd.nokia.isds-radio-presets`: MediaType = - new MediaType("application", "vnd.nokia.isds-radio-presets", Compressible, NotBinary) - lazy val `vnd.nokia.landmark+wbxml`: MediaType = - new MediaType("application", "vnd.nokia.landmark+wbxml", Compressible, NotBinary) - lazy val `vnd.nokia.landmark+xml`: MediaType = - new MediaType("application", "vnd.nokia.landmark+xml", Compressible, NotBinary) - lazy val `vnd.nokia.landmarkcollection+xml`: MediaType = - new MediaType("application", "vnd.nokia.landmarkcollection+xml", Compressible, NotBinary) - lazy val `vnd.nokia.n-gage.ac+xml`: MediaType = - new MediaType("application", "vnd.nokia.n-gage.ac+xml", Compressible, NotBinary, List("ac")) - lazy val `vnd.nokia.n-gage.data`: MediaType = new MediaType( + + lazy val `vnd.ms-excel.addin.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.nokia.n-gage.data", - Compressible, - NotBinary, - List("ngdat"), + "vnd.ms-excel.addin.macroenabled.12", + compressible = false, + binary = true, + List("xlam"), ) - lazy val `vnd.nokia.n-gage.symbian.install`: MediaType = new MediaType( + + lazy val `vnd.openxmlformats-package.core-properties+xml`: MediaType = + new MediaType("application", "vnd.openxmlformats-package.core-properties+xml", compressible = true, binary = true) + + lazy val `vnd.ms-color.iccprofile`: MediaType = + new MediaType("application", "vnd.ms-color.iccprofile", compressible = false, binary = true) + + lazy val `vnd.etsi.iptvueprofile+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvueprofile+xml", compressible = true, binary = true) + + lazy val `vnd.apache.thrift.json`: MediaType = + new MediaType("application", "vnd.apache.thrift.json", compressible = false, binary = false) + + lazy val `vnd.powerbuilder75-s`: MediaType = + new MediaType("application", "vnd.powerbuilder75-s", compressible = false, binary = true) + + lazy val `x-msterminal`: MediaType = + new MediaType("application", "x-msterminal", compressible = false, binary = true, List("trm")) + + lazy val `calendar+json`: MediaType = + new MediaType("application", "calendar+json", compressible = true, binary = false) + + lazy val `xcon-conference-info+xml`: MediaType = + new MediaType("application", "xcon-conference-info+xml", compressible = true, binary = true) + + lazy val `vnd.collection.doc+json`: MediaType = + new MediaType("application", "vnd.collection.doc+json", compressible = true, binary = false) + + lazy val `vnd.d3m-dataset`: MediaType = + new MediaType("application", "vnd.d3m-dataset", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.formula`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.formula", compressible = false, binary = true, List("odf")) + + lazy val `vnd.simtech-mindmapper`: MediaType = + new MediaType("application", "vnd.simtech-mindmapper", compressible = false, binary = true, List("twd", "twds")) + + lazy val `reginfo+xml`: MediaType = + new MediaType("application", "reginfo+xml", compressible = true, binary = true, List("rif")) + + lazy val `vnd.wordlift`: MediaType = + new MediaType("application", "vnd.wordlift", compressible = false, binary = true) + + lazy val `lost+xml`: MediaType = + new MediaType("application", "lost+xml", compressible = true, binary = true, List("lostxml")) + + lazy val `vnd.preminet`: MediaType = + new MediaType("application", "vnd.preminet", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml`: MediaType = + new MediaType( "application", - "vnd.nokia.n-gage.symbian.install", - Compressible, - NotBinary, - List("n-gage"), + "vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml", + compressible = true, + binary = true, ) - lazy val `vnd.nokia.ncd`: MediaType = - new MediaType("application", "vnd.nokia.ncd", Compressible, NotBinary) - lazy val `vnd.nokia.pcd+wbxml`: MediaType = - new MediaType("application", "vnd.nokia.pcd+wbxml", Compressible, NotBinary) - lazy val `vnd.nokia.pcd+xml`: MediaType = - new MediaType("application", "vnd.nokia.pcd+xml", Compressible, NotBinary) - lazy val `vnd.nokia.radio-preset`: MediaType = new MediaType( + + lazy val `vnd.comicbook+zip`: MediaType = + new MediaType("application", "vnd.comicbook+zip", compressible = false, binary = true) + + lazy val `vnd.ezpix-package`: MediaType = + new MediaType("application", "vnd.ezpix-package", compressible = false, binary = true, List("ez3")) + + lazy val `emergencycalldata.veds+xml`: MediaType = + new MediaType("application", "emergencycalldata.veds+xml", compressible = true, binary = true) + + lazy val `pkcs10`: MediaType = + new MediaType("application", "pkcs10", compressible = false, binary = true, List("p10")) + + lazy val `vnd.dtg.local.flash`: MediaType = + new MediaType("application", "vnd.dtg.local.flash", compressible = false, binary = true) + + lazy val `sep-exi`: MediaType = + new MediaType("application", "sep-exi", compressible = false, binary = true) + + lazy val `vnd.nokia.radio-preset`: MediaType = + new MediaType("application", "vnd.nokia.radio-preset", compressible = false, binary = true, List("rpst")) + + lazy val `vnd.dece.zip`: MediaType = + new MediaType("application", "vnd.dece.zip", compressible = false, binary = true, List("uvz", "uvvz")) + + lazy val `smil+xml`: MediaType = + new MediaType("application", "smil+xml", compressible = true, binary = true, List("smi", "smil")) + + lazy val `vnd.shopkick+json`: MediaType = + new MediaType("application", "vnd.shopkick+json", compressible = true, binary = false) + + lazy val `webpush-options+json`: MediaType = + new MediaType("application", "webpush-options+json", compressible = true, binary = false) + + lazy val `vnd.anki`: MediaType = + new MediaType("application", "vnd.anki", compressible = false, binary = true) + + lazy val `cdmi-object`: MediaType = + new MediaType("application", "cdmi-object", compressible = false, binary = true, List("cdmio")) + + lazy val `vnd.onepagertatp`: MediaType = + new MediaType("application", "vnd.onepagertatp", compressible = false, binary = true) + + lazy val `vnd.fujixerox.docuworks.binder`: MediaType = + new MediaType("application", "vnd.fujixerox.docuworks.binder", compressible = false, binary = true, List("xbd")) + + lazy val `rtf`: MediaType = + new MediaType("application", "rtf", compressible = true, binary = true, List("rtf")) + + lazy val `vnd.nintendo.snes.rom`: MediaType = + new MediaType("application", "vnd.nintendo.snes.rom", compressible = false, binary = true) + + lazy val `vnd.visionary`: MediaType = + new MediaType("application", "vnd.visionary", compressible = false, binary = true, List("vis")) + + lazy val `vnd.iptc.g2.newsmessage+xml`: MediaType = + new MediaType("application", "vnd.iptc.g2.newsmessage+xml", compressible = true, binary = true) + + lazy val `tamp-update`: MediaType = + new MediaType("application", "tamp-update", compressible = false, binary = true) + + lazy val `calendar+xml`: MediaType = + new MediaType("application", "calendar+xml", compressible = true, binary = true, List("xcs")) + + lazy val `vnd.canon-lips`: MediaType = + new MediaType("application", "vnd.canon-lips", compressible = false, binary = true) + + lazy val `vnd.bpf`: MediaType = + new MediaType("application", "vnd.bpf", compressible = false, binary = true) + + lazy val `prs.cyn`: MediaType = + new MediaType("application", "prs.cyn", compressible = false, binary = true) + + lazy val `vnd.wap.sic`: MediaType = + new MediaType("application", "vnd.wap.sic", compressible = false, binary = true) + + lazy val `alto-cdni+json`: MediaType = + new MediaType("application", "alto-cdni+json", compressible = true, binary = false) + + lazy val `vnd.handheld-entertainment+xml`: MediaType = + new MediaType("application", "vnd.handheld-entertainment+xml", compressible = true, binary = true, List("zmm")) + + lazy val `vnd.shootproof+json`: MediaType = + new MediaType("application", "vnd.shootproof+json", compressible = true, binary = false) + + lazy val `prs.cww`: MediaType = + new MediaType("application", "prs.cww", compressible = false, binary = true, List("cww")) + + lazy val `vnd.gentoo.eclass`: MediaType = + new MediaType("application", "vnd.gentoo.eclass", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml`: MediaType = + new MediaType( "application", - "vnd.nokia.radio-preset", - Compressible, - NotBinary, - List("rpst"), + "vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml", + compressible = true, + binary = true, ) - lazy val `vnd.nokia.radio-presets`: MediaType = new MediaType( + + lazy val `vnd.ms-officetheme`: MediaType = + new MediaType("application", "vnd.ms-officetheme", compressible = false, binary = true, List("thmx")) + + lazy val `pkix-pkipath`: MediaType = + new MediaType("application", "pkix-pkipath", compressible = false, binary = true, List("pkipath")) + + lazy val `vnd.openxmlformats-officedocument.extended-properties+xml`: MediaType = + new MediaType( "application", - "vnd.nokia.radio-presets", - Compressible, - NotBinary, - List("rpss"), + "vnd.openxmlformats-officedocument.extended-properties+xml", + compressible = true, + binary = true, ) - lazy val `vnd.novadigm.edm`: MediaType = - new MediaType("application", "vnd.novadigm.edm", Compressible, NotBinary, List("edm")) - lazy val `vnd.novadigm.edx`: MediaType = - new MediaType("application", "vnd.novadigm.edx", Compressible, NotBinary, List("edx")) - lazy val `vnd.novadigm.ext`: MediaType = - new MediaType("application", "vnd.novadigm.ext", Compressible, NotBinary, List("ext")) - lazy val `vnd.ntt-local.content-share`: MediaType = - new MediaType("application", "vnd.ntt-local.content-share", Compressible, NotBinary) - lazy val `vnd.ntt-local.file-transfer`: MediaType = - new MediaType("application", "vnd.ntt-local.file-transfer", Compressible, NotBinary) - lazy val `vnd.ntt-local.ogw_remote-access`: MediaType = - new MediaType("application", "vnd.ntt-local.ogw_remote-access", Compressible, NotBinary) - lazy val `vnd.ntt-local.sip-ta_remote`: MediaType = - new MediaType("application", "vnd.ntt-local.sip-ta_remote", Compressible, NotBinary) - lazy val `vnd.ntt-local.sip-ta_tcp_stream`: MediaType = - new MediaType("application", "vnd.ntt-local.sip-ta_tcp_stream", Compressible, NotBinary) - lazy val `vnd.oasis.opendocument.chart`: MediaType = new MediaType( + + lazy val `vnd.belightsoft.lhzl+zip`: MediaType = + new MediaType("application", "vnd.belightsoft.lhzl+zip", compressible = false, binary = true) + + lazy val `vnd.3gpp.pic-bw-small`: MediaType = + new MediaType("application", "vnd.3gpp.pic-bw-small", compressible = false, binary = true, List("psb")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.chart", - Compressible, - Binary, - List("odc"), + "vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.chart-template`: MediaType = new MediaType( + + lazy val `vnd.oma.bcast.smartcard-trigger+xml`: MediaType = + new MediaType("application", "vnd.oma.bcast.smartcard-trigger+xml", compressible = true, binary = true) + + lazy val `vnd.ncd.reference`: MediaType = + new MediaType("application", "vnd.ncd.reference", compressible = false, binary = true) + + lazy val `vnd.ipunplugged.rcprofile`: MediaType = + new MediaType("application", "vnd.ipunplugged.rcprofile", compressible = false, binary = true, List("rcprofile")) + + lazy val `cnrp+xml`: MediaType = + new MediaType("application", "cnrp+xml", compressible = true, binary = true) + + lazy val `vnd.amiga.ami`: MediaType = + new MediaType("application", "vnd.amiga.ami", compressible = false, binary = true, List("ami")) + + lazy val `yang-patch+xml`: MediaType = + new MediaType("application", "yang-patch+xml", compressible = true, binary = true) + + lazy val `vnd.etsi.iptvsad-cod+xml`: MediaType = + new MediaType("application", "vnd.etsi.iptvsad-cod+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.chart-template", - Compressible, - NotBinary, - List("otc"), + "vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.database`: MediaType = new MediaType( + + lazy val `vnd.wt.stf`: MediaType = + new MediaType("application", "vnd.wt.stf", compressible = false, binary = true, List("stf")) + + lazy val `vnd.3gpp2.bcmcsinfo+xml`: MediaType = + new MediaType("application", "vnd.3gpp2.bcmcsinfo+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp-prose+xml`: MediaType = + new MediaType("application", "vnd.3gpp-prose+xml", compressible = true, binary = true) + + lazy val `vnd.sun.xml.writer`: MediaType = + new MediaType("application", "vnd.sun.xml.writer", compressible = false, binary = true, List("sxw")) + + lazy val `vnd.rim.cod`: MediaType = + new MediaType("application", "vnd.rim.cod", compressible = false, binary = true, List("cod")) + + lazy val `poc-settings+xml`: MediaType = + new MediaType("application", "poc-settings+xml", compressible = true, binary = true) + + lazy val `jose`: MediaType = + new MediaType("application", "jose", compressible = false, binary = true) + + lazy val `pkixcmp`: MediaType = + new MediaType("application", "pkixcmp", compressible = false, binary = true, List("pki")) + + lazy val `vnd.infotech.project+xml`: MediaType = + new MediaType("application", "vnd.infotech.project+xml", compressible = true, binary = true) + + lazy val `vnd.uplanet.bearer-choice-wbxml`: MediaType = + new MediaType("application", "vnd.uplanet.bearer-choice-wbxml", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.notesslide+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.database", - Compressible, - Binary, - List("odb"), + "vnd.openxmlformats-officedocument.presentationml.notesslide+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.formula`: MediaType = new MediaType( + + lazy val `vnd.f-secure.mobile`: MediaType = + new MediaType("application", "vnd.f-secure.mobile", compressible = false, binary = true) + + lazy val `scaip+xml`: MediaType = + new MediaType("application", "scaip+xml", compressible = true, binary = true) + + lazy val `vnd.gentoo.xpak`: MediaType = + new MediaType("application", "vnd.gentoo.xpak", compressible = false, binary = true) + + lazy val `vnd.poc.group-advertisement+xml`: MediaType = + new MediaType("application", "vnd.poc.group-advertisement+xml", compressible = true, binary = true) + + lazy val `xcap-error+xml`: MediaType = + new MediaType("application", "xcap-error+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.custom-properties+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.formula", - Compressible, - Binary, - List("odf"), + "vnd.openxmlformats-officedocument.custom-properties+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.formula-template`: MediaType = new MediaType( + + lazy val `h224`: MediaType = + new MediaType("application", "h224", compressible = false, binary = true) + + lazy val `vnd.kde.kivio`: MediaType = + new MediaType("application", "vnd.kde.kivio", compressible = false, binary = true, List("flw")) + + lazy val `mmt-usd+xml`: MediaType = + new MediaType("application", "mmt-usd+xml", compressible = true, binary = true, List("musd")) + + lazy val `csta+xml`: MediaType = + new MediaType("application", "csta+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp.mcptt-ue-init-config+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-ue-init-config+xml", compressible = true, binary = true) + + lazy val `vnd.ms-htmlhelp`: MediaType = + new MediaType("application", "vnd.ms-htmlhelp", compressible = false, binary = true, List("chm")) + + lazy val `xenc+xml`: MediaType = + new MediaType("application", "xenc+xml", compressible = true, binary = true, List("xenc")) + + lazy val `tamp-sequence-adjust`: MediaType = + new MediaType("application", "tamp-sequence-adjust", compressible = false, binary = true) + + lazy val `cfw`: MediaType = + new MediaType("application", "cfw", compressible = false, binary = true) + + lazy val `vnd.oipf.spdiscovery+xml`: MediaType = + new MediaType("application", "vnd.oipf.spdiscovery+xml", compressible = true, binary = true) + + lazy val `vnd.sycle+xml`: MediaType = + new MediaType("application", "vnd.sycle+xml", compressible = true, binary = true) + + lazy val `vnd.sun.wadl+xml`: MediaType = + new MediaType("application", "vnd.sun.wadl+xml", compressible = true, binary = true, List("wadl")) + + lazy val `vnd.lotus-notes`: MediaType = + new MediaType("application", "vnd.lotus-notes", compressible = false, binary = true, List("nsf")) + + lazy val `vnd.epson.msf`: MediaType = + new MediaType("application", "vnd.epson.msf", compressible = false, binary = true, List("msf")) + + lazy val `vnd.oma.bcast.sprov+xml`: MediaType = + new MediaType("application", "vnd.oma.bcast.sprov+xml", compressible = true, binary = true) + + lazy val `vnd.unity`: MediaType = + new MediaType("application", "vnd.unity", compressible = false, binary = true, List("unityweb")) + + lazy val `vnd.oipf.cspg-hexbinary`: MediaType = + new MediaType("application", "vnd.oipf.cspg-hexbinary", compressible = false, binary = true) + + lazy val `vnd.uplanet.list-wbxml`: MediaType = + new MediaType("application", "vnd.uplanet.list-wbxml", compressible = false, binary = true) + + lazy val `rpki-publication`: MediaType = + new MediaType("application", "rpki-publication", compressible = false, binary = true) + + lazy val `vnd.3gpp-prose-pc3ach+xml`: MediaType = + new MediaType("application", "vnd.3gpp-prose-pc3ach+xml", compressible = true, binary = true) + + lazy val `vnd.xacml+json`: MediaType = + new MediaType("application", "vnd.xacml+json", compressible = true, binary = false) + + lazy val `vnd.dvb.notif-ia-registration-request+xml`: MediaType = + new MediaType("application", "vnd.dvb.notif-ia-registration-request+xml", compressible = true, binary = true) + + lazy val `vnd.japannet-registration-wakeup`: MediaType = + new MediaType("application", "vnd.japannet-registration-wakeup", compressible = false, binary = true) + + lazy val `vnd.kinar`: MediaType = + new MediaType("application", "vnd.kinar", compressible = false, binary = true, List("kne", "knp")) + + lazy val `vnd.3gpp.mcvideo-mbms-usage-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-mbms-usage-info+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.formula-template", - Compressible, - NotBinary, - List("odft"), + "vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.graphics`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.graphics", - Uncompressible, - Binary, - List("odg"), - ) - lazy val `vnd.oasis.opendocument.graphics-template`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.graphics-template", - Compressible, - NotBinary, - List("otg"), - ) - lazy val `vnd.oasis.opendocument.image`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.image", - Compressible, - Binary, - List("odi"), - ) - lazy val `vnd.oasis.opendocument.image-template`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.image-template", - Compressible, - NotBinary, - List("oti"), - ) - lazy val `vnd.oasis.opendocument.presentation`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.presentation", - Uncompressible, - Binary, - List("odp"), - ) - lazy val `vnd.oasis.opendocument.presentation-template`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.presentation-template", - Compressible, - NotBinary, - List("otp"), - ) - lazy val `vnd.oasis.opendocument.spreadsheet`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.spreadsheet", - Uncompressible, - Binary, - List("ods"), - ) - lazy val `vnd.oasis.opendocument.spreadsheet-template`: MediaType = new MediaType( - "application", - "vnd.oasis.opendocument.spreadsheet-template", - Compressible, - NotBinary, - List("ots"), - ) - lazy val `vnd.oasis.opendocument.text`: MediaType = new MediaType( + + lazy val `vnd.3gpp2.tcap`: MediaType = + new MediaType("application", "vnd.3gpp2.tcap", compressible = false, binary = true, List("tcap")) + + lazy val `mac-compactpro`: MediaType = + new MediaType("application", "mac-compactpro", compressible = false, binary = true, List("cpt")) + + lazy val `widget`: MediaType = + new MediaType("application", "widget", compressible = false, binary = true, List("wgt")) + + lazy val `raptorfec`: MediaType = + new MediaType("application", "raptorfec", compressible = false, binary = true) + + lazy val `tlsrpt+json`: MediaType = + new MediaType("application", "tlsrpt+json", compressible = true, binary = false) + + lazy val `vnd.bluetooth.le.oob`: MediaType = + new MediaType("application", "vnd.bluetooth.le.oob", compressible = false, binary = true) + + lazy val `x-ms-shortcut`: MediaType = + new MediaType("application", "x-ms-shortcut", compressible = false, binary = true, List("lnk")) + + lazy val `oxps`: MediaType = + new MediaType("application", "oxps", compressible = false, binary = true, List("oxps")) + + lazy val `metalink+xml`: MediaType = + new MediaType("application", "metalink+xml", compressible = true, binary = true, List("metalink")) + + lazy val `mpeg4-iod`: MediaType = + new MediaType("application", "mpeg4-iod", compressible = false, binary = true) + + lazy val `vnd.nokia.n-gage.ac+xml`: MediaType = + new MediaType("application", "vnd.nokia.n-gage.ac+xml", compressible = true, binary = true, List("ac")) + + lazy val `javascript`: MediaType = + new MediaType("application", "javascript", compressible = true, binary = false, List("js")) + + lazy val `vnd.seis+json`: MediaType = + new MediaType("application", "vnd.seis+json", compressible = true, binary = false) + + lazy val `vnd.xfdl.webform`: MediaType = + new MediaType("application", "vnd.xfdl.webform", compressible = false, binary = true) + + lazy val `vnd.datalog`: MediaType = + new MediaType("application", "vnd.datalog", compressible = false, binary = true) + + lazy val `alto-endpointprop+json`: MediaType = + new MediaType("application", "alto-endpointprop+json", compressible = true, binary = false) + + lazy val `vnd.omaloc-supl-init`: MediaType = + new MediaType("application", "vnd.omaloc-supl-init", compressible = false, binary = true) + + lazy val `vnd.eclipse.ditto+json`: MediaType = + new MediaType("application", "vnd.eclipse.ditto+json", compressible = true, binary = false) + + lazy val `vnd.vividence.scriptfile`: MediaType = + new MediaType("application", "vnd.vividence.scriptfile", compressible = false, binary = true) + + lazy val `xml`: MediaType = + new MediaType("application", "xml", compressible = true, binary = false, List("xml", "xsl", "xsd", "rng")) + + lazy val `vnd.wmf.bootstrap`: MediaType = + new MediaType("application", "vnd.wmf.bootstrap", compressible = false, binary = true) + + lazy val `vnd.afpc.modca-cmtable`: MediaType = + new MediaType("application", "vnd.afpc.modca-cmtable", compressible = false, binary = true) + + lazy val `vnd.syncml.dmtnds+wbxml`: MediaType = + new MediaType("application", "vnd.syncml.dmtnds+wbxml", compressible = false, binary = true) + + lazy val `vnd.uplanet.alert-wbxml`: MediaType = + new MediaType("application", "vnd.uplanet.alert-wbxml", compressible = false, binary = true) + + lazy val `vnd.shana.informed.package`: MediaType = + new MediaType("application", "vnd.shana.informed.package", compressible = false, binary = true, List("ipk")) + + lazy val `vnd.onepagertamx`: MediaType = + new MediaType("application", "vnd.onepagertamx", compressible = false, binary = true) + + lazy val `vnd.apple.numbers`: MediaType = + new MediaType("application", "vnd.apple.numbers", compressible = false, binary = true, List("numbers")) + + lazy val `vnd.ncd.control`: MediaType = + new MediaType("application", "vnd.ncd.control", compressible = false, binary = true) + + lazy val `vnd.xmpie.plan`: MediaType = + new MediaType("application", "vnd.xmpie.plan", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcvideo-ue-config+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-ue-config+xml", compressible = true, binary = true) + + lazy val `x-pkcs12`: MediaType = + new MediaType("application", "x-pkcs12", compressible = false, binary = true, List("p12", "pfx")) + + lazy val `vnd.efi.iso`: MediaType = + new MediaType("application", "vnd.efi.iso", compressible = false, binary = true) + + lazy val `emergencycalldata.cap+xml`: MediaType = + new MediaType("application", "emergencycalldata.cap+xml", compressible = true, binary = true) + + lazy val `vnd.sun.xml.math`: MediaType = + new MediaType("application", "vnd.sun.xml.math", compressible = false, binary = true, List("sxm")) + + lazy val `vnd.imagemeter.folder+zip`: MediaType = + new MediaType("application", "vnd.imagemeter.folder+zip", compressible = false, binary = true) + + lazy val `vnd.ms-printing.printticket+xml`: MediaType = + new MediaType("application", "vnd.ms-printing.printticket+xml", compressible = true, binary = true) + + lazy val `vnd.ms-tnef`: MediaType = + new MediaType("application", "vnd.ms-tnef", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.text", - Uncompressible, - Binary, - List("odt"), + "vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.text-master`: MediaType = new MediaType( + + lazy val `x-font-linux-psf`: MediaType = + new MediaType("application", "x-font-linux-psf", compressible = false, binary = true, List("psf")) + + lazy val `vnd.radisys.msml-dialog-fax-detect+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-dialog-fax-detect+xml", compressible = true, binary = true) + + lazy val `provenance+xml`: MediaType = + new MediaType("application", "provenance+xml", compressible = true, binary = true, List("provx")) + + lazy val `xml-dtd`: MediaType = + new MediaType("application", "xml-dtd", compressible = true, binary = false, List("dtd")) + + lazy val `vnd.cybank`: MediaType = + new MediaType("application", "vnd.cybank", compressible = false, binary = true) + + lazy val `vnd.yellowriver-custom-menu`: MediaType = + new MediaType("application", "vnd.yellowriver-custom-menu", compressible = false, binary = true, List("cmp")) + + lazy val `vnd.ims.lti.v2.toolsettings.simple+json`: MediaType = + new MediaType("application", "vnd.ims.lti.v2.toolsettings.simple+json", compressible = true, binary = false) + + lazy val `vnd.tri.onesource`: MediaType = + new MediaType("application", "vnd.tri.onesource", compressible = false, binary = true) + + lazy val `vnd.belightsoft.lhzd+zip`: MediaType = + new MediaType("application", "vnd.belightsoft.lhzd+zip", compressible = false, binary = true) + + lazy val `vnd.bpf3`: MediaType = + new MediaType("application", "vnd.bpf3", compressible = false, binary = true) + + lazy val `vnd.apache.thrift.compact`: MediaType = + new MediaType("application", "vnd.apache.thrift.compact", compressible = false, binary = true) + + lazy val `vnd.radisys.msml-audit-dialog+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-audit-dialog+xml", compressible = true, binary = true) + + lazy val `x-subrip`: MediaType = + new MediaType("application", "x-subrip", compressible = false, binary = true, List("srt")) + + lazy val `vnd.oma.poc.detailed-progress-report+xml`: MediaType = + new MediaType("application", "vnd.oma.poc.detailed-progress-report+xml", compressible = true, binary = true) + + lazy val `vnd.openxmlformats-officedocument.drawingml.chart+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.text-master", - Compressible, - Binary, - List("odm"), + "vnd.openxmlformats-officedocument.drawingml.chart+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.text-template`: MediaType = new MediaType( + + lazy val `bacnet-xdd+zip`: MediaType = + new MediaType("application", "bacnet-xdd+zip", compressible = false, binary = true) + + lazy val `vnd.swiftview-ics`: MediaType = + new MediaType("application", "vnd.swiftview-ics", compressible = false, binary = true) + + lazy val `vnd.ds-keypoint`: MediaType = + new MediaType("application", "vnd.ds-keypoint", compressible = false, binary = true, List("kpxx")) + + lazy val `kpml-request+xml`: MediaType = + new MediaType("application", "kpml-request+xml", compressible = true, binary = true) + + lazy val `vnd.resilient.logic`: MediaType = + new MediaType("application", "vnd.resilient.logic", compressible = false, binary = true) + + lazy val `session-info`: MediaType = + new MediaType("application", "session-info", compressible = false, binary = true) + + lazy val `vnd.cyclonedx+xml`: MediaType = + new MediaType("application", "vnd.cyclonedx+xml", compressible = true, binary = true) + + lazy val `vnd.sealed.ppt`: MediaType = + new MediaType("application", "vnd.sealed.ppt", compressible = false, binary = true) + + lazy val `sru+xml`: MediaType = + new MediaType("application", "sru+xml", compressible = true, binary = true, List("sru")) + + lazy val `route-apd+xml`: MediaType = + new MediaType("application", "route-apd+xml", compressible = true, binary = true, List("rapd")) + + lazy val `hyperstudio`: MediaType = + new MediaType("application", "hyperstudio", compressible = false, binary = true, List("stk")) + + lazy val `cdmi-queue`: MediaType = + new MediaType("application", "cdmi-queue", compressible = false, binary = true, List("cdmiq")) + + lazy val `mbms-register-response+xml`: MediaType = + new MediaType("application", "mbms-register-response+xml", compressible = true, binary = true) + + lazy val `dca-rft`: MediaType = + new MediaType("application", "dca-rft", compressible = false, binary = true) + + lazy val `vnd.syncml+xml`: MediaType = + new MediaType("application", "vnd.syncml+xml", compressible = true, binary = true, List("xsm")) + + lazy val `vnd.ecowin.fileupdate`: MediaType = + new MediaType("application", "vnd.ecowin.fileupdate", compressible = false, binary = true) + + lazy val `x-java-archive-diff`: MediaType = + new MediaType("application", "x-java-archive-diff", compressible = false, binary = true, List("jardiff")) + + lazy val `x-wais-source`: MediaType = + new MediaType("application", "x-wais-source", compressible = false, binary = true, List("src")) + + lazy val `x-futuresplash`: MediaType = + new MediaType("application", "x-futuresplash", compressible = false, binary = true, List("spl")) + + lazy val `rlmi+xml`: MediaType = + new MediaType("application", "rlmi+xml", compressible = true, binary = true) + + lazy val `vnd.mobius.plc`: MediaType = + new MediaType("application", "vnd.mobius.plc", compressible = false, binary = true, List("plc")) + + lazy val `vnd.oma.lwm2m+cbor`: MediaType = + new MediaType("application", "vnd.oma.lwm2m+cbor", compressible = false, binary = true) + + lazy val `vnd.radisys.msml-dialog-fax-sendrecv+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-dialog-fax-sendrecv+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp.mid-call+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mid-call+xml", compressible = true, binary = true) + + lazy val `pkcs7-signature`: MediaType = + new MediaType("application", "pkcs7-signature", compressible = false, binary = true, List("p7s")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.slidelayout+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.text-template", - Compressible, - NotBinary, - List("ott"), + "vnd.openxmlformats-officedocument.presentationml.slidelayout+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oasis.opendocument.text-web`: MediaType = new MediaType( + + lazy val `vnd.imagemeter.image+zip`: MediaType = + new MediaType("application", "vnd.imagemeter.image+zip", compressible = false, binary = true) + + lazy val `vnd.hp-hpgl`: MediaType = + new MediaType("application", "vnd.hp-hpgl", compressible = false, binary = true, List("hpgl")) + + lazy val `vnd.gerber`: MediaType = + new MediaType("application", "vnd.gerber", compressible = false, binary = true) + + lazy val `vnd.ah-barcode`: MediaType = + new MediaType("application", "vnd.ah-barcode", compressible = false, binary = true) + + lazy val `vnd.sealed.3df`: MediaType = + new MediaType("application", "vnd.sealed.3df", compressible = false, binary = true) + + lazy val `jose+json`: MediaType = + new MediaType("application", "jose+json", compressible = true, binary = false) + + lazy val `pics-rules`: MediaType = + new MediaType("application", "pics-rules", compressible = false, binary = true, List("prf")) + + lazy val `vnd.cab-jscript`: MediaType = + new MediaType("application", "vnd.cab-jscript", compressible = false, binary = true) + + lazy val `xcap-caps+xml`: MediaType = + new MediaType("application", "xcap-caps+xml", compressible = true, binary = true, List("xca")) + + lazy val `vnd.afpc.modca-mediummap`: MediaType = + new MediaType("application", "vnd.afpc.modca-mediummap", compressible = false, binary = true) + + lazy val `vnd.xmpie.dpkg`: MediaType = + new MediaType("application", "vnd.xmpie.dpkg", compressible = false, binary = true) + + lazy val `vnd.3gpp.srvcc-ext+xml`: MediaType = + new MediaType("application", "vnd.3gpp.srvcc-ext+xml", compressible = true, binary = true) + + lazy val `vnd.ipld.car`: MediaType = + new MediaType("application", "vnd.ipld.car", compressible = false, binary = true) + + lazy val `vnd.radisys.msml-audit-stream+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-audit-stream+xml", compressible = true, binary = true) + + lazy val `vnd.iptc.g2.catalogitem+xml`: MediaType = + new MediaType("application", "vnd.iptc.g2.catalogitem+xml", compressible = true, binary = true) + + lazy val `inkml+xml`: MediaType = + new MediaType("application", "inkml+xml", compressible = true, binary = true, List("ink", "inkml")) + + lazy val `vnd.epson.quickanime`: MediaType = + new MediaType("application", "vnd.epson.quickanime", compressible = false, binary = true, List("qam")) + + lazy val `vnd.bbf.usp.error`: MediaType = + new MediaType("application", "vnd.bbf.usp.error", compressible = false, binary = true) + + lazy val `xliff+xml`: MediaType = + new MediaType("application", "xliff+xml", compressible = true, binary = true, List("xlf")) + + lazy val `remote-printing`: MediaType = + new MediaType("application", "remote-printing", compressible = false, binary = true) + + lazy val `vnd.fints`: MediaType = + new MediaType("application", "vnd.fints", compressible = false, binary = true) + + lazy val `vnd.oipf.mippvcontrolmessage+xml`: MediaType = + new MediaType("application", "vnd.oipf.mippvcontrolmessage+xml", compressible = true, binary = true) + + lazy val `vnd.nokia.ncd`: MediaType = + new MediaType("application", "vnd.nokia.ncd", compressible = false, binary = true) + + lazy val `vnd.aplextor.warrp+json`: MediaType = + new MediaType("application", "vnd.aplextor.warrp+json", compressible = true, binary = false) + + lazy val `mud+json`: MediaType = + new MediaType("application", "mud+json", compressible = true, binary = false) + + lazy val `vnd.3gpp.bsf+xml`: MediaType = + new MediaType("application", "vnd.3gpp.bsf+xml", compressible = true, binary = true) + + lazy val `rdf+xml`: MediaType = + new MediaType("application", "rdf+xml", compressible = true, binary = true, List("rdf", "owl")) + + lazy val `im-iscomposing+xml`: MediaType = + new MediaType("application", "im-iscomposing+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp.s1ap`: MediaType = + new MediaType("application", "vnd.3gpp.s1ap", compressible = false, binary = true) + + lazy val `riscos`: MediaType = + new MediaType("application", "riscos", compressible = false, binary = true) + + lazy val `vnd.enphase.envoy`: MediaType = + new MediaType("application", "vnd.enphase.envoy", compressible = false, binary = true) + + lazy val `scvp-vp-response`: MediaType = + new MediaType("application", "scvp-vp-response", compressible = false, binary = true, List("spp")) + + lazy val `vnd.umajin`: MediaType = + new MediaType("application", "vnd.umajin", compressible = false, binary = true, List("umj")) + + lazy val `x-font-vfont`: MediaType = + new MediaType("application", "x-font-vfont", compressible = false, binary = true) + + lazy val `vnd.gov.sk.e-form+zip`: MediaType = + new MediaType("application", "vnd.gov.sk.e-form+zip", compressible = false, binary = true) + + lazy val `vnd.openblox.game+xml`: MediaType = + new MediaType("application", "vnd.openblox.game+xml", compressible = true, binary = true, List("obgx")) + + lazy val `alto-costmap+json`: MediaType = + new MediaType("application", "alto-costmap+json", compressible = true, binary = false) + + lazy val `font-sfnt`: MediaType = + new MediaType("application", "font-sfnt", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml`: MediaType = + new MediaType( "application", - "vnd.oasis.opendocument.text-web", - Compressible, - Binary, - List("oth"), + "vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml", + compressible = true, + binary = true, ) - lazy val `vnd.obn`: MediaType = - new MediaType("application", "vnd.obn", Compressible, NotBinary) - lazy val `vnd.ocf+cbor`: MediaType = - new MediaType("application", "vnd.ocf+cbor", Compressible, NotBinary) - lazy val `vnd.oci.image.manifest.v1+json`: MediaType = - new MediaType("application", "vnd.oci.image.manifest.v1+json", Compressible, NotBinary) - lazy val `vnd.oftn.l10n+json`: MediaType = - new MediaType("application", "vnd.oftn.l10n+json", Compressible, NotBinary) - lazy val `vnd.oipf.contentaccessdownload+xml`: MediaType = - new MediaType("application", "vnd.oipf.contentaccessdownload+xml", Compressible, NotBinary) - lazy val `vnd.oipf.contentaccessstreaming+xml`: MediaType = - new MediaType("application", "vnd.oipf.contentaccessstreaming+xml", Compressible, NotBinary) - lazy val `vnd.oipf.cspg-hexbinary`: MediaType = - new MediaType("application", "vnd.oipf.cspg-hexbinary", Compressible, NotBinary) - lazy val `vnd.oipf.dae.svg+xml`: MediaType = - new MediaType("application", "vnd.oipf.dae.svg+xml", Compressible, NotBinary) - lazy val `vnd.oipf.dae.xhtml+xml`: MediaType = - new MediaType("application", "vnd.oipf.dae.xhtml+xml", Compressible, NotBinary) - lazy val `vnd.oipf.mippvcontrolmessage+xml`: MediaType = - new MediaType("application", "vnd.oipf.mippvcontrolmessage+xml", Compressible, NotBinary) - lazy val `vnd.oipf.pae.gem`: MediaType = - new MediaType("application", "vnd.oipf.pae.gem", Compressible, NotBinary) - lazy val `vnd.oipf.spdiscovery+xml`: MediaType = - new MediaType("application", "vnd.oipf.spdiscovery+xml", Compressible, NotBinary) - lazy val `vnd.oipf.spdlist+xml`: MediaType = - new MediaType("application", "vnd.oipf.spdlist+xml", Compressible, NotBinary) - lazy val `vnd.oipf.ueprofile+xml`: MediaType = - new MediaType("application", "vnd.oipf.ueprofile+xml", Compressible, NotBinary) - lazy val `vnd.oipf.userprofile+xml`: MediaType = - new MediaType("application", "vnd.oipf.userprofile+xml", Compressible, NotBinary) - lazy val `vnd.olpc-sugar`: MediaType = - new MediaType("application", "vnd.olpc-sugar", Compressible, NotBinary, List("xo")) - lazy val `vnd.oma-scws-config`: MediaType = - new MediaType("application", "vnd.oma-scws-config", Compressible, NotBinary) - lazy val `vnd.oma-scws-http-request`: MediaType = - new MediaType("application", "vnd.oma-scws-http-request", Compressible, NotBinary) - lazy val `vnd.oma-scws-http-response`: MediaType = - new MediaType("application", "vnd.oma-scws-http-response", Compressible, NotBinary) - lazy val `vnd.oma.bcast.associated-procedure-parameter+xml`: MediaType = new MediaType( + + lazy val `vnd.motorola.iprm`: MediaType = + new MediaType("application", "vnd.motorola.iprm", compressible = false, binary = true) + + lazy val `pkix-attr-cert`: MediaType = + new MediaType("application", "pkix-attr-cert", compressible = false, binary = true, List("ac")) + + lazy val `vnd.nokia.n-gage.data`: MediaType = + new MediaType("application", "vnd.nokia.n-gage.data", compressible = false, binary = true, List("ngdat")) + + lazy val `index.vnd`: MediaType = + new MediaType("application", "index.vnd", compressible = false, binary = true) + + lazy val `trig`: MediaType = + new MediaType("application", "trig", compressible = false, binary = true, List("trig")) + + lazy val `vnd.oma.push`: MediaType = + new MediaType("application", "vnd.oma.push", compressible = false, binary = true) + + lazy val `tzif-leap`: MediaType = + new MediaType("application", "tzif-leap", compressible = false, binary = true) + + lazy val `vnd.3gpp-prose-pc3a+xml`: MediaType = + new MediaType("application", "vnd.3gpp-prose-pc3a+xml", compressible = true, binary = true) + + lazy val `dskpp+xml`: MediaType = + new MediaType("application", "dskpp+xml", compressible = true, binary = true) + + lazy val `prs.nprend`: MediaType = + new MediaType("application", "prs.nprend", compressible = false, binary = true) + + lazy val `vnd.oma.dcd`: MediaType = + new MediaType("application", "vnd.oma.dcd", compressible = false, binary = true) + + lazy val `vnd.intercon.formnet`: MediaType = + new MediaType("application", "vnd.intercon.formnet", compressible = false, binary = true, List("xpw", "xpx")) + + lazy val `vnd.ms-powerpoint.template.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.oma.bcast.associated-procedure-parameter+xml", - Compressible, - NotBinary, + "vnd.ms-powerpoint.template.macroenabled.12", + compressible = false, + binary = true, + List("potm"), ) - lazy val `vnd.oma.bcast.drm-trigger+xml`: MediaType = - new MediaType("application", "vnd.oma.bcast.drm-trigger+xml", Compressible, NotBinary) - lazy val `vnd.oma.bcast.imd+xml`: MediaType = - new MediaType("application", "vnd.oma.bcast.imd+xml", Compressible, NotBinary) - lazy val `vnd.oma.bcast.ltkm`: MediaType = - new MediaType("application", "vnd.oma.bcast.ltkm", Compressible, NotBinary) - lazy val `vnd.oma.bcast.notification+xml`: MediaType = - new MediaType("application", "vnd.oma.bcast.notification+xml", Compressible, NotBinary) - lazy val `vnd.oma.bcast.provisioningtrigger`: MediaType = - new MediaType("application", "vnd.oma.bcast.provisioningtrigger", Compressible, NotBinary) - lazy val `vnd.oma.bcast.sgboot`: MediaType = - new MediaType("application", "vnd.oma.bcast.sgboot", Compressible, NotBinary) - lazy val `vnd.oma.bcast.sgdd+xml`: MediaType = - new MediaType("application", "vnd.oma.bcast.sgdd+xml", Compressible, NotBinary) - lazy val `vnd.oma.bcast.sgdu`: MediaType = - new MediaType("application", "vnd.oma.bcast.sgdu", Compressible, NotBinary) - lazy val `vnd.oma.bcast.simple-symbol-container`: MediaType = new MediaType( + + lazy val `vnd.businessobjects`: MediaType = + new MediaType("application", "vnd.businessobjects", compressible = false, binary = true, List("rep")) + + lazy val `vnd.openxmlformats-officedocument.customxmlproperties+xml`: MediaType = + new MediaType( "application", - "vnd.oma.bcast.simple-symbol-container", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.customxmlproperties+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oma.bcast.smartcard-trigger+xml`: MediaType = - new MediaType("application", "vnd.oma.bcast.smartcard-trigger+xml", Compressible, NotBinary) - lazy val `vnd.oma.bcast.sprov+xml`: MediaType = - new MediaType("application", "vnd.oma.bcast.sprov+xml", Compressible, NotBinary) - lazy val `vnd.oma.bcast.stkm`: MediaType = - new MediaType("application", "vnd.oma.bcast.stkm", Compressible, NotBinary) - lazy val `vnd.oma.cab-address-book+xml`: MediaType = - new MediaType("application", "vnd.oma.cab-address-book+xml", Compressible, NotBinary) - lazy val `vnd.oma.cab-feature-handler+xml`: MediaType = - new MediaType("application", "vnd.oma.cab-feature-handler+xml", Compressible, NotBinary) - lazy val `vnd.oma.cab-pcc+xml`: MediaType = - new MediaType("application", "vnd.oma.cab-pcc+xml", Compressible, NotBinary) - lazy val `vnd.oma.cab-subs-invite+xml`: MediaType = - new MediaType("application", "vnd.oma.cab-subs-invite+xml", Compressible, NotBinary) - lazy val `vnd.oma.cab-user-prefs+xml`: MediaType = - new MediaType("application", "vnd.oma.cab-user-prefs+xml", Compressible, NotBinary) - lazy val `vnd.oma.dcd`: MediaType = - new MediaType("application", "vnd.oma.dcd", Compressible, NotBinary) - lazy val `vnd.oma.dcdc`: MediaType = - new MediaType("application", "vnd.oma.dcdc", Compressible, NotBinary) - lazy val `vnd.oma.dd2+xml`: MediaType = - new MediaType("application", "vnd.oma.dd2+xml", Compressible, NotBinary, List("dd2")) - lazy val `vnd.oma.drm.risd+xml`: MediaType = - new MediaType("application", "vnd.oma.drm.risd+xml", Compressible, NotBinary) - lazy val `vnd.oma.group-usage-list+xml`: MediaType = - new MediaType("application", "vnd.oma.group-usage-list+xml", Compressible, NotBinary) - lazy val `vnd.oma.lwm2m+cbor`: MediaType = - new MediaType("application", "vnd.oma.lwm2m+cbor", Compressible, NotBinary) - lazy val `vnd.oma.lwm2m+json`: MediaType = - new MediaType("application", "vnd.oma.lwm2m+json", Compressible, NotBinary) - lazy val `vnd.oma.lwm2m+tlv`: MediaType = - new MediaType("application", "vnd.oma.lwm2m+tlv", Compressible, NotBinary) - lazy val `vnd.oma.pal+xml`: MediaType = - new MediaType("application", "vnd.oma.pal+xml", Compressible, NotBinary) - lazy val `vnd.oma.poc.detailed-progress-report+xml`: MediaType = new MediaType( + + lazy val `x-sql`: MediaType = + new MediaType("application", "x-sql", compressible = false, binary = true, List("sql")) + + lazy val `java-vm`: MediaType = + new MediaType("application", "java-vm", compressible = false, binary = true, List("class")) + + lazy val `csrattrs`: MediaType = + new MediaType("application", "csrattrs", compressible = false, binary = true) + + lazy val `vnd.groove-injector`: MediaType = + new MediaType("application", "vnd.groove-injector", compressible = false, binary = true, List("grv")) + + lazy val `vnd.oma.cab-pcc+xml`: MediaType = + new MediaType("application", "vnd.oma.cab-pcc+xml", compressible = true, binary = true) + + lazy val `yang`: MediaType = + new MediaType("application", "yang", compressible = false, binary = true, List("yang")) + + lazy val `cstadata+xml`: MediaType = + new MediaType("application", "cstadata+xml", compressible = true, binary = true) + + lazy val `vnd.stardivision.math`: MediaType = + new MediaType("application", "vnd.stardivision.math", compressible = false, binary = true, List("smf")) + + lazy val `sgml`: MediaType = + new MediaType("application", "sgml", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.presprops+xml`: MediaType = + new MediaType( "application", - "vnd.oma.poc.detailed-progress-report+xml", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.presentationml.presprops+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oma.poc.final-report+xml`: MediaType = - new MediaType("application", "vnd.oma.poc.final-report+xml", Compressible, NotBinary) - lazy val `vnd.oma.poc.groups+xml`: MediaType = - new MediaType("application", "vnd.oma.poc.groups+xml", Compressible, NotBinary) - lazy val `vnd.oma.poc.invocation-descriptor+xml`: MediaType = new MediaType( + + lazy val `a2l`: MediaType = + new MediaType("application", "a2l", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml`: MediaType = + new MediaType( "application", - "vnd.oma.poc.invocation-descriptor+xml", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml", + compressible = true, + binary = true, ) - lazy val `vnd.oma.poc.optimized-progress-report+xml`: MediaType = new MediaType( + + lazy val `vnd.pmi.widget`: MediaType = + new MediaType("application", "vnd.pmi.widget", compressible = false, binary = true, List("wg")) + + lazy val `mac-binhex40`: MediaType = + new MediaType("application", "mac-binhex40", compressible = false, binary = true, List("hqx")) + + lazy val `vnd.sealed.net`: MediaType = + new MediaType("application", "vnd.sealed.net", compressible = false, binary = true) + + lazy val `vnd.ms-pki.seccat`: MediaType = + new MediaType("application", "vnd.ms-pki.seccat", compressible = false, binary = true, List("cat")) + + lazy val `vnd.hal+json`: MediaType = + new MediaType("application", "vnd.hal+json", compressible = true, binary = false) + + lazy val `vnd.hdt`: MediaType = + new MediaType("application", "vnd.hdt", compressible = false, binary = true) + + lazy val `senml+xml`: MediaType = + new MediaType("application", "senml+xml", compressible = true, binary = true, List("senmlx")) + + lazy val `vnd.fujixerox.art-ex`: MediaType = + new MediaType("application", "vnd.fujixerox.art-ex", compressible = false, binary = true) + + lazy val `pkix-cert`: MediaType = + new MediaType("application", "pkix-cert", compressible = false, binary = true, List("cer")) + + lazy val `vnd.syncml.ds.notification`: MediaType = + new MediaType("application", "vnd.syncml.ds.notification", compressible = false, binary = true) + + lazy val `vnd.previewsystems.box`: MediaType = + new MediaType("application", "vnd.previewsystems.box", compressible = false, binary = true, List("box")) + + lazy val `vnd.oma.pal+xml`: MediaType = + new MediaType("application", "vnd.oma.pal+xml", compressible = true, binary = true) + + lazy val `vnd.irepository.package+xml`: MediaType = + new MediaType("application", "vnd.irepository.package+xml", compressible = true, binary = true, List("irp")) + + lazy val `ibe-pkg-reply+xml`: MediaType = + new MediaType("application", "ibe-pkg-reply+xml", compressible = true, binary = true) + + lazy val `wita`: MediaType = + new MediaType("application", "wita", compressible = false, binary = true) + + lazy val `samlassertion+xml`: MediaType = + new MediaType("application", "samlassertion+xml", compressible = true, binary = true) + + lazy val `x-msmetafile`: MediaType = + new MediaType( "application", - "vnd.oma.poc.optimized-progress-report+xml", - Compressible, - NotBinary, + "x-msmetafile", + compressible = false, + binary = true, + List("wmf", "wmz", "emf", "emz"), ) - lazy val `vnd.oma.push`: MediaType = - new MediaType("application", "vnd.oma.push", Compressible, NotBinary) - lazy val `vnd.oma.scidm.messages+xml`: MediaType = - new MediaType("application", "vnd.oma.scidm.messages+xml", Compressible, NotBinary) - lazy val `vnd.oma.xcap-directory+xml`: MediaType = - new MediaType("application", "vnd.oma.xcap-directory+xml", Compressible, NotBinary) - lazy val `vnd.omads-email+xml`: MediaType = - new MediaType("application", "vnd.omads-email+xml", Compressible, NotBinary) - lazy val `vnd.omads-file+xml`: MediaType = - new MediaType("application", "vnd.omads-file+xml", Compressible, NotBinary) - lazy val `vnd.omads-folder+xml`: MediaType = - new MediaType("application", "vnd.omads-folder+xml", Compressible, NotBinary) - lazy val `vnd.omaloc-supl-init`: MediaType = - new MediaType("application", "vnd.omaloc-supl-init", Compressible, NotBinary) - lazy val `vnd.onepager`: MediaType = - new MediaType("application", "vnd.onepager", Compressible, NotBinary) - lazy val `vnd.onepagertamp`: MediaType = - new MediaType("application", "vnd.onepagertamp", Compressible, NotBinary) - lazy val `vnd.onepagertamx`: MediaType = - new MediaType("application", "vnd.onepagertamx", Compressible, NotBinary) - lazy val `vnd.onepagertat`: MediaType = - new MediaType("application", "vnd.onepagertat", Compressible, NotBinary) - lazy val `vnd.onepagertatp`: MediaType = - new MediaType("application", "vnd.onepagertatp", Compressible, NotBinary) - lazy val `vnd.onepagertatx`: MediaType = - new MediaType("application", "vnd.onepagertatx", Compressible, NotBinary) - lazy val `vnd.openblox.game+xml`: MediaType = - new MediaType("application", "vnd.openblox.game+xml", Compressible, NotBinary, List("obgx")) - lazy val `vnd.openblox.game-binary`: MediaType = - new MediaType("application", "vnd.openblox.game-binary", Compressible, NotBinary) - lazy val `vnd.openeye.oeb`: MediaType = - new MediaType("application", "vnd.openeye.oeb", Compressible, NotBinary) - lazy val `vnd.openofficeorg.extension`: MediaType = new MediaType( + + lazy val `vnd.openxmlformats-officedocument.presentationml.template.main+xml`: MediaType = + new MediaType( "application", - "vnd.openofficeorg.extension", - Compressible, - NotBinary, - List("oxt"), + "vnd.openxmlformats-officedocument.presentationml.template.main+xml", + compressible = true, + binary = true, ) - lazy val `vnd.openstreetmap.data+xml`: MediaType = new MediaType( + + lazy val `vnd.sar`: MediaType = + new MediaType("application", "vnd.sar", compressible = false, binary = true) + + lazy val `xml-patch+xml`: MediaType = + new MediaType("application", "xml-patch+xml", compressible = true, binary = false) + + lazy val `vnd.ms-project`: MediaType = + new MediaType("application", "vnd.ms-project", compressible = false, binary = true, List("mpp", "mpt")) + + lazy val `vnd.picsel`: MediaType = + new MediaType("application", "vnd.picsel", compressible = false, binary = true, List("efif")) + + lazy val `vnd.mseq`: MediaType = + new MediaType("application", "vnd.mseq", compressible = false, binary = true, List("mseq")) + + lazy val `vnd.balsamiq.bmpr`: MediaType = + new MediaType("application", "vnd.balsamiq.bmpr", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcdata-affiliation-command+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-affiliation-command+xml", compressible = true, binary = true) + + lazy val `vnd.oasis.opendocument.image`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.image", compressible = false, binary = true, List("odi")) + + lazy val `vnd.blink-idb-value-wrapper`: MediaType = + new MediaType("application", "vnd.blink-idb-value-wrapper", compressible = false, binary = true) + + lazy val `x-x509-ca-ra-cert`: MediaType = + new MediaType("application", "x-x509-ca-ra-cert", compressible = false, binary = true) + + lazy val `vnd.dvb.ipdcesgaccess`: MediaType = + new MediaType("application", "vnd.dvb.ipdcesgaccess", compressible = false, binary = true) + + lazy val `vnd.jisp`: MediaType = + new MediaType("application", "vnd.jisp", compressible = false, binary = true, List("jisp")) + + lazy val `vnd.groove-vcard`: MediaType = + new MediaType("application", "vnd.groove-vcard", compressible = false, binary = true, List("vcg")) + + lazy val `vnd.rn-realmedia-vbr`: MediaType = + new MediaType("application", "vnd.rn-realmedia-vbr", compressible = false, binary = true, List("rmvb")) + + lazy val `vnd.globalplatform.card-content-mgt-response`: MediaType = + new MediaType("application", "vnd.globalplatform.card-content-mgt-response", compressible = false, binary = true) + + lazy val `cea`: MediaType = + new MediaType("application", "cea", compressible = false, binary = true) + + lazy val `vnd.oma.scidm.messages+xml`: MediaType = + new MediaType("application", "vnd.oma.scidm.messages+xml", compressible = true, binary = true) + + lazy val `timestamped-data`: MediaType = + new MediaType("application", "timestamped-data", compressible = false, binary = true, List("tsd")) + + lazy val `vnd.novadigm.edm`: MediaType = + new MediaType("application", "vnd.novadigm.edm", compressible = false, binary = true, List("edm")) + + lazy val `vnd.ms-windows.printerpairing`: MediaType = + new MediaType("application", "vnd.ms-windows.printerpairing", compressible = false, binary = true) + + lazy val `x-iso9660-image`: MediaType = + new MediaType("application", "x-iso9660-image", compressible = false, binary = true, List("iso")) + + lazy val `vnd.informedcontrol.rms+xml`: MediaType = + new MediaType("application", "vnd.informedcontrol.rms+xml", compressible = true, binary = true) + + lazy val `dns-message`: MediaType = + new MediaType("application", "dns-message", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml`: MediaType = + new MediaType( "application", - "vnd.openstreetmap.data+xml", - Compressible, - NotBinary, - List("osm"), + "vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml", + compressible = true, + binary = true, ) - lazy val `vnd.openxmlformats-officedocument.custom-properties+xml`: MediaType = new MediaType( + + lazy val `vnd.nitf`: MediaType = + new MediaType("application", "vnd.nitf", compressible = false, binary = true, List("ntf", "nitf")) + + lazy val `vnd.wap.slc`: MediaType = + new MediaType("application", "vnd.wap.slc", compressible = false, binary = true) + + lazy val `vnd.collabio.xodocuments.presentation`: MediaType = + new MediaType("application", "vnd.collabio.xodocuments.presentation", compressible = false, binary = true) + + lazy val `vnd.route66.link66+xml`: MediaType = + new MediaType("application", "vnd.route66.link66+xml", compressible = true, binary = true, List("link66")) + + lazy val `vnd.fluxtime.clip`: MediaType = + new MediaType("application", "vnd.fluxtime.clip", compressible = false, binary = true, List("ftc")) + + lazy val `vnd.bbf.usp.msg`: MediaType = + new MediaType("application", "vnd.bbf.usp.msg", compressible = false, binary = true) + + lazy val `vnd.dvb.notif-ia-msglist+xml`: MediaType = + new MediaType("application", "vnd.dvb.notif-ia-msglist+xml", compressible = true, binary = true) + + lazy val `vnd.marlin.drm.mdcf`: MediaType = + new MediaType("application", "vnd.marlin.drm.mdcf", compressible = false, binary = true) + + lazy val `vnd.wv.csp+wbxml`: MediaType = + new MediaType("application", "vnd.wv.csp+wbxml", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml`: MediaType = + new MediaType( "application", - "vnd.openxmlformats-officedocument.custom-properties+xml", - Compressible, - NotBinary, + "vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", + compressible = true, + binary = true, ) - lazy val `vnd.openxmlformats-officedocument.customxmlproperties+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.customxmlproperties+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.drawing+xml`: MediaType = new MediaType( + + lazy val `vnd.dreamfactory`: MediaType = + new MediaType("application", "vnd.dreamfactory", compressible = false, binary = true, List("dfac")) + + lazy val `vnd.contact.cmsg`: MediaType = + new MediaType("application", "vnd.contact.cmsg", compressible = false, binary = true, List("cdbcmsg")) + + lazy val `prs.alvestrand.titrax-sheet`: MediaType = + new MediaType("application", "prs.alvestrand.titrax-sheet", compressible = false, binary = true) + + lazy val `vnd.3m.post-it-notes`: MediaType = + new MediaType("application", "vnd.3m.post-it-notes", compressible = false, binary = true, List("pwn")) + + lazy val `vnd.collabio.xodocuments.document-template`: MediaType = + new MediaType("application", "vnd.collabio.xodocuments.document-template", compressible = false, binary = true) + + lazy val `pem-certificate-chain`: MediaType = + new MediaType("application", "pem-certificate-chain", compressible = false, binary = true) + + lazy val `x-bcpio`: MediaType = + new MediaType("application", "x-bcpio", compressible = false, binary = true, List("bcpio")) + + lazy val `vnd.ibm.secure-container`: MediaType = + new MediaType("application", "vnd.ibm.secure-container", compressible = false, binary = true, List("sc")) + + lazy val `vnd.microsoft.windows.thumbnail-cache`: MediaType = + new MediaType("application", "vnd.microsoft.windows.thumbnail-cache", compressible = false, binary = true) + + lazy val `x-gzip`: MediaType = + new MediaType("application", "x-gzip", compressible = false, binary = true) + + lazy val `jf2feed+json`: MediaType = + new MediaType("application", "jf2feed+json", compressible = true, binary = false) + + lazy val `vnd.3gpp.mcptt-service-config+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcptt-service-config+xml", compressible = true, binary = true) + + lazy val `vnd.iptc.g2.planningitem+xml`: MediaType = + new MediaType("application", "vnd.iptc.g2.planningitem+xml", compressible = true, binary = true) + + lazy val `conference-info+xml`: MediaType = + new MediaType("application", "conference-info+xml", compressible = true, binary = true) + + lazy val `x-dtbncx+xml`: MediaType = + new MediaType("application", "x-dtbncx+xml", compressible = true, binary = true, List("ncx")) + + lazy val `x-web-app-manifest+json`: MediaType = + new MediaType("application", "x-web-app-manifest+json", compressible = true, binary = false, List("webapp")) + + lazy val `p21+zip`: MediaType = + new MediaType("application", "p21+zip", compressible = false, binary = true) + + lazy val `vnd.ntt-local.file-transfer`: MediaType = + new MediaType("application", "vnd.ntt-local.file-transfer", compressible = false, binary = true) + + lazy val `vnd.ms-excel`: MediaType = + new MediaType( "application", - "vnd.openxmlformats-officedocument.drawing+xml", - Compressible, - NotBinary, + "vnd.ms-excel", + compressible = false, + binary = true, + List("xls", "xlm", "xla", "xlc", "xlt", "xlw"), ) - lazy val `vnd.openxmlformats-officedocument.drawingml.chart+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.drawingml.chart+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.drawingml.chartshapes+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.drawingml.chartshapes+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.drawingml.diagramdata+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.drawingml.diagramdata+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.extended-properties+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.extended-properties+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.commentauthors+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.commentauthors+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.comments+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.comments+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.notesmaster+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.notesmaster+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.notesslide+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.notesslide+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.presentation`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.presentation", - Uncompressible, - Binary, - List("pptx"), - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.presentation.main+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.presentation.main+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.presprops+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.presprops+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.slide`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.slide", - Compressible, - Binary, - List("sldx"), - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.slide+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.slide+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.slidelayout+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.slidelayout+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.slidemaster+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.slidemaster+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.slideshow`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.slideshow", - Compressible, - Binary, - List("ppsx"), - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.tablestyles+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.tablestyles+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.tags+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.tags+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.template`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.template", - Compressible, - Binary, - List("potx"), - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.template.main+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.template.main+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.presentationml.viewprops+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.presentationml.viewprops+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.comments+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.connections+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.connections+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sheet`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.sheet", - Uncompressible, - Binary, - List("xlsx"), - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.styles+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.table+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.table+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.template`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.template", - Compressible, - Binary, - List("xltx"), - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.theme+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.theme+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.themeoverride+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.themeoverride+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.vmldrawing`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.vmldrawing", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.comments+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.comments+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.document`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.document", - Uncompressible, - Binary, - List("docx"), - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.footer+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.footer+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.settings+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.settings+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.styles+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.styles+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.template`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.template", - Compressible, - Binary, - List("dotx"), - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-package.core-properties+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-package.core-properties+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-package.digital-signature-xmlsignature+xml`: MediaType = - new MediaType( - "application", - "vnd.openxmlformats-package.digital-signature-xmlsignature+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.openxmlformats-package.relationships+xml`: MediaType = new MediaType( - "application", - "vnd.openxmlformats-package.relationships+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.oracle.resource+json`: MediaType = - new MediaType("application", "vnd.oracle.resource+json", Compressible, NotBinary) - lazy val `vnd.orange.indata`: MediaType = - new MediaType("application", "vnd.orange.indata", Compressible, NotBinary) - lazy val `vnd.osa.netdeploy`: MediaType = - new MediaType("application", "vnd.osa.netdeploy", Compressible, NotBinary) - lazy val `vnd.osgeo.mapguide.package`: MediaType = new MediaType( - "application", - "vnd.osgeo.mapguide.package", - Compressible, - NotBinary, - List("mgp"), - ) - lazy val `vnd.osgi.bundle`: MediaType = - new MediaType("application", "vnd.osgi.bundle", Compressible, NotBinary) - lazy val `vnd.osgi.dp`: MediaType = - new MediaType("application", "vnd.osgi.dp", Compressible, NotBinary, List("dp")) - lazy val `vnd.osgi.subsystem`: MediaType = - new MediaType("application", "vnd.osgi.subsystem", Compressible, NotBinary, List("esa")) - lazy val `vnd.otps.ct-kip+xml`: MediaType = - new MediaType("application", "vnd.otps.ct-kip+xml", Compressible, NotBinary) - lazy val `vnd.oxli.countgraph`: MediaType = - new MediaType("application", "vnd.oxli.countgraph", Compressible, NotBinary) - lazy val `vnd.pagerduty+json`: MediaType = - new MediaType("application", "vnd.pagerduty+json", Compressible, NotBinary) - lazy val `vnd.palm`: MediaType = new MediaType( - "application", - "vnd.palm", - Compressible, - NotBinary, - List("pdb", "pqa", "oprc"), - ) - lazy val `vnd.panoply`: MediaType = - new MediaType("application", "vnd.panoply", Compressible, NotBinary) - lazy val `vnd.paos.xml`: MediaType = - new MediaType("application", "vnd.paos.xml", Compressible, NotBinary) - lazy val `vnd.patentdive`: MediaType = - new MediaType("application", "vnd.patentdive", Compressible, NotBinary) - lazy val `vnd.patientecommsdoc`: MediaType = - new MediaType("application", "vnd.patientecommsdoc", Compressible, NotBinary) - lazy val `vnd.pawaafile`: MediaType = - new MediaType("application", "vnd.pawaafile", Compressible, NotBinary, List("paw")) - lazy val `vnd.pcos`: MediaType = - new MediaType("application", "vnd.pcos", Compressible, NotBinary) - lazy val `vnd.pg.format`: MediaType = - new MediaType("application", "vnd.pg.format", Compressible, NotBinary, List("str")) - lazy val `vnd.pg.osasli`: MediaType = - new MediaType("application", "vnd.pg.osasli", Compressible, NotBinary, List("ei6")) - lazy val `vnd.piaccess.application-licence`: MediaType = - new MediaType("application", "vnd.piaccess.application-licence", Compressible, NotBinary) - lazy val `vnd.picsel`: MediaType = - new MediaType("application", "vnd.picsel", Compressible, NotBinary, List("efif")) - lazy val `vnd.pmi.widget`: MediaType = - new MediaType("application", "vnd.pmi.widget", Compressible, NotBinary, List("wg")) - lazy val `vnd.poc.group-advertisement+xml`: MediaType = - new MediaType("application", "vnd.poc.group-advertisement+xml", Compressible, NotBinary) - lazy val `vnd.pocketlearn`: MediaType = - new MediaType("application", "vnd.pocketlearn", Compressible, NotBinary, List("plf")) - lazy val `vnd.powerbuilder6`: MediaType = - new MediaType("application", "vnd.powerbuilder6", Compressible, NotBinary, List("pbd")) - lazy val `vnd.powerbuilder6-s`: MediaType = - new MediaType("application", "vnd.powerbuilder6-s", Compressible, NotBinary) - lazy val `vnd.powerbuilder7`: MediaType = - new MediaType("application", "vnd.powerbuilder7", Compressible, NotBinary) - lazy val `vnd.powerbuilder7-s`: MediaType = - new MediaType("application", "vnd.powerbuilder7-s", Compressible, NotBinary) - lazy val `vnd.powerbuilder75`: MediaType = - new MediaType("application", "vnd.powerbuilder75", Compressible, NotBinary) - lazy val `vnd.powerbuilder75-s`: MediaType = - new MediaType("application", "vnd.powerbuilder75-s", Compressible, NotBinary) - lazy val `vnd.preminet`: MediaType = - new MediaType("application", "vnd.preminet", Compressible, NotBinary) - lazy val `vnd.previewsystems.box`: MediaType = - new MediaType("application", "vnd.previewsystems.box", Compressible, NotBinary, List("box")) - lazy val `vnd.proteus.magazine`: MediaType = - new MediaType("application", "vnd.proteus.magazine", Compressible, NotBinary, List("mgz")) - lazy val `vnd.psfs`: MediaType = - new MediaType("application", "vnd.psfs", Compressible, NotBinary) - lazy val `vnd.publishare-delta-tree`: MediaType = new MediaType( - "application", - "vnd.publishare-delta-tree", - Compressible, - NotBinary, - List("qps"), - ) - lazy val `vnd.pvi.ptid1`: MediaType = - new MediaType("application", "vnd.pvi.ptid1", Compressible, NotBinary, List("ptid")) - lazy val `vnd.pwg-multiplexed`: MediaType = - new MediaType("application", "vnd.pwg-multiplexed", Compressible, NotBinary) - lazy val `vnd.pwg-xhtml-print+xml`: MediaType = - new MediaType("application", "vnd.pwg-xhtml-print+xml", Compressible, NotBinary) - lazy val `vnd.qualcomm.brew-app-res`: MediaType = - new MediaType("application", "vnd.qualcomm.brew-app-res", Compressible, NotBinary) - lazy val `vnd.quarantainenet`: MediaType = - new MediaType("application", "vnd.quarantainenet", Compressible, NotBinary) - lazy val `vnd.quark.quarkxpress`: MediaType = new MediaType( - "application", - "vnd.quark.quarkxpress", - Compressible, - NotBinary, - List("qxd", "qxt", "qwd", "qwt", "qxl", "qxb"), - ) - lazy val `vnd.quobject-quoxdocument`: MediaType = - new MediaType("application", "vnd.quobject-quoxdocument", Compressible, NotBinary) - lazy val `vnd.radisys.moml+xml`: MediaType = - new MediaType("application", "vnd.radisys.moml+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-audit+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-audit+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-audit-conf+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-audit-conf+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-audit-conn+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-audit-conn+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-audit-dialog+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-audit-dialog+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-audit-stream+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-audit-stream+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-conf+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-conf+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-dialog+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-dialog+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-dialog-base+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-dialog-base+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-dialog-fax-detect+xml`: MediaType = new MediaType( - "application", - "vnd.radisys.msml-dialog-fax-detect+xml", - Compressible, - NotBinary, - ) - lazy val `vnd.radisys.msml-dialog-fax-sendrecv+xml`: MediaType = new MediaType( + + lazy val `vnd.symbian.install`: MediaType = + new MediaType("application", "vnd.symbian.install", compressible = false, binary = true, List("sis", "sisx")) + + lazy val `x-netcdf`: MediaType = + new MediaType("application", "x-netcdf", compressible = false, binary = true, List("nc", "cdf")) + + lazy val `vnd.grafeq`: MediaType = + new MediaType("application", "vnd.grafeq", compressible = false, binary = true, List("gqf", "gqs")) + + lazy val `atomsvc+xml`: MediaType = + new MediaType("application", "atomsvc+xml", compressible = true, binary = true, List("atomsvc")) + + lazy val `mf4`: MediaType = + new MediaType("application", "mf4", compressible = false, binary = true) + + lazy val `vnd.sema`: MediaType = + new MediaType("application", "vnd.sema", compressible = false, binary = true, List("sema")) + + lazy val `vnd.minisoft-hp3000-save`: MediaType = + new MediaType("application", "vnd.minisoft-hp3000-save", compressible = false, binary = true) + + lazy val `vnd.recordare.musicxml+xml`: MediaType = + new MediaType("application", "vnd.recordare.musicxml+xml", compressible = true, binary = true, List("musicxml")) + + lazy val `vnd.3gpp.mcvideo-user-profile+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcvideo-user-profile+xml", compressible = true, binary = true) + + lazy val `xhtml-voice+xml`: MediaType = + new MediaType("application", "xhtml-voice+xml", compressible = true, binary = true) + + lazy val `vnd.iptc.g2.knowledgeitem+xml`: MediaType = + new MediaType("application", "vnd.iptc.g2.knowledgeitem+xml", compressible = true, binary = true) + + lazy val `taxii+json`: MediaType = + new MediaType("application", "taxii+json", compressible = true, binary = false) + + lazy val `vnd.accpac.simply.imp`: MediaType = + new MediaType("application", "vnd.accpac.simply.imp", compressible = false, binary = true, List("imp")) + + lazy val `vnd.ms-outlook`: MediaType = + new MediaType("application", "vnd.ms-outlook", compressible = false, binary = true, List("msg")) + + lazy val `x-cdlink`: MediaType = + new MediaType("application", "x-cdlink", compressible = false, binary = true, List("vcd")) + + lazy val `vnd.software602.filler.form-xml-zip`: MediaType = + new MediaType("application", "vnd.software602.filler.form-xml-zip", compressible = false, binary = true) + + lazy val `vnd.ecdis-update`: MediaType = + new MediaType("application", "vnd.ecdis-update", compressible = false, binary = true) + + lazy val `vnd.wolfram.player`: MediaType = + new MediaType("application", "vnd.wolfram.player", compressible = false, binary = true, List("nbp")) + + lazy val `mbms-register+xml`: MediaType = + new MediaType("application", "mbms-register+xml", compressible = true, binary = true) + + lazy val `vnd.radisys.moml+xml`: MediaType = + new MediaType("application", "vnd.radisys.moml+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp.interworking-data`: MediaType = + new MediaType("application", "vnd.3gpp.interworking-data", compressible = false, binary = true) + + lazy val `vnd.stardivision.calc`: MediaType = + new MediaType("application", "vnd.stardivision.calc", compressible = false, binary = true, List("sdc")) + + lazy val `x-font-speedo`: MediaType = + new MediaType("application", "x-font-speedo", compressible = false, binary = true) + + lazy val `vnd.proteus.magazine`: MediaType = + new MediaType("application", "vnd.proteus.magazine", compressible = false, binary = true, List("mgz")) + + lazy val `sbml+xml`: MediaType = + new MediaType("application", "sbml+xml", compressible = true, binary = true, List("sbml")) + + lazy val `vnd.amazon.mobi8-ebook`: MediaType = + new MediaType("application", "vnd.amazon.mobi8-ebook", compressible = false, binary = true) + + lazy val `vnd.ms-3mfdocument`: MediaType = + new MediaType("application", "vnd.ms-3mfdocument", compressible = false, binary = true) + + lazy val `vnd.dece.data`: MediaType = + new MediaType( "application", - "vnd.radisys.msml-dialog-fax-sendrecv+xml", - Compressible, - NotBinary, + "vnd.dece.data", + compressible = false, + binary = true, + List("uvf", "uvvf", "uvd", "uvvd"), ) - lazy val `vnd.radisys.msml-dialog-group+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-dialog-group+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-dialog-speech+xml`: MediaType = - new MediaType("application", "vnd.radisys.msml-dialog-speech+xml", Compressible, NotBinary) - lazy val `vnd.radisys.msml-dialog-transform+xml`: MediaType = new MediaType( + + lazy val `vnd.oma.bcast.imd+xml`: MediaType = + new MediaType("application", "vnd.oma.bcast.imd+xml", compressible = true, binary = true) + + lazy val `vnd.doremir.scorecloud-binary-document`: MediaType = + new MediaType("application", "vnd.doremir.scorecloud-binary-document", compressible = false, binary = true) + + lazy val `x-hdf`: MediaType = + new MediaType("application", "x-hdf", compressible = false, binary = true, List("hdf")) + + lazy val `vnd.ms-excel.sheet.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.radisys.msml-dialog-transform+xml", - Compressible, - NotBinary, + "vnd.ms-excel.sheet.macroenabled.12", + compressible = false, + binary = true, + List("xlsm"), ) - lazy val `vnd.rainstor.data`: MediaType = - new MediaType("application", "vnd.rainstor.data", Compressible, NotBinary) - lazy val `vnd.rapid`: MediaType = - new MediaType("application", "vnd.rapid", Compressible, NotBinary) - lazy val `vnd.rar`: MediaType = - new MediaType("application", "vnd.rar", Compressible, NotBinary, List("rar")) - lazy val `vnd.realvnc.bed`: MediaType = - new MediaType("application", "vnd.realvnc.bed", Compressible, NotBinary, List("bed")) - lazy val `vnd.recordare.musicxml`: MediaType = - new MediaType("application", "vnd.recordare.musicxml", Compressible, NotBinary, List("mxl")) - lazy val `vnd.recordare.musicxml+xml`: MediaType = new MediaType( + + lazy val `dvcs`: MediaType = + new MediaType("application", "dvcs", compressible = false, binary = true) + + lazy val `vnd.vel+json`: MediaType = + new MediaType("application", "vnd.vel+json", compressible = true, binary = false) + + lazy val `vnd.mobius.mqy`: MediaType = + new MediaType("application", "vnd.mobius.mqy", compressible = false, binary = true, List("mqy")) + + lazy val `vnd.3gpp.vae-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.vae-info+xml", compressible = true, binary = true) + + lazy val `vnd.syncml.dm+wbxml`: MediaType = + new MediaType("application", "vnd.syncml.dm+wbxml", compressible = false, binary = true, List("bdm")) + + lazy val `vnd.etsi.asic-e+zip`: MediaType = + new MediaType("application", "vnd.etsi.asic-e+zip", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.commentauthors+xml`: MediaType = + new MediaType( "application", - "vnd.recordare.musicxml+xml", - Compressible, - NotBinary, - List("musicxml"), + "vnd.openxmlformats-officedocument.presentationml.commentauthors+xml", + compressible = true, + binary = true, ) - lazy val `vnd.renlearn.rlprint`: MediaType = - new MediaType("application", "vnd.renlearn.rlprint", Compressible, NotBinary) - lazy val `vnd.resilient.logic`: MediaType = - new MediaType("application", "vnd.resilient.logic", Compressible, NotBinary) - lazy val `vnd.restful+json`: MediaType = - new MediaType("application", "vnd.restful+json", Compressible, NotBinary) - lazy val `vnd.rig.cryptonote`: MediaType = new MediaType( + + lazy val `vnd.ms-printschematicket+xml`: MediaType = + new MediaType("application", "vnd.ms-printschematicket+xml", compressible = true, binary = true) + + lazy val `aif+json`: MediaType = + new MediaType("application", "aif+json", compressible = true, binary = false) + + lazy val `vnd.isac.fcs`: MediaType = + new MediaType("application", "vnd.isac.fcs", compressible = false, binary = true, List("fcs")) + + lazy val `vnd.eprints.data+xml`: MediaType = + new MediaType("application", "vnd.eprints.data+xml", compressible = true, binary = true) + + lazy val `mp21`: MediaType = + new MediaType("application", "mp21", compressible = false, binary = true, List("m21", "mp21")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.comments+xml`: MediaType = + new MediaType( "application", - "vnd.rig.cryptonote", - Compressible, - NotBinary, - List("cryptonote"), + "vnd.openxmlformats-officedocument.presentationml.comments+xml", + compressible = true, + binary = true, ) - lazy val `vnd.rim.cod`: MediaType = - new MediaType("application", "vnd.rim.cod", Compressible, NotBinary, List("cod")) - lazy val `vnd.rn-realmedia`: MediaType = - new MediaType("application", "vnd.rn-realmedia", Compressible, NotBinary, List("rm")) - lazy val `vnd.rn-realmedia-vbr`: MediaType = - new MediaType("application", "vnd.rn-realmedia-vbr", Compressible, NotBinary, List("rmvb")) - lazy val `vnd.route66.link66+xml`: MediaType = new MediaType( + + lazy val `vnd.openofficeorg.extension`: MediaType = + new MediaType("application", "vnd.openofficeorg.extension", compressible = false, binary = true, List("oxt")) + + lazy val `vnd.syncml.dmtnds+xml`: MediaType = + new MediaType("application", "vnd.syncml.dmtnds+xml", compressible = true, binary = true) + + lazy val `x-msdos-program`: MediaType = + new MediaType("application", "x-msdos-program", compressible = false, binary = true, List("exe")) + + lazy val `vnd.micrografx.flo`: MediaType = + new MediaType("application", "vnd.micrografx.flo", compressible = false, binary = true, List("flo")) + + lazy val `vnd.bekitzur-stech+json`: MediaType = + new MediaType("application", "vnd.bekitzur-stech+json", compressible = true, binary = false) + + lazy val `dns`: MediaType = + new MediaType("application", "dns", compressible = false, binary = true) + + lazy val `x-bittorrent`: MediaType = + new MediaType("application", "x-bittorrent", compressible = false, binary = true, List("torrent")) + + lazy val `vnd.oipf.contentaccessdownload+xml`: MediaType = + new MediaType("application", "vnd.oipf.contentaccessdownload+xml", compressible = true, binary = true) + + lazy val `edifact`: MediaType = + new MediaType("application", "edifact", compressible = false, binary = true) + + lazy val `vnd.cups-pdf`: MediaType = + new MediaType("application", "vnd.cups-pdf", compressible = false, binary = true) + + lazy val `vnd.oxli.countgraph`: MediaType = + new MediaType("application", "vnd.oxli.countgraph", compressible = false, binary = true) + + lazy val `vnd.espass-espass+zip`: MediaType = + new MediaType("application", "vnd.espass-espass+zip", compressible = false, binary = true) + + lazy val `thraud+xml`: MediaType = + new MediaType("application", "thraud+xml", compressible = true, binary = true, List("tfi")) + + lazy val `alto-networkmap+json`: MediaType = + new MediaType("application", "alto-networkmap+json", compressible = true, binary = false) + + lazy val `sensml-exi`: MediaType = + new MediaType("application", "sensml-exi", compressible = false, binary = true) + + lazy val `wsdl+xml`: MediaType = + new MediaType("application", "wsdl+xml", compressible = true, binary = true, List("wsdl")) + + lazy val `nlsml+xml`: MediaType = + new MediaType("application", "nlsml+xml", compressible = true, binary = true) + + lazy val `tamp-status-query`: MediaType = + new MediaType("application", "tamp-status-query", compressible = false, binary = true) + + lazy val `vnd.sealedmedia.softseal.pdf`: MediaType = + new MediaType("application", "vnd.sealedmedia.softseal.pdf", compressible = false, binary = true) + + lazy val `vnd.dvb.esgcontainer`: MediaType = + new MediaType("application", "vnd.dvb.esgcontainer", compressible = false, binary = true) + + lazy val `vnd.oasis.opendocument.chart`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.chart", compressible = false, binary = true, List("odc")) + + lazy val `vnd.osgi.bundle`: MediaType = + new MediaType("application", "vnd.osgi.bundle", compressible = false, binary = true) + + lazy val `mathml+xml`: MediaType = + new MediaType("application", "mathml+xml", compressible = true, binary = true, List("mathml")) + + lazy val `oda`: MediaType = + new MediaType("application", "oda", compressible = false, binary = true, List("oda")) + + lazy val `vnd.oma.poc.optimized-progress-report+xml`: MediaType = + new MediaType("application", "vnd.oma.poc.optimized-progress-report+xml", compressible = true, binary = true) + + lazy val `scvp-cv-request`: MediaType = + new MediaType("application", "scvp-cv-request", compressible = false, binary = true, List("scq")) + + lazy val `vnd.maxar.archive.3tz+zip`: MediaType = + new MediaType("application", "vnd.maxar.archive.3tz+zip", compressible = false, binary = true) + + lazy val `vnd.airzip.filesecure.azf`: MediaType = + new MediaType("application", "vnd.airzip.filesecure.azf", compressible = false, binary = true, List("azf")) + + lazy val `vnd.oasis.opendocument.database`: MediaType = + new MediaType("application", "vnd.oasis.opendocument.database", compressible = false, binary = true, List("odb")) + + lazy val `vnd.powerbuilder75`: MediaType = + new MediaType("application", "vnd.powerbuilder75", compressible = false, binary = true) + + lazy val `ssml+xml`: MediaType = + new MediaType("application", "ssml+xml", compressible = true, binary = true, List("ssml")) + + lazy val `vnd.openxmlformats-officedocument.drawingml.chartshapes+xml`: MediaType = + new MediaType( "application", - "vnd.route66.link66+xml", - Compressible, - NotBinary, - List("link66"), + "vnd.openxmlformats-officedocument.drawingml.chartshapes+xml", + compressible = true, + binary = true, ) - lazy val `vnd.rs-274x`: MediaType = - new MediaType("application", "vnd.rs-274x", Compressible, NotBinary) - lazy val `vnd.ruckus.download`: MediaType = - new MediaType("application", "vnd.ruckus.download", Compressible, NotBinary) - lazy val `vnd.s3sms`: MediaType = - new MediaType("application", "vnd.s3sms", Compressible, NotBinary) - lazy val `vnd.sailingtracker.track`: MediaType = new MediaType( + + lazy val `dots+cbor`: MediaType = + new MediaType("application", "dots+cbor", compressible = false, binary = true) + + lazy val `alto-endpointpropparams+json`: MediaType = + new MediaType("application", "alto-endpointpropparams+json", compressible = true, binary = false) + + lazy val `x-tads`: MediaType = + new MediaType("application", "x-tads", compressible = false, binary = true, List("gam")) + + lazy val `rdap+json`: MediaType = + new MediaType("application", "rdap+json", compressible = true, binary = false) + + lazy val `metalink4+xml`: MediaType = + new MediaType("application", "metalink4+xml", compressible = true, binary = true, List("meta4")) + + lazy val `vnd.geocube+xml`: MediaType = + new MediaType("application", "vnd.geocube+xml", compressible = true, binary = true) + + lazy val `3gpphalforms+json`: MediaType = + new MediaType("application", "3gpphalforms+json", compressible = true, binary = false) + + lazy val `vnd.coffeescript`: MediaType = + new MediaType("application", "vnd.coffeescript", compressible = false, binary = true) + + lazy val `vnd.stardivision.writer-global`: MediaType = + new MediaType("application", "vnd.stardivision.writer-global", compressible = false, binary = true, List("sgl")) + + lazy val `vnd.openxmlformats-officedocument.wordprocessingml.comments+xml`: MediaType = + new MediaType( "application", - "vnd.sailingtracker.track", - Compressible, - NotBinary, - List("st"), + "vnd.openxmlformats-officedocument.wordprocessingml.comments+xml", + compressible = true, + binary = true, ) - lazy val `vnd.sar`: MediaType = - new MediaType("application", "vnd.sar", Compressible, NotBinary) - lazy val `vnd.sbm.cid`: MediaType = - new MediaType("application", "vnd.sbm.cid", Compressible, NotBinary) - lazy val `vnd.sbm.mid2`: MediaType = - new MediaType("application", "vnd.sbm.mid2", Compressible, NotBinary) - lazy val `vnd.scribus`: MediaType = - new MediaType("application", "vnd.scribus", Compressible, NotBinary) - lazy val `vnd.sealed.3df`: MediaType = - new MediaType("application", "vnd.sealed.3df", Compressible, NotBinary) - lazy val `vnd.sealed.csf`: MediaType = - new MediaType("application", "vnd.sealed.csf", Compressible, NotBinary) - lazy val `vnd.sealed.doc`: MediaType = - new MediaType("application", "vnd.sealed.doc", Compressible, NotBinary) - lazy val `vnd.sealed.eml`: MediaType = - new MediaType("application", "vnd.sealed.eml", Compressible, NotBinary) - lazy val `vnd.sealed.mht`: MediaType = - new MediaType("application", "vnd.sealed.mht", Compressible, NotBinary) - lazy val `vnd.sealed.net`: MediaType = - new MediaType("application", "vnd.sealed.net", Compressible, NotBinary) - lazy val `vnd.sealed.ppt`: MediaType = - new MediaType("application", "vnd.sealed.ppt", Compressible, NotBinary) - lazy val `vnd.sealed.tiff`: MediaType = - new MediaType("application", "vnd.sealed.tiff", Compressible, NotBinary) - lazy val `vnd.sealed.xls`: MediaType = - new MediaType("application", "vnd.sealed.xls", Compressible, NotBinary) - lazy val `vnd.sealedmedia.softseal.html`: MediaType = - new MediaType("application", "vnd.sealedmedia.softseal.html", Compressible, NotBinary) - lazy val `vnd.sealedmedia.softseal.pdf`: MediaType = - new MediaType("application", "vnd.sealedmedia.softseal.pdf", Compressible, NotBinary) - lazy val `vnd.seemail`: MediaType = - new MediaType("application", "vnd.seemail", Compressible, NotBinary, List("see")) - lazy val `vnd.seis+json`: MediaType = - new MediaType("application", "vnd.seis+json", Compressible, NotBinary) - lazy val `vnd.sema`: MediaType = - new MediaType("application", "vnd.sema", Compressible, NotBinary, List("sema")) - lazy val `vnd.semd`: MediaType = - new MediaType("application", "vnd.semd", Compressible, NotBinary, List("semd")) - lazy val `vnd.semf`: MediaType = - new MediaType("application", "vnd.semf", Compressible, NotBinary, List("semf")) - lazy val `vnd.shade-save-file`: MediaType = - new MediaType("application", "vnd.shade-save-file", Compressible, NotBinary) - lazy val `vnd.shana.informed.formdata`: MediaType = new MediaType( + + lazy val `vnd.geo+json`: MediaType = + new MediaType("application", "vnd.geo+json", compressible = true, binary = false) + + lazy val `vnd.sun.xml.calc.template`: MediaType = + new MediaType("application", "vnd.sun.xml.calc.template", compressible = false, binary = true, List("stc")) + + lazy val `x-msdownload`: MediaType = + new MediaType( "application", - "vnd.shana.informed.formdata", - Compressible, - NotBinary, - List("ifm"), + "x-msdownload", + compressible = false, + binary = true, + List("exe", "dll", "com", "bat", "msi"), ) - lazy val `vnd.shana.informed.formtemplate`: MediaType = new MediaType( + + lazy val `vnd.pocketlearn`: MediaType = + new MediaType("application", "vnd.pocketlearn", compressible = false, binary = true, List("plf")) + + lazy val `x-lua-bytecode`: MediaType = + new MediaType("application", "x-lua-bytecode", compressible = false, binary = true, List("luac")) + + lazy val `vnd.gpxsee.map+xml`: MediaType = + new MediaType("application", "vnd.gpxsee.map+xml", compressible = true, binary = true) + + lazy val `vnd.geoplan`: MediaType = + new MediaType("application", "vnd.geoplan", compressible = false, binary = true, List("g2w")) + + lazy val `resource-lists-diff+xml`: MediaType = + new MediaType("application", "resource-lists-diff+xml", compressible = true, binary = true, List("rld")) + + lazy val `vnd.qualcomm.brew-app-res`: MediaType = + new MediaType("application", "vnd.qualcomm.brew-app-res", compressible = false, binary = true) + + lazy val `vnd.dvb.iptv.alfec-enhancement`: MediaType = + new MediaType("application", "vnd.dvb.iptv.alfec-enhancement", compressible = false, binary = true) + + lazy val `vnd.groove-help`: MediaType = + new MediaType("application", "vnd.groove-help", compressible = false, binary = true, List("ghf")) + + lazy val `vnd.iso11783-10+zip`: MediaType = + new MediaType("application", "vnd.iso11783-10+zip", compressible = false, binary = true) + + lazy val `vnd.3gpp.sms`: MediaType = + new MediaType("application", "vnd.3gpp.sms", compressible = false, binary = true) + + lazy val `vnd.fsc.weblaunch`: MediaType = + new MediaType("application", "vnd.fsc.weblaunch", compressible = false, binary = true, List("fsc")) + + lazy val `vnd.quarantainenet`: MediaType = + new MediaType("application", "vnd.quarantainenet", compressible = false, binary = true) + + lazy val `vnd.gentoo.ebuild`: MediaType = + new MediaType("application", "vnd.gentoo.ebuild", compressible = false, binary = true) + + lazy val `vnd.dvb.ipdcroaming`: MediaType = + new MediaType("application", "vnd.dvb.ipdcroaming", compressible = false, binary = true) + + lazy val `vnd.byu.uapi+json`: MediaType = + new MediaType("application", "vnd.byu.uapi+json", compressible = true, binary = false) + + lazy val `vnd.oma.dcdc`: MediaType = + new MediaType("application", "vnd.oma.dcdc", compressible = false, binary = true) + + lazy val `express`: MediaType = + new MediaType("application", "express", compressible = false, binary = true, List("exp")) + + lazy val `vnd.ms-cab-compressed`: MediaType = + new MediaType("application", "vnd.ms-cab-compressed", compressible = false, binary = true, List("cab")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.comments+xml`: MediaType = + new MediaType( "application", - "vnd.shana.informed.formtemplate", - Compressible, - NotBinary, - List("itp"), + "vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", + compressible = true, + binary = true, ) - lazy val `vnd.shana.informed.interchange`: MediaType = new MediaType( + + lazy val `link-format`: MediaType = + new MediaType("application", "link-format", compressible = false, binary = true) + + lazy val `vnd.3gpp.seal-location-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.seal-location-info+xml", compressible = true, binary = true) + + lazy val `vnd.pg.format`: MediaType = + new MediaType("application", "vnd.pg.format", compressible = false, binary = true, List("str")) + + lazy val `vnd.3gpp.pic-bw-large`: MediaType = + new MediaType("application", "vnd.3gpp.pic-bw-large", compressible = false, binary = true, List("plb")) + + lazy val `vnd.etsi.mcid+xml`: MediaType = + new MediaType("application", "vnd.etsi.mcid+xml", compressible = true, binary = true) + + lazy val `vnd.kidspiration`: MediaType = + new MediaType("application", "vnd.kidspiration", compressible = false, binary = true, List("kia")) + + lazy val `x-research-info-systems`: MediaType = + new MediaType("application", "x-research-info-systems", compressible = false, binary = true, List("ris")) + + lazy val `vnd.meridian-slingshot`: MediaType = + new MediaType("application", "vnd.meridian-slingshot", compressible = false, binary = true) + + lazy val `vnd.restful+json`: MediaType = + new MediaType("application", "vnd.restful+json", compressible = true, binary = false) + + lazy val `fdf`: MediaType = + new MediaType("application", "fdf", compressible = false, binary = true, List("fdf")) + + lazy val `vnd.gentoo.pkgmetadata+xml`: MediaType = + new MediaType("application", "vnd.gentoo.pkgmetadata+xml", compressible = true, binary = true) + + lazy val `vnd.accpac.simply.aso`: MediaType = + new MediaType("application", "vnd.accpac.simply.aso", compressible = false, binary = true, List("aso")) + + lazy val `vnd.immervision-ivu`: MediaType = + new MediaType("application", "vnd.immervision-ivu", compressible = false, binary = true, List("ivu")) + + lazy val `vnd.crick.clicker.palette`: MediaType = + new MediaType("application", "vnd.crick.clicker.palette", compressible = false, binary = true, List("clkp")) + + lazy val `atsc-rdt+json`: MediaType = + new MediaType("application", "atsc-rdt+json", compressible = true, binary = false) + + lazy val `vnd.astraea-software.iota`: MediaType = + new MediaType("application", "vnd.astraea-software.iota", compressible = false, binary = true, List("iota")) + + lazy val `vnd.motorola.flexsuite.gotap`: MediaType = + new MediaType("application", "vnd.motorola.flexsuite.gotap", compressible = false, binary = true) + + lazy val `vnd.dpgraph`: MediaType = + new MediaType("application", "vnd.dpgraph", compressible = false, binary = true, List("dpg")) + + lazy val `vnd.genomatix.tuxedo`: MediaType = + new MediaType("application", "vnd.genomatix.tuxedo", compressible = false, binary = true, List("txd")) + + lazy val `vnd.3gpp.mcdata-ue-config+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-ue-config+xml", compressible = true, binary = true) + + lazy val `vnd.kde.kspread`: MediaType = + new MediaType("application", "vnd.kde.kspread", compressible = false, binary = true, List("ksp")) + + lazy val `x-ns-proxy-autoconfig`: MediaType = + new MediaType("application", "x-ns-proxy-autoconfig", compressible = true, binary = true, List("pac")) + + lazy val `ibe-pp-data`: MediaType = + new MediaType("application", "ibe-pp-data", compressible = false, binary = true) + + lazy val `vnd.3gpp.mcdata-regroup+xml`: MediaType = + new MediaType("application", "vnd.3gpp.mcdata-regroup+xml", compressible = true, binary = true) + + lazy val `emergencycalldata.comment+xml`: MediaType = + new MediaType("application", "emergencycalldata.comment+xml", compressible = true, binary = true) + + lazy val `vnd.apple.keynote`: MediaType = + new MediaType("application", "vnd.apple.keynote", compressible = false, binary = true, List("key")) + + lazy val `timestamp-query`: MediaType = + new MediaType("application", "timestamp-query", compressible = false, binary = true) + + lazy val `vnd.las`: MediaType = + new MediaType("application", "vnd.las", compressible = false, binary = true) + + lazy val `vnd.oipf.dae.svg+xml`: MediaType = + new MediaType("application", "vnd.oipf.dae.svg+xml", compressible = true, binary = true) + + lazy val `vnd.mitsubishi.misty-guard.trustweb`: MediaType = + new MediaType("application", "vnd.mitsubishi.misty-guard.trustweb", compressible = false, binary = true) + + lazy val `vnd.sun.xml.draw`: MediaType = + new MediaType("application", "vnd.sun.xml.draw", compressible = false, binary = true, List("sxd")) + + lazy val `x-7z-compressed`: MediaType = + new MediaType("application", "x-7z-compressed", compressible = false, binary = true, List("7z")) + + lazy val `vnd.openxmlformats-officedocument.presentationml.presentation.main+xml`: MediaType = + new MediaType( "application", - "vnd.shana.informed.interchange", - Compressible, - NotBinary, - List("iif"), + "vnd.openxmlformats-officedocument.presentationml.presentation.main+xml", + compressible = true, + binary = true, ) - lazy val `vnd.shana.informed.package`: MediaType = new MediaType( + + lazy val `x-apple-diskimage`: MediaType = + new MediaType("application", "x-apple-diskimage", compressible = false, binary = true, List("dmg")) + + lazy val `vnd.orange.indata`: MediaType = + new MediaType("application", "vnd.orange.indata", compressible = false, binary = true) + + lazy val `cu-seeme`: MediaType = + new MediaType("application", "cu-seeme", compressible = false, binary = true, List("cu")) + + lazy val `x-x509-next-ca-cert`: MediaType = + new MediaType("application", "x-x509-next-ca-cert", compressible = false, binary = true) + + lazy val `x-virtualbox-vhd`: MediaType = + new MediaType("application", "x-virtualbox-vhd", compressible = true, binary = true, List("vhd")) + + lazy val `media-policy-dataset+xml`: MediaType = + new MediaType("application", "media-policy-dataset+xml", compressible = true, binary = true, List("mpf")) + + lazy val `vnd.ocf+cbor`: MediaType = + new MediaType("application", "vnd.ocf+cbor", compressible = false, binary = true) + + lazy val `vnd.japannet-verification-wakeup`: MediaType = + new MediaType("application", "vnd.japannet-verification-wakeup", compressible = false, binary = true) + + lazy val `vnd.spotfire.dxp`: MediaType = + new MediaType("application", "vnd.spotfire.dxp", compressible = false, binary = true, List("dxp")) + + lazy val `mpeg4-generic`: MediaType = + new MediaType("application", "mpeg4-generic", compressible = false, binary = true) + + lazy val `vemmi`: MediaType = + new MediaType("application", "vemmi", compressible = false, binary = true) + + lazy val `x-tex-tfm`: MediaType = + new MediaType("application", "x-tex-tfm", compressible = false, binary = true, List("tfm")) + + lazy val `vnd.ms-powerpoint`: MediaType = + new MediaType("application", "vnd.ms-powerpoint", compressible = false, binary = true, List("ppt", "pps", "pot")) + + lazy val `vnd.hhe.lesson-player`: MediaType = + new MediaType("application", "vnd.hhe.lesson-player", compressible = false, binary = true, List("les")) + + lazy val `hjson`: MediaType = + new MediaType("application", "hjson", compressible = false, binary = false, List("hjson")) + + lazy val `vnd.msign`: MediaType = + new MediaType("application", "vnd.msign", compressible = false, binary = true) + + lazy val `vnd.openxmlformats-officedocument.presentationml.tablestyles+xml`: MediaType = + new MediaType( "application", - "vnd.shana.informed.package", - Compressible, - NotBinary, - List("ipk"), + "vnd.openxmlformats-officedocument.presentationml.tablestyles+xml", + compressible = true, + binary = true, ) - lazy val `vnd.shootproof+json`: MediaType = - new MediaType("application", "vnd.shootproof+json", Compressible, NotBinary) - lazy val `vnd.shopkick+json`: MediaType = - new MediaType("application", "vnd.shopkick+json", Compressible, NotBinary) - lazy val `vnd.shp`: MediaType = - new MediaType("application", "vnd.shp", Compressible, NotBinary) - lazy val `vnd.shx`: MediaType = - new MediaType("application", "vnd.shx", Compressible, NotBinary) - lazy val `vnd.sigrok.session`: MediaType = - new MediaType("application", "vnd.sigrok.session", Compressible, NotBinary) - lazy val `vnd.simtech-mindmapper`: MediaType = new MediaType( + + lazy val `news-groupinfo`: MediaType = + new MediaType("application", "news-groupinfo", compressible = false, binary = true) + + lazy val `simplesymbolcontainer`: MediaType = + new MediaType("application", "simplesymbolcontainer", compressible = false, binary = true) + + lazy val `msword`: MediaType = + new MediaType("application", "msword", compressible = false, binary = true, List("doc", "dot")) + + lazy val `x-gramps-xml`: MediaType = + new MediaType("application", "x-gramps-xml", compressible = false, binary = true, List("gramps")) + + lazy val `vnd.hp-pclxl`: MediaType = + new MediaType("application", "vnd.hp-pclxl", compressible = false, binary = true, List("pclxl")) + + lazy val `emergencycalldata.subscriberinfo+xml`: MediaType = + new MediaType("application", "emergencycalldata.subscriberinfo+xml", compressible = true, binary = true) + + lazy val `vnd.seemail`: MediaType = + new MediaType("application", "vnd.seemail", compressible = false, binary = true, List("see")) + + lazy val `dii`: MediaType = + new MediaType("application", "dii", compressible = false, binary = true) + + lazy val `cwl`: MediaType = + new MediaType("application", "cwl", compressible = false, binary = true, List("cwl")) + + lazy val `vnd.mif`: MediaType = + new MediaType("application", "vnd.mif", compressible = false, binary = true, List("mif")) + + lazy val `x-t3vm-image`: MediaType = + new MediaType("application", "x-t3vm-image", compressible = false, binary = true, List("t3")) + + lazy val `font-woff`: MediaType = + new MediaType("application", "font-woff", compressible = false, binary = true) + + lazy val `pdf`: MediaType = + new MediaType("application", "pdf", compressible = false, binary = true, List("pdf")) + + lazy val `vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml`: MediaType = + new MediaType( "application", - "vnd.simtech-mindmapper", - Compressible, - NotBinary, - List("twd", "twds"), + "vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml", + compressible = true, + binary = true, ) - lazy val `vnd.siren+json`: MediaType = - new MediaType("application", "vnd.siren+json", Compressible, NotBinary) - lazy val `vnd.smaf`: MediaType = - new MediaType("application", "vnd.smaf", Compressible, NotBinary, List("mmf")) - lazy val `vnd.smart.notebook`: MediaType = - new MediaType("application", "vnd.smart.notebook", Compressible, NotBinary) - lazy val `vnd.smart.teacher`: MediaType = - new MediaType("application", "vnd.smart.teacher", Compressible, NotBinary, List("teacher")) - lazy val `vnd.snesdev-page-table`: MediaType = - new MediaType("application", "vnd.snesdev-page-table", Compressible, NotBinary) - lazy val `vnd.software602.filler.form+xml`: MediaType = new MediaType( + + lazy val `vnd.chipnuts.karaoke-mmd`: MediaType = + new MediaType("application", "vnd.chipnuts.karaoke-mmd", compressible = false, binary = true, List("mmd")) + + lazy val `vnd.ims.lis.v2.result+json`: MediaType = + new MediaType("application", "vnd.ims.lis.v2.result+json", compressible = true, binary = false) + + lazy val `pkcs7-mime`: MediaType = + new MediaType("application", "pkcs7-mime", compressible = false, binary = true, List("p7m", "p7c")) + + lazy val `xv+xml`: MediaType = + new MediaType("application", "xv+xml", compressible = true, binary = true, List("mxml", "xhvml", "xvml", "xvm")) + + lazy val `x-ms-wmd`: MediaType = + new MediaType("application", "x-ms-wmd", compressible = false, binary = true, List("wmd")) + + lazy val `vnd.marlin.drm.conftoken+xml`: MediaType = + new MediaType("application", "vnd.marlin.drm.conftoken+xml", compressible = true, binary = true) + + lazy val `vnd.oracle.resource+json`: MediaType = + new MediaType("application", "vnd.oracle.resource+json", compressible = true, binary = false) + + lazy val `cose-key-set`: MediaType = + new MediaType("application", "cose-key-set", compressible = false, binary = true) + + lazy val `vnd.3gpp.access-transfer-events+xml`: MediaType = + new MediaType("application", "vnd.3gpp.access-transfer-events+xml", compressible = true, binary = true) + + lazy val `vnd.ms-excel.template.macroenabled.12`: MediaType = + new MediaType( "application", - "vnd.software602.filler.form+xml", - Compressible, - NotBinary, - List("fo"), + "vnd.ms-excel.template.macroenabled.12", + compressible = false, + binary = true, + List("xltm"), ) - lazy val `vnd.software602.filler.form-xml-zip`: MediaType = - new MediaType("application", "vnd.software602.filler.form-xml-zip", Compressible, NotBinary) - lazy val `vnd.solent.sdkm+xml`: MediaType = new MediaType( + + lazy val `pidf+xml`: MediaType = + new MediaType("application", "pidf+xml", compressible = true, binary = true) + + lazy val `vnd.geogebra.slides`: MediaType = + new MediaType("application", "vnd.geogebra.slides", compressible = false, binary = true) + + lazy val `emergencycalldata.legacyesn+json`: MediaType = + new MediaType("application", "emergencycalldata.legacyesn+json", compressible = true, binary = false) + + lazy val `relax-ng-compact-syntax`: MediaType = + new MediaType("application", "relax-ng-compact-syntax", compressible = false, binary = true, List("rnc")) + + lazy val `vnd.insors.igm`: MediaType = + new MediaType("application", "vnd.insors.igm", compressible = false, binary = true, List("igm")) + + lazy val `vnd.fujixerox.ddd`: MediaType = + new MediaType("application", "vnd.fujixerox.ddd", compressible = false, binary = true, List("ddd")) + + lazy val `vnd.google-apps.document`: MediaType = + new MediaType("application", "vnd.google-apps.document", compressible = false, binary = true, List("gdoc")) + + lazy val `vnd.xara`: MediaType = + new MediaType("application", "vnd.xara", compressible = false, binary = true, List("xar")) + + lazy val `vnd.mapbox-vector-tile`: MediaType = + new MediaType("application", "vnd.mapbox-vector-tile", compressible = false, binary = true, List("mvt")) + + lazy val `vnd.tml`: MediaType = + new MediaType("application", "vnd.tml", compressible = false, binary = true) + + lazy val `merge-patch+json`: MediaType = + new MediaType("application", "merge-patch+json", compressible = true, binary = false) + + lazy val `vnd.syncml.dm+xml`: MediaType = + new MediaType("application", "vnd.syncml.dm+xml", compressible = true, binary = true, List("xdm")) + + lazy val `x-mie`: MediaType = + new MediaType("application", "x-mie", compressible = false, binary = true, List("mie")) + + lazy val `vnd.openxmlformats-package.relationships+xml`: MediaType = + new MediaType("application", "vnd.openxmlformats-package.relationships+xml", compressible = true, binary = true) + + lazy val `vnd.ms-package.obfuscated-opentype`: MediaType = + new MediaType("application", "vnd.ms-package.obfuscated-opentype", compressible = false, binary = true) + + lazy val `alto-error+json`: MediaType = + new MediaType("application", "alto-error+json", compressible = true, binary = false) + + lazy val `vnd.oma.group-usage-list+xml`: MediaType = + new MediaType("application", "vnd.oma.group-usage-list+xml", compressible = true, binary = true) + + lazy val `cea-2018+xml`: MediaType = + new MediaType("application", "cea-2018+xml", compressible = true, binary = true) + + lazy val `vnd.yamaha.openscoreformat.osfpvg+xml`: MediaType = + new MediaType( "application", - "vnd.solent.sdkm+xml", - Compressible, - NotBinary, - List("sdkm", "sdkd"), + "vnd.yamaha.openscoreformat.osfpvg+xml", + compressible = true, + binary = true, + List("osfpvg"), ) - lazy val `vnd.spotfire.dxp`: MediaType = - new MediaType("application", "vnd.spotfire.dxp", Compressible, NotBinary, List("dxp")) - lazy val `vnd.spotfire.sfs`: MediaType = - new MediaType("application", "vnd.spotfire.sfs", Compressible, NotBinary, List("sfs")) - lazy val `vnd.sqlite3`: MediaType = - new MediaType("application", "vnd.sqlite3", Compressible, NotBinary) - lazy val `vnd.sss-cod`: MediaType = - new MediaType("application", "vnd.sss-cod", Compressible, NotBinary) - lazy val `vnd.sss-dtf`: MediaType = - new MediaType("application", "vnd.sss-dtf", Compressible, NotBinary) - lazy val `vnd.sss-ntf`: MediaType = - new MediaType("application", "vnd.sss-ntf", Compressible, NotBinary) - lazy val `vnd.stardivision.calc`: MediaType = - new MediaType("application", "vnd.stardivision.calc", Compressible, NotBinary, List("sdc")) - lazy val `vnd.stardivision.draw`: MediaType = - new MediaType("application", "vnd.stardivision.draw", Compressible, NotBinary, List("sda")) - lazy val `vnd.stardivision.impress`: MediaType = new MediaType( - "application", - "vnd.stardivision.impress", - Compressible, - NotBinary, - List("sdd"), - ) - lazy val `vnd.stardivision.math`: MediaType = - new MediaType("application", "vnd.stardivision.math", Compressible, NotBinary, List("smf")) - lazy val `vnd.stardivision.writer`: MediaType = new MediaType( - "application", - "vnd.stardivision.writer", - Compressible, - NotBinary, - List("sdw", "vor"), - ) - lazy val `vnd.stardivision.writer-global`: MediaType = new MediaType( - "application", - "vnd.stardivision.writer-global", - Compressible, - NotBinary, - List("sgl"), - ) - lazy val `vnd.stepmania.package`: MediaType = new MediaType( - "application", - "vnd.stepmania.package", - Compressible, - NotBinary, - List("smzip"), - ) - lazy val `vnd.stepmania.stepchart`: MediaType = - new MediaType("application", "vnd.stepmania.stepchart", Compressible, NotBinary, List("sm")) - lazy val `vnd.street-stream`: MediaType = - new MediaType("application", "vnd.street-stream", Compressible, NotBinary) - lazy val `vnd.sun.wadl+xml`: MediaType = - new MediaType("application", "vnd.sun.wadl+xml", Compressible, NotBinary, List("wadl")) - lazy val `vnd.sun.xml.calc`: MediaType = - new MediaType("application", "vnd.sun.xml.calc", Compressible, NotBinary, List("sxc")) - lazy val `vnd.sun.xml.calc.template`: MediaType = new MediaType( - "application", - "vnd.sun.xml.calc.template", - Compressible, - NotBinary, - List("stc"), - ) - lazy val `vnd.sun.xml.draw`: MediaType = - new MediaType("application", "vnd.sun.xml.draw", Compressible, NotBinary, List("sxd")) - lazy val `vnd.sun.xml.draw.template`: MediaType = new MediaType( - "application", - "vnd.sun.xml.draw.template", - Compressible, - NotBinary, - List("std"), - ) - lazy val `vnd.sun.xml.impress`: MediaType = - new MediaType("application", "vnd.sun.xml.impress", Compressible, NotBinary, List("sxi")) - lazy val `vnd.sun.xml.impress.template`: MediaType = new MediaType( - "application", - "vnd.sun.xml.impress.template", - Compressible, - NotBinary, - List("sti"), - ) - lazy val `vnd.sun.xml.math`: MediaType = - new MediaType("application", "vnd.sun.xml.math", Compressible, NotBinary, List("sxm")) - lazy val `vnd.sun.xml.writer`: MediaType = - new MediaType("application", "vnd.sun.xml.writer", Compressible, NotBinary, List("sxw")) - lazy val `vnd.sun.xml.writer.global`: MediaType = new MediaType( - "application", - "vnd.sun.xml.writer.global", - Compressible, - NotBinary, - List("sxg"), - ) - lazy val `vnd.sun.xml.writer.template`: MediaType = new MediaType( - "application", - "vnd.sun.xml.writer.template", - Compressible, - NotBinary, - List("stw"), - ) - lazy val `vnd.sus-calendar`: MediaType = new MediaType( - "application", - "vnd.sus-calendar", - Compressible, - NotBinary, - List("sus", "susp"), - ) - lazy val `vnd.svd`: MediaType = - new MediaType("application", "vnd.svd", Compressible, NotBinary, List("svd")) - lazy val `vnd.swiftview-ics`: MediaType = - new MediaType("application", "vnd.swiftview-ics", Compressible, NotBinary) - lazy val `vnd.sycle+xml`: MediaType = - new MediaType("application", "vnd.sycle+xml", Compressible, NotBinary) - lazy val `vnd.symbian.install`: MediaType = new MediaType( - "application", - "vnd.symbian.install", - Compressible, - NotBinary, - List("sis", "sisx"), - ) - lazy val `vnd.syncml+xml`: MediaType = - new MediaType("application", "vnd.syncml+xml", Compressible, NotBinary, List("xsm")) - lazy val `vnd.syncml.dm+wbxml`: MediaType = - new MediaType("application", "vnd.syncml.dm+wbxml", Compressible, NotBinary, List("bdm")) - lazy val `vnd.syncml.dm+xml`: MediaType = - new MediaType("application", "vnd.syncml.dm+xml", Compressible, NotBinary, List("xdm")) - lazy val `vnd.syncml.dm.notification`: MediaType = - new MediaType("application", "vnd.syncml.dm.notification", Compressible, NotBinary) - lazy val `vnd.syncml.dmddf+wbxml`: MediaType = - new MediaType("application", "vnd.syncml.dmddf+wbxml", Compressible, NotBinary) - lazy val `vnd.syncml.dmddf+xml`: MediaType = - new MediaType("application", "vnd.syncml.dmddf+xml", Compressible, NotBinary, List("ddf")) - lazy val `vnd.syncml.dmtnds+wbxml`: MediaType = - new MediaType("application", "vnd.syncml.dmtnds+wbxml", Compressible, NotBinary) - lazy val `vnd.syncml.dmtnds+xml`: MediaType = - new MediaType("application", "vnd.syncml.dmtnds+xml", Compressible, NotBinary) - lazy val `vnd.syncml.ds.notification`: MediaType = - new MediaType("application", "vnd.syncml.ds.notification", Compressible, NotBinary) - lazy val `vnd.tableschema+json`: MediaType = - new MediaType("application", "vnd.tableschema+json", Compressible, NotBinary) - lazy val `vnd.tao.intent-module-archive`: MediaType = new MediaType( - "application", - "vnd.tao.intent-module-archive", - Compressible, - NotBinary, - List("tao"), - ) - lazy val `vnd.tcpdump.pcap`: MediaType = new MediaType( - "application", - "vnd.tcpdump.pcap", - Compressible, - NotBinary, - List("pcap", "cap", "dmp"), - ) - lazy val `vnd.think-cell.ppttc+json`: MediaType = - new MediaType("application", "vnd.think-cell.ppttc+json", Compressible, NotBinary) - lazy val `vnd.tmd.mediaflex.api+xml`: MediaType = - new MediaType("application", "vnd.tmd.mediaflex.api+xml", Compressible, NotBinary) - lazy val `vnd.tml`: MediaType = - new MediaType("application", "vnd.tml", Compressible, NotBinary) - lazy val `vnd.tmobile-livetv`: MediaType = - new MediaType("application", "vnd.tmobile-livetv", Compressible, NotBinary, List("tmo")) - lazy val `vnd.tri.onesource`: MediaType = - new MediaType("application", "vnd.tri.onesource", Compressible, NotBinary) - lazy val `vnd.trid.tpt`: MediaType = - new MediaType("application", "vnd.trid.tpt", Compressible, NotBinary, List("tpt")) - lazy val `vnd.triscape.mxs`: MediaType = - new MediaType("application", "vnd.triscape.mxs", Compressible, NotBinary, List("mxs")) - lazy val `vnd.trueapp`: MediaType = - new MediaType("application", "vnd.trueapp", Compressible, NotBinary, List("tra")) - lazy val `vnd.truedoc`: MediaType = - new MediaType("application", "vnd.truedoc", Compressible, NotBinary) - lazy val `vnd.ubisoft.webplayer`: MediaType = - new MediaType("application", "vnd.ubisoft.webplayer", Compressible, NotBinary) - lazy val `vnd.ufdl`: MediaType = - new MediaType("application", "vnd.ufdl", Compressible, NotBinary, List("ufd", "ufdl")) - lazy val `vnd.uiq.theme`: MediaType = - new MediaType("application", "vnd.uiq.theme", Compressible, NotBinary, List("utz")) - lazy val `vnd.umajin`: MediaType = - new MediaType("application", "vnd.umajin", Compressible, NotBinary, List("umj")) - lazy val `vnd.unity`: MediaType = - new MediaType("application", "vnd.unity", Compressible, NotBinary, List("unityweb")) - lazy val `vnd.uoml+xml`: MediaType = - new MediaType("application", "vnd.uoml+xml", Compressible, NotBinary, List("uoml")) - lazy val `vnd.uplanet.alert`: MediaType = - new MediaType("application", "vnd.uplanet.alert", Compressible, NotBinary) - lazy val `vnd.uplanet.alert-wbxml`: MediaType = - new MediaType("application", "vnd.uplanet.alert-wbxml", Compressible, NotBinary) - lazy val `vnd.uplanet.bearer-choice`: MediaType = - new MediaType("application", "vnd.uplanet.bearer-choice", Compressible, NotBinary) - lazy val `vnd.uplanet.bearer-choice-wbxml`: MediaType = - new MediaType("application", "vnd.uplanet.bearer-choice-wbxml", Compressible, NotBinary) - lazy val `vnd.uplanet.cacheop`: MediaType = - new MediaType("application", "vnd.uplanet.cacheop", Compressible, NotBinary) - lazy val `vnd.uplanet.cacheop-wbxml`: MediaType = - new MediaType("application", "vnd.uplanet.cacheop-wbxml", Compressible, NotBinary) - lazy val `vnd.uplanet.channel`: MediaType = - new MediaType("application", "vnd.uplanet.channel", Compressible, NotBinary) - lazy val `vnd.uplanet.channel-wbxml`: MediaType = - new MediaType("application", "vnd.uplanet.channel-wbxml", Compressible, NotBinary) - lazy val `vnd.uplanet.list`: MediaType = - new MediaType("application", "vnd.uplanet.list", Compressible, NotBinary) - lazy val `vnd.uplanet.list-wbxml`: MediaType = - new MediaType("application", "vnd.uplanet.list-wbxml", Compressible, NotBinary) - lazy val `vnd.uplanet.listcmd`: MediaType = - new MediaType("application", "vnd.uplanet.listcmd", Compressible, NotBinary) - lazy val `vnd.uplanet.listcmd-wbxml`: MediaType = - new MediaType("application", "vnd.uplanet.listcmd-wbxml", Compressible, NotBinary) - lazy val `vnd.uplanet.signal`: MediaType = - new MediaType("application", "vnd.uplanet.signal", Compressible, NotBinary) - lazy val `vnd.uri-map`: MediaType = - new MediaType("application", "vnd.uri-map", Compressible, NotBinary) - lazy val `vnd.valve.source.material`: MediaType = - new MediaType("application", "vnd.valve.source.material", Compressible, NotBinary) - lazy val `vnd.vcx`: MediaType = - new MediaType("application", "vnd.vcx", Compressible, NotBinary, List("vcx")) - lazy val `vnd.vd-study`: MediaType = - new MediaType("application", "vnd.vd-study", Compressible, NotBinary) - lazy val `vnd.vectorworks`: MediaType = - new MediaType("application", "vnd.vectorworks", Compressible, NotBinary) - lazy val `vnd.vel+json`: MediaType = - new MediaType("application", "vnd.vel+json", Compressible, NotBinary) - lazy val `vnd.verimatrix.vcas`: MediaType = - new MediaType("application", "vnd.verimatrix.vcas", Compressible, NotBinary) - lazy val `vnd.veryant.thin`: MediaType = - new MediaType("application", "vnd.veryant.thin", Compressible, NotBinary) - lazy val `vnd.ves.encrypted`: MediaType = - new MediaType("application", "vnd.ves.encrypted", Compressible, NotBinary) - lazy val `vnd.vidsoft.vidconference`: MediaType = - new MediaType("application", "vnd.vidsoft.vidconference", Compressible, NotBinary) - lazy val `vnd.visio`: MediaType = new MediaType( - "application", - "vnd.visio", - Compressible, - NotBinary, - List("vsd", "vst", "vss", "vsw"), - ) - lazy val `vnd.visionary`: MediaType = - new MediaType("application", "vnd.visionary", Compressible, NotBinary, List("vis")) - lazy val `vnd.vividence.scriptfile`: MediaType = - new MediaType("application", "vnd.vividence.scriptfile", Compressible, NotBinary) - lazy val `vnd.vsf`: MediaType = - new MediaType("application", "vnd.vsf", Compressible, NotBinary, List("vsf")) - lazy val `vnd.wap.sic`: MediaType = - new MediaType("application", "vnd.wap.sic", Compressible, NotBinary) - lazy val `vnd.wap.slc`: MediaType = - new MediaType("application", "vnd.wap.slc", Compressible, NotBinary) - lazy val `vnd.wap.wbxml`: MediaType = - new MediaType("application", "vnd.wap.wbxml", Compressible, NotBinary, List("wbxml")) - lazy val `vnd.wap.wmlc`: MediaType = - new MediaType("application", "vnd.wap.wmlc", Compressible, NotBinary, List("wmlc")) - lazy val `vnd.wap.wmlscriptc`: MediaType = - new MediaType("application", "vnd.wap.wmlscriptc", Compressible, NotBinary, List("wmlsc")) - lazy val `vnd.webturbo`: MediaType = - new MediaType("application", "vnd.webturbo", Compressible, NotBinary, List("wtb")) - lazy val `vnd.wfa.dpp`: MediaType = - new MediaType("application", "vnd.wfa.dpp", Compressible, NotBinary) - lazy val `vnd.wfa.p2p`: MediaType = - new MediaType("application", "vnd.wfa.p2p", Compressible, NotBinary) - lazy val `vnd.wfa.wsc`: MediaType = - new MediaType("application", "vnd.wfa.wsc", Compressible, NotBinary) - lazy val `vnd.windows.devicepairing`: MediaType = - new MediaType("application", "vnd.windows.devicepairing", Compressible, NotBinary) - lazy val `vnd.wmc`: MediaType = - new MediaType("application", "vnd.wmc", Compressible, NotBinary) - lazy val `vnd.wmf.bootstrap`: MediaType = - new MediaType("application", "vnd.wmf.bootstrap", Compressible, NotBinary) - lazy val `vnd.wolfram.mathematica`: MediaType = - new MediaType("application", "vnd.wolfram.mathematica", Compressible, NotBinary) - lazy val `vnd.wolfram.mathematica.package`: MediaType = - new MediaType("application", "vnd.wolfram.mathematica.package", Compressible, NotBinary) - lazy val `vnd.wolfram.player`: MediaType = - new MediaType("application", "vnd.wolfram.player", Compressible, NotBinary, List("nbp")) - lazy val `vnd.wordperfect`: MediaType = - new MediaType("application", "vnd.wordperfect", Compressible, NotBinary, List("wpd")) - lazy val `vnd.wqd`: MediaType = - new MediaType("application", "vnd.wqd", Compressible, NotBinary, List("wqd")) - lazy val `vnd.wrq-hp3000-labelled`: MediaType = - new MediaType("application", "vnd.wrq-hp3000-labelled", Compressible, NotBinary) - lazy val `vnd.wt.stf`: MediaType = - new MediaType("application", "vnd.wt.stf", Compressible, NotBinary, List("stf")) - lazy val `vnd.wv.csp+wbxml`: MediaType = - new MediaType("application", "vnd.wv.csp+wbxml", Compressible, NotBinary) - lazy val `vnd.wv.csp+xml`: MediaType = - new MediaType("application", "vnd.wv.csp+xml", Compressible, NotBinary) - lazy val `vnd.wv.ssp+xml`: MediaType = - new MediaType("application", "vnd.wv.ssp+xml", Compressible, NotBinary) - lazy val `vnd.xacml+json`: MediaType = - new MediaType("application", "vnd.xacml+json", Compressible, NotBinary) - lazy val `vnd.xara`: MediaType = - new MediaType("application", "vnd.xara", Compressible, NotBinary, List("xar")) - lazy val `vnd.xfdl`: MediaType = - new MediaType("application", "vnd.xfdl", Compressible, NotBinary, List("xfdl")) - lazy val `vnd.xfdl.webform`: MediaType = - new MediaType("application", "vnd.xfdl.webform", Compressible, NotBinary) - lazy val `vnd.xmi+xml`: MediaType = - new MediaType("application", "vnd.xmi+xml", Compressible, NotBinary) - lazy val `vnd.xmpie.cpkg`: MediaType = - new MediaType("application", "vnd.xmpie.cpkg", Compressible, NotBinary) - lazy val `vnd.xmpie.dpkg`: MediaType = - new MediaType("application", "vnd.xmpie.dpkg", Compressible, NotBinary) - lazy val `vnd.xmpie.plan`: MediaType = - new MediaType("application", "vnd.xmpie.plan", Compressible, NotBinary) - lazy val `vnd.xmpie.ppkg`: MediaType = - new MediaType("application", "vnd.xmpie.ppkg", Compressible, NotBinary) - lazy val `vnd.xmpie.xlim`: MediaType = - new MediaType("application", "vnd.xmpie.xlim", Compressible, NotBinary) - lazy val `vnd.yamaha.hv-dic`: MediaType = - new MediaType("application", "vnd.yamaha.hv-dic", Compressible, NotBinary, List("hvd")) - lazy val `vnd.yamaha.hv-script`: MediaType = - new MediaType("application", "vnd.yamaha.hv-script", Compressible, NotBinary, List("hvs")) - lazy val `vnd.yamaha.hv-voice`: MediaType = - new MediaType("application", "vnd.yamaha.hv-voice", Compressible, NotBinary, List("hvp")) - lazy val `vnd.yamaha.openscoreformat`: MediaType = new MediaType( - "application", - "vnd.yamaha.openscoreformat", - Compressible, - NotBinary, - List("osf"), - ) - lazy val `vnd.yamaha.openscoreformat.osfpvg+xml`: MediaType = new MediaType( - "application", - "vnd.yamaha.openscoreformat.osfpvg+xml", - Compressible, - NotBinary, - List("osfpvg"), - ) - lazy val `vnd.yamaha.remote-setup`: MediaType = - new MediaType("application", "vnd.yamaha.remote-setup", Compressible, NotBinary) - lazy val `vnd.yamaha.smaf-audio`: MediaType = - new MediaType("application", "vnd.yamaha.smaf-audio", Compressible, NotBinary, List("saf")) - lazy val `vnd.yamaha.smaf-phrase`: MediaType = - new MediaType("application", "vnd.yamaha.smaf-phrase", Compressible, NotBinary, List("spf")) - lazy val `vnd.yamaha.through-ngn`: MediaType = - new MediaType("application", "vnd.yamaha.through-ngn", Compressible, NotBinary) - lazy val `vnd.yamaha.tunnel-udpencap`: MediaType = - new MediaType("application", "vnd.yamaha.tunnel-udpencap", Compressible, NotBinary) - lazy val `vnd.yaoweme`: MediaType = - new MediaType("application", "vnd.yaoweme", Compressible, NotBinary) - lazy val `vnd.yellowriver-custom-menu`: MediaType = new MediaType( - "application", - "vnd.yellowriver-custom-menu", - Compressible, - NotBinary, - List("cmp"), - ) - lazy val `vnd.youtube.yt`: MediaType = - new MediaType("application", "vnd.youtube.yt", Compressible, NotBinary) - lazy val `vnd.zul`: MediaType = - new MediaType("application", "vnd.zul", Compressible, NotBinary, List("zir", "zirz")) - lazy val `vnd.zzazz.deck+xml`: MediaType = - new MediaType("application", "vnd.zzazz.deck+xml", Compressible, NotBinary, List("zaz")) - lazy val `voicexml+xml`: MediaType = - new MediaType("application", "voicexml+xml", Compressible, NotBinary, List("vxml")) - lazy val `voucher-cms+json`: MediaType = - new MediaType("application", "voucher-cms+json", Compressible, NotBinary) - lazy val `vq-rtcpxr`: MediaType = - new MediaType("application", "vq-rtcpxr", Compressible, NotBinary) - lazy val `wasm`: MediaType = - new MediaType("application", "wasm", Compressible, NotBinary, List("wasm")) - lazy val `watcherinfo+xml`: MediaType = - new MediaType("application", "watcherinfo+xml", Compressible, NotBinary) - lazy val `webpush-options+json`: MediaType = - new MediaType("application", "webpush-options+json", Compressible, NotBinary) - lazy val `whoispp-query`: MediaType = - new MediaType("application", "whoispp-query", Compressible, NotBinary) - lazy val `whoispp-response`: MediaType = - new MediaType("application", "whoispp-response", Compressible, NotBinary) - lazy val `widget`: MediaType = - new MediaType("application", "widget", Compressible, NotBinary, List("wgt")) - lazy val `winhlp`: MediaType = - new MediaType("application", "winhlp", Compressible, NotBinary, List("hlp")) - lazy val `wita`: MediaType = new MediaType("application", "wita", Compressible, NotBinary) - lazy val `wordperfect5.1`: MediaType = - new MediaType("application", "wordperfect5.1", Compressible, NotBinary) - lazy val `wsdl+xml`: MediaType = - new MediaType("application", "wsdl+xml", Compressible, NotBinary, List("wsdl")) - lazy val `wspolicy+xml`: MediaType = - new MediaType("application", "wspolicy+xml", Compressible, NotBinary, List("wspolicy")) - lazy val `x-7z-compressed`: MediaType = - new MediaType("application", "x-7z-compressed", Uncompressible, Binary, List("7z")) - lazy val `x-abiword`: MediaType = - new MediaType("application", "x-abiword", Compressible, NotBinary, List("abw")) - lazy val `x-ace-compressed`: MediaType = - new MediaType("application", "x-ace-compressed", Compressible, Binary, List("ace")) - lazy val `x-amf`: MediaType = new MediaType("application", "x-amf", Compressible, NotBinary) - lazy val `x-apple-diskimage`: MediaType = - new MediaType("application", "x-apple-diskimage", Compressible, Binary, List("dmg")) - lazy val `x-arj`: MediaType = - new MediaType("application", "x-arj", Uncompressible, NotBinary, List("arj")) - lazy val `x-authorware-bin`: MediaType = new MediaType( - "application", - "x-authorware-bin", - Compressible, - NotBinary, - List("aab", "x32", "u32", "vox"), - ) - lazy val `x-authorware-map`: MediaType = - new MediaType("application", "x-authorware-map", Compressible, NotBinary, List("aam")) - lazy val `x-authorware-seg`: MediaType = - new MediaType("application", "x-authorware-seg", Compressible, NotBinary, List("aas")) - lazy val `x-bcpio`: MediaType = - new MediaType("application", "x-bcpio", Compressible, NotBinary, List("bcpio")) - lazy val `x-bdoc`: MediaType = - new MediaType("application", "x-bdoc", Uncompressible, NotBinary, List("bdoc")) - lazy val `x-bittorrent`: MediaType = - new MediaType("application", "x-bittorrent", Compressible, NotBinary, List("torrent")) - lazy val `x-blorb`: MediaType = - new MediaType("application", "x-blorb", Compressible, NotBinary, List("blb", "blorb")) - lazy val `x-bzip`: MediaType = - new MediaType("application", "x-bzip", Uncompressible, Binary, List("bz")) - lazy val `x-bzip2`: MediaType = - new MediaType("application", "x-bzip2", Uncompressible, Binary, List("bz2", "boz")) - lazy val `x-cbr`: MediaType = new MediaType( - "application", - "x-cbr", - Compressible, - NotBinary, - List("cbr", "cba", "cbt", "cbz", "cb7"), - ) - lazy val `x-cdlink`: MediaType = - new MediaType("application", "x-cdlink", Compressible, NotBinary, List("vcd")) - lazy val `x-cfs-compressed`: MediaType = - new MediaType("application", "x-cfs-compressed", Compressible, NotBinary, List("cfs")) - lazy val `x-chat`: MediaType = - new MediaType("application", "x-chat", Compressible, NotBinary, List("chat")) - lazy val `x-chess-pgn`: MediaType = - new MediaType("application", "x-chess-pgn", Compressible, NotBinary, List("pgn")) - lazy val `x-chrome-extension`: MediaType = - new MediaType("application", "x-chrome-extension", Compressible, Binary, List("crx")) - lazy val `x-cocoa`: MediaType = - new MediaType("application", "x-cocoa", Compressible, NotBinary, List("cco")) - lazy val `x-compress`: MediaType = - new MediaType("application", "x-compress", Compressible, Binary) - lazy val `x-conference`: MediaType = - new MediaType("application", "x-conference", Compressible, NotBinary, List("nsc")) - lazy val `x-cpio`: MediaType = - new MediaType("application", "x-cpio", Compressible, NotBinary, List("cpio")) - lazy val part_2: List[MediaType] = List( - `vnd.ms-wmdrm.lic-resp`, - `vnd.ms-wmdrm.meter-chlg-req`, - `vnd.ms-wmdrm.meter-resp`, - `vnd.ms-word.document.macroenabled.12`, - `vnd.ms-word.template.macroenabled.12`, - `vnd.ms-works`, - `vnd.ms-wpl`, - `vnd.ms-xpsdocument`, - `vnd.msa-disk-image`, - `vnd.mseq`, - `vnd.msign`, - `vnd.multiad.creator`, - `vnd.multiad.creator.cif`, - `vnd.music-niff`, - `vnd.musician`, - `vnd.muvee.style`, - `vnd.mynfc`, - `vnd.ncd.control`, - `vnd.ncd.reference`, - `vnd.nearst.inv+json`, - `vnd.nebumind.line`, - `vnd.nervana`, - `vnd.netfpx`, - `vnd.neurolanguage.nlu`, - `vnd.nimn`, - `vnd.nintendo.nitro.rom`, - `vnd.nintendo.snes.rom`, - `vnd.nitf`, - `vnd.noblenet-directory`, - `vnd.noblenet-sealer`, - `vnd.noblenet-web`, - `vnd.nokia.catalogs`, - `vnd.nokia.conml+wbxml`, - `vnd.nokia.conml+xml`, - `vnd.nokia.iptv.config+xml`, - `vnd.nokia.isds-radio-presets`, - `vnd.nokia.landmark+wbxml`, - `vnd.nokia.landmark+xml`, - `vnd.nokia.landmarkcollection+xml`, - `vnd.nokia.n-gage.ac+xml`, - `vnd.nokia.n-gage.data`, - `vnd.nokia.n-gage.symbian.install`, - `vnd.nokia.ncd`, - `vnd.nokia.pcd+wbxml`, - `vnd.nokia.pcd+xml`, - `vnd.nokia.radio-preset`, - `vnd.nokia.radio-presets`, - `vnd.novadigm.edm`, - `vnd.novadigm.edx`, - `vnd.novadigm.ext`, - `vnd.ntt-local.content-share`, - `vnd.ntt-local.file-transfer`, - `vnd.ntt-local.ogw_remote-access`, - `vnd.ntt-local.sip-ta_remote`, - `vnd.ntt-local.sip-ta_tcp_stream`, - `vnd.oasis.opendocument.chart`, - `vnd.oasis.opendocument.chart-template`, - `vnd.oasis.opendocument.database`, - `vnd.oasis.opendocument.formula`, - `vnd.oasis.opendocument.formula-template`, - `vnd.oasis.opendocument.graphics`, - `vnd.oasis.opendocument.graphics-template`, - `vnd.oasis.opendocument.image`, - `vnd.oasis.opendocument.image-template`, - `vnd.oasis.opendocument.presentation`, - `vnd.oasis.opendocument.presentation-template`, - `vnd.oasis.opendocument.spreadsheet`, - `vnd.oasis.opendocument.spreadsheet-template`, - `vnd.oasis.opendocument.text`, - `vnd.oasis.opendocument.text-master`, - `vnd.oasis.opendocument.text-template`, - `vnd.oasis.opendocument.text-web`, - `vnd.obn`, - `vnd.ocf+cbor`, - `vnd.oci.image.manifest.v1+json`, - `vnd.oftn.l10n+json`, - `vnd.oipf.contentaccessdownload+xml`, - `vnd.oipf.contentaccessstreaming+xml`, - `vnd.oipf.cspg-hexbinary`, - `vnd.oipf.dae.svg+xml`, - `vnd.oipf.dae.xhtml+xml`, - `vnd.oipf.mippvcontrolmessage+xml`, - `vnd.oipf.pae.gem`, - `vnd.oipf.spdiscovery+xml`, - `vnd.oipf.spdlist+xml`, - `vnd.oipf.ueprofile+xml`, - `vnd.oipf.userprofile+xml`, - `vnd.olpc-sugar`, - `vnd.oma-scws-config`, - `vnd.oma-scws-http-request`, - `vnd.oma-scws-http-response`, - `vnd.oma.bcast.associated-procedure-parameter+xml`, - `vnd.oma.bcast.drm-trigger+xml`, - `vnd.oma.bcast.imd+xml`, - `vnd.oma.bcast.ltkm`, - `vnd.oma.bcast.notification+xml`, - `vnd.oma.bcast.provisioningtrigger`, - `vnd.oma.bcast.sgboot`, - `vnd.oma.bcast.sgdd+xml`, - `vnd.oma.bcast.sgdu`, - `vnd.oma.bcast.simple-symbol-container`, - `vnd.oma.bcast.smartcard-trigger+xml`, - `vnd.oma.bcast.sprov+xml`, - `vnd.oma.bcast.stkm`, - `vnd.oma.cab-address-book+xml`, - `vnd.oma.cab-feature-handler+xml`, - `vnd.oma.cab-pcc+xml`, - `vnd.oma.cab-subs-invite+xml`, - `vnd.oma.cab-user-prefs+xml`, - `vnd.oma.dcd`, - `vnd.oma.dcdc`, - `vnd.oma.dd2+xml`, - `vnd.oma.drm.risd+xml`, - `vnd.oma.group-usage-list+xml`, - `vnd.oma.lwm2m+cbor`, - `vnd.oma.lwm2m+json`, - `vnd.oma.lwm2m+tlv`, - `vnd.oma.pal+xml`, - `vnd.oma.poc.detailed-progress-report+xml`, - `vnd.oma.poc.final-report+xml`, - `vnd.oma.poc.groups+xml`, - `vnd.oma.poc.invocation-descriptor+xml`, - `vnd.oma.poc.optimized-progress-report+xml`, - `vnd.oma.push`, - `vnd.oma.scidm.messages+xml`, - `vnd.oma.xcap-directory+xml`, - `vnd.omads-email+xml`, - `vnd.omads-file+xml`, - `vnd.omads-folder+xml`, - `vnd.omaloc-supl-init`, - `vnd.onepager`, - `vnd.onepagertamp`, - `vnd.onepagertamx`, - `vnd.onepagertat`, - `vnd.onepagertatp`, - `vnd.onepagertatx`, - `vnd.openblox.game+xml`, - `vnd.openblox.game-binary`, - `vnd.openeye.oeb`, - `vnd.openofficeorg.extension`, - `vnd.openstreetmap.data+xml`, - `vnd.openxmlformats-officedocument.custom-properties+xml`, - `vnd.openxmlformats-officedocument.customxmlproperties+xml`, - `vnd.openxmlformats-officedocument.drawing+xml`, - `vnd.openxmlformats-officedocument.drawingml.chart+xml`, - `vnd.openxmlformats-officedocument.drawingml.chartshapes+xml`, - `vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml`, - `vnd.openxmlformats-officedocument.drawingml.diagramdata+xml`, - `vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml`, - `vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml`, - `vnd.openxmlformats-officedocument.extended-properties+xml`, - `vnd.openxmlformats-officedocument.presentationml.commentauthors+xml`, - `vnd.openxmlformats-officedocument.presentationml.comments+xml`, - `vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml`, - `vnd.openxmlformats-officedocument.presentationml.notesmaster+xml`, - `vnd.openxmlformats-officedocument.presentationml.notesslide+xml`, - `vnd.openxmlformats-officedocument.presentationml.presentation`, - `vnd.openxmlformats-officedocument.presentationml.presentation.main+xml`, - `vnd.openxmlformats-officedocument.presentationml.presprops+xml`, - `vnd.openxmlformats-officedocument.presentationml.slide`, - `vnd.openxmlformats-officedocument.presentationml.slide+xml`, - `vnd.openxmlformats-officedocument.presentationml.slidelayout+xml`, - `vnd.openxmlformats-officedocument.presentationml.slidemaster+xml`, - `vnd.openxmlformats-officedocument.presentationml.slideshow`, - `vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml`, - `vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml`, - `vnd.openxmlformats-officedocument.presentationml.tablestyles+xml`, - `vnd.openxmlformats-officedocument.presentationml.tags+xml`, - `vnd.openxmlformats-officedocument.presentationml.template`, - `vnd.openxmlformats-officedocument.presentationml.template.main+xml`, - `vnd.openxmlformats-officedocument.presentationml.viewprops+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.comments+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.connections+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.sheet`, - `vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.styles+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.table+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.template`, - `vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml`, - `vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml`, - `vnd.openxmlformats-officedocument.theme+xml`, - `vnd.openxmlformats-officedocument.themeoverride+xml`, - `vnd.openxmlformats-officedocument.vmldrawing`, - `vnd.openxmlformats-officedocument.wordprocessingml.comments+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.document`, - `vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.footer+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.settings+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.styles+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.template`, - `vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml`, - `vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml`, - `vnd.openxmlformats-package.core-properties+xml`, - `vnd.openxmlformats-package.digital-signature-xmlsignature+xml`, - `vnd.openxmlformats-package.relationships+xml`, - `vnd.oracle.resource+json`, - `vnd.orange.indata`, - `vnd.osa.netdeploy`, - `vnd.osgeo.mapguide.package`, - `vnd.osgi.bundle`, - `vnd.osgi.dp`, - `vnd.osgi.subsystem`, - `vnd.otps.ct-kip+xml`, - `vnd.oxli.countgraph`, - `vnd.pagerduty+json`, - `vnd.palm`, - `vnd.panoply`, - `vnd.paos.xml`, - `vnd.patentdive`, - `vnd.patientecommsdoc`, - `vnd.pawaafile`, - `vnd.pcos`, - `vnd.pg.format`, - `vnd.pg.osasli`, - `vnd.piaccess.application-licence`, - `vnd.picsel`, - `vnd.pmi.widget`, - `vnd.poc.group-advertisement+xml`, - `vnd.pocketlearn`, - `vnd.powerbuilder6`, - `vnd.powerbuilder6-s`, - `vnd.powerbuilder7`, - `vnd.powerbuilder7-s`, - `vnd.powerbuilder75`, - `vnd.powerbuilder75-s`, - `vnd.preminet`, - `vnd.previewsystems.box`, - `vnd.proteus.magazine`, - `vnd.psfs`, - `vnd.publishare-delta-tree`, - `vnd.pvi.ptid1`, - `vnd.pwg-multiplexed`, - `vnd.pwg-xhtml-print+xml`, - `vnd.qualcomm.brew-app-res`, - `vnd.quarantainenet`, - `vnd.quark.quarkxpress`, - `vnd.quobject-quoxdocument`, - `vnd.radisys.moml+xml`, - `vnd.radisys.msml+xml`, - `vnd.radisys.msml-audit+xml`, - `vnd.radisys.msml-audit-conf+xml`, - `vnd.radisys.msml-audit-conn+xml`, - `vnd.radisys.msml-audit-dialog+xml`, - `vnd.radisys.msml-audit-stream+xml`, - `vnd.radisys.msml-conf+xml`, - `vnd.radisys.msml-dialog+xml`, - `vnd.radisys.msml-dialog-base+xml`, - `vnd.radisys.msml-dialog-fax-detect+xml`, - `vnd.radisys.msml-dialog-fax-sendrecv+xml`, - `vnd.radisys.msml-dialog-group+xml`, - `vnd.radisys.msml-dialog-speech+xml`, - `vnd.radisys.msml-dialog-transform+xml`, - `vnd.rainstor.data`, - `vnd.rapid`, - `vnd.rar`, - `vnd.realvnc.bed`, - `vnd.recordare.musicxml`, - `vnd.recordare.musicxml+xml`, - `vnd.renlearn.rlprint`, - `vnd.resilient.logic`, - `vnd.restful+json`, - `vnd.rig.cryptonote`, - `vnd.rim.cod`, - `vnd.rn-realmedia`, - `vnd.rn-realmedia-vbr`, - `vnd.route66.link66+xml`, - `vnd.rs-274x`, - `vnd.ruckus.download`, - `vnd.s3sms`, - `vnd.sailingtracker.track`, - `vnd.sar`, - `vnd.sbm.cid`, - `vnd.sbm.mid2`, - `vnd.scribus`, - `vnd.sealed.3df`, - `vnd.sealed.csf`, - `vnd.sealed.doc`, - `vnd.sealed.eml`, - `vnd.sealed.mht`, - `vnd.sealed.net`, - `vnd.sealed.ppt`, - `vnd.sealed.tiff`, - `vnd.sealed.xls`, - `vnd.sealedmedia.softseal.html`, - `vnd.sealedmedia.softseal.pdf`, - `vnd.seemail`, - `vnd.seis+json`, - `vnd.sema`, - `vnd.semd`, - `vnd.semf`, - `vnd.shade-save-file`, - `vnd.shana.informed.formdata`, - `vnd.shana.informed.formtemplate`, - `vnd.shana.informed.interchange`, - `vnd.shana.informed.package`, - `vnd.shootproof+json`, - `vnd.shopkick+json`, - `vnd.shp`, - `vnd.shx`, - `vnd.sigrok.session`, - `vnd.simtech-mindmapper`, - `vnd.siren+json`, - `vnd.smaf`, - `vnd.smart.notebook`, - `vnd.smart.teacher`, - `vnd.snesdev-page-table`, - `vnd.software602.filler.form+xml`, - `vnd.software602.filler.form-xml-zip`, - `vnd.solent.sdkm+xml`, - `vnd.spotfire.dxp`, - `vnd.spotfire.sfs`, - `vnd.sqlite3`, - `vnd.sss-cod`, - `vnd.sss-dtf`, - `vnd.sss-ntf`, - `vnd.stardivision.calc`, - `vnd.stardivision.draw`, - `vnd.stardivision.impress`, - `vnd.stardivision.math`, - `vnd.stardivision.writer`, - `vnd.stardivision.writer-global`, - `vnd.stepmania.package`, - `vnd.stepmania.stepchart`, - `vnd.street-stream`, - `vnd.sun.wadl+xml`, - `vnd.sun.xml.calc`, - `vnd.sun.xml.calc.template`, - `vnd.sun.xml.draw`, - `vnd.sun.xml.draw.template`, - `vnd.sun.xml.impress`, - `vnd.sun.xml.impress.template`, - `vnd.sun.xml.math`, - `vnd.sun.xml.writer`, - `vnd.sun.xml.writer.global`, - `vnd.sun.xml.writer.template`, - `vnd.sus-calendar`, - `vnd.svd`, - `vnd.swiftview-ics`, - `vnd.sycle+xml`, - `vnd.symbian.install`, - `vnd.syncml+xml`, - `vnd.syncml.dm+wbxml`, - `vnd.syncml.dm+xml`, - `vnd.syncml.dm.notification`, - `vnd.syncml.dmddf+wbxml`, - `vnd.syncml.dmddf+xml`, - `vnd.syncml.dmtnds+wbxml`, - `vnd.syncml.dmtnds+xml`, - `vnd.syncml.ds.notification`, - `vnd.tableschema+json`, - `vnd.tao.intent-module-archive`, - `vnd.tcpdump.pcap`, - `vnd.think-cell.ppttc+json`, - `vnd.tmd.mediaflex.api+xml`, - `vnd.tml`, - `vnd.tmobile-livetv`, - `vnd.tri.onesource`, - `vnd.trid.tpt`, - `vnd.triscape.mxs`, - `vnd.trueapp`, - `vnd.truedoc`, - `vnd.ubisoft.webplayer`, - `vnd.ufdl`, - `vnd.uiq.theme`, - `vnd.umajin`, - `vnd.unity`, - `vnd.uoml+xml`, - `vnd.uplanet.alert`, - `vnd.uplanet.alert-wbxml`, - `vnd.uplanet.bearer-choice`, - `vnd.uplanet.bearer-choice-wbxml`, - `vnd.uplanet.cacheop`, - `vnd.uplanet.cacheop-wbxml`, - `vnd.uplanet.channel`, - `vnd.uplanet.channel-wbxml`, - `vnd.uplanet.list`, - `vnd.uplanet.list-wbxml`, - `vnd.uplanet.listcmd`, - `vnd.uplanet.listcmd-wbxml`, - `vnd.uplanet.signal`, - `vnd.uri-map`, - `vnd.valve.source.material`, - `vnd.vcx`, - `vnd.vd-study`, - `vnd.vectorworks`, - `vnd.vel+json`, - `vnd.verimatrix.vcas`, - `vnd.veryant.thin`, - `vnd.ves.encrypted`, - `vnd.vidsoft.vidconference`, - `vnd.visio`, - `vnd.visionary`, - `vnd.vividence.scriptfile`, - `vnd.vsf`, - `vnd.wap.sic`, - `vnd.wap.slc`, - `vnd.wap.wbxml`, - `vnd.wap.wmlc`, - `vnd.wap.wmlscriptc`, - `vnd.webturbo`, - `vnd.wfa.dpp`, - `vnd.wfa.p2p`, - `vnd.wfa.wsc`, - `vnd.windows.devicepairing`, - `vnd.wmc`, - `vnd.wmf.bootstrap`, - `vnd.wolfram.mathematica`, - `vnd.wolfram.mathematica.package`, - `vnd.wolfram.player`, - `vnd.wordperfect`, - `vnd.wqd`, - `vnd.wrq-hp3000-labelled`, - `vnd.wt.stf`, - `vnd.wv.csp+wbxml`, - `vnd.wv.csp+xml`, - `vnd.wv.ssp+xml`, - `vnd.xacml+json`, - `vnd.xara`, - `vnd.xfdl`, - `vnd.xfdl.webform`, - `vnd.xmi+xml`, - `vnd.xmpie.cpkg`, - `vnd.xmpie.dpkg`, - `vnd.xmpie.plan`, - `vnd.xmpie.ppkg`, - `vnd.xmpie.xlim`, - `vnd.yamaha.hv-dic`, - `vnd.yamaha.hv-script`, - `vnd.yamaha.hv-voice`, - `vnd.yamaha.openscoreformat`, - `vnd.yamaha.openscoreformat.osfpvg+xml`, - `vnd.yamaha.remote-setup`, - `vnd.yamaha.smaf-audio`, - `vnd.yamaha.smaf-phrase`, - `vnd.yamaha.through-ngn`, - `vnd.yamaha.tunnel-udpencap`, - `vnd.yaoweme`, - `vnd.yellowriver-custom-menu`, - `vnd.youtube.yt`, - `vnd.zul`, - `vnd.zzazz.deck+xml`, - `voicexml+xml`, - `voucher-cms+json`, - `vq-rtcpxr`, - `wasm`, - `watcherinfo+xml`, - `webpush-options+json`, - `whoispp-query`, - `whoispp-response`, - `widget`, - `winhlp`, - `wita`, - `wordperfect5.1`, - `wsdl+xml`, - `wspolicy+xml`, - `x-7z-compressed`, - `x-abiword`, - `x-ace-compressed`, - `x-amf`, - `x-apple-diskimage`, - `x-arj`, - `x-authorware-bin`, - `x-authorware-map`, - `x-authorware-seg`, - `x-bcpio`, - `x-bdoc`, - `x-bittorrent`, - `x-blorb`, - `x-bzip`, - `x-bzip2`, - `x-cbr`, - `x-cdlink`, - `x-cfs-compressed`, - `x-chat`, - `x-chess-pgn`, - `x-chrome-extension`, - `x-cocoa`, - `x-compress`, - `x-conference`, - `x-cpio`, - ) - } - trait application_3 { - lazy val `x-csh`: MediaType = - new MediaType("application", "x-csh", Compressible, NotBinary, List("csh")) - lazy val `x-deb`: MediaType = new MediaType("application", "x-deb", Uncompressible, NotBinary) - lazy val `x-debian-package`: MediaType = - new MediaType("application", "x-debian-package", Compressible, Binary, List("deb", "udeb")) - lazy val `x-dgc-compressed`: MediaType = - new MediaType("application", "x-dgc-compressed", Compressible, NotBinary, List("dgc")) - lazy val `x-director`: MediaType = new MediaType( - "application", - "x-director", - Compressible, - NotBinary, - List("dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"), - ) - lazy val `x-doom`: MediaType = - new MediaType("application", "x-doom", Compressible, NotBinary, List("wad")) - lazy val `x-dtbncx+xml`: MediaType = - new MediaType("application", "x-dtbncx+xml", Compressible, NotBinary, List("ncx")) - lazy val `x-dtbook+xml`: MediaType = - new MediaType("application", "x-dtbook+xml", Compressible, NotBinary, List("dtb")) - lazy val `x-dtbresource+xml`: MediaType = - new MediaType("application", "x-dtbresource+xml", Compressible, NotBinary, List("res")) - lazy val `x-dvi`: MediaType = - new MediaType("application", "x-dvi", Uncompressible, Binary, List("dvi")) - lazy val `x-envoy`: MediaType = - new MediaType("application", "x-envoy", Compressible, NotBinary, List("evy")) - lazy val `x-eva`: MediaType = - new MediaType("application", "x-eva", Compressible, NotBinary, List("eva")) - lazy val `x-font-bdf`: MediaType = - new MediaType("application", "x-font-bdf", Compressible, NotBinary, List("bdf")) - lazy val `x-font-dos`: MediaType = - new MediaType("application", "x-font-dos", Compressible, NotBinary) - lazy val `x-font-framemaker`: MediaType = - new MediaType("application", "x-font-framemaker", Compressible, NotBinary) - lazy val `x-font-ghostscript`: MediaType = - new MediaType("application", "x-font-ghostscript", Compressible, NotBinary, List("gsf")) - lazy val `x-font-libgrx`: MediaType = - new MediaType("application", "x-font-libgrx", Compressible, NotBinary) - lazy val `x-font-linux-psf`: MediaType = - new MediaType("application", "x-font-linux-psf", Compressible, NotBinary, List("psf")) - lazy val `x-font-pcf`: MediaType = - new MediaType("application", "x-font-pcf", Compressible, NotBinary, List("pcf")) - lazy val `x-font-snf`: MediaType = - new MediaType("application", "x-font-snf", Compressible, NotBinary, List("snf")) - lazy val `x-font-speedo`: MediaType = - new MediaType("application", "x-font-speedo", Compressible, NotBinary) - lazy val `x-font-sunos-news`: MediaType = - new MediaType("application", "x-font-sunos-news", Compressible, NotBinary) - lazy val `x-font-type1`: MediaType = new MediaType( - "application", - "x-font-type1", - Compressible, - NotBinary, - List("pfa", "pfb", "pfm", "afm"), - ) - lazy val `x-font-vfont`: MediaType = - new MediaType("application", "x-font-vfont", Compressible, NotBinary) - lazy val `x-freearc`: MediaType = - new MediaType("application", "x-freearc", Compressible, NotBinary, List("arc")) - lazy val `x-futuresplash`: MediaType = - new MediaType("application", "x-futuresplash", Compressible, NotBinary, List("spl")) - lazy val `x-gca-compressed`: MediaType = - new MediaType("application", "x-gca-compressed", Compressible, NotBinary, List("gca")) - lazy val `x-glulx`: MediaType = - new MediaType("application", "x-glulx", Compressible, NotBinary, List("ulx")) - lazy val `x-gnumeric`: MediaType = - new MediaType("application", "x-gnumeric", Compressible, NotBinary, List("gnumeric")) - lazy val `x-gramps-xml`: MediaType = - new MediaType("application", "x-gramps-xml", Compressible, NotBinary, List("gramps")) - lazy val `x-gtar`: MediaType = - new MediaType("application", "x-gtar", Compressible, Binary, List("gtar")) - lazy val `x-gzip`: MediaType = new MediaType("application", "x-gzip", Compressible, Binary) - lazy val `x-hdf`: MediaType = - new MediaType("application", "x-hdf", Compressible, NotBinary, List("hdf")) - lazy val `x-httpd-php`: MediaType = - new MediaType("application", "x-httpd-php", Compressible, NotBinary, List("php")) - lazy val `x-install-instructions`: MediaType = new MediaType( - "application", - "x-install-instructions", - Compressible, - NotBinary, - List("install"), - ) - lazy val `x-iso9660-image`: MediaType = - new MediaType("application", "x-iso9660-image", Compressible, NotBinary, List("iso")) - lazy val `x-java-archive-diff`: MediaType = new MediaType( - "application", - "x-java-archive-diff", - Compressible, - NotBinary, - List("jardiff"), - ) - lazy val `x-java-jnlp-file`: MediaType = - new MediaType("application", "x-java-jnlp-file", Uncompressible, NotBinary, List("jnlp")) - lazy val `x-javascript`: MediaType = - new MediaType("application", "x-javascript", Compressible, NotBinary) - lazy val `x-keepass2`: MediaType = - new MediaType("application", "x-keepass2", Compressible, NotBinary, List("kdbx")) - lazy val `x-latex`: MediaType = - new MediaType("application", "x-latex", Uncompressible, Binary, List("latex")) - lazy val `x-lua-bytecode`: MediaType = - new MediaType("application", "x-lua-bytecode", Compressible, NotBinary, List("luac")) - lazy val `x-lzh-compressed`: MediaType = new MediaType( - "application", - "x-lzh-compressed", - Compressible, - NotBinary, - List("lzh", "lha"), - ) - lazy val `x-makeself`: MediaType = - new MediaType("application", "x-makeself", Compressible, NotBinary, List("run")) - lazy val `x-mie`: MediaType = - new MediaType("application", "x-mie", Compressible, NotBinary, List("mie")) - lazy val `x-mobipocket-ebook`: MediaType = new MediaType( - "application", - "x-mobipocket-ebook", - Compressible, - NotBinary, - List("prc", "mobi"), - ) - lazy val `x-mpegurl`: MediaType = - new MediaType("application", "x-mpegurl", Uncompressible, NotBinary) - lazy val `x-ms-application`: MediaType = new MediaType( - "application", - "x-ms-application", - Compressible, - NotBinary, - List("application"), - ) - lazy val `x-ms-shortcut`: MediaType = - new MediaType("application", "x-ms-shortcut", Compressible, NotBinary, List("lnk")) - lazy val `x-ms-wmd`: MediaType = - new MediaType("application", "x-ms-wmd", Compressible, NotBinary, List("wmd")) - lazy val `x-ms-wmz`: MediaType = - new MediaType("application", "x-ms-wmz", Compressible, NotBinary, List("wmz")) - lazy val `x-ms-xbap`: MediaType = - new MediaType("application", "x-ms-xbap", Compressible, NotBinary, List("xbap")) - lazy val `x-msaccess`: MediaType = - new MediaType("application", "x-msaccess", Compressible, NotBinary, List("mdb")) - lazy val `x-msbinder`: MediaType = - new MediaType("application", "x-msbinder", Compressible, NotBinary, List("obd")) - lazy val `x-mscardfile`: MediaType = - new MediaType("application", "x-mscardfile", Compressible, NotBinary, List("crd")) - lazy val `x-msclip`: MediaType = - new MediaType("application", "x-msclip", Compressible, NotBinary, List("clp")) - lazy val `x-msdos-program`: MediaType = - new MediaType("application", "x-msdos-program", Compressible, NotBinary, List("exe")) - lazy val `x-msdownload`: MediaType = new MediaType( - "application", - "x-msdownload", - Compressible, - NotBinary, - List("exe", "dll", "com", "bat", "msi"), - ) - lazy val `x-msmediaview`: MediaType = new MediaType( - "application", - "x-msmediaview", - Compressible, - NotBinary, - List("mvb", "m13", "m14"), - ) - lazy val `x-msmetafile`: MediaType = new MediaType( - "application", - "x-msmetafile", - Compressible, - NotBinary, - List("wmf", "wmz", "emf", "emz"), - ) - lazy val `x-msmoney`: MediaType = - new MediaType("application", "x-msmoney", Compressible, NotBinary, List("mny")) - lazy val `x-mspublisher`: MediaType = - new MediaType("application", "x-mspublisher", Compressible, NotBinary, List("pub")) - lazy val `x-msschedule`: MediaType = - new MediaType("application", "x-msschedule", Compressible, NotBinary, List("scd")) - lazy val `x-msterminal`: MediaType = - new MediaType("application", "x-msterminal", Compressible, NotBinary, List("trm")) - lazy val `x-mswrite`: MediaType = - new MediaType("application", "x-mswrite", Compressible, NotBinary, List("wri")) - lazy val `x-netcdf`: MediaType = - new MediaType("application", "x-netcdf", Compressible, NotBinary, List("nc", "cdf")) - lazy val `x-ns-proxy-autoconfig`: MediaType = - new MediaType("application", "x-ns-proxy-autoconfig", Compressible, NotBinary, List("pac")) - lazy val `x-nzb`: MediaType = - new MediaType("application", "x-nzb", Compressible, NotBinary, List("nzb")) - lazy val `x-perl`: MediaType = - new MediaType("application", "x-perl", Compressible, NotBinary, List("pl", "pm")) - lazy val `x-pilot`: MediaType = - new MediaType("application", "x-pilot", Compressible, NotBinary, List("prc", "pdb")) - lazy val `x-pkcs12`: MediaType = - new MediaType("application", "x-pkcs12", Uncompressible, NotBinary, List("p12", "pfx")) - lazy val `x-pkcs7-certificates`: MediaType = new MediaType( - "application", - "x-pkcs7-certificates", - Compressible, - NotBinary, - List("p7b", "spc"), - ) - lazy val `x-pkcs7-certreqresp`: MediaType = - new MediaType("application", "x-pkcs7-certreqresp", Compressible, NotBinary, List("p7r")) - lazy val `x-pki-message`: MediaType = - new MediaType("application", "x-pki-message", Compressible, NotBinary) - lazy val `x-rar-compressed`: MediaType = - new MediaType("application", "x-rar-compressed", Uncompressible, Binary, List("rar")) - lazy val `x-redhat-package-manager`: MediaType = - new MediaType("application", "x-redhat-package-manager", Compressible, Binary, List("rpm")) - lazy val `x-research-info-systems`: MediaType = new MediaType( - "application", - "x-research-info-systems", - Compressible, - NotBinary, - List("ris"), - ) - lazy val `x-sea`: MediaType = - new MediaType("application", "x-sea", Compressible, NotBinary, List("sea")) - lazy val `x-sh`: MediaType = - new MediaType("application", "x-sh", Compressible, NotBinary, List("sh")) - lazy val `x-shar`: MediaType = - new MediaType("application", "x-shar", Compressible, NotBinary, List("shar")) - lazy val `x-shockwave-flash`: MediaType = - new MediaType("application", "x-shockwave-flash", Uncompressible, Binary, List("swf")) - lazy val `x-silverlight-app`: MediaType = - new MediaType("application", "x-silverlight-app", Compressible, NotBinary, List("xap")) - lazy val `x-sql`: MediaType = - new MediaType("application", "x-sql", Compressible, NotBinary, List("sql")) - lazy val `x-stuffit`: MediaType = - new MediaType("application", "x-stuffit", Uncompressible, NotBinary, List("sit")) - lazy val `x-stuffitx`: MediaType = - new MediaType("application", "x-stuffitx", Compressible, NotBinary, List("sitx")) - lazy val `x-subrip`: MediaType = - new MediaType("application", "x-subrip", Compressible, NotBinary, List("srt")) - lazy val `x-sv4cpio`: MediaType = - new MediaType("application", "x-sv4cpio", Compressible, NotBinary, List("sv4cpio")) - lazy val `x-sv4crc`: MediaType = - new MediaType("application", "x-sv4crc", Compressible, NotBinary, List("sv4crc")) - lazy val `x-t3vm-image`: MediaType = - new MediaType("application", "x-t3vm-image", Compressible, NotBinary, List("t3")) - lazy val `x-tads`: MediaType = - new MediaType("application", "x-tads", Compressible, NotBinary, List("gam")) - lazy val `x-tar`: MediaType = - new MediaType("application", "x-tar", Compressible, Binary, List("tar")) - lazy val `x-tcl`: MediaType = - new MediaType("application", "x-tcl", Compressible, NotBinary, List("tcl", "tk")) - lazy val `x-tex`: MediaType = - new MediaType("application", "x-tex", Compressible, Binary, List("tex")) - lazy val `x-tex-tfm`: MediaType = - new MediaType("application", "x-tex-tfm", Compressible, NotBinary, List("tfm")) - lazy val `x-texinfo`: MediaType = - new MediaType("application", "x-texinfo", Compressible, Binary, List("texinfo", "texi")) - lazy val `x-tgif`: MediaType = - new MediaType("application", "x-tgif", Compressible, NotBinary, List("obj")) - lazy val `x-ustar`: MediaType = - new MediaType("application", "x-ustar", Compressible, NotBinary, List("ustar")) - lazy val `x-virtualbox-hdd`: MediaType = - new MediaType("application", "x-virtualbox-hdd", Compressible, NotBinary, List("hdd")) - lazy val `x-virtualbox-ova`: MediaType = - new MediaType("application", "x-virtualbox-ova", Compressible, NotBinary, List("ova")) - lazy val `x-virtualbox-ovf`: MediaType = - new MediaType("application", "x-virtualbox-ovf", Compressible, NotBinary, List("ovf")) - lazy val `x-virtualbox-vbox`: MediaType = - new MediaType("application", "x-virtualbox-vbox", Compressible, NotBinary, List("vbox")) - lazy val `x-virtualbox-vbox-extpack`: MediaType = new MediaType( - "application", - "x-virtualbox-vbox-extpack", - Uncompressible, - NotBinary, - List("vbox-extpack"), - ) - lazy val `x-virtualbox-vdi`: MediaType = - new MediaType("application", "x-virtualbox-vdi", Compressible, NotBinary, List("vdi")) - lazy val `x-virtualbox-vhd`: MediaType = - new MediaType("application", "x-virtualbox-vhd", Compressible, NotBinary, List("vhd")) - lazy val `x-virtualbox-vmdk`: MediaType = - new MediaType("application", "x-virtualbox-vmdk", Compressible, NotBinary, List("vmdk")) - lazy val `x-wais-source`: MediaType = - new MediaType("application", "x-wais-source", Compressible, NotBinary, List("src")) - lazy val `x-web-app-manifest+json`: MediaType = new MediaType( - "application", - "x-web-app-manifest+json", - Compressible, - NotBinary, - List("webapp"), - ) - lazy val `x-www-form-urlencoded`: MediaType = - new MediaType("application", "x-www-form-urlencoded", Compressible, NotBinary) - lazy val `x-x509-ca-cert`: MediaType = new MediaType( - "application", - "x-x509-ca-cert", - Compressible, - Binary, - List("der", "crt", "pem"), - ) - lazy val `x-x509-ca-ra-cert`: MediaType = - new MediaType("application", "x-x509-ca-ra-cert", Compressible, NotBinary) - lazy val `x-x509-next-ca-cert`: MediaType = - new MediaType("application", "x-x509-next-ca-cert", Compressible, NotBinary) - lazy val `x-xfig`: MediaType = - new MediaType("application", "x-xfig", Compressible, NotBinary, List("fig")) - lazy val `x-xliff+xml`: MediaType = - new MediaType("application", "x-xliff+xml", Compressible, NotBinary, List("xlf")) - lazy val `x-xpinstall`: MediaType = - new MediaType("application", "x-xpinstall", Uncompressible, Binary, List("xpi")) - lazy val `x-xz`: MediaType = - new MediaType("application", "x-xz", Compressible, NotBinary, List("xz")) - lazy val `x-zmachine`: MediaType = new MediaType( - "application", - "x-zmachine", - Compressible, - NotBinary, - List("z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"), - ) - lazy val `x400-bp`: MediaType = - new MediaType("application", "x400-bp", Compressible, NotBinary) - lazy val `xacml+xml`: MediaType = - new MediaType("application", "xacml+xml", Compressible, NotBinary) - lazy val `xaml+xml`: MediaType = - new MediaType("application", "xaml+xml", Compressible, NotBinary, List("xaml")) - lazy val `xcap-att+xml`: MediaType = - new MediaType("application", "xcap-att+xml", Compressible, NotBinary, List("xav")) - lazy val `xcap-caps+xml`: MediaType = - new MediaType("application", "xcap-caps+xml", Compressible, NotBinary, List("xca")) - lazy val `xcap-diff+xml`: MediaType = - new MediaType("application", "xcap-diff+xml", Compressible, NotBinary, List("xdf")) - lazy val `xcap-el+xml`: MediaType = - new MediaType("application", "xcap-el+xml", Compressible, NotBinary, List("xel")) - lazy val `xcap-error+xml`: MediaType = - new MediaType("application", "xcap-error+xml", Compressible, NotBinary) - lazy val `xcap-ns+xml`: MediaType = - new MediaType("application", "xcap-ns+xml", Compressible, NotBinary, List("xns")) - lazy val `xcon-conference-info+xml`: MediaType = - new MediaType("application", "xcon-conference-info+xml", Compressible, NotBinary) - lazy val `xcon-conference-info-diff+xml`: MediaType = - new MediaType("application", "xcon-conference-info-diff+xml", Compressible, NotBinary) - lazy val `xenc+xml`: MediaType = - new MediaType("application", "xenc+xml", Compressible, NotBinary, List("xenc")) - lazy val `xhtml+xml`: MediaType = - new MediaType("application", "xhtml+xml", Compressible, NotBinary, List("xhtml", "xht")) - lazy val `xhtml-voice+xml`: MediaType = - new MediaType("application", "xhtml-voice+xml", Compressible, NotBinary) - lazy val `xliff+xml`: MediaType = - new MediaType("application", "xliff+xml", Compressible, NotBinary, List("xlf")) - lazy val `xml`: MediaType = new MediaType( - "application", - "xml", - Compressible, - NotBinary, - List("xml", "xsl", "xsd", "rng"), + + lazy val `vnd.radisys.msml-dialog-speech+xml`: MediaType = + new MediaType("application", "vnd.radisys.msml-dialog-speech+xml", compressible = true, binary = true) + + lazy val `vnd.3gpp.srvcc-info+xml`: MediaType = + new MediaType("application", "vnd.3gpp.srvcc-info+xml", compressible = true, binary = true) + + lazy val `vnd.japannet-jpnstore-wakeup`: MediaType = + new MediaType("application", "vnd.japannet-jpnstore-wakeup", compressible = false, binary = true) + + lazy val `alto-costmapfilter+json`: MediaType = + new MediaType("application", "alto-costmapfilter+json", compressible = true, binary = false) + + lazy val `vnd.ims.imsccv1p1`: MediaType = + new MediaType("application", "vnd.ims.imsccv1p1", compressible = false, binary = true) + + lazy val `vnd.ms-windows.wsd.oob`: MediaType = + new MediaType("application", "vnd.ms-windows.wsd.oob", compressible = false, binary = true) + + lazy val `swid+xml`: MediaType = + new MediaType("application", "swid+xml", compressible = true, binary = true, List("swidtag")) + + lazy val `rpki-checklist`: MediaType = + new MediaType("application", "rpki-checklist", compressible = false, binary = true) + + lazy val `vnd.dtg.local.html`: MediaType = + new MediaType("application", "vnd.dtg.local.html", compressible = false, binary = true) + + lazy val `yin+xml`: MediaType = + new MediaType("application", "yin+xml", compressible = true, binary = true, List("yin")) + + lazy val all: List[MediaType] = List( + `x-bdoc`, + `vnd.3gpp.mcptt-location-info+xml`, + `vnd.ctct.ws+xml`, + `vnd.trueapp`, + `vnd.geogebra.tool`, + `vnd.ms-works`, + `vnd.hc+json`, + `vnd.ims.lti.v2.toolconsumerprofile+json`, + `vnd.3gpp.pfcp`, + `wordperfect5.1`, + `ace+cbor`, + `vnd.kodak-descriptor`, + `tetra_isi`, + `vnd.collabio.xodocuments.presentation-template`, + `vnd.oasis.opendocument.text`, + `vnd.fujitsu.oasys2`, + `commonground`, + `vnd.evolv.ecig.profile`, + `vnd.gov.sk.xmldatacontainer+xml`, + `simple-filter+xml`, + `vnd.chess-pgn`, + `vnd.oma.lwm2m+tlv`, + `vnd.gov.sk.e-form+xml`, + `jwk-set+json`, + `index.response`, + `vnd.novadigm.edx`, + `mathml-presentation+xml`, + `urc-targetdesc+xml`, + `vnd.nokia.conml+xml`, + `vnd.anser-web-funds-transfer-initiation`, + `vnd.dvb.service`, + `x-compress`, + `vnd.ms-wmdrm.meter-resp`, + `vnd.etsi.pstn+xml`, + `route-usd+xml`, + `x-msmoney`, + `vnd.tcpdump.pcap`, + `vnd.smintio.portals.archive`, + `vnd.medcalcdata`, + `cbor-seq`, + `vnd.3gpp.mcdata-msgstore-ctrl-request+xml`, + `vnd.oma.poc.groups+xml`, + `yang-patch+json`, + `vnd.3gpp2.sms`, + `passport`, + `atomdeleted+xml`, + `x-blorb`, + `marcxml+xml`, + `ocsp-request`, + `vnd.cirpack.isdn-ext`, + `vnd.truedoc`, + `tzif`, + `vnd.openxmlformats-officedocument.vmldrawing`, + `yang-data+cbor`, + `vnd.ecowin.series`, + `vnd.groove-identity-message`, + `vnd.s3sms`, + `vnd.nacamar.ybrid+json`, + `x-ms-xbap`, + `vnd.ipld.dag-cbor`, + `macwriteii`, + `vnd.ezpix-album`, + `vnd.openeye.oeb`, + `vnd.cryptomator.vault`, + `3gpp-ims+xml`, + `vnd.sybyl.mol2`, + `vnd.informix-visionary`, + `pkcs8-encrypted`, + `vnd.radisys.msml-dialog-base+xml`, + `vnd.wmc`, + `vnd.mfmp`, + `xcap-att+xml`, + `spirits-event+xml`, + `oauth-authz-req+jwt`, + `alto-propmapparams+json`, + `pskc+xml`, + `vnd.data-vision.rdz`, + `vnd.visio`, + `vnd.oma.bcast.stkm`, + `vnd.mfer`, + `vnd.ntt-local.ogw_remote-access`, + `logout+jwt`, + `cwt`, + `load-control+xml`, + `vnd.gentoo.manifest`, + `vnd.smaf`, + `vnd.otps.ct-kip+xml`, + `vnd.nokia.pcd+xml`, + `vnd.scribus`, + `vnd.ntt-local.sip-ta_tcp_stream`, + `geo+json`, + `ocsp-response`, + `vnd.apple.pages`, + `vnd.micrografx.igx`, + `cbor`, + `3gpphal+json`, + `vnd.kde.kpresenter`, + `json`, + `vnd.iptc.g2.conceptitem+xml`, + `vnd.cups-raster`, + `vnd.amazon.ebook`, + `vnd.musician`, + `vnd.oftn.l10n+json`, + `sdp`, + `vnd.kde.kformula`, + `x-nzb`, + `vnd.uplanet.cacheop`, + `vnd.ruckus.download`, + `vnd.oasis.opendocument.base`, + `x-java-jnlp-file`, + `pkcs12`, + `resource-lists+xml`, + `odm+xml`, + `vnd.jsk.isdn-ngn`, + `iotp`, + `pkix-crl`, + `vnd.geogebra.file`, + `ace+json`, + `x-gca-compressed`, + `sparql-results+xml`, + `xspf+xml`, + `vnd.crypto-shade-file`, + `vnd.is-xpr`, + `beep+xml`, + `vnd.filmit.zfc`, + `vnd.oma.bcast.simple-symbol-container`, + `framework-attributes+xml`, + `vnd.collabio.xodocuments.spreadsheet-template`, + `vnd.groove-account`, + `clue_info+xml`, + `vnd.software602.filler.form+xml`, + `x-font-sunos-news`, + `vnd.fujixerox.docuworks.container`, + `pls+xml`, + `dicom+json`, + `vnd.oasis.opendocument.text-template`, + `vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml`, + `vnd.epson.salt`, + `vnd.onepagertatx`, + `vnd.nokia.radio-presets`, + `x-keepass2`, + `sieve`, + `vnd.geometry-explorer`, + `vnd.yamaha.openscoreformat`, + `msc-mixer+xml`, + `vnd.ciedi`, + `vnd.jcp.javame.midlet-rms`, + `vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml`, + `edi-consent`, + `x-virtualbox-hdd`, + `vnd.aether.imp`, + `json5`, + `vnd.oma.cab-subs-invite+xml`, + `flexfec`, + `vnd.3gpp.mcptt-user-profile+xml`, + `cybercash`, + `vnd.oasis.opendocument.presentation`, + `atomcat+xml`, + `dash+xml`, + `vnd.uri-map`, + `vnd.radisys.msml-dialog-group+xml`, + `xcap-diff+xml`, + `tamp-apex-update-confirm`, + `vnd.ms-ims`, + `x-virtualbox-vbox-extpack`, + `concise-problem-details+cbor`, + `alto-networkmapfilter+json`, + `vnd.noblenet-web`, + `vnd.tableschema+json`, + `elm+xml`, + `x-dvi`, + `vnd.nokia.iptv.config+xml`, + `whoispp-response`, + `vnd.afpc.foca-codedfont`, + `x-msmediaview`, + `emergencycalldata.serviceinfo+xml`, + `vnd.sbm.cid`, + `vnd.yamaha.smaf-audio`, + `vnd.3gpp.mcptt-info+xml`, + `vnd.oipf.userprofile+xml`, + `vnd.eln+zip`, + `cose`, + `prs.rdf-xml-crypt`, + `vnd.oasis.opendocument.image-template`, + `vnd.innopath.wamp.notification`, + `vnd.evolv.ecig.theme`, + `vnd.onepagertat`, + `vnd.wolfram.mathematica`, + `vnd.pwg-xhtml-print+xml`, + `vnd.gnu.taler.merchant+json`, + `voicexml+xml`, + `vnd.geospace`, + `vnd.vd-study`, + `vnd.3gpp.mcvideo-info+xml`, + `sbe`, + `x-chrome-extension`, + `vnd.omads-email+xml`, + `x-ms-wmz`, + `vnd.apache.arrow.stream`, + `vnd.kde.kchart`, + `vnd.crick.clicker.keyboard`, + `vnd.loom`, + `vnd.sqlite3`, + `vnd.dolby.mlp`, + `vnd.openxmlformats-officedocument.spreadsheetml.sheet`, + `vnd.stardivision.impress`, + `vnd.mozilla.xul+xml`, + `x-zmachine`, + `vnd.3gpp.mc-signalling-ear`, + `vnd.dvb.notif-aggregate-root+xml`, + `vnd.noblenet-directory`, + `automationml-aml+xml`, + `vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml`, + `x-httpd-php`, + `vnd.pwg-multiplexed`, + `vnd.pawaafile`, + `activemessage`, + `vnd.balsamiq.bmml+xml`, + `emergencycalldata.deviceinfo+xml`, + `vnd.android.ota`, + `vnd.motorola.flexsuite.kmr`, + `csvm+json`, + `vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml`, + `x-texinfo`, + `vnd.fujitsu.oasysgp`, + `vividence.scriptfile`, + `vnd.crick.clicker`, + `vnd.rainstor.data`, + `shf+xml`, + `vnd.etsi.cug+xml`, + `senml-etch+json`, + `cccex`, + `vnd.d2l.coursepackage1p0+zip`, + `vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml`, + `vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml`, + `prs.plucker`, + `vnd.dxr`, + `vnd.ecowin.chart`, + `vnd.etsi.aoc+xml`, + `atsc-rsat+xml`, + `vnd.cinderella`, + `vnd.renlearn.rlprint`, + `dart`, + `json-patch+json`, + `scim+json`, + `pgp-keys`, + `vnd.3gpp.mcptt-signed+xml`, + `x-tex`, + `x-shar`, + `lgr+xml`, + `x-dgc-compressed`, + `vnd.intertrust.nncp`, + `vnd.ms-xpsdocument`, + `1d-interleaved-parityfec`, + `vnd.artisan+json`, + `vnd.etsi.iptvservice+xml`, + `vnd.sun.xml.impress`, + `vnd.fujixerox.art4`, + `atsc-held+xml`, + `tamp-update-confirm`, + `vnd.sigrok.session`, + `vnd.dvb.notif-container+xml`, + `nss`, + `vnd.denovo.fcselayout-link`, + `vnd.etsi.asic-s+zip`, + `senml+json`, + `vnd.nokia.pcd+wbxml`, + `city+json`, + `vnd.openxmlformats-officedocument.theme+xml`, + `dit`, + `p21`, + `cals-1840`, + `yang-data+json`, + `vnd.nokia.n-gage.symbian.install`, + `encaprtp`, + `vnd.ms-windows.devicepairing`, + `vnd.japannet-payment-wakeup`, + `problem+xml`, + `vnd.cluetrust.cartomobile-config-pkg`, + `sensml+xml`, + `parityfec`, + `vnd.desmume.movie`, + `vnd.osgi.subsystem`, + `vnd.ubisoft.webplayer`, + `vnd.3gpp.mcdata-user-profile+xml`, + `jrd+json`, + `vnd.onepagertamp`, + `vnd.fujitsu.oasysprs`, + `vnd.antix.game-component`, + `gzip`, + `vnd.3gpp.gtpc`, + `vnd.capasystems-pg+json`, + `vnd.apexlang`, + `x-xpinstall`, + `vnd.uplanet.listcmd-wbxml`, + `vnd.muvee.style`, + `vnd.immervision-ivp`, + `x-font-ghostscript`, + `x-debian-package`, + `vnd.sun.xml.draw.template`, + `vnd.3gpp.mcdata-payload`, + `moss-signature`, + `vnd.sailingtracker.track`, + `vnd.openxmlformats-officedocument.presentationml.notesmaster+xml`, + `raml+yaml`, + `vnd.fujixerox.hbpl`, + `vnd.gnu.taler.exchange+json`, + `vnd.oipf.dae.xhtml+xml`, + `x-envoy`, + `vnd.fastcopy-disk-image`, + `vnd.webturbo`, + `linkset+json`, + `vnd.omads-file+xml`, + `vnd.openxmlformats-officedocument.presentationml.slideshow`, + `jwk+json`, + `vnd.multiad.creator.cif`, + `vq-rtcpxr`, + `3gpdash-qoe-report+xml`, + `soap+fastinfoset`, + `vnd.tao.intent-module-archive`, + `x-msaccess`, + `vnd.xmpie.xlim`, + `vnd.quobject-quoxdocument`, + `tnauthlist`, + `vnd.openxmlformats-officedocument.wordprocessingml.footer+xml`, + `vnd.firemonkeys.cloudcell`, + `vnd.nokia.isds-radio-presets`, + `vnd.gmx`, + `vnd.d3m-problem`, + `vnd.vsf`, + `sql`, + `vnd.mason+json`, + `x-tgif`, + `x-www-form-urlencoded`, + `epub+zip`, + `vnd.onvif.metadata`, + `odx`, + `vnd.openxmlformats-officedocument.presentationml.slide`, + `vnd.dvb.ipdcesgaccess2`, + `x-font-framemaker`, + `vnd.ms-word.template.macroenabled.12`, + `vnd.openxmlformats-officedocument.presentationml.slide+xml`, + `zip`, + `vnd.dvb.ait`, + `vnd.afpc.modca-objectcontainer`, + `vnd.sun.xml.writer.global`, + `vnd.tmd.mediaflex.api+xml`, + `watcherinfo+xml`, + `dash-patch+xml`, + `x-gnumeric`, + `mods+xml`, + `spdx+json`, + `vnd.amadeus+json`, + `andrew-inset`, + `vnd.cncf.helm.chart.content.v1.tar+gzip`, + `vnd.shade-save-file`, + `vnd.motorola.flexsuite.wem`, + `x-tcl`, + `vnd.fdf`, + `tamp-community-update-confirm`, + `vnd.ms-fontobject`, + `ccxml+xml`, + `vnd.shx`, + `vnd.afpc.foca-charset`, + `mp4`, + `mxf`, + `vnd.oma.bcast.ltkm`, + `vnd.ms-office.activex+xml`, + `vnd.multiad.creator`, + `edi-x12`, + `vnd.ms-lrm`, + `vnd.trid.tpt`, + `vnd.ms-pki.stl`, + `rtploopback`, + `set-registration-initiation`, + `call-completion`, + `vnd.lotus-1-2-3`, + `x-mpegurl`, + `mbms-reception-report+xml`, + `vnd.olpc-sugar`, + `sipc`, + `vnd.eu.kasparian.car+json`, + `x-glulx`, + `geo+json-seq`, + `vnd.ahead.space`, + `vnd.xmpie.cpkg`, + `cdmi-capability`, + `trickle-ice-sdpfrag`, + `vnd.mobius.dis`, + `vnd.cncf.helm.chart.provenance.v1.prov`, + `vnd.avalon+json`, + `vnd.lotus-screencam`, + `x-perl`, + `vnd.datapackage+json`, + `vnd.openxmlformats-officedocument.wordprocessingml.template`, + `vnd.ms-opentype`, + `vnd.openxmlformats-officedocument.presentationml.template`, + `vnd.collabio.xodocuments.spreadsheet`, + `vnd.cryptomator.encrypted`, + `vnd.afpc.modca`, + `onenote`, + `cdmi-domain`, + `vnd.hal+xml`, + `vnd.canon-cpdl`, + `vnd.mcd`, + `vnd.ibm.electronic-media`, + `fhir+xml`, + `tamp-error`, + `vnd.dvb.notif-generic+xml`, + `vnd.3gpp.ussd+xml`, + `vnd.semf`, + `vnd.dvb.ipdcdftnotifaccess`, + `vnd.marlin.drm.license+xml`, + `ogg`, + `geopackage+sqlite3`, + `dashdelta`, + `vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml`, + `vnd.ufdl`, + `senml-exi`, + `vnd.powerbuilder7-s`, + `index`, + `mbms-deregister+xml`, + `vnd.easykaraoke.cdgdownload`, + `vnd.cups-ppd`, + `vnd.oma.bcast.sgdu`, + `x-chess-pgn`, + `vnd.ms-playready.initiator+xml`, + `cose-x509`, + `vnd.dir-bi.plate-dl-nosuffix`, + `vnd.crick.clicker.template`, + `vnd.uiq.theme`, + `json-seq`, + `vnd.lotus-wordpro`, + `vnd.adobe.partial-upload`, + `sep+xml`, + `vnd.claymore`, + `tar`, + `rpki-roa`, + `clr`, + `vnd.oasis.opendocument.formula-template`, + `vnd.oma.dd2+xml`, + `vnd.sealed.doc`, + `vnd.wrq-hp3000-labelled`, + `vnd.arastra.swi`, + `vnd.flographit`, + `winhlp`, + `vnd.dbf`, + `x-latex`, + `td+json`, + `vnd.3gpp-prose-pc3ch+xml`, + `cda+xml`, + `vnd.gridmp`, + `vnd.dataresource+json`, + `vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml`, + `news-checkgroups`, + `vnd.solent.sdkm+xml`, + `atfx`, + `vnd.globalplatform.card-content-mgt`, + `vnd.acucobol`, + `vnd.adobe.fxp`, + `vnd.ms-wpl`, + `x-bzip`, + `vnd.leap+json`, + `vnd.dynageo`, + `sensml+json`, + `vnd.collection.next+json`, + `coap-payload`, + `vnd.sss-dtf`, + `postscript`, + `timestamp-reply`, + `vnd.etsi.mheg5`, + `vnd.fuzzysheet`, + `vnd.oipf.spdlist+xml`, + `x-cocoa`, + `vnd.3gpp.gmop+xml`, + `vnd.exstream-empower+zip`, + `vnd.omads-folder+xml`, + `vnd.google-apps.presentation`, + `vnd.syncml.dm.notification`, + `x-stuffit`, + `vnd.motorola.flexsuite.adsi`, + `xcon-conference-info-diff+xml`, + `docbook+xml`, + `vnd.eudora.data`, + `vnd.ntt-local.content-share`, + `vnd.etsi.iptvprofile+xml`, + `vnd.mediastation.cdkey`, + `sgml-open-catalog`, + `x-lzh-compressed`, + `vnd.sealed.eml`, + `aml`, + `vnd.oma.bcast.sgboot`, + `scvp-cv-response`, + `vnd.cyclonedx+json`, + `vnd.ms-wmdrm.meter-chlg-req`, + `vnd.fujifilm.fb.jfi+xml`, + `xproc+xml`, + `vnd.rn-realmedia`, + `ulpfec`, + `vnd.genozip`, + `vnd.opentimestamps.ots`, + `vnd.oasis.opendocument.text-web`, + `dcd`, + `vnd.oipf.ueprofile+xml`, + `vnd.ms-word.document.macroenabled.12`, + `vnd.vidsoft.vidconference`, + `vnd.etsi.iptvdiscovery+xml`, + `vnd.oma.poc.invocation-descriptor+xml`, + `x-arj`, + `slate`, + `vnd.oasis.opendocument.graphics`, + `vnd.patientecommsdoc`, + `x-director`, + `gpx+xml`, + `vnd.rig.cryptonote`, + `vnd.syncml.dmddf+wbxml`, + `x-javascript`, + `x-pkcs7-certreqresp`, + `patch-ops-error+xml`, + `vnd.fujifilm.fb.docuworks`, + `vnd.etsi.iptvsad-bc+xml`, + `vnd.criticaltools.wbs+xml`, + `pidf-diff+xml`, + `vnd.familysearch.gedcom+zip`, + `x-xz`, + `cose-key`, + `jscalendar+json`, + `dicom+xml`, + `vnd.kde.kword`, + `vnd.syncml.dmddf+xml`, + `vnd.oma.xcap-directory+xml`, + `vnd.nokia.catalogs`, + `reputon+json`, + `vnd.acucorp`, + `vnd.jam`, + `vnd.openxmlformats-officedocument.spreadsheetml.styles+xml`, + `pvd+json`, + `vnd.uplanet.list`, + `vnd.verimatrix.vcas`, + `vnd.bint.med-content`, + `ld+json`, + `x-virtualbox-ova`, + `tei+xml`, + `rpki-ghostbusters`, + `vnd.oipf.contentaccessstreaming+xml`, + `atf`, + `smil`, + `vnd.afpc.foca-codepage`, + `vnd.ficlab.flb+zip`, + `vnd.afpc.afplinedata`, + `opc-nodeset+xml`, + `vnd.ibm.rights-management`, + `x-silverlight-app`, + `x-font-libgrx`, + `alto-directory+json`, + `zlib`, + `vnd.japannet-verification`, + `vnd.patentdive`, + `vnd.openxmlformats-officedocument.drawing+xml`, + `vnd.commerce-battelle`, + `vnd.wap.wmlscriptc`, + `atxml`, + `secevent+jwt`, + `multipart-core`, + `cms`, + `vnd.panoply`, + `srgs+xml`, + `x-csh`, + `vnd.oma.bcast.associated-procedure-parameter+xml`, + `vnd.radisys.msml-dialog+xml`, + `vnd.dvb.notif-init+xml`, + `vnd.ecowin.seriesrequest`, + `vnd.oma.bcast.sgdd+xml`, + `vnd.3gpp.pic-bw-var`, + `iges`, + `msixbundle`, + `vnd.noblenet-sealer`, + `dec-dx`, + `manifest+json`, + `vnd.apple.mpegurl`, + `vnd.adobe.formscentral.fcdt`, + `vnd.gentoo.gpkg`, + `mosskey-request`, + `yang-data+xml`, + `x-abiword`, + `mbox`, + `vnd.apache.thrift.binary`, + `x-makeself`, + `vnd.debian.binary-package`, + `vnd.google-earth.kmz`, + `x-shockwave-flash`, + `emergencycalldata.providerinfo+xml`, + `fdt+xml`, + `rtx`, + `vnd.nokia.landmark+wbxml`, + `vnd.intu.qfx`, + `lpf+zip`, + `vnd.ims.lti.v2.toolsettings+json`, + `vnd.afpc.modca-overlay`, + `vnd.osgeo.mapguide.package`, + `vnd.yamaha.remote-setup`, + `vnd.cyan.dean.root+xml`, + `ubjson`, + `vnd.dolby.mobile.1`, + `mbms-envelope+xml`, + `vnd.openxmlformats-officedocument.presentationml.presentation`, + `cdfx+xml`, + `vnd.hydrostatix.sof-data`, + `vnd.afpc.afplinedata-pagedef`, + `vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml`, + `aif+cbor`, + `vnd.openxmlformats-officedocument.spreadsheetml.template`, + `appxbundle`, + `vnd.koan`, + `vnd.osa.netdeploy`, + `mbms-msk+xml`, + `vnd.dece.unspecified`, + `vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml`, + `vnd.fujifilm.fb.docuworks.binder`, + `x-ms-application`, + `n-quads`, + `davmount+xml`, + `vnd.oasis.opendocument.graphics-template`, + `vnd.emclient.accessrequest+xml`, + `vnd.efi.img`, + `x-iwork-pages-sffpages`, + `mipc`, + `vnd.lotus-approach`, + `vnd.bmi`, + `vnd.dece.ttml+xml`, + `vnd.shana.informed.formtemplate`, + `vnd.3gpp.mcdata-info+xml`, + `vnd.oma-scws-http-request`, + `vnd.hbci`, + `x-xfig`, + `vnd.3gpp.ngap`, + `route-s-tsid+xml`, + `vnd.kenameaapp`, + `vnd.kahootz`, + `vnd.cluetrust.cartomobile-config`, + `vnd.uplanet.alert`, + `vnd.rar`, + `vnd.nokia.landmark+xml`, + `vnd.ms-windows.nwprinting.oob`, + `vnd.yamaha.hv-script`, + `x-install-instructions`, + `vnd.evolv.ecig.settings`, + `vnd.pg.osasli`, + `pkcs8`, + `at+jwt`, + `vnd.ntt-local.sip-ta_remote`, + `vnd.dm.delegation+xml`, + `vnd.intergeo`, + `tamp-apex-update`, + `x-bzip2`, + `vnd.fujixerox.docuworks`, + `ccmp+xml`, + `vnd.ffsns`, + `x-chat`, + `vnd.ves.encrypted`, + `vnd.xmpie.ppkg`, + `held+xml`, + `vnd.ms-wmdrm.lic-resp`, + `qsig`, + `vnd.oasis.opendocument.presentation-template`, + `vnd.iptc.g2.packageitem+xml`, + `vnd.realvnc.bed`, + `mets+xml`, + `atsc-dynamic-event-message`, + `nasdata`, + `x-pilot`, + `java-serialized-object`, + `x-stuffitx`, + `simple-message-summary`, + `zstd`, + `news-transmission`, + `vnd.fujitsu.oasys`, + `vnd.adobe.xfdf`, + `dssc+xml`, + `vnd.netfpx`, + `vnd.etsi.tsl+xml`, + `vnd.palm`, + `expect-ct-report+json`, + `applixware`, + `vnd.adobe.air-application-installer-package+zip`, + `vnd.dart`, + `vnd.osgi.dp`, + `vnd.sun.xml.impress.template`, + `vnd.cups-raw`, + `alto-cdnifilter+json`, + `vnd.shana.informed.formdata`, + `its+xml`, + `vnd.zul`, + `vnd.pvi.ptid1`, + `vnd.3gpp.mcvideo-location-info+xml`, + `alto-endpointcost+json`, + `vnd.openxmlformats-officedocument.wordprocessingml.settings+xml`, + `stix+json`, + `vnd.wqd`, + `vnd.japannet-setstore-wakeup`, + `vnd.ericsson.quickcall`, + `efi`, + `vnd.android.package-archive`, + `vnd.3gpp.mcptt-ue-config+xml`, + `vnd.ms-powerpoint.presentation.macroenabled.12`, + `set-registration`, + `vnd.laszip`, + `vnd.stardivision.writer`, + `gml+xml`, + `ppsp-tracker+json`, + `cdmi-container`, + `x-mswrite`, + `x-sv4crc`, + `vnd.ms-printdevicecapabilities+xml`, + `vnd.mobius.mbk`, + `vnd.fujifilm.fb.docuworks.container`, + `tamp-sequence-adjust-confirm`, + `fastinfoset`, + `vnd.veryant.thin`, + `vcard+json`, + `vnd.audiograph`, + `vnd.heroku+json`, + `vnd.mobius.msl`, + `vnd.dvb.pfr`, + `vnd.enliven`, + `x-dtbook+xml`, + `pdx`, + `vnd.3gpp-prose-pc8+xml`, + `atom+xml`, + `vnd.fut-misnet`, + `x-iwork-numbers-sffnumbers`, + `vnd.micro+json`, + `vnd.blueice.multipass`, + `vnd.3gpp.mcvideo-transmission-request+xml`, + `mbms-associated-procedure-description+xml`, + `vnd.bbf.usp.msg+json`, + `vnd.radisys.msml-conf+xml`, + `vnd.futoin+json`, + `vnd.mophun.application`, + `x-rar-compressed`, + `vnd.3gpp.mcvideo-affiliation-command+xml`, + `vnd.publishare-delta-tree`, + `vnd.font-fontforge-sfd`, + `vnd.autopackage`, + `vnd.airzip.filesecure.azs`, + `vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml`, + `vnd.americandynamics.acc`, + `xslt+xml`, + `rls-services+xml`, + `moss-keys`, + `vnd.ibm.afplinedata`, + `x-font-bdf`, + `vnd.hp-hps`, + `vnd.apothekende.reservation+json`, + `vnd.hzn-3d-crossword`, + `vnd.japannet-registration`, + `vnd.sun.xml.calc`, + `vnd.wolfram.mathematica.package`, + `vnd.framemaker`, + `vnd.3gpp.5gnas`, + `vnd.zzazz.deck+xml`, + `index.obj`, + `vnd.pagerduty+json`, + `vnd.uplanet.bearer-choice`, + `vnd.llamagraphics.life-balance.desktop`, + `ttml+xml`, + `vnd.xmi+xml`, + `vnd.nebumind.line`, + `x-pkcs7-certificates`, + `sparql-query`, + `vnd.hp-hpid`, + `mrb-consumer+xml`, + `vnd.sbm.mid2`, + `mosskey-data`, + `vnd.hp-pcl`, + `vnd.openxmlformats-officedocument.presentationml.tags+xml`, + `linkset`, + `vnd.coreos.ignition+json`, + `vnd.ims.imsccv1p2`, + `vnd.dzr`, + `vnd.hcl-bireports`, + `vnd.mophun.certificate`, + `vnd.ims.lti.v2.toolproxy+json`, + `vnd.piaccess.application-licence`, + `vnd.cloanto.rp9`, + `vnd.openxmlformats-officedocument.presentationml.slidemaster+xml`, + `vnd.paos.xml`, + `vnd.dvb.notif-ia-registration-response+xml`, + `x-cpio`, + `vnd.recordare.musicxml`, + `atomicmail`, + `vnd.uplanet.cacheop-wbxml`, + `set-payment-initiation`, + `vnd.stardivision.draw`, + `vnd.nimn`, + `vnd.powerbuilder7`, + `vnd.apple.pkpass`, + `vnd.uplanet.listcmd`, + `oebps-package+xml`, + `vnd.wfa.dpp`, + `gltf-buffer`, + `x-dtbresource+xml`, + `x-deb`, + `vnd.street-stream`, + `vnd.3gpp-v2x-local-service-information`, + `vnd.dvb.ipdcesgpdd`, + `vnd.fdsn.mseed`, + `vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml`, + `vnd.uplanet.channel-wbxml`, + `vnd.yamaha.hv-voice`, + `alto-propmap+json`, + `vnd.1000minds.decision-model+xml`, + `mathematica`, + `problem+json`, + `vnd.iptc.g2.newsitem+xml`, + `vnd.nokia.landmarkcollection+xml`, + `x-xliff+xml`, + `atsc-dwd+xml`, + `automationml-amlx+zip`, + `vnd.bluetooth.ep.oob`, + `vnd.openxmlformats-officedocument.wordprocessingml.styles+xml`, + `vnd.cendio.thinlinc.clientconf`, + `vnd.etsi.overload-control-policy-dataset+xml`, + `urc-uisocketdesc+xml`, + `vnd.radisys.msml+xml`, + `vnd.dvb.dvbj`, + `vnd.windows.devicepairing`, + `vnd.comicbook-rar`, + `captive+json`, + `vnd.etsi.iptvcommand+xml`, + `vnd.cups-postscript`, + `vnd.gentoo.catmetadata+xml`, + `vnd.collection+json`, + `vnd.oma.lwm2m+json`, + `vnd.hp-jlyt`, + `vnd.veritone.aion+json`, + `wasm`, + `vnd.oma.drm.risd+xml`, + `vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml`, + `vnd.adobe.xdp+xml`, + `vnd.adobe.flash.movie`, + `vnd.novadigm.ext`, + `vnd.las.las+json`, + `x-msbinder`, + `coap-group+json`, + `vnd.oma-scws-config`, + `vnd.xfdl`, + `vnd.oma.bcast.notification+xml`, + `x-msclip`, + `vnd.apple.installer+xml`, + `vnd.marlin.drm.actiontoken+xml`, + `marc`, + `vnd.etsi.iptvsync+xml`, + `x-conference`, + `vnd.epson.esf`, + `vnd.oma.bcast.provisioningtrigger`, + `vnd.dna`, + `soap+xml`, + `vnd.etsi.simservs+xml`, + `vnd.openxmlformats-officedocument.wordprocessingml.document`, + `vnd.microsoft.portable-executable`, + `vnd.ms-powerpoint.addin.macroenabled.12`, + `vnd.think-cell.ppttc+json`, + `vnd.avistar+xml`, + `vnd.las.las+xml`, + `vnd.ms-powerpoint.slideshow.macroenabled.12`, + `vnd.ims.lti.v2.toolproxy.id+json`, + `vnd.nintendo.nitro.rom`, + `vnd.apache.arrow.file`, + `ipfix`, + `vnd.3gpp.mcptt-floor-request+xml`, + `alto-updatestreamparams+json`, + `vnd.ibm.minipay`, + `vnd.document+json`, + `vnd.groove-tool-template`, + `vnd.oasis.opendocument.chart-template`, + `vnd.ms-wmdrm.lic-chlg-req`, + `vnd.wasmflow.wafl`, + `vnd.google-earth.kml+xml`, + `alto-endpointcostparams+json`, + `vnd.radisys.msml-dialog-transform+xml`, + `emergencycalldata.ecall.msd`, + `vnd.3gpp.mcptt-affiliation-command+xml`, + `mbms-schedule+xml`, + `vnd.nervana`, + `vnd.smart.notebook`, + `vnd.pcos`, + `vnd.valve.source.material`, + `java-archive`, + `vnd.miele+json`, + `vnd.3gpp.mcptt-mbms-usage-info+xml`, + `vnd.infotech.project`, + `vnd.yamaha.tunnel-udpencap`, + `appx`, + `smpte336m`, + `x-sv4cpio`, + `mbms-user-service-description+xml`, + `jwt`, + `vnd.fdsn.seed`, + `ipp`, + `vnd.yamaha.through-ngn`, + `vnd.oasis.opendocument.spreadsheet`, + `vnd.etsi.iptvsad-npvr+xml`, + `mpeg4-iod-xmt`, + `vnd.wv.csp+xml`, + `vnd.vectorworks`, + `vnd.mynfc`, + `vnd.century-systems.tcp_stream`, + `clue+xml`, + `senml+cbor`, + `elm+json`, + `vnd.music-niff`, + `vnd.ibm.modcap`, + `vnd.ctc-posml`, + `p2p-overlay+xml`, + `rfc+xml`, + `x-authorware-seg`, + `vnd.sealed.csf`, + `samlmetadata+xml`, + `ssdl+xml`, + `missing-blocks+cbor-seq`, + `vnd.mobius.txf`, + `vnd.radisys.msml-audit-conn+xml`, + `vnd.futoin+cbor`, + `vnd.intertrust.digibox`, + `vnd.radisys.msml-audit+xml`, + `vnd.oma-scws-http-response`, + `x-tar`, + `vnd.banana-accounting`, + `token-introspection+jwt`, + `kpml-response+xml`, + `vnd.sealed.mht`, + `vnd.yamaha.hv-dic`, + `applefile`, + `xhtml+xml`, + `mmt-aei+xml`, + `vnd.oma.bcast.drm-trigger+xml`, + `vnd.sealed.xls`, + `vnd.snesdev-page-table`, + `exi`, + `vnd.wap.wmlc`, + `vnd.oma.cab-feature-handler+xml`, + `media_control+xml`, + `vnd.curl.car`, + `vnd.openxmlformats-officedocument.presentationml.viewprops+xml`, + `xaml+xml`, + `vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml`, + `tlsrpt+gzip`, + `vnd.citationstyles.style+xml`, + `urc-grpsheet+xml`, + `vnd.frogans.fnc`, + `vnd.onepager`, + `vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml`, + `vnd.dvb.iptv.alfec-base`, + `vnd.joost.joda-archive`, + `pgp-encrypted`, + `x-freearc`, + `vnd.3gpp.lpp`, + `vnd.curl.pcurl`, + `rpki-manifest`, + `vnd.3gpp.sms+xml`, + `vnd.spotfire.sfs`, + `vnd.liberty-request+xml`, + `node`, + `xacml+xml`, + `vnd.ecowin.seriesupdate`, + `vnd.geonext`, + `prs.xsf+xml`, + `srgs`, + `vnd.etsi.timestamp-token`, + `vnd.3gpp.mcdata-signalling`, + `x-font-dos`, + `x-pki-message`, + `vnd.hsl`, + `vnd.motorola.flexsuite.ttc`, + `x-mspublisher`, + `vnd.3lightssoftware.imagescal`, + `vnd.openxmlformats-officedocument.spreadsheetml.connections+xml`, + `vnd.fujitsu.oasys3`, + `wspolicy+xml`, + `xml-external-parsed-entity`, + `vnd.shp`, + `vnd.hyper+json`, + `vnd.age`, + `vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml`, + `vnd.crick.clicker.wordbank`, + `x-amf`, + `vnd.eszigno3+xml`, + `ecmascript`, + `vnd.rs-274x`, + `lostsync+xml`, + `vnd.curl`, + `vnd.api+json`, + `vnd.ims.imsccv1p3`, + `vnd.logipipe.circuit+zip`, + `x-authorware-bin`, + `geoxacml+xml`, + `toml`, + `vnd.anser-web-certificate-issue-initiation`, + `scvp-vp-request`, + `vnd.openxmlformats-officedocument.themeoverride+xml`, + `vnd.psfs`, + `voucher-cms+json`, + `xmpp+xml`, + `bdoc`, + `vnd.wfa.p2p`, + `vnd.uplanet.channel`, + `mbms-protection-description+xml`, + `vnd.sus-calendar`, + `senml-etch+cbor`, + `vnd.motorola.flexsuite`, + `x-authorware-map`, + `vnd.3gpp.seal-info+xml`, + `dssc+der`, + `vnd.rapid`, + `vnd.sun.xml.writer.template`, + `vnd.3gpp.mcdata-service-config+xml`, + `mikey`, + `vnd.ms-excel.sheet.binary.macroenabled.12`, + `batch-smtp`, + `vnd.powerbuilder6-s`, + `cpl+xml`, + `cellml+xml`, + `vnd.oma.poc.final-report+xml`, + `x-mobipocket-ebook`, + `vnd.ipld.dag-json`, + `isup`, + `cwl+json`, + `omdoc+xml`, + `vnd.artsquare`, + `vnd.obn`, + `vnd.neurolanguage.nlu`, + `vnd.lotus-organizer`, + `x-font-snf`, + `vnd.syft+json`, + `vnd.uoml+xml`, + `x-msschedule`, + `vnd.afpc.cmoca-cmresource`, + `x-mscardfile`, + `vnd.stepmania.stepchart`, + `eshop`, + `emotionml+xml`, + `tve-trigger`, + `vnd.exstream-package`, + `vnd.svd`, + `vnd.openxmlformats-officedocument.drawingml.diagramdata+xml`, + `vnd.afpc.modca-formdef`, + `vnd.3gpp.state-and-event-info+xml`, + `mbms-msk-response+xml`, + `vnd.sealedmedia.softseal.html`, + `vnd.groove-tool-message`, + `vnd.ecip.rlp`, + `hl7v2+xml`, + `vnd.afpc.modca-pagesegment`, + `vnd.httphone`, + `vnd.smart.teacher`, + `vnd.oasis.opendocument.text-master`, + `mediaservercontrol+xml`, + `ibe-key-request+xml`, + `index.cmd`, + `dns+json`, + `rsd+xml`, + `vnd.chemdraw+xml`, + `mathml-content+xml`, + `vnd.motorola.flexsuite.fis`, + `vnd.vcx`, + `tm+json`, + `vnd.frogans.ltf`, + `pgp-signature`, + `x-redhat-package-manager`, + `vnd.wap.wbxml`, + `oscore`, + `vnd.oasis.opendocument.spreadsheet-template`, + `vnd.maxmind.maxmind-db`, + `fastsoap`, + `vnd.llamagraphics.life-balance.exchange+xml`, + `mads+xml`, + `vnd.triscape.mxs`, + `x-ace-compressed`, + `x-iwork-keynote-sffkey`, + `sarif-external-properties+json`, + `vnd.sss-cod`, + `mrb-publish+xml`, + `vnd.oipf.pae.gem`, + `vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml`, + `xop+xml`, + `vnd.intu.qbo`, + `set-payment`, + `appinstaller`, + `vnd.biopax.rdf+xml`, + `vnd.uplanet.signal`, + `vnd.macports.portpkg`, + `activity+json`, + `whoispp-query`, + `auth-policy+xml`, + `x-sea`, + `vnd.semd`, + `vnd.google-apps.spreadsheet`, + `x-virtualbox-vmdk`, + `vnd.aristanetworks.swi`, + `xcap-el+xml`, + `emma+xml`, + `cdni`, + `vnd.openxmlformats-officedocument.spreadsheetml.table+xml`, + `x-doom`, + `vnd.etsi.sci+xml`, + `swid+cbor`, + `font-tdpfr`, + `vnd.gentics.grd+json`, + `x-ustar`, + `urc-ressheet+xml`, + `vnd.dtg.local`, + `http`, + `vnd.dvb.dvbisl+xml`, + `vnd.cryptii.pipe+json`, + `vnd.quark.quarkxpress`, + `vnd.kde.kontour`, + `vnd.igloader`, + `vnd.yamaha.smaf-phrase`, + `vnd.drive+json`, + `jsonml+json`, + `oblivious-dns-message`, + `vnd.hyper-item+json`, + `x-virtualbox-vdi`, + `vcard+xml`, + `vnd.commonspace`, + `vnd.shana.informed.interchange`, + `x-virtualbox-ovf`, + `vnd.ms-powerpoint.slide.macroenabled.12`, + `vnd.tmobile-livetv`, + `vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml`, + `vnd.mobius.daf`, + `fhir+json`, + `vnd.epson.ssf`, + `dicom`, + `x-cbr`, + `vnd.nokia.conml+wbxml`, + `vnd.wv.ssp+xml`, + `vnd.etsi.tsl.der`, + `prs.hpub+zip`, + `vnd.japannet-directory-service`, + `sarif+json`, + `vnd.siren+json`, + `gxf`, + `vnd.openstreetmap.data+xml`, + `vnd.amundsen.maze+xml`, + `x-eva`, + `vnd.hyperdrive+json`, + `n-triples`, + `vnd.clonk.c4group`, + `vnd.stepmania.package`, + `vnd.radisys.msml-audit-conf+xml`, + `vnd.ms-asf`, + `vnd.collabio.xodocuments.document`, + `vnd.3gpp.mcvideo-service-config+xml`, + `tamp-status-response`, + `alto-updatestreamcontrol+json`, + `vnd.msa-disk-image`, + `x-cfs-compressed`, + `vnd.oma.cab-address-book+xml`, + `vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml`, + `xfdf`, + `vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml`, + `vnd.iccprofile`, + `rpki-updown`, + `tamp-community-update`, + `vnd.dolby.mobile.2`, + `vnd.nearst.inv+json`, + `lxf`, + `vnd.wordperfect`, + `epp+xml`, + `vnd.openxmlformats-package.digital-signature-xmlsignature+xml`, + `vnd.sss-ntf`, + `vnd.oma.cab-user-prefs+xml`, + `vnd.ecowin.filerequest`, + `vnd.ms-artgalry`, + `dialog-info+xml`, + `x-font-pcf`, + `vnd.openblox.game-binary`, + `x-x509-ca-cert`, + `vnd.ipld.raw`, + `xcap-ns+xml`, + `vnd.cosmocaller`, + `x-sh`, + `vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml`, + `vnd.sealed.tiff`, + `fits`, + `vnd.wfa.wsc`, + `x400-bp`, + `vnd.lotus-freelance`, + `vnd.medicalholodeck.recordxr`, + `vnd.powerbuilder6`, + `x-virtualbox-vbox`, + `vnd.kde.karbon`, + `sensml+cbor`, + `msc-ivr+xml`, + `msix`, + `vnd.oci.image.manifest.v1+json`, + `fido.trusted-apps+json`, + `vnd.ieee.1905`, + `x-font-type1`, + `vnd.yaoweme`, + `rss+xml`, + `emergencycalldata.control+xml`, + `x-gtar`, + `octet-stream`, + `vnd.ms-excel.addin.macroenabled.12`, + `vnd.openxmlformats-package.core-properties+xml`, + `vnd.ms-color.iccprofile`, + `vnd.etsi.iptvueprofile+xml`, + `vnd.apache.thrift.json`, + `vnd.powerbuilder75-s`, + `x-msterminal`, + `calendar+json`, + `xcon-conference-info+xml`, + `vnd.collection.doc+json`, + `vnd.d3m-dataset`, + `vnd.oasis.opendocument.formula`, + `vnd.simtech-mindmapper`, + `reginfo+xml`, + `vnd.wordlift`, + `lost+xml`, + `vnd.preminet`, + `vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml`, + `vnd.comicbook+zip`, + `vnd.ezpix-package`, + `emergencycalldata.veds+xml`, + `pkcs10`, + `vnd.dtg.local.flash`, + `sep-exi`, + `vnd.nokia.radio-preset`, + `vnd.dece.zip`, + `smil+xml`, + `vnd.shopkick+json`, + `webpush-options+json`, + `vnd.anki`, + `cdmi-object`, + `vnd.onepagertatp`, + `vnd.fujixerox.docuworks.binder`, + `rtf`, + `vnd.nintendo.snes.rom`, + `vnd.visionary`, + `vnd.iptc.g2.newsmessage+xml`, + `tamp-update`, + `calendar+xml`, + `vnd.canon-lips`, + `vnd.bpf`, + `prs.cyn`, + `vnd.wap.sic`, + `alto-cdni+json`, + `vnd.handheld-entertainment+xml`, + `vnd.shootproof+json`, + `prs.cww`, + `vnd.gentoo.eclass`, + `vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml`, + `vnd.ms-officetheme`, + `pkix-pkipath`, + `vnd.openxmlformats-officedocument.extended-properties+xml`, + `vnd.belightsoft.lhzl+zip`, + `vnd.3gpp.pic-bw-small`, + `vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml`, + `vnd.oma.bcast.smartcard-trigger+xml`, + `vnd.ncd.reference`, + `vnd.ipunplugged.rcprofile`, + `cnrp+xml`, + `vnd.amiga.ami`, + `yang-patch+xml`, + `vnd.etsi.iptvsad-cod+xml`, + `vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml`, + `vnd.wt.stf`, + `vnd.3gpp2.bcmcsinfo+xml`, + `vnd.3gpp-prose+xml`, + `vnd.sun.xml.writer`, + `vnd.rim.cod`, + `poc-settings+xml`, + `jose`, + `pkixcmp`, + `vnd.infotech.project+xml`, + `vnd.uplanet.bearer-choice-wbxml`, + `vnd.openxmlformats-officedocument.presentationml.notesslide+xml`, + `vnd.f-secure.mobile`, + `scaip+xml`, + `vnd.gentoo.xpak`, + `vnd.poc.group-advertisement+xml`, + `xcap-error+xml`, + `vnd.openxmlformats-officedocument.custom-properties+xml`, + `h224`, + `vnd.kde.kivio`, + `mmt-usd+xml`, + `csta+xml`, + `vnd.3gpp.mcptt-ue-init-config+xml`, + `vnd.ms-htmlhelp`, + `xenc+xml`, + `tamp-sequence-adjust`, + `cfw`, + `vnd.oipf.spdiscovery+xml`, + `vnd.sycle+xml`, + `vnd.sun.wadl+xml`, + `vnd.lotus-notes`, + `vnd.epson.msf`, + `vnd.oma.bcast.sprov+xml`, + `vnd.unity`, + `vnd.oipf.cspg-hexbinary`, + `vnd.uplanet.list-wbxml`, + `rpki-publication`, + `vnd.3gpp-prose-pc3ach+xml`, + `vnd.xacml+json`, + `vnd.dvb.notif-ia-registration-request+xml`, + `vnd.japannet-registration-wakeup`, + `vnd.kinar`, + `vnd.3gpp.mcvideo-mbms-usage-info+xml`, + `vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml`, + `vnd.3gpp2.tcap`, + `mac-compactpro`, + `widget`, + `raptorfec`, + `tlsrpt+json`, + `vnd.bluetooth.le.oob`, + `x-ms-shortcut`, + `oxps`, + `metalink+xml`, + `mpeg4-iod`, + `vnd.nokia.n-gage.ac+xml`, + `javascript`, + `vnd.seis+json`, + `vnd.xfdl.webform`, + `vnd.datalog`, + `alto-endpointprop+json`, + `vnd.omaloc-supl-init`, + `vnd.eclipse.ditto+json`, + `vnd.vividence.scriptfile`, + `xml`, + `vnd.wmf.bootstrap`, + `vnd.afpc.modca-cmtable`, + `vnd.syncml.dmtnds+wbxml`, + `vnd.uplanet.alert-wbxml`, + `vnd.shana.informed.package`, + `vnd.onepagertamx`, + `vnd.apple.numbers`, + `vnd.ncd.control`, + `vnd.xmpie.plan`, + `vnd.3gpp.mcvideo-ue-config+xml`, + `x-pkcs12`, + `vnd.efi.iso`, + `emergencycalldata.cap+xml`, + `vnd.sun.xml.math`, + `vnd.imagemeter.folder+zip`, + `vnd.ms-printing.printticket+xml`, + `vnd.ms-tnef`, + `vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml`, + `x-font-linux-psf`, + `vnd.radisys.msml-dialog-fax-detect+xml`, + `provenance+xml`, + `xml-dtd`, + `vnd.cybank`, + `vnd.yellowriver-custom-menu`, + `vnd.ims.lti.v2.toolsettings.simple+json`, + `vnd.tri.onesource`, + `vnd.belightsoft.lhzd+zip`, + `vnd.bpf3`, + `vnd.apache.thrift.compact`, + `vnd.radisys.msml-audit-dialog+xml`, + `x-subrip`, + `vnd.oma.poc.detailed-progress-report+xml`, + `vnd.openxmlformats-officedocument.drawingml.chart+xml`, + `bacnet-xdd+zip`, + `vnd.swiftview-ics`, + `vnd.ds-keypoint`, + `kpml-request+xml`, + `vnd.resilient.logic`, + `session-info`, + `vnd.cyclonedx+xml`, + `vnd.sealed.ppt`, + `sru+xml`, + `route-apd+xml`, + `hyperstudio`, + `cdmi-queue`, + `mbms-register-response+xml`, + `dca-rft`, + `vnd.syncml+xml`, + `vnd.ecowin.fileupdate`, + `x-java-archive-diff`, + `x-wais-source`, + `x-futuresplash`, + `rlmi+xml`, + `vnd.mobius.plc`, + `vnd.oma.lwm2m+cbor`, + `vnd.radisys.msml-dialog-fax-sendrecv+xml`, + `vnd.3gpp.mid-call+xml`, + `pkcs7-signature`, + `vnd.openxmlformats-officedocument.presentationml.slidelayout+xml`, + `vnd.imagemeter.image+zip`, + `vnd.hp-hpgl`, + `vnd.gerber`, + `vnd.ah-barcode`, + `vnd.sealed.3df`, + `jose+json`, + `pics-rules`, + `vnd.cab-jscript`, + `xcap-caps+xml`, + `vnd.afpc.modca-mediummap`, + `vnd.xmpie.dpkg`, + `vnd.3gpp.srvcc-ext+xml`, + `vnd.ipld.car`, + `vnd.radisys.msml-audit-stream+xml`, + `vnd.iptc.g2.catalogitem+xml`, + `inkml+xml`, + `vnd.epson.quickanime`, + `vnd.bbf.usp.error`, + `xliff+xml`, + `remote-printing`, + `vnd.fints`, + `vnd.oipf.mippvcontrolmessage+xml`, + `vnd.nokia.ncd`, + `vnd.aplextor.warrp+json`, + `mud+json`, + `vnd.3gpp.bsf+xml`, + `rdf+xml`, + `im-iscomposing+xml`, + `vnd.3gpp.s1ap`, + `riscos`, + `vnd.enphase.envoy`, + `scvp-vp-response`, + `vnd.umajin`, + `x-font-vfont`, + `vnd.gov.sk.e-form+zip`, + `vnd.openblox.game+xml`, + `alto-costmap+json`, + `font-sfnt`, + `vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml`, + `vnd.motorola.iprm`, + `pkix-attr-cert`, + `vnd.nokia.n-gage.data`, + `index.vnd`, + `trig`, + `vnd.oma.push`, + `tzif-leap`, + `vnd.3gpp-prose-pc3a+xml`, + `dskpp+xml`, + `prs.nprend`, + `vnd.oma.dcd`, + `vnd.intercon.formnet`, + `vnd.ms-powerpoint.template.macroenabled.12`, + `vnd.businessobjects`, + `vnd.openxmlformats-officedocument.customxmlproperties+xml`, + `x-sql`, + `java-vm`, + `csrattrs`, + `vnd.groove-injector`, + `vnd.oma.cab-pcc+xml`, + `yang`, + `cstadata+xml`, + `vnd.stardivision.math`, + `sgml`, + `vnd.openxmlformats-officedocument.presentationml.presprops+xml`, + `a2l`, + `vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml`, + `vnd.pmi.widget`, + `mac-binhex40`, + `vnd.sealed.net`, + `vnd.ms-pki.seccat`, + `vnd.hal+json`, + `vnd.hdt`, + `senml+xml`, + `vnd.fujixerox.art-ex`, + `pkix-cert`, + `vnd.syncml.ds.notification`, + `vnd.previewsystems.box`, + `vnd.oma.pal+xml`, + `vnd.irepository.package+xml`, + `ibe-pkg-reply+xml`, + `wita`, + `samlassertion+xml`, + `x-msmetafile`, + `vnd.openxmlformats-officedocument.presentationml.template.main+xml`, + `vnd.sar`, + `xml-patch+xml`, + `vnd.ms-project`, + `vnd.picsel`, + `vnd.mseq`, + `vnd.balsamiq.bmpr`, + `vnd.3gpp.mcdata-affiliation-command+xml`, + `vnd.oasis.opendocument.image`, + `vnd.blink-idb-value-wrapper`, + `x-x509-ca-ra-cert`, + `vnd.dvb.ipdcesgaccess`, + `vnd.jisp`, + `vnd.groove-vcard`, + `vnd.rn-realmedia-vbr`, + `vnd.globalplatform.card-content-mgt-response`, + `cea`, + `vnd.oma.scidm.messages+xml`, + `timestamped-data`, + `vnd.novadigm.edm`, + `vnd.ms-windows.printerpairing`, + `x-iso9660-image`, + `vnd.informedcontrol.rms+xml`, + `dns-message`, + `vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml`, + `vnd.nitf`, + `vnd.wap.slc`, + `vnd.collabio.xodocuments.presentation`, + `vnd.route66.link66+xml`, + `vnd.fluxtime.clip`, + `vnd.bbf.usp.msg`, + `vnd.dvb.notif-ia-msglist+xml`, + `vnd.marlin.drm.mdcf`, + `vnd.wv.csp+wbxml`, + `vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml`, + `vnd.dreamfactory`, + `vnd.contact.cmsg`, + `prs.alvestrand.titrax-sheet`, + `vnd.3m.post-it-notes`, + `vnd.collabio.xodocuments.document-template`, + `pem-certificate-chain`, + `x-bcpio`, + `vnd.ibm.secure-container`, + `vnd.microsoft.windows.thumbnail-cache`, + `x-gzip`, + `jf2feed+json`, + `vnd.3gpp.mcptt-service-config+xml`, + `vnd.iptc.g2.planningitem+xml`, + `conference-info+xml`, + `x-dtbncx+xml`, + `x-web-app-manifest+json`, + `p21+zip`, + `vnd.ntt-local.file-transfer`, + `vnd.ms-excel`, + `vnd.symbian.install`, + `x-netcdf`, + `vnd.grafeq`, + `atomsvc+xml`, + `mf4`, + `vnd.sema`, + `vnd.minisoft-hp3000-save`, + `vnd.recordare.musicxml+xml`, + `vnd.3gpp.mcvideo-user-profile+xml`, + `xhtml-voice+xml`, + `vnd.iptc.g2.knowledgeitem+xml`, + `taxii+json`, + `vnd.accpac.simply.imp`, + `vnd.ms-outlook`, + `x-cdlink`, + `vnd.software602.filler.form-xml-zip`, + `vnd.ecdis-update`, + `vnd.wolfram.player`, + `mbms-register+xml`, + `vnd.radisys.moml+xml`, + `vnd.3gpp.interworking-data`, + `vnd.stardivision.calc`, + `x-font-speedo`, + `vnd.proteus.magazine`, + `sbml+xml`, + `vnd.amazon.mobi8-ebook`, + `vnd.ms-3mfdocument`, + `vnd.dece.data`, + `vnd.oma.bcast.imd+xml`, + `vnd.doremir.scorecloud-binary-document`, + `x-hdf`, + `vnd.ms-excel.sheet.macroenabled.12`, + `dvcs`, + `vnd.vel+json`, + `vnd.mobius.mqy`, + `vnd.3gpp.vae-info+xml`, + `vnd.syncml.dm+wbxml`, + `vnd.etsi.asic-e+zip`, + `vnd.openxmlformats-officedocument.presentationml.commentauthors+xml`, + `vnd.ms-printschematicket+xml`, + `aif+json`, + `vnd.isac.fcs`, + `vnd.eprints.data+xml`, + `mp21`, + `vnd.openxmlformats-officedocument.presentationml.comments+xml`, + `vnd.openofficeorg.extension`, + `vnd.syncml.dmtnds+xml`, + `x-msdos-program`, + `vnd.micrografx.flo`, + `vnd.bekitzur-stech+json`, + `dns`, + `x-bittorrent`, + `vnd.oipf.contentaccessdownload+xml`, + `edifact`, + `vnd.cups-pdf`, + `vnd.oxli.countgraph`, + `vnd.espass-espass+zip`, + `thraud+xml`, + `alto-networkmap+json`, + `sensml-exi`, + `wsdl+xml`, + `nlsml+xml`, + `tamp-status-query`, + `vnd.sealedmedia.softseal.pdf`, + `vnd.dvb.esgcontainer`, + `vnd.oasis.opendocument.chart`, + `vnd.osgi.bundle`, + `mathml+xml`, + `oda`, + `vnd.oma.poc.optimized-progress-report+xml`, + `scvp-cv-request`, + `vnd.maxar.archive.3tz+zip`, + `vnd.airzip.filesecure.azf`, + `vnd.oasis.opendocument.database`, + `vnd.powerbuilder75`, + `ssml+xml`, + `vnd.openxmlformats-officedocument.drawingml.chartshapes+xml`, + `dots+cbor`, + `alto-endpointpropparams+json`, + `x-tads`, + `rdap+json`, + `metalink4+xml`, + `vnd.geocube+xml`, + `3gpphalforms+json`, + `vnd.coffeescript`, + `vnd.stardivision.writer-global`, + `vnd.openxmlformats-officedocument.wordprocessingml.comments+xml`, + `vnd.geo+json`, + `vnd.sun.xml.calc.template`, + `x-msdownload`, + `vnd.pocketlearn`, + `x-lua-bytecode`, + `vnd.gpxsee.map+xml`, + `vnd.geoplan`, + `resource-lists-diff+xml`, + `vnd.qualcomm.brew-app-res`, + `vnd.dvb.iptv.alfec-enhancement`, + `vnd.groove-help`, + `vnd.iso11783-10+zip`, + `vnd.3gpp.sms`, + `vnd.fsc.weblaunch`, + `vnd.quarantainenet`, + `vnd.gentoo.ebuild`, + `vnd.dvb.ipdcroaming`, + `vnd.byu.uapi+json`, + `vnd.oma.dcdc`, + `express`, + `vnd.ms-cab-compressed`, + `vnd.openxmlformats-officedocument.spreadsheetml.comments+xml`, + `link-format`, + `vnd.3gpp.seal-location-info+xml`, + `vnd.pg.format`, + `vnd.3gpp.pic-bw-large`, + `vnd.etsi.mcid+xml`, + `vnd.kidspiration`, + `x-research-info-systems`, + `vnd.meridian-slingshot`, + `vnd.restful+json`, + `fdf`, + `vnd.gentoo.pkgmetadata+xml`, + `vnd.accpac.simply.aso`, + `vnd.immervision-ivu`, + `vnd.crick.clicker.palette`, + `atsc-rdt+json`, + `vnd.astraea-software.iota`, + `vnd.motorola.flexsuite.gotap`, + `vnd.dpgraph`, + `vnd.genomatix.tuxedo`, + `vnd.3gpp.mcdata-ue-config+xml`, + `vnd.kde.kspread`, + `x-ns-proxy-autoconfig`, + `ibe-pp-data`, + `vnd.3gpp.mcdata-regroup+xml`, + `emergencycalldata.comment+xml`, + `vnd.apple.keynote`, + `timestamp-query`, + `vnd.las`, + `vnd.oipf.dae.svg+xml`, + `vnd.mitsubishi.misty-guard.trustweb`, + `vnd.sun.xml.draw`, + `x-7z-compressed`, + `vnd.openxmlformats-officedocument.presentationml.presentation.main+xml`, + `x-apple-diskimage`, + `vnd.orange.indata`, + `cu-seeme`, + `x-x509-next-ca-cert`, + `x-virtualbox-vhd`, + `media-policy-dataset+xml`, + `vnd.ocf+cbor`, + `vnd.japannet-verification-wakeup`, + `vnd.spotfire.dxp`, + `mpeg4-generic`, + `vemmi`, + `x-tex-tfm`, + `vnd.ms-powerpoint`, + `vnd.hhe.lesson-player`, + `hjson`, + `vnd.msign`, + `vnd.openxmlformats-officedocument.presentationml.tablestyles+xml`, + `news-groupinfo`, + `simplesymbolcontainer`, + `msword`, + `x-gramps-xml`, + `vnd.hp-pclxl`, + `emergencycalldata.subscriberinfo+xml`, + `vnd.seemail`, + `dii`, + `cwl`, + `vnd.mif`, + `x-t3vm-image`, + `font-woff`, + `pdf`, + `vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml`, + `vnd.chipnuts.karaoke-mmd`, + `vnd.ims.lis.v2.result+json`, + `pkcs7-mime`, + `xv+xml`, + `x-ms-wmd`, + `vnd.marlin.drm.conftoken+xml`, + `vnd.oracle.resource+json`, + `cose-key-set`, + `vnd.3gpp.access-transfer-events+xml`, + `vnd.ms-excel.template.macroenabled.12`, + `pidf+xml`, + `vnd.geogebra.slides`, + `emergencycalldata.legacyesn+json`, + `relax-ng-compact-syntax`, + `vnd.insors.igm`, + `vnd.fujixerox.ddd`, + `vnd.google-apps.document`, + `vnd.xara`, + `vnd.mapbox-vector-tile`, + `vnd.tml`, + `merge-patch+json`, + `vnd.syncml.dm+xml`, + `x-mie`, + `vnd.openxmlformats-package.relationships+xml`, + `vnd.ms-package.obfuscated-opentype`, + `alto-error+json`, + `vnd.oma.group-usage-list+xml`, + `cea-2018+xml`, + `vnd.yamaha.openscoreformat.osfpvg+xml`, + `vnd.radisys.msml-dialog-speech+xml`, + `vnd.3gpp.srvcc-info+xml`, + `vnd.japannet-jpnstore-wakeup`, + `alto-costmapfilter+json`, + `vnd.ims.imsccv1p1`, + `vnd.ms-windows.wsd.oob`, + `swid+xml`, + `rpki-checklist`, + `vnd.dtg.local.html`, + `yin+xml`, + ) + lazy val any: MediaType = new MediaType("application", "*") + } + + object x_shader { + + lazy val `x-vertex`: MediaType = + new MediaType("x-shader", "x-vertex", compressible = true, binary = false) + + lazy val `x-fragment`: MediaType = + new MediaType("x-shader", "x-fragment", compressible = true, binary = false) + + lazy val all: List[MediaType] = List(`x-vertex`, `x-fragment`) + lazy val any: MediaType = new MediaType("x-shader", "*") + } + + object model { + + lazy val `vnd.gtw`: MediaType = + new MediaType("model", "vnd.gtw", compressible = false, binary = true, List("gtw")) + + lazy val `vnd.parasolid.transmit.text`: MediaType = + new MediaType("model", "vnd.parasolid.transmit.text", compressible = false, binary = true, List("x_t")) + + lazy val `vnd.usdz+zip`: MediaType = + new MediaType("model", "vnd.usdz+zip", compressible = false, binary = true, List("usdz")) + + lazy val `iges`: MediaType = + new MediaType("model", "iges", compressible = false, binary = true, List("igs", "iges")) + + lazy val `vnd.rosette.annotated-data-model`: MediaType = + new MediaType("model", "vnd.rosette.annotated-data-model", compressible = false, binary = true) + + lazy val `vnd.valve.source.compiled-map`: MediaType = + new MediaType("model", "vnd.valve.source.compiled-map", compressible = false, binary = true, List("bsp")) + + lazy val `vnd.pytha.pyox`: MediaType = + new MediaType("model", "vnd.pytha.pyox", compressible = false, binary = true, List("pyo", "pyox")) + + lazy val `x3d+fastinfoset`: MediaType = + new MediaType("model", "x3d+fastinfoset", compressible = false, binary = true, List("x3db")) + + lazy val `x3d+binary`: MediaType = + new MediaType("model", "x3d+binary", compressible = false, binary = true, List("x3db", "x3dbz")) + + lazy val `mesh`: MediaType = + new MediaType("model", "mesh", compressible = false, binary = true, List("msh", "mesh", "silo")) + + lazy val `mtl`: MediaType = + new MediaType("model", "mtl", compressible = false, binary = true, List("mtl")) + + lazy val `vnd.collada+xml`: MediaType = + new MediaType("model", "vnd.collada+xml", compressible = true, binary = true, List("dae")) + + lazy val `vnd.vtu`: MediaType = + new MediaType("model", "vnd.vtu", compressible = false, binary = true, List("vtu")) + + lazy val `prc`: MediaType = + new MediaType("model", "prc", compressible = false, binary = true, List("prc")) + + lazy val `x3d-vrml`: MediaType = + new MediaType("model", "x3d-vrml", compressible = false, binary = true, List("x3dv")) + + lazy val `vnd.opengex`: MediaType = + new MediaType("model", "vnd.opengex", compressible = false, binary = true, List("ogex")) + + lazy val `step+xml`: MediaType = + new MediaType("model", "step+xml", compressible = true, binary = true, List("stpx")) + + lazy val `vnd.moml+xml`: MediaType = + new MediaType("model", "vnd.moml+xml", compressible = true, binary = true) + + lazy val `vrml`: MediaType = + new MediaType("model", "vrml", compressible = false, binary = true, List("wrl", "vrml")) + + lazy val `vnd.gdl`: MediaType = + new MediaType("model", "vnd.gdl", compressible = false, binary = true, List("gdl")) + + lazy val `obj`: MediaType = + new MediaType("model", "obj", compressible = false, binary = true, List("obj")) + + lazy val `jt`: MediaType = + new MediaType("model", "jt", compressible = false, binary = true, List("jt")) + + lazy val `vnd.gs-gdl`: MediaType = + new MediaType("model", "vnd.gs-gdl", compressible = false, binary = true) + + lazy val `u3d`: MediaType = + new MediaType("model", "u3d", compressible = false, binary = true, List("u3d")) + + lazy val `vnd.parasolid.transmit.binary`: MediaType = + new MediaType("model", "vnd.parasolid.transmit.binary", compressible = false, binary = true, List("x_b")) + + lazy val `vnd.sap.vds`: MediaType = + new MediaType("model", "vnd.sap.vds", compressible = false, binary = true, List("vds")) + + lazy val `x3d+xml`: MediaType = + new MediaType("model", "x3d+xml", compressible = true, binary = true, List("x3d", "x3dz")) + + lazy val `vnd.gs.gdl`: MediaType = + new MediaType("model", "vnd.gs.gdl", compressible = false, binary = true) + + lazy val `x3d+vrml`: MediaType = + new MediaType("model", "x3d+vrml", compressible = false, binary = true, List("x3dv", "x3dvz")) + + lazy val `3mf`: MediaType = + new MediaType("model", "3mf", compressible = false, binary = true, List("3mf")) + + lazy val `step+zip`: MediaType = + new MediaType("model", "step+zip", compressible = false, binary = true, List("stpz")) + + lazy val `step`: MediaType = + new MediaType("model", "step", compressible = false, binary = true) + + lazy val `gltf-binary`: MediaType = + new MediaType("model", "gltf-binary", compressible = true, binary = true, List("glb")) + + lazy val `stl`: MediaType = + new MediaType("model", "stl", compressible = false, binary = true, List("stl")) + + lazy val `vnd.dwf`: MediaType = + new MediaType("model", "vnd.dwf", compressible = false, binary = true, List("dwf")) + + lazy val `step-xml+zip`: MediaType = + new MediaType("model", "step-xml+zip", compressible = false, binary = true, List("stpxz")) + + lazy val `gltf+json`: MediaType = + new MediaType("model", "gltf+json", compressible = true, binary = true, List("gltf")) + + lazy val `e57`: MediaType = + new MediaType("model", "e57", compressible = false, binary = true) + + lazy val `vnd.flatland.3dml`: MediaType = + new MediaType("model", "vnd.flatland.3dml", compressible = false, binary = true) + + lazy val `vnd.mts`: MediaType = + new MediaType("model", "vnd.mts", compressible = false, binary = true, List("mts")) + + lazy val `vnd.cld`: MediaType = + new MediaType("model", "vnd.cld", compressible = false, binary = true, List("cld")) + + lazy val `vnd.usda`: MediaType = + new MediaType("model", "vnd.usda", compressible = false, binary = true, List("usda")) + + lazy val all: List[MediaType] = List( + `vnd.gtw`, + `vnd.parasolid.transmit.text`, + `vnd.usdz+zip`, + `iges`, + `vnd.rosette.annotated-data-model`, + `vnd.valve.source.compiled-map`, + `vnd.pytha.pyox`, + `x3d+fastinfoset`, + `x3d+binary`, + `mesh`, + `mtl`, + `vnd.collada+xml`, + `vnd.vtu`, + `prc`, + `x3d-vrml`, + `vnd.opengex`, + `step+xml`, + `vnd.moml+xml`, + `vrml`, + `vnd.gdl`, + `obj`, + `jt`, + `vnd.gs-gdl`, + `u3d`, + `vnd.parasolid.transmit.binary`, + `vnd.sap.vds`, + `x3d+xml`, + `vnd.gs.gdl`, + `x3d+vrml`, + `3mf`, + `step+zip`, + `step`, + `gltf-binary`, + `stl`, + `vnd.dwf`, + `step-xml+zip`, + `gltf+json`, + `e57`, + `vnd.flatland.3dml`, + `vnd.mts`, + `vnd.cld`, + `vnd.usda`, + ) + lazy val any: MediaType = new MediaType("model", "*") + } + + object image { + + lazy val `g3fax`: MediaType = + new MediaType("image", "g3fax", compressible = false, binary = true, List("g3")) + + lazy val `vnd.radiance`: MediaType = + new MediaType("image", "vnd.radiance", compressible = false, binary = true) + + lazy val `x-ms-bmp`: MediaType = + new MediaType("image", "x-ms-bmp", compressible = true, binary = true, List("bmp")) + + lazy val `x-cmx`: MediaType = + new MediaType("image", "x-cmx", compressible = false, binary = true, List("cmx")) + + lazy val `ief`: MediaType = + new MediaType("image", "ief", compressible = false, binary = true, List("ief")) + + lazy val `vnd.microsoft.icon`: MediaType = + new MediaType("image", "vnd.microsoft.icon", compressible = true, binary = true, List("ico")) + + lazy val `avif`: MediaType = + new MediaType("image", "avif", compressible = false, binary = true, List("avif")) + + lazy val `tiff-fx`: MediaType = + new MediaType("image", "tiff-fx", compressible = false, binary = true, List("tfx")) + + lazy val `x-rgb`: MediaType = + new MediaType("image", "x-rgb", compressible = false, binary = true, List("rgb")) + + lazy val `jxsc`: MediaType = + new MediaType("image", "jxsc", compressible = false, binary = true, List("jxsc")) + + lazy val `gif`: MediaType = + new MediaType("image", "gif", compressible = false, binary = true, List("gif")) + + lazy val `vnd.net-fpx`: MediaType = + new MediaType("image", "vnd.net-fpx", compressible = false, binary = true, List("npx")) + + lazy val `apng`: MediaType = + new MediaType("image", "apng", compressible = false, binary = true, List("apng")) + + lazy val `fits`: MediaType = + new MediaType("image", "fits", compressible = false, binary = true, List("fits")) + + lazy val `vnd.fpx`: MediaType = + new MediaType("image", "vnd.fpx", compressible = false, binary = true, List("fpx")) + + lazy val `prs.btif`: MediaType = + new MediaType("image", "prs.btif", compressible = false, binary = true, List("btif", "btf")) + + lazy val `x-portable-bitmap`: MediaType = + new MediaType("image", "x-portable-bitmap", compressible = false, binary = true, List("pbm")) + + lazy val `vnd.valve.source.texture`: MediaType = + new MediaType("image", "vnd.valve.source.texture", compressible = false, binary = true, List("vtf")) + + lazy val `bmp`: MediaType = + new MediaType("image", "bmp", compressible = true, binary = true, List("bmp", "dib")) + + lazy val `jxsi`: MediaType = + new MediaType("image", "jxsi", compressible = false, binary = true, List("jxsi")) + + lazy val `vnd.sealedmedia.softseal.gif`: MediaType = + new MediaType("image", "vnd.sealedmedia.softseal.gif", compressible = false, binary = true) + + lazy val `vnd.dxf`: MediaType = + new MediaType("image", "vnd.dxf", compressible = false, binary = true, List("dxf")) + + lazy val `vnd.wap.wbmp`: MediaType = + new MediaType("image", "vnd.wap.wbmp", compressible = false, binary = true, List("wbmp")) + + lazy val `jxrs`: MediaType = + new MediaType("image", "jxrs", compressible = false, binary = true, List("jxrs")) + + lazy val `x-icon`: MediaType = + new MediaType("image", "x-icon", compressible = true, binary = true, List("ico")) + + lazy val `dpx`: MediaType = + new MediaType("image", "dpx", compressible = false, binary = true, List("dpx")) + + lazy val `tiff`: MediaType = + new MediaType("image", "tiff", compressible = false, binary = true, List("tif", "tiff")) + + lazy val `jphc`: MediaType = + new MediaType("image", "jphc", compressible = false, binary = true, List("jhc")) + + lazy val `jpm`: MediaType = + new MediaType("image", "jpm", compressible = false, binary = true, List("jpm", "jpgm")) + + lazy val `jp2`: MediaType = + new MediaType("image", "jp2", compressible = false, binary = true, List("jp2", "jpg2")) + + lazy val `heif`: MediaType = + new MediaType("image", "heif", compressible = false, binary = true, List("heif")) + + lazy val `jxs`: MediaType = + new MediaType("image", "jxs", compressible = false, binary = true, List("jxs")) + + lazy val `heif-sequence`: MediaType = + new MediaType("image", "heif-sequence", compressible = false, binary = true, List("heifs")) + + lazy val `vnd.fastbidsheet`: MediaType = + new MediaType("image", "vnd.fastbidsheet", compressible = false, binary = true, List("fbs")) + + lazy val `avci`: MediaType = + new MediaType("image", "avci", compressible = false, binary = true, List("avci")) + + lazy val `x-cmu-raster`: MediaType = + new MediaType("image", "x-cmu-raster", compressible = false, binary = true, List("ras")) + + lazy val `vnd.adobe.photoshop`: MediaType = + new MediaType("image", "vnd.adobe.photoshop", compressible = true, binary = true, List("psd")) + + lazy val `ktx`: MediaType = + new MediaType("image", "ktx", compressible = false, binary = true, List("ktx")) + + lazy val `heic-sequence`: MediaType = + new MediaType("image", "heic-sequence", compressible = false, binary = true, List("heics")) + + lazy val `vnd.dece.graphic`: MediaType = + new MediaType( + "image", + "vnd.dece.graphic", + compressible = false, + binary = true, + List("uvi", "uvvi", "uvg", "uvvg"), ) - lazy val `xml-dtd`: MediaType = - new MediaType("application", "xml-dtd", Compressible, NotBinary, List("dtd")) - lazy val `xml-external-parsed-entity`: MediaType = - new MediaType("application", "xml-external-parsed-entity", Compressible, NotBinary) - lazy val `xml-patch+xml`: MediaType = - new MediaType("application", "xml-patch+xml", Compressible, NotBinary) - lazy val `xmpp+xml`: MediaType = - new MediaType("application", "xmpp+xml", Compressible, NotBinary) - lazy val `xop+xml`: MediaType = - new MediaType("application", "xop+xml", Compressible, NotBinary, List("xop")) - lazy val `xproc+xml`: MediaType = - new MediaType("application", "xproc+xml", Compressible, NotBinary, List("xpl")) - lazy val `xslt+xml`: MediaType = - new MediaType("application", "xslt+xml", Compressible, NotBinary, List("xsl", "xslt")) - lazy val `xspf+xml`: MediaType = - new MediaType("application", "xspf+xml", Compressible, NotBinary, List("xspf")) - lazy val `xv+xml`: MediaType = new MediaType( - "application", - "xv+xml", - Compressible, - NotBinary, - List("mxml", "xhvml", "xvml", "xvm"), + + lazy val `pwg-raster`: MediaType = + new MediaType("image", "pwg-raster", compressible = false, binary = true) + + lazy val `vnd.dvb.subtitle`: MediaType = + new MediaType("image", "vnd.dvb.subtitle", compressible = false, binary = true, List("sub")) + + lazy val `vnd.ms-photo`: MediaType = + new MediaType("image", "vnd.ms-photo", compressible = false, binary = true, List("wdp")) + + lazy val `jph`: MediaType = + new MediaType("image", "jph", compressible = false, binary = true, List("jph")) + + lazy val `sgi`: MediaType = + new MediaType("image", "sgi", compressible = false, binary = true, List("sgi")) + + lazy val `x-xbitmap`: MediaType = + new MediaType("image", "x-xbitmap", compressible = false, binary = true, List("xbm")) + + lazy val `prs.pti`: MediaType = + new MediaType("image", "prs.pti", compressible = false, binary = true, List("pti")) + + lazy val `aces`: MediaType = + new MediaType("image", "aces", compressible = false, binary = true, List("exr")) + + lazy val `vnd.ms-dds`: MediaType = + new MediaType("image", "vnd.ms-dds", compressible = true, binary = true, List("dds")) + + lazy val `vnd.fujixerox.edmics-mmr`: MediaType = + new MediaType("image", "vnd.fujixerox.edmics-mmr", compressible = false, binary = true, List("mmr")) + + lazy val `x-jng`: MediaType = + new MediaType("image", "x-jng", compressible = false, binary = true, List("jng")) + + lazy val `png`: MediaType = + new MediaType("image", "png", compressible = false, binary = true, List("png")) + + lazy val `x-pict`: MediaType = + new MediaType("image", "x-pict", compressible = false, binary = true, List("pic", "pct")) + + lazy val `vnd.sealed.png`: MediaType = + new MediaType("image", "vnd.sealed.png", compressible = false, binary = true) + + lazy val `x-freehand`: MediaType = + new MediaType("image", "x-freehand", compressible = false, binary = true, List("fh", "fhc", "fh4", "fh5", "fh7")) + + lazy val `x-portable-anymap`: MediaType = + new MediaType("image", "x-portable-anymap", compressible = false, binary = true, List("pnm")) + + lazy val `jpx`: MediaType = + new MediaType("image", "jpx", compressible = false, binary = true, List("jpx", "jpf")) + + lazy val `pjpeg`: MediaType = + new MediaType("image", "pjpeg", compressible = false, binary = true) + + lazy val `ktx2`: MediaType = + new MediaType("image", "ktx2", compressible = false, binary = true, List("ktx2")) + + lazy val `vnd.cns.inf2`: MediaType = + new MediaType("image", "vnd.cns.inf2", compressible = false, binary = true) + + lazy val `x-xpixmap`: MediaType = + new MediaType("image", "x-xpixmap", compressible = false, binary = true, List("xpm")) + + lazy val `vnd.tencent.tap`: MediaType = + new MediaType("image", "vnd.tencent.tap", compressible = false, binary = true, List("tap")) + + lazy val `x-3ds`: MediaType = + new MediaType("image", "x-3ds", compressible = false, binary = true, List("3ds")) + + lazy val `vnd.airzip.accelerator.azv`: MediaType = + new MediaType("image", "vnd.airzip.accelerator.azv", compressible = false, binary = true, List("azv")) + + lazy val `x-mrsid-image`: MediaType = + new MediaType("image", "x-mrsid-image", compressible = false, binary = true, List("sid")) + + lazy val `avcs`: MediaType = + new MediaType("image", "avcs", compressible = false, binary = true, List("avcs")) + + lazy val `x-portable-pixmap`: MediaType = + new MediaType("image", "x-portable-pixmap", compressible = false, binary = true, List("ppm")) + + lazy val `vnd.fujixerox.edmics-rlc`: MediaType = + new MediaType("image", "vnd.fujixerox.edmics-rlc", compressible = false, binary = true, List("rlc")) + + lazy val `vnd.xiff`: MediaType = + new MediaType("image", "vnd.xiff", compressible = false, binary = true, List("xif")) + + lazy val `webp`: MediaType = + new MediaType("image", "webp", compressible = false, binary = true, List("webp")) + + lazy val `vnd.pco.b16`: MediaType = + new MediaType("image", "vnd.pco.b16", compressible = false, binary = true, List("b16")) + + lazy val `vnd.globalgraphics.pgb`: MediaType = + new MediaType("image", "vnd.globalgraphics.pgb", compressible = false, binary = true) + + lazy val `vnd.svf`: MediaType = + new MediaType("image", "vnd.svf", compressible = false, binary = true) + + lazy val `vnd.sealedmedia.softseal.jpg`: MediaType = + new MediaType("image", "vnd.sealedmedia.softseal.jpg", compressible = false, binary = true) + + lazy val `hsj2`: MediaType = + new MediaType("image", "hsj2", compressible = false, binary = true, List("hsj2")) + + lazy val `dicom-rle`: MediaType = + new MediaType("image", "dicom-rle", compressible = false, binary = true, List("drle")) + + lazy val `vnd.zbrush.pcx`: MediaType = + new MediaType("image", "vnd.zbrush.pcx", compressible = false, binary = true, List("pcx")) + + lazy val `emf`: MediaType = + new MediaType("image", "emf", compressible = false, binary = true, List("emf")) + + lazy val `cgm`: MediaType = + new MediaType("image", "cgm", compressible = false, binary = true, List("cgm")) + + lazy val `jxss`: MediaType = + new MediaType("image", "jxss", compressible = false, binary = true, List("jxss")) + + lazy val `svg+xml`: MediaType = + new MediaType("image", "svg+xml", compressible = true, binary = true, List("svg", "svgz")) + + lazy val `naplps`: MediaType = + new MediaType("image", "naplps", compressible = false, binary = true) + + lazy val `hej2k`: MediaType = + new MediaType("image", "hej2k", compressible = false, binary = true, List("hej2")) + + lazy val `jls`: MediaType = + new MediaType("image", "jls", compressible = false, binary = true, List("jls")) + + lazy val `jxra`: MediaType = + new MediaType("image", "jxra", compressible = false, binary = true, List("jxra")) + + lazy val `x-xwindowdump`: MediaType = + new MediaType("image", "x-xwindowdump", compressible = false, binary = true, List("xwd")) + + lazy val `t38`: MediaType = + new MediaType("image", "t38", compressible = false, binary = true, List("t38")) + + lazy val `vnd.fst`: MediaType = + new MediaType("image", "vnd.fst", compressible = false, binary = true, List("fst")) + + lazy val `vnd.mozilla.apng`: MediaType = + new MediaType("image", "vnd.mozilla.apng", compressible = false, binary = true) + + lazy val `x-tga`: MediaType = + new MediaType("image", "x-tga", compressible = false, binary = true, List("tga")) + + lazy val `jpeg`: MediaType = + new MediaType("image", "jpeg", compressible = false, binary = true, List("jpeg", "jpg", "jpe")) + + lazy val `vnd.dwg`: MediaType = + new MediaType("image", "vnd.dwg", compressible = false, binary = true, List("dwg")) + + lazy val `vnd.mix`: MediaType = + new MediaType("image", "vnd.mix", compressible = false, binary = true) + + lazy val `wmf`: MediaType = + new MediaType("image", "wmf", compressible = false, binary = true, List("wmf")) + + lazy val `x-xcf`: MediaType = + new MediaType("image", "x-xcf", compressible = false, binary = true) + + lazy val `x-pcx`: MediaType = + new MediaType("image", "x-pcx", compressible = false, binary = true, List("pcx")) + + lazy val `x-portable-graymap`: MediaType = + new MediaType("image", "x-portable-graymap", compressible = false, binary = true, List("pgm")) + + lazy val `heic`: MediaType = + new MediaType("image", "heic", compressible = false, binary = true, List("heic")) + + lazy val `vnd.djvu`: MediaType = + new MediaType("image", "vnd.djvu", compressible = false, binary = true, List("djvu", "djv")) + + lazy val `jxr`: MediaType = + new MediaType("image", "jxr", compressible = false, binary = true, List("jxr")) + + lazy val `vnd.ms-modi`: MediaType = + new MediaType("image", "vnd.ms-modi", compressible = false, binary = true, List("mdi")) + + lazy val all: List[MediaType] = List( + `g3fax`, + `vnd.radiance`, + `x-ms-bmp`, + `x-cmx`, + `ief`, + `vnd.microsoft.icon`, + `avif`, + `tiff-fx`, + `x-rgb`, + `jxsc`, + `gif`, + `vnd.net-fpx`, + `apng`, + `fits`, + `vnd.fpx`, + `prs.btif`, + `x-portable-bitmap`, + `vnd.valve.source.texture`, + `bmp`, + `jxsi`, + `vnd.sealedmedia.softseal.gif`, + `vnd.dxf`, + `vnd.wap.wbmp`, + `jxrs`, + `x-icon`, + `dpx`, + `tiff`, + `jphc`, + `jpm`, + `jp2`, + `heif`, + `jxs`, + `heif-sequence`, + `vnd.fastbidsheet`, + `avci`, + `x-cmu-raster`, + `vnd.adobe.photoshop`, + `ktx`, + `heic-sequence`, + `vnd.dece.graphic`, + `pwg-raster`, + `vnd.dvb.subtitle`, + `vnd.ms-photo`, + `jph`, + `sgi`, + `x-xbitmap`, + `prs.pti`, + `aces`, + `vnd.ms-dds`, + `vnd.fujixerox.edmics-mmr`, + `x-jng`, + `png`, + `x-pict`, + `vnd.sealed.png`, + `x-freehand`, + `x-portable-anymap`, + `jpx`, + `pjpeg`, + `ktx2`, + `vnd.cns.inf2`, + `x-xpixmap`, + `vnd.tencent.tap`, + `x-3ds`, + `vnd.airzip.accelerator.azv`, + `x-mrsid-image`, + `avcs`, + `x-portable-pixmap`, + `vnd.fujixerox.edmics-rlc`, + `vnd.xiff`, + `webp`, + `vnd.pco.b16`, + `vnd.globalgraphics.pgb`, + `vnd.svf`, + `vnd.sealedmedia.softseal.jpg`, + `hsj2`, + `dicom-rle`, + `vnd.zbrush.pcx`, + `emf`, + `cgm`, + `jxss`, + `svg+xml`, + `naplps`, + `hej2k`, + `jls`, + `jxra`, + `x-xwindowdump`, + `t38`, + `vnd.fst`, + `vnd.mozilla.apng`, + `x-tga`, + `jpeg`, + `vnd.dwg`, + `vnd.mix`, + `wmf`, + `x-xcf`, + `x-pcx`, + `x-portable-graymap`, + `heic`, + `vnd.djvu`, + `jxr`, + `vnd.ms-modi`, + ) + lazy val any: MediaType = new MediaType("image", "*") + } + + object text { + + lazy val `vnd.wap.wmlscript`: MediaType = + new MediaType("text", "vnd.wap.wmlscript", compressible = false, binary = false, List("wmls")) + + lazy val `ulpfec`: MediaType = + new MediaType("text", "ulpfec", compressible = false, binary = false) + + lazy val `vnd.radisys.msml-basic-layout`: MediaType = + new MediaType("text", "vnd.radisys.msml-basic-layout", compressible = false, binary = false) + + lazy val `shex`: MediaType = + new MediaType("text", "shex", compressible = false, binary = false, List("shex")) + + lazy val `shaclc`: MediaType = + new MediaType("text", "shaclc", compressible = false, binary = false) + + lazy val `vnd.curl.dcurl`: MediaType = + new MediaType("text", "vnd.curl.dcurl", compressible = false, binary = false, List("dcurl")) + + lazy val `xml-external-parsed-entity`: MediaType = + new MediaType("text", "xml-external-parsed-entity", compressible = false, binary = false) + + lazy val `fhirpath`: MediaType = + new MediaType("text", "fhirpath", compressible = false, binary = false) + + lazy val `turtle`: MediaType = + new MediaType("text", "turtle", compressible = false, binary = false, List("ttl")) + + lazy val `vnd.sun.j2me.app-descriptor`: MediaType = + new MediaType("text", "vnd.sun.j2me.app-descriptor", compressible = false, binary = false, List("jad")) + + lazy val `x-sass`: MediaType = + new MediaType("text", "x-sass", compressible = false, binary = false, List("sass")) + + lazy val `x-vcard`: MediaType = + new MediaType("text", "x-vcard", compressible = false, binary = false, List("vcf")) + + lazy val `vnd.a`: MediaType = + new MediaType("text", "vnd.a", compressible = false, binary = false) + + lazy val `uri-list`: MediaType = + new MediaType("text", "uri-list", compressible = true, binary = false, List("uri", "uris", "urls")) + + lazy val `calender`: MediaType = + new MediaType("text", "calender", compressible = true, binary = false) + + lazy val `markdown`: MediaType = + new MediaType("text", "markdown", compressible = true, binary = false, List("md", "markdown")) + + lazy val `vnd.dvb.subtitle`: MediaType = + new MediaType("text", "vnd.dvb.subtitle", compressible = false, binary = false, List("sub")) + + lazy val `ecmascript`: MediaType = + new MediaType("text", "ecmascript", compressible = false, binary = false) + + lazy val `x-processing`: MediaType = + new MediaType("text", "x-processing", compressible = true, binary = false, List("pde")) + + lazy val `cmd`: MediaType = + new MediaType("text", "cmd", compressible = true, binary = false) + + lazy val `tab-separated-values`: MediaType = + new MediaType("text", "tab-separated-values", compressible = true, binary = false, List("tsv")) + + lazy val `less`: MediaType = + new MediaType("text", "less", compressible = true, binary = false, List("less")) + + lazy val `cache-manifest`: MediaType = + new MediaType("text", "cache-manifest", compressible = true, binary = false, List("appcache", "manifest")) + + lazy val `vnd.wap.sl`: MediaType = + new MediaType("text", "vnd.wap.sl", compressible = false, binary = false) + + lazy val `dns`: MediaType = + new MediaType("text", "dns", compressible = false, binary = false) + + lazy val `strings`: MediaType = + new MediaType("text", "strings", compressible = false, binary = false) + + lazy val `csv`: MediaType = + new MediaType("text", "csv", compressible = true, binary = false, List("csv")) + + lazy val `vnd.gml`: MediaType = + new MediaType("text", "vnd.gml", compressible = false, binary = false) + + lazy val `x-setext`: MediaType = + new MediaType("text", "x-setext", compressible = false, binary = false, List("etx")) + + lazy val `x-lua`: MediaType = + new MediaType("text", "x-lua", compressible = false, binary = false, List("lua")) + + lazy val `x-vcalendar`: MediaType = + new MediaType("text", "x-vcalendar", compressible = false, binary = false, List("vcs")) + + lazy val `vnd.exchangeable`: MediaType = + new MediaType("text", "vnd.exchangeable", compressible = false, binary = false) + + lazy val `wgsl`: MediaType = + new MediaType("text", "wgsl", compressible = false, binary = false, List("wgsl")) + + lazy val `rfc822-headers`: MediaType = + new MediaType("text", "rfc822-headers", compressible = false, binary = false) + + lazy val `vnd.graphviz`: MediaType = + new MediaType("text", "vnd.graphviz", compressible = false, binary = false, List("gv")) + + lazy val `red`: MediaType = + new MediaType("text", "red", compressible = false, binary = false) + + lazy val `x-fortran`: MediaType = + new MediaType("text", "x-fortran", compressible = false, binary = false, List("f", "for", "f77", "f90")) + + lazy val `cql`: MediaType = + new MediaType("text", "cql", compressible = false, binary = false) + + lazy val `vnd.esmertec.theme-descriptor`: MediaType = + new MediaType("text", "vnd.esmertec.theme-descriptor", compressible = false, binary = false) + + lazy val `directory`: MediaType = + new MediaType("text", "directory", compressible = false, binary = false) + + lazy val `css`: MediaType = + new MediaType("text", "css", compressible = true, binary = false, List("css")) + + lazy val `vnd.latex-z`: MediaType = + new MediaType("text", "vnd.latex-z", compressible = false, binary = false) + + lazy val `vnd.fly`: MediaType = + new MediaType("text", "vnd.fly", compressible = false, binary = false, List("fly")) + + lazy val `vnd.senx.warpscript`: MediaType = + new MediaType("text", "vnd.senx.warpscript", compressible = false, binary = false) + + lazy val `vnd.sosi`: MediaType = + new MediaType("text", "vnd.sosi", compressible = false, binary = false) + + lazy val `parameters`: MediaType = + new MediaType("text", "parameters", compressible = false, binary = false) + + lazy val `provenance-notation`: MediaType = + new MediaType("text", "provenance-notation", compressible = false, binary = false) + + lazy val `x-markdown`: MediaType = + new MediaType("text", "x-markdown", compressible = true, binary = false, List("mkd")) + + lazy val `x-handlebars-template`: MediaType = + new MediaType("text", "x-handlebars-template", compressible = false, binary = false, List("hbs")) + + lazy val `csv-schema`: MediaType = + new MediaType("text", "csv-schema", compressible = false, binary = false) + + lazy val `rtp-enc-aescm128`: MediaType = + new MediaType("text", "rtp-enc-aescm128", compressible = false, binary = false) + + lazy val `jcr-cnd`: MediaType = + new MediaType("text", "jcr-cnd", compressible = false, binary = false) + + lazy val `vnd.hans`: MediaType = + new MediaType("text", "vnd.hans", compressible = false, binary = false) + + lazy val `x-java-source`: MediaType = + new MediaType("text", "x-java-source", compressible = false, binary = false, List("java")) + + lazy val `vnd.curl.scurl`: MediaType = + new MediaType("text", "vnd.curl.scurl", compressible = false, binary = false, List("scurl")) + + lazy val `encaprtp`: MediaType = + new MediaType("text", "encaprtp", compressible = false, binary = false) + + lazy val `vnd.iptc.newsml`: MediaType = + new MediaType("text", "vnd.iptc.newsml", compressible = false, binary = false) + + lazy val `vnd.fmi.flexstor`: MediaType = + new MediaType("text", "vnd.fmi.flexstor", compressible = false, binary = false, List("flx")) + + lazy val `vnd.wap.wml`: MediaType = + new MediaType("text", "vnd.wap.wml", compressible = false, binary = false, List("wml")) + + lazy val `cql-identifier`: MediaType = + new MediaType("text", "cql-identifier", compressible = false, binary = false) + + lazy val `vcard`: MediaType = + new MediaType("text", "vcard", compressible = true, binary = false, List("vcard")) + + lazy val `rtploopback`: MediaType = + new MediaType("text", "rtploopback", compressible = false, binary = false) + + lazy val `cql-expression`: MediaType = + new MediaType("text", "cql-expression", compressible = false, binary = false) + + lazy val `x-opml`: MediaType = + new MediaType("text", "x-opml", compressible = false, binary = false, List("opml")) + + lazy val `event-stream`: MediaType = + new MediaType("text", "event-stream", compressible = true, binary = false) + + lazy val `slim`: MediaType = + new MediaType("text", "slim", compressible = false, binary = false, List("slim", "slm")) + + lazy val `x-pascal`: MediaType = + new MediaType("text", "x-pascal", compressible = false, binary = false, List("p", "pas")) + + lazy val `parityfec`: MediaType = + new MediaType("text", "parityfec", compressible = false, binary = false) + + lazy val `prs.prop.logic`: MediaType = + new MediaType("text", "prs.prop.logic", compressible = false, binary = false) + + lazy val `t140`: MediaType = + new MediaType("text", "t140", compressible = false, binary = false) + + lazy val `javascript`: MediaType = + new MediaType("text", "javascript", compressible = true, binary = false, List("js", "mjs")) + + lazy val `vnd.dmclientscript`: MediaType = + new MediaType("text", "vnd.dmclientscript", compressible = false, binary = false) + + lazy val `x-sfv`: MediaType = + new MediaType("text", "x-sfv", compressible = false, binary = false, List("sfv")) + + lazy val `flexfec`: MediaType = + new MediaType("text", "flexfec", compressible = false, binary = false) + + lazy val `spdx`: MediaType = + new MediaType("text", "spdx", compressible = false, binary = false, List("spdx")) + + lazy val `stylus`: MediaType = + new MediaType("text", "stylus", compressible = false, binary = false, List("stylus", "styl")) + + lazy val `coffeescript`: MediaType = + new MediaType("text", "coffeescript", compressible = false, binary = false, List("coffee", "litcoffee")) + + lazy val `yaml`: MediaType = + new MediaType("text", "yaml", compressible = true, binary = false, List("yaml", "yml")) + + lazy val `vnd.familysearch.gedcom`: MediaType = + new MediaType("text", "vnd.familysearch.gedcom", compressible = false, binary = false, List("ged")) + + lazy val `vnd.in3d.3dml`: MediaType = + new MediaType("text", "vnd.in3d.3dml", compressible = false, binary = false, List("3dml")) + + lazy val `x-c`: MediaType = + new MediaType( + "text", + "x-c", + compressible = false, + binary = false, + List("c", "cc", "cxx", "cpp", "h", "hh", "dic"), ) - lazy val `yang`: MediaType = - new MediaType("application", "yang", Compressible, NotBinary, List("yang")) - lazy val `yang-data+json`: MediaType = - new MediaType("application", "yang-data+json", Compressible, NotBinary) - lazy val `yang-data+xml`: MediaType = - new MediaType("application", "yang-data+xml", Compressible, NotBinary) - lazy val `yang-patch+json`: MediaType = - new MediaType("application", "yang-patch+json", Compressible, NotBinary) - lazy val `yang-patch+xml`: MediaType = - new MediaType("application", "yang-patch+xml", Compressible, NotBinary) - lazy val `yin+xml`: MediaType = - new MediaType("application", "yin+xml", Compressible, NotBinary, List("yin")) - lazy val `zip`: MediaType = - new MediaType("application", "zip", Uncompressible, Binary, List("zip")) - lazy val `zlib`: MediaType = new MediaType("application", "zlib", Compressible, NotBinary) - lazy val `zstd`: MediaType = new MediaType("application", "zstd", Compressible, NotBinary) - lazy val part_3: List[MediaType] = List( - `x-csh`, - `x-deb`, - `x-debian-package`, - `x-dgc-compressed`, - `x-director`, - `x-doom`, - `x-dtbncx+xml`, - `x-dtbook+xml`, - `x-dtbresource+xml`, - `x-dvi`, - `x-envoy`, - `x-eva`, - `x-font-bdf`, - `x-font-dos`, - `x-font-framemaker`, - `x-font-ghostscript`, - `x-font-libgrx`, - `x-font-linux-psf`, - `x-font-pcf`, - `x-font-snf`, - `x-font-speedo`, - `x-font-sunos-news`, - `x-font-type1`, - `x-font-vfont`, - `x-freearc`, - `x-futuresplash`, - `x-gca-compressed`, - `x-glulx`, - `x-gnumeric`, - `x-gramps-xml`, - `x-gtar`, - `x-gzip`, - `x-hdf`, - `x-httpd-php`, - `x-install-instructions`, - `x-iso9660-image`, - `x-java-archive-diff`, - `x-java-jnlp-file`, - `x-javascript`, - `x-keepass2`, - `x-latex`, - `x-lua-bytecode`, - `x-lzh-compressed`, - `x-makeself`, - `x-mie`, - `x-mobipocket-ebook`, - `x-mpegurl`, - `x-ms-application`, - `x-ms-shortcut`, - `x-ms-wmd`, - `x-ms-wmz`, - `x-ms-xbap`, - `x-msaccess`, - `x-msbinder`, - `x-mscardfile`, - `x-msclip`, - `x-msdos-program`, - `x-msdownload`, - `x-msmediaview`, - `x-msmetafile`, - `x-msmoney`, - `x-mspublisher`, - `x-msschedule`, - `x-msterminal`, - `x-mswrite`, - `x-netcdf`, - `x-ns-proxy-autoconfig`, - `x-nzb`, - `x-perl`, - `x-pilot`, - `x-pkcs12`, - `x-pkcs7-certificates`, - `x-pkcs7-certreqresp`, - `x-pki-message`, - `x-rar-compressed`, - `x-redhat-package-manager`, - `x-research-info-systems`, - `x-sea`, - `x-sh`, - `x-shar`, - `x-shockwave-flash`, - `x-silverlight-app`, - `x-sql`, - `x-stuffit`, - `x-stuffitx`, - `x-subrip`, - `x-sv4cpio`, - `x-sv4crc`, - `x-t3vm-image`, - `x-tads`, - `x-tar`, - `x-tcl`, - `x-tex`, - `x-tex-tfm`, - `x-texinfo`, - `x-tgif`, - `x-ustar`, - `x-virtualbox-hdd`, - `x-virtualbox-ova`, - `x-virtualbox-ovf`, - `x-virtualbox-vbox`, - `x-virtualbox-vbox-extpack`, - `x-virtualbox-vdi`, - `x-virtualbox-vhd`, - `x-virtualbox-vmdk`, - `x-wais-source`, - `x-web-app-manifest+json`, - `x-www-form-urlencoded`, - `x-x509-ca-cert`, - `x-x509-ca-ra-cert`, - `x-x509-next-ca-cert`, - `x-xfig`, - `x-xliff+xml`, - `x-xpinstall`, - `x-xz`, - `x-zmachine`, - `x400-bp`, - `xacml+xml`, - `xaml+xml`, - `xcap-att+xml`, - `xcap-caps+xml`, - `xcap-diff+xml`, - `xcap-el+xml`, - `xcap-error+xml`, - `xcap-ns+xml`, - `xcon-conference-info+xml`, - `xcon-conference-info-diff+xml`, - `xenc+xml`, - `xhtml+xml`, - `xhtml-voice+xml`, - `xliff+xml`, - `xml`, - `xml-dtd`, - `xml-external-parsed-entity`, - `xml-patch+xml`, - `xmpp+xml`, - `xop+xml`, - `xproc+xml`, - `xslt+xml`, - `xspf+xml`, - `xv+xml`, - `yang`, - `yang-data+json`, - `yang-data+xml`, - `yang-patch+json`, - `yang-patch+xml`, - `yin+xml`, - `zip`, - `zlib`, - `zstd`, + + lazy val `x-gwt-rpc`: MediaType = + new MediaType("text", "x-gwt-rpc", compressible = true, binary = false) + + lazy val `grammar-ref-list`: MediaType = + new MediaType("text", "grammar-ref-list", compressible = false, binary = false) + + lazy val `plain`: MediaType = + new MediaType( + "text", + "plain", + compressible = true, + binary = false, + List("txt", "text", "conf", "def", "list", "log", "in", "ini"), ) - } + + lazy val `vnd.in3d.spot`: MediaType = + new MediaType("text", "vnd.in3d.spot", compressible = false, binary = false, List("spot")) + + lazy val `x-asm`: MediaType = + new MediaType("text", "x-asm", compressible = false, binary = false, List("s", "asm")) + + lazy val `x-scss`: MediaType = + new MediaType("text", "x-scss", compressible = false, binary = false, List("scss")) + + lazy val `gff3`: MediaType = + new MediaType("text", "gff3", compressible = false, binary = false) + + lazy val `vnd.trolltech.linguist`: MediaType = + new MediaType("text", "vnd.trolltech.linguist", compressible = false, binary = false) + + lazy val `jsx`: MediaType = + new MediaType("text", "jsx", compressible = true, binary = false, List("jsx")) + + lazy val `vnd.debian.copyright`: MediaType = + new MediaType("text", "vnd.debian.copyright", compressible = false, binary = false) + + lazy val `enriched`: MediaType = + new MediaType("text", "enriched", compressible = false, binary = false) + + lazy val `vnd.curl`: MediaType = + new MediaType("text", "vnd.curl", compressible = false, binary = false, List("curl")) + + lazy val `x-component`: MediaType = + new MediaType("text", "x-component", compressible = false, binary = false, List("htc")) + + lazy val `mdx`: MediaType = + new MediaType("text", "mdx", compressible = true, binary = false, List("mdx")) + + lazy val `jade`: MediaType = + new MediaType("text", "jade", compressible = false, binary = false, List("jade")) + + lazy val `hl7v2`: MediaType = + new MediaType("text", "hl7v2", compressible = false, binary = false) + + lazy val `x-suse-ymp`: MediaType = + new MediaType("text", "x-suse-ymp", compressible = true, binary = false, List("ymp")) + + lazy val `rtx`: MediaType = + new MediaType("text", "rtx", compressible = false, binary = false) + + lazy val `vnd.ficlab.flt`: MediaType = + new MediaType("text", "vnd.ficlab.flt", compressible = false, binary = false) + + lazy val `html`: MediaType = + new MediaType("text", "html", compressible = true, binary = false, List("html", "htm", "shtml")) + + lazy val `1d-interleaved-parityfec`: MediaType = + new MediaType("text", "1d-interleaved-parityfec", compressible = false, binary = false) + + lazy val `vnd.ascii-art`: MediaType = + new MediaType("text", "vnd.ascii-art", compressible = false, binary = false) + + lazy val `x-nfo`: MediaType = + new MediaType("text", "x-nfo", compressible = false, binary = false, List("nfo")) + + lazy val `mizar`: MediaType = + new MediaType("text", "mizar", compressible = false, binary = false) + + lazy val `sgml`: MediaType = + new MediaType("text", "sgml", compressible = false, binary = false, List("sgml", "sgm")) + + lazy val `vnd.motorola.reflex`: MediaType = + new MediaType("text", "vnd.motorola.reflex", compressible = false, binary = false) + + lazy val `vnd.hgl`: MediaType = + new MediaType("text", "vnd.hgl", compressible = false, binary = false) + + lazy val `vnd.abc`: MediaType = + new MediaType("text", "vnd.abc", compressible = false, binary = false) + + lazy val `vnd.net2phone.commcenter.command`: MediaType = + new MediaType("text", "vnd.net2phone.commcenter.command", compressible = false, binary = false) + + lazy val `prs.lines.tag`: MediaType = + new MediaType("text", "prs.lines.tag", compressible = false, binary = false, List("dsc")) + + lazy val `vnd.iptc.nitf`: MediaType = + new MediaType("text", "vnd.iptc.nitf", compressible = false, binary = false) + + lazy val `vnd.wap.si`: MediaType = + new MediaType("text", "vnd.wap.si", compressible = false, binary = false) + + lazy val `richtext`: MediaType = + new MediaType("text", "richtext", compressible = true, binary = false, List("rtx")) + + lazy val `vnd.curl.mcurl`: MediaType = + new MediaType("text", "vnd.curl.mcurl", compressible = false, binary = false, List("mcurl")) + + lazy val `vnd.ms-mediapackage`: MediaType = + new MediaType("text", "vnd.ms-mediapackage", compressible = false, binary = false) + + lazy val `n3`: MediaType = + new MediaType("text", "n3", compressible = true, binary = false, List("n3")) + + lazy val `vtt`: MediaType = + new MediaType("text", "vtt", compressible = true, binary = false, List("vtt")) + + lazy val `fwdred`: MediaType = + new MediaType("text", "fwdred", compressible = false, binary = false) + + lazy val `prs.fallenstein.rst`: MediaType = + new MediaType("text", "prs.fallenstein.rst", compressible = false, binary = false) + + lazy val `mathml`: MediaType = + new MediaType("text", "mathml", compressible = false, binary = false, List("mml")) + + lazy val `vnd.si.uricatalogue`: MediaType = + new MediaType("text", "vnd.si.uricatalogue", compressible = false, binary = false) + + lazy val `xml`: MediaType = + new MediaType("text", "xml", compressible = true, binary = false, List("xml")) + + lazy val `rtf`: MediaType = + new MediaType("text", "rtf", compressible = true, binary = false, List("rtf")) + + lazy val `x-uuencode`: MediaType = + new MediaType("text", "x-uuencode", compressible = false, binary = false, List("uu")) + + lazy val `troff`: MediaType = + new MediaType("text", "troff", compressible = false, binary = false, List("t", "tr", "roff", "man", "me", "ms")) + + lazy val `x-jquery-tmpl`: MediaType = + new MediaType("text", "x-jquery-tmpl", compressible = true, binary = false) + + lazy val `x-org`: MediaType = + new MediaType("text", "x-org", compressible = true, binary = false, List("org")) + + lazy val `calendar`: MediaType = + new MediaType("text", "calendar", compressible = false, binary = false, List("ics", "ifb")) + + lazy val `raptorfec`: MediaType = + new MediaType("text", "raptorfec", compressible = false, binary = false) + + lazy val all: List[MediaType] = List( + `vnd.wap.wmlscript`, + `ulpfec`, + `vnd.radisys.msml-basic-layout`, + `shex`, + `shaclc`, + `vnd.curl.dcurl`, + `xml-external-parsed-entity`, + `fhirpath`, + `turtle`, + `vnd.sun.j2me.app-descriptor`, + `x-sass`, + `x-vcard`, + `vnd.a`, + `uri-list`, + `calender`, + `markdown`, + `vnd.dvb.subtitle`, + `ecmascript`, + `x-processing`, + `cmd`, + `tab-separated-values`, + `less`, + `cache-manifest`, + `vnd.wap.sl`, + `dns`, + `strings`, + `csv`, + `vnd.gml`, + `x-setext`, + `x-lua`, + `x-vcalendar`, + `vnd.exchangeable`, + `wgsl`, + `rfc822-headers`, + `vnd.graphviz`, + `red`, + `x-fortran`, + `cql`, + `vnd.esmertec.theme-descriptor`, + `directory`, + `css`, + `vnd.latex-z`, + `vnd.fly`, + `vnd.senx.warpscript`, + `vnd.sosi`, + `parameters`, + `provenance-notation`, + `x-markdown`, + `x-handlebars-template`, + `csv-schema`, + `rtp-enc-aescm128`, + `jcr-cnd`, + `vnd.hans`, + `x-java-source`, + `vnd.curl.scurl`, + `encaprtp`, + `vnd.iptc.newsml`, + `vnd.fmi.flexstor`, + `vnd.wap.wml`, + `cql-identifier`, + `vcard`, + `rtploopback`, + `cql-expression`, + `x-opml`, + `event-stream`, + `slim`, + `x-pascal`, + `parityfec`, + `prs.prop.logic`, + `t140`, + `javascript`, + `vnd.dmclientscript`, + `x-sfv`, + `flexfec`, + `spdx`, + `stylus`, + `coffeescript`, + `yaml`, + `vnd.familysearch.gedcom`, + `vnd.in3d.3dml`, + `x-c`, + `x-gwt-rpc`, + `grammar-ref-list`, + `plain`, + `vnd.in3d.spot`, + `x-asm`, + `x-scss`, + `gff3`, + `vnd.trolltech.linguist`, + `jsx`, + `vnd.debian.copyright`, + `enriched`, + `vnd.curl`, + `x-component`, + `mdx`, + `jade`, + `hl7v2`, + `x-suse-ymp`, + `rtx`, + `vnd.ficlab.flt`, + `html`, + `1d-interleaved-parityfec`, + `vnd.ascii-art`, + `x-nfo`, + `mizar`, + `sgml`, + `vnd.motorola.reflex`, + `vnd.hgl`, + `vnd.abc`, + `vnd.net2phone.commcenter.command`, + `prs.lines.tag`, + `vnd.iptc.nitf`, + `vnd.wap.si`, + `richtext`, + `vnd.curl.mcurl`, + `vnd.ms-mediapackage`, + `n3`, + `vtt`, + `fwdred`, + `prs.fallenstein.rst`, + `mathml`, + `vnd.si.uricatalogue`, + `xml`, + `rtf`, + `x-uuencode`, + `troff`, + `x-jquery-tmpl`, + `x-org`, + `calendar`, + `raptorfec`, + ) + lazy val any: MediaType = new MediaType("text", "*") } - object application - extends application_parts.application_0 - with application_parts.application_1 - with application_parts.application_2 - with application_parts.application_3 { - lazy val all: List[MediaType] = Nil ++ part_0 ++ part_1 ++ part_2 ++ part_3 - lazy val any: MediaType = new MediaType("application", "*") + + object font { + + lazy val `woff`: MediaType = + new MediaType("font", "woff", compressible = false, binary = true, List("woff")) + + lazy val `ttf`: MediaType = + new MediaType("font", "ttf", compressible = true, binary = true, List("ttf")) + + lazy val `otf`: MediaType = + new MediaType("font", "otf", compressible = true, binary = true, List("otf")) + + lazy val `woff2`: MediaType = + new MediaType("font", "woff2", compressible = false, binary = true, List("woff2")) + + lazy val `collection`: MediaType = + new MediaType("font", "collection", compressible = false, binary = true, List("ttc")) + + lazy val `sfnt`: MediaType = + new MediaType("font", "sfnt", compressible = false, binary = true) + + lazy val all: List[MediaType] = List(`woff`, `ttf`, `otf`, `woff2`, `collection`, `sfnt`) + lazy val any: MediaType = new MediaType("font", "*") } - object audio { + + object video { + + lazy val `vnd.dlna.mpeg-tts`: MediaType = + new MediaType("video", "vnd.dlna.mpeg-tts", compressible = false, binary = true) + + lazy val `vnd.dece.video`: MediaType = + new MediaType("video", "vnd.dece.video", compressible = false, binary = true, List("uvv", "uvvv")) + lazy val `1d-interleaved-parityfec`: MediaType = - new MediaType("audio", "1d-interleaved-parityfec", Compressible, Binary) - lazy val `32kadpcm`: MediaType = new MediaType("audio", "32kadpcm", Compressible, Binary) - lazy val `3gpp`: MediaType = - new MediaType("audio", "3gpp", Uncompressible, Binary, List("3gpp")) - lazy val `3gpp2`: MediaType = new MediaType("audio", "3gpp2", Compressible, Binary) - lazy val `aac`: MediaType = new MediaType("audio", "aac", Compressible, Binary) - lazy val `ac3`: MediaType = new MediaType("audio", "ac3", Compressible, Binary) - lazy val `adpcm`: MediaType = new MediaType("audio", "adpcm", Compressible, Binary, List("adp")) - lazy val `amr`: MediaType = new MediaType("audio", "amr", Compressible, Binary, List("amr")) - lazy val `amr-wb`: MediaType = new MediaType("audio", "amr-wb", Compressible, Binary) - lazy val `amr-wb+` : MediaType = new MediaType("audio", "amr-wb+", Compressible, Binary) - lazy val `aptx`: MediaType = new MediaType("audio", "aptx", Compressible, Binary) - lazy val `asc`: MediaType = new MediaType("audio", "asc", Compressible, Binary) - lazy val `atrac-advanced-lossless`: MediaType = - new MediaType("audio", "atrac-advanced-lossless", Compressible, Binary) - lazy val `atrac-x`: MediaType = new MediaType("audio", "atrac-x", Compressible, Binary) - lazy val `atrac3`: MediaType = new MediaType("audio", "atrac3", Compressible, Binary) - lazy val `basic`: MediaType = - new MediaType("audio", "basic", Uncompressible, Binary, List("au", "snd")) - lazy val `bv16`: MediaType = new MediaType("audio", "bv16", Compressible, Binary) - lazy val `bv32`: MediaType = new MediaType("audio", "bv32", Compressible, Binary) - lazy val `clearmode`: MediaType = new MediaType("audio", "clearmode", Compressible, Binary) - lazy val `cn`: MediaType = new MediaType("audio", "cn", Compressible, Binary) - lazy val `dat12`: MediaType = new MediaType("audio", "dat12", Compressible, Binary) - lazy val `dls`: MediaType = new MediaType("audio", "dls", Compressible, Binary) - lazy val `dsr-es201108`: MediaType = - new MediaType("audio", "dsr-es201108", Compressible, Binary) - lazy val `dsr-es202050`: MediaType = - new MediaType("audio", "dsr-es202050", Compressible, Binary) - lazy val `dsr-es202211`: MediaType = - new MediaType("audio", "dsr-es202211", Compressible, Binary) - lazy val `dsr-es202212`: MediaType = - new MediaType("audio", "dsr-es202212", Compressible, Binary) - lazy val `dv`: MediaType = new MediaType("audio", "dv", Compressible, Binary) - lazy val `dvi4`: MediaType = new MediaType("audio", "dvi4", Compressible, Binary) - lazy val `eac3`: MediaType = new MediaType("audio", "eac3", Compressible, Binary) - lazy val `encaprtp`: MediaType = new MediaType("audio", "encaprtp", Compressible, Binary) - lazy val `evrc`: MediaType = new MediaType("audio", "evrc", Compressible, Binary) - lazy val `evrc-qcp`: MediaType = new MediaType("audio", "evrc-qcp", Compressible, Binary) - lazy val `evrc0`: MediaType = new MediaType("audio", "evrc0", Compressible, Binary) - lazy val `evrc1`: MediaType = new MediaType("audio", "evrc1", Compressible, Binary) - lazy val `evrcb`: MediaType = new MediaType("audio", "evrcb", Compressible, Binary) - lazy val `evrcb0`: MediaType = new MediaType("audio", "evrcb0", Compressible, Binary) - lazy val `evrcb1`: MediaType = new MediaType("audio", "evrcb1", Compressible, Binary) - lazy val `evrcnw`: MediaType = new MediaType("audio", "evrcnw", Compressible, Binary) - lazy val `evrcnw0`: MediaType = new MediaType("audio", "evrcnw0", Compressible, Binary) - lazy val `evrcnw1`: MediaType = new MediaType("audio", "evrcnw1", Compressible, Binary) - lazy val `evrcwb`: MediaType = new MediaType("audio", "evrcwb", Compressible, Binary) - lazy val `evrcwb0`: MediaType = new MediaType("audio", "evrcwb0", Compressible, Binary) - lazy val `evrcwb1`: MediaType = new MediaType("audio", "evrcwb1", Compressible, Binary) - lazy val `evs`: MediaType = new MediaType("audio", "evs", Compressible, Binary) - lazy val `flexfec`: MediaType = new MediaType("audio", "flexfec", Compressible, Binary) - lazy val `fwdred`: MediaType = new MediaType("audio", "fwdred", Compressible, Binary) - lazy val `g711-0`: MediaType = new MediaType("audio", "g711-0", Compressible, Binary) - lazy val `g719`: MediaType = new MediaType("audio", "g719", Compressible, Binary) - lazy val `g722`: MediaType = new MediaType("audio", "g722", Compressible, Binary) - lazy val `g7221`: MediaType = new MediaType("audio", "g7221", Compressible, Binary) - lazy val `g723`: MediaType = new MediaType("audio", "g723", Compressible, Binary) - lazy val `g726-16`: MediaType = new MediaType("audio", "g726-16", Compressible, Binary) - lazy val `g726-24`: MediaType = new MediaType("audio", "g726-24", Compressible, Binary) - lazy val `g726-32`: MediaType = new MediaType("audio", "g726-32", Compressible, Binary) - lazy val `g726-40`: MediaType = new MediaType("audio", "g726-40", Compressible, Binary) - lazy val `g728`: MediaType = new MediaType("audio", "g728", Compressible, Binary) - lazy val `g729`: MediaType = new MediaType("audio", "g729", Compressible, Binary) - lazy val `g7291`: MediaType = new MediaType("audio", "g7291", Compressible, Binary) - lazy val `g729d`: MediaType = new MediaType("audio", "g729d", Compressible, Binary) - lazy val `g729e`: MediaType = new MediaType("audio", "g729e", Compressible, Binary) - lazy val `gsm`: MediaType = new MediaType("audio", "gsm", Compressible, Binary) - lazy val `gsm-efr`: MediaType = new MediaType("audio", "gsm-efr", Compressible, Binary) - lazy val `gsm-hr-08`: MediaType = new MediaType("audio", "gsm-hr-08", Compressible, Binary) - lazy val `ilbc`: MediaType = new MediaType("audio", "ilbc", Compressible, Binary) - lazy val `ip-mr_v2.5`: MediaType = new MediaType("audio", "ip-mr_v2.5", Compressible, Binary) - lazy val `isac`: MediaType = new MediaType("audio", "isac", Compressible, Binary) - lazy val `l16`: MediaType = new MediaType("audio", "l16", Compressible, Binary) - lazy val `l20`: MediaType = new MediaType("audio", "l20", Compressible, Binary) - lazy val `l24`: MediaType = new MediaType("audio", "l24", Uncompressible, Binary) - lazy val `l8`: MediaType = new MediaType("audio", "l8", Compressible, Binary) - lazy val `lpc`: MediaType = new MediaType("audio", "lpc", Compressible, Binary) - lazy val `melp`: MediaType = new MediaType("audio", "melp", Compressible, Binary) - lazy val `melp1200`: MediaType = new MediaType("audio", "melp1200", Compressible, Binary) - lazy val `melp2400`: MediaType = new MediaType("audio", "melp2400", Compressible, Binary) - lazy val `melp600`: MediaType = new MediaType("audio", "melp600", Compressible, Binary) - lazy val `mhas`: MediaType = new MediaType("audio", "mhas", Compressible, Binary) - lazy val `midi`: MediaType = - new MediaType("audio", "midi", Compressible, Binary, List("mid", "midi", "kar", "rmi")) - lazy val `mobile-xmf`: MediaType = - new MediaType("audio", "mobile-xmf", Compressible, Binary, List("mxmf")) - lazy val `mp3`: MediaType = new MediaType("audio", "mp3", Uncompressible, Binary, List("mp3")) - lazy val `mp4`: MediaType = - new MediaType("audio", "mp4", Uncompressible, Binary, List("m4a", "mp4a")) - lazy val `mp4a-latm`: MediaType = new MediaType("audio", "mp4a-latm", Compressible, Binary) - lazy val `mpa`: MediaType = new MediaType("audio", "mpa", Compressible, Binary) - lazy val `mpa-robust`: MediaType = new MediaType("audio", "mpa-robust", Compressible, Binary) - lazy val `mpeg`: MediaType = new MediaType( - "audio", - "mpeg", - Uncompressible, - Binary, - List("mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"), - ) - lazy val `mpeg4-generic`: MediaType = - new MediaType("audio", "mpeg4-generic", Compressible, Binary) - lazy val `musepack`: MediaType = new MediaType("audio", "musepack", Compressible, Binary) - lazy val `ogg`: MediaType = - new MediaType("audio", "ogg", Uncompressible, Binary, List("oga", "ogg", "spx", "opus")) - lazy val `opus`: MediaType = new MediaType("audio", "opus", Compressible, Binary) - lazy val `parityfec`: MediaType = new MediaType("audio", "parityfec", Compressible, Binary) - lazy val `pcma`: MediaType = new MediaType("audio", "pcma", Compressible, Binary) - lazy val `pcma-wb`: MediaType = new MediaType("audio", "pcma-wb", Compressible, Binary) - lazy val `pcmu`: MediaType = new MediaType("audio", "pcmu", Compressible, Binary) - lazy val `pcmu-wb`: MediaType = new MediaType("audio", "pcmu-wb", Compressible, Binary) - lazy val `prs.sid`: MediaType = new MediaType("audio", "prs.sid", Compressible, Binary) - lazy val `qcelp`: MediaType = new MediaType("audio", "qcelp", Compressible, Binary) - lazy val `raptorfec`: MediaType = new MediaType("audio", "raptorfec", Compressible, Binary) - lazy val `red`: MediaType = new MediaType("audio", "red", Compressible, Binary) - lazy val `rtp-enc-aescm128`: MediaType = - new MediaType("audio", "rtp-enc-aescm128", Compressible, Binary) - lazy val `rtp-midi`: MediaType = new MediaType("audio", "rtp-midi", Compressible, Binary) - lazy val `rtploopback`: MediaType = new MediaType("audio", "rtploopback", Compressible, Binary) - lazy val `rtx`: MediaType = new MediaType("audio", "rtx", Compressible, Binary) - lazy val `s3m`: MediaType = new MediaType("audio", "s3m", Compressible, Binary, List("s3m")) - lazy val `scip`: MediaType = new MediaType("audio", "scip", Compressible, Binary) - lazy val `silk`: MediaType = new MediaType("audio", "silk", Compressible, Binary, List("sil")) - lazy val `smv`: MediaType = new MediaType("audio", "smv", Compressible, Binary) - lazy val `smv-qcp`: MediaType = new MediaType("audio", "smv-qcp", Compressible, Binary) - lazy val `smv0`: MediaType = new MediaType("audio", "smv0", Compressible, Binary) - lazy val `sofa`: MediaType = new MediaType("audio", "sofa", Compressible, Binary) - lazy val `sp-midi`: MediaType = new MediaType("audio", "sp-midi", Compressible, Binary) - lazy val `speex`: MediaType = new MediaType("audio", "speex", Compressible, Binary) - lazy val `t140c`: MediaType = new MediaType("audio", "t140c", Compressible, Binary) - lazy val `t38`: MediaType = new MediaType("audio", "t38", Compressible, Binary) - lazy val `telephone-event`: MediaType = - new MediaType("audio", "telephone-event", Compressible, Binary) - lazy val `tetra_acelp`: MediaType = new MediaType("audio", "tetra_acelp", Compressible, Binary) - lazy val `tetra_acelp_bb`: MediaType = - new MediaType("audio", "tetra_acelp_bb", Compressible, Binary) - lazy val `tone`: MediaType = new MediaType("audio", "tone", Compressible, Binary) - lazy val `tsvcis`: MediaType = new MediaType("audio", "tsvcis", Compressible, Binary) - lazy val `uemclip`: MediaType = new MediaType("audio", "uemclip", Compressible, Binary) - lazy val `ulpfec`: MediaType = new MediaType("audio", "ulpfec", Compressible, Binary) - lazy val `usac`: MediaType = new MediaType("audio", "usac", Compressible, Binary) - lazy val `vdvi`: MediaType = new MediaType("audio", "vdvi", Compressible, Binary) - lazy val `vmr-wb`: MediaType = new MediaType("audio", "vmr-wb", Compressible, Binary) - lazy val `vnd.3gpp.iufp`: MediaType = - new MediaType("audio", "vnd.3gpp.iufp", Compressible, Binary) - lazy val `vnd.4sb`: MediaType = new MediaType("audio", "vnd.4sb", Compressible, Binary) - lazy val `vnd.audiokoz`: MediaType = - new MediaType("audio", "vnd.audiokoz", Compressible, Binary) - lazy val `vnd.celp`: MediaType = new MediaType("audio", "vnd.celp", Compressible, Binary) - lazy val `vnd.cisco.nse`: MediaType = - new MediaType("audio", "vnd.cisco.nse", Compressible, Binary) - lazy val `vnd.cmles.radio-events`: MediaType = - new MediaType("audio", "vnd.cmles.radio-events", Compressible, Binary) - lazy val `vnd.cns.anp1`: MediaType = - new MediaType("audio", "vnd.cns.anp1", Compressible, Binary) - lazy val `vnd.cns.inf1`: MediaType = - new MediaType("audio", "vnd.cns.inf1", Compressible, Binary) - lazy val `vnd.dece.audio`: MediaType = - new MediaType("audio", "vnd.dece.audio", Compressible, Binary, List("uva", "uvva")) - lazy val `vnd.digital-winds`: MediaType = - new MediaType("audio", "vnd.digital-winds", Compressible, Binary, List("eol")) - lazy val `vnd.dlna.adts`: MediaType = - new MediaType("audio", "vnd.dlna.adts", Compressible, Binary) - lazy val `vnd.dolby.heaac.1`: MediaType = - new MediaType("audio", "vnd.dolby.heaac.1", Compressible, Binary) - lazy val `vnd.dolby.heaac.2`: MediaType = - new MediaType("audio", "vnd.dolby.heaac.2", Compressible, Binary) - lazy val `vnd.dolby.mlp`: MediaType = - new MediaType("audio", "vnd.dolby.mlp", Compressible, Binary) - lazy val `vnd.dolby.mps`: MediaType = - new MediaType("audio", "vnd.dolby.mps", Compressible, Binary) - lazy val `vnd.dolby.pl2`: MediaType = - new MediaType("audio", "vnd.dolby.pl2", Compressible, Binary) - lazy val `vnd.dolby.pl2x`: MediaType = - new MediaType("audio", "vnd.dolby.pl2x", Compressible, Binary) - lazy val `vnd.dolby.pl2z`: MediaType = - new MediaType("audio", "vnd.dolby.pl2z", Compressible, Binary) - lazy val `vnd.dolby.pulse.1`: MediaType = - new MediaType("audio", "vnd.dolby.pulse.1", Compressible, Binary) - lazy val `vnd.dra`: MediaType = - new MediaType("audio", "vnd.dra", Compressible, Binary, List("dra")) - lazy val `vnd.dts`: MediaType = - new MediaType("audio", "vnd.dts", Compressible, Binary, List("dts")) - lazy val `vnd.dts.hd`: MediaType = - new MediaType("audio", "vnd.dts.hd", Compressible, Binary, List("dtshd")) - lazy val `vnd.dts.uhd`: MediaType = new MediaType("audio", "vnd.dts.uhd", Compressible, Binary) - lazy val `vnd.dvb.file`: MediaType = - new MediaType("audio", "vnd.dvb.file", Compressible, Binary) - lazy val `vnd.everad.plj`: MediaType = - new MediaType("audio", "vnd.everad.plj", Compressible, Binary) - lazy val `vnd.hns.audio`: MediaType = - new MediaType("audio", "vnd.hns.audio", Compressible, Binary) - lazy val `vnd.lucent.voice`: MediaType = - new MediaType("audio", "vnd.lucent.voice", Compressible, Binary, List("lvp")) - lazy val `vnd.ms-playready.media.pya`: MediaType = - new MediaType("audio", "vnd.ms-playready.media.pya", Compressible, Binary, List("pya")) - lazy val `vnd.nokia.mobile-xmf`: MediaType = - new MediaType("audio", "vnd.nokia.mobile-xmf", Compressible, Binary) - lazy val `vnd.nortel.vbk`: MediaType = - new MediaType("audio", "vnd.nortel.vbk", Compressible, Binary) - lazy val `vnd.nuera.ecelp4800`: MediaType = - new MediaType("audio", "vnd.nuera.ecelp4800", Compressible, Binary, List("ecelp4800")) - lazy val `vnd.nuera.ecelp7470`: MediaType = - new MediaType("audio", "vnd.nuera.ecelp7470", Compressible, Binary, List("ecelp7470")) - lazy val `vnd.nuera.ecelp9600`: MediaType = - new MediaType("audio", "vnd.nuera.ecelp9600", Compressible, Binary, List("ecelp9600")) - lazy val `vnd.octel.sbc`: MediaType = - new MediaType("audio", "vnd.octel.sbc", Compressible, Binary) - lazy val `vnd.presonus.multitrack`: MediaType = - new MediaType("audio", "vnd.presonus.multitrack", Compressible, Binary) - lazy val `vnd.qcelp`: MediaType = new MediaType("audio", "vnd.qcelp", Compressible, Binary) - lazy val `vnd.rhetorex.32kadpcm`: MediaType = - new MediaType("audio", "vnd.rhetorex.32kadpcm", Compressible, Binary) - lazy val `vnd.rip`: MediaType = - new MediaType("audio", "vnd.rip", Compressible, Binary, List("rip")) - lazy val `vnd.rn-realaudio`: MediaType = - new MediaType("audio", "vnd.rn-realaudio", Uncompressible, Binary) - lazy val `vnd.sealedmedia.softseal.mpeg`: MediaType = - new MediaType("audio", "vnd.sealedmedia.softseal.mpeg", Compressible, Binary) - lazy val `vnd.vmx.cvsd`: MediaType = - new MediaType("audio", "vnd.vmx.cvsd", Compressible, Binary) - lazy val `vnd.wave`: MediaType = new MediaType("audio", "vnd.wave", Uncompressible, Binary) - lazy val `vorbis`: MediaType = new MediaType("audio", "vorbis", Uncompressible, Binary) - lazy val `vorbis-config`: MediaType = - new MediaType("audio", "vorbis-config", Compressible, Binary) - lazy val `wav`: MediaType = new MediaType("audio", "wav", Uncompressible, Binary, List("wav")) - lazy val `wave`: MediaType = new MediaType("audio", "wave", Uncompressible, Binary, List("wav")) - lazy val `webm`: MediaType = - new MediaType("audio", "webm", Uncompressible, Binary, List("weba")) - lazy val `x-aac`: MediaType = - new MediaType("audio", "x-aac", Uncompressible, Binary, List("aac")) - lazy val `x-aiff`: MediaType = - new MediaType("audio", "x-aiff", Compressible, Binary, List("aif", "aiff", "aifc")) - lazy val `x-caf`: MediaType = - new MediaType("audio", "x-caf", Uncompressible, Binary, List("caf")) - lazy val `x-flac`: MediaType = - new MediaType("audio", "x-flac", Compressible, Binary, List("flac")) - lazy val `x-m4a`: MediaType = new MediaType("audio", "x-m4a", Compressible, Binary, List("m4a")) - lazy val `x-matroska`: MediaType = - new MediaType("audio", "x-matroska", Compressible, Binary, List("mka")) - lazy val `x-mpegurl`: MediaType = - new MediaType("audio", "x-mpegurl", Compressible, Binary, List("m3u")) - lazy val `x-ms-wax`: MediaType = - new MediaType("audio", "x-ms-wax", Compressible, Binary, List("wax")) - lazy val `x-ms-wma`: MediaType = - new MediaType("audio", "x-ms-wma", Compressible, Binary, List("wma")) - lazy val `x-pn-realaudio`: MediaType = - new MediaType("audio", "x-pn-realaudio", Compressible, Binary, List("ram", "ra")) - lazy val `x-pn-realaudio-plugin`: MediaType = - new MediaType("audio", "x-pn-realaudio-plugin", Compressible, Binary, List("rmp")) - lazy val `x-realaudio`: MediaType = - new MediaType("audio", "x-realaudio", Compressible, Binary, List("ra")) - lazy val `x-tta`: MediaType = new MediaType("audio", "x-tta", Compressible, Binary) - lazy val `x-wav`: MediaType = new MediaType("audio", "x-wav", Compressible, Binary, List("wav")) - lazy val `xm`: MediaType = new MediaType("audio", "xm", Compressible, Binary, List("xm")) - lazy val all: List[MediaType] = List( + new MediaType("video", "1d-interleaved-parityfec", compressible = false, binary = true) + + lazy val `nv`: MediaType = + new MediaType("video", "nv", compressible = false, binary = true) + + lazy val `vnd.directv.mpeg-tts`: MediaType = + new MediaType("video", "vnd.directv.mpeg-tts", compressible = false, binary = true) + + lazy val `bmpeg`: MediaType = + new MediaType("video", "bmpeg", compressible = false, binary = true) + + lazy val `quicktime`: MediaType = + new MediaType("video", "quicktime", compressible = false, binary = true, List("qt", "mov")) + + lazy val `h264`: MediaType = + new MediaType("video", "h264", compressible = false, binary = true, List("h264")) + + lazy val `vnd.ms-playready.media.pyv`: MediaType = + new MediaType("video", "vnd.ms-playready.media.pyv", compressible = false, binary = true, List("pyv")) + + lazy val `rtp-enc-aescm128`: MediaType = + new MediaType("video", "rtp-enc-aescm128", compressible = false, binary = true) + + lazy val `x-mng`: MediaType = + new MediaType("video", "x-mng", compressible = false, binary = true, List("mng")) + + lazy val `celb`: MediaType = + new MediaType("video", "celb", compressible = false, binary = true) + + lazy val `raptorfec`: MediaType = + new MediaType("video", "raptorfec", compressible = false, binary = true) + + lazy val `vnd.dece.pd`: MediaType = + new MediaType("video", "vnd.dece.pd", compressible = false, binary = true, List("uvp", "uvvp")) + + lazy val `mpeg`: MediaType = + new MediaType("video", "mpeg", compressible = false, binary = true, List("mpeg", "mpg", "mpe", "m1v", "m2v")) + + lazy val `smpte291`: MediaType = + new MediaType("video", "smpte291", compressible = false, binary = true) + + lazy val `vnd.dece.mp4`: MediaType = + new MediaType("video", "vnd.dece.mp4", compressible = false, binary = true) + + lazy val `encaprtp`: MediaType = + new MediaType("video", "encaprtp", compressible = false, binary = true) + + lazy val `vnd.dece.hd`: MediaType = + new MediaType("video", "vnd.dece.hd", compressible = false, binary = true, List("uvh", "uvvh")) + + lazy val `h263-2000`: MediaType = + new MediaType("video", "h263-2000", compressible = false, binary = true) + + lazy val `vnd.iptvforum.2dparityfec-1010`: MediaType = + new MediaType("video", "vnd.iptvforum.2dparityfec-1010", compressible = false, binary = true) + + lazy val `vnd.mpegurl`: MediaType = + new MediaType("video", "vnd.mpegurl", compressible = false, binary = true, List("mxu", "m4u")) + + lazy val `jxsv`: MediaType = + new MediaType("video", "jxsv", compressible = false, binary = true) + + lazy val `vnd.nokia.interleaved-multimedia`: MediaType = + new MediaType("video", "vnd.nokia.interleaved-multimedia", compressible = false, binary = true) + + lazy val `bt656`: MediaType = + new MediaType("video", "bt656", compressible = false, binary = true) + + lazy val `x-sgi-movie`: MediaType = + new MediaType("video", "x-sgi-movie", compressible = false, binary = true, List("movie")) + + lazy val `x-fli`: MediaType = + new MediaType("video", "x-fli", compressible = false, binary = true, List("fli")) + + lazy val `vnd.youtube.yt`: MediaType = + new MediaType("video", "vnd.youtube.yt", compressible = false, binary = true) + + lazy val `vnd.iptvforum.ttsavc`: MediaType = + new MediaType("video", "vnd.iptvforum.ttsavc", compressible = false, binary = true) + + lazy val `h261`: MediaType = + new MediaType("video", "h261", compressible = false, binary = true, List("h261")) + + lazy val `parityfec`: MediaType = + new MediaType("video", "parityfec", compressible = false, binary = true) + + lazy val `3gpp-tt`: MediaType = + new MediaType("video", "3gpp-tt", compressible = false, binary = true) + + lazy val `3gpp2`: MediaType = + new MediaType("video", "3gpp2", compressible = false, binary = true, List("3g2")) + + lazy val `x-ms-wmv`: MediaType = + new MediaType("video", "x-ms-wmv", compressible = false, binary = true, List("wmv")) + + lazy val `vnd.nokia.mp4vr`: MediaType = + new MediaType("video", "vnd.nokia.mp4vr", compressible = false, binary = true) + + lazy val `h265`: MediaType = + new MediaType("video", "h265", compressible = false, binary = true) + + lazy val `vnd.dece.sd`: MediaType = + new MediaType("video", "vnd.dece.sd", compressible = false, binary = true, List("uvs", "uvvs")) + + lazy val `x-ms-wm`: MediaType = + new MediaType("video", "x-ms-wm", compressible = false, binary = true, List("wm")) + + lazy val `vnd.iptvforum.ttsmpeg2`: MediaType = + new MediaType("video", "vnd.iptvforum.ttsmpeg2", compressible = false, binary = true) + + lazy val `vnd.sealedmedia.softseal.mov`: MediaType = + new MediaType("video", "vnd.sealedmedia.softseal.mov", compressible = false, binary = true) + + lazy val `vnd.sealed.swf`: MediaType = + new MediaType("video", "vnd.sealed.swf", compressible = false, binary = true) + + lazy val `ffv1`: MediaType = + new MediaType("video", "ffv1", compressible = false, binary = true) + + lazy val `ogg`: MediaType = + new MediaType("video", "ogg", compressible = false, binary = true, List("ogv")) + + lazy val `vnd.cctv`: MediaType = + new MediaType("video", "vnd.cctv", compressible = false, binary = true) + + lazy val `iso.segment`: MediaType = + new MediaType("video", "iso.segment", compressible = false, binary = true, List("m4s")) + + lazy val `x-ms-vob`: MediaType = + new MediaType("video", "x-ms-vob", compressible = false, binary = true, List("vob")) + + lazy val `vp9`: MediaType = + new MediaType("video", "vp9", compressible = false, binary = true) + + lazy val `vnd.iptvforum.2dparityfec-2005`: MediaType = + new MediaType("video", "vnd.iptvforum.2dparityfec-2005", compressible = false, binary = true) + + lazy val `rtx`: MediaType = + new MediaType("video", "rtx", compressible = false, binary = true) + + lazy val `scip`: MediaType = + new MediaType("video", "scip", compressible = false, binary = true) + + lazy val `vnd.fvt`: MediaType = + new MediaType("video", "vnd.fvt", compressible = false, binary = true, List("fvt")) + + lazy val `mpv`: MediaType = + new MediaType("video", "mpv", compressible = false, binary = true) + + lazy val `vnd.uvvu.mp4`: MediaType = + new MediaType("video", "vnd.uvvu.mp4", compressible = false, binary = true, List("uvu", "uvvu")) + + lazy val `ulpfec`: MediaType = + new MediaType("video", "ulpfec", compressible = false, binary = true) + + lazy val `av1`: MediaType = + new MediaType("video", "av1", compressible = false, binary = true) + + lazy val `vnd.motorola.video`: MediaType = + new MediaType("video", "vnd.motorola.video", compressible = false, binary = true) + + lazy val `vnd.hns.video`: MediaType = + new MediaType("video", "vnd.hns.video", compressible = false, binary = true) + + lazy val `mp2p`: MediaType = + new MediaType("video", "mp2p", compressible = false, binary = true) + + lazy val `h266`: MediaType = + new MediaType("video", "h266", compressible = false, binary = true) + + lazy val `rtploopback`: MediaType = + new MediaType("video", "rtploopback", compressible = false, binary = true) + + lazy val `h263-1998`: MediaType = + new MediaType("video", "h263-1998", compressible = false, binary = true) + + lazy val `vnd.radgamettools.smacker`: MediaType = + new MediaType("video", "vnd.radgamettools.smacker", compressible = false, binary = true) + + lazy val `smpte292m`: MediaType = + new MediaType("video", "smpte292m", compressible = false, binary = true) + + lazy val `x-matroska`: MediaType = + new MediaType("video", "x-matroska", compressible = false, binary = true, List("mkv", "mk3d", "mks")) + + lazy val `vnd.directv.mpeg`: MediaType = + new MediaType("video", "vnd.directv.mpeg", compressible = false, binary = true) + + lazy val `x-msvideo`: MediaType = + new MediaType("video", "x-msvideo", compressible = false, binary = true, List("avi")) + + lazy val `flexfec`: MediaType = + new MediaType("video", "flexfec", compressible = false, binary = true) + + lazy val `webm`: MediaType = + new MediaType("video", "webm", compressible = false, binary = true, List("webm")) + + lazy val `raw`: MediaType = + new MediaType("video", "raw", compressible = false, binary = true) + + lazy val `vnd.iptvforum.1dparityfec-1010`: MediaType = + new MediaType("video", "vnd.iptvforum.1dparityfec-1010", compressible = false, binary = true) + + lazy val `h264-svc`: MediaType = + new MediaType("video", "h264-svc", compressible = false, binary = true) + + lazy val `x-f4v`: MediaType = + new MediaType("video", "x-f4v", compressible = false, binary = true, List("f4v")) + + lazy val `vnd.radgamettools.bink`: MediaType = + new MediaType("video", "vnd.radgamettools.bink", compressible = false, binary = true) + + lazy val `vnd.iptvforum.1dparityfec-2005`: MediaType = + new MediaType("video", "vnd.iptvforum.1dparityfec-2005", compressible = false, binary = true) + + lazy val `h263`: MediaType = + new MediaType("video", "h263", compressible = false, binary = true, List("h263")) + + lazy val `vnd.sealed.mpeg1`: MediaType = + new MediaType("video", "vnd.sealed.mpeg1", compressible = false, binary = true) + + lazy val `vnd.objectvideo`: MediaType = + new MediaType("video", "vnd.objectvideo", compressible = false, binary = true) + + lazy val `mj2`: MediaType = + new MediaType("video", "mj2", compressible = false, binary = true, List("mj2", "mjp2")) + + lazy val `x-ms-asf`: MediaType = + new MediaType("video", "x-ms-asf", compressible = false, binary = true, List("asf", "asx")) + + lazy val `x-smv`: MediaType = + new MediaType("video", "x-smv", compressible = false, binary = true, List("smv")) + + lazy val `3gpp`: MediaType = + new MediaType("video", "3gpp", compressible = false, binary = true, List("3gp", "3gpp")) + + lazy val `vc2`: MediaType = + new MediaType("video", "vc2", compressible = false, binary = true) + + lazy val `vnd.sealed.mpeg4`: MediaType = + new MediaType("video", "vnd.sealed.mpeg4", compressible = false, binary = true) + + lazy val `vnd.vivo`: MediaType = + new MediaType("video", "vnd.vivo", compressible = false, binary = true, List("viv")) + + lazy val `vnd.dece.mobile`: MediaType = + new MediaType("video", "vnd.dece.mobile", compressible = false, binary = true, List("uvm", "uvvm")) + + lazy val `pointer`: MediaType = + new MediaType("video", "pointer", compressible = false, binary = true) + + lazy val `vnd.nokia.videovoip`: MediaType = + new MediaType("video", "vnd.nokia.videovoip", compressible = false, binary = true) + + lazy val `vc1`: MediaType = + new MediaType("video", "vc1", compressible = false, binary = true) + + lazy val `jpm`: MediaType = + new MediaType("video", "jpm", compressible = false, binary = true, List("jpm", "jpgm")) + + lazy val `mp4v-es`: MediaType = + new MediaType("video", "mp4v-es", compressible = false, binary = true) + + lazy val `x-ms-wmx`: MediaType = + new MediaType("video", "x-ms-wmx", compressible = false, binary = true, List("wmx")) + + lazy val `h264-rcdo`: MediaType = + new MediaType("video", "h264-rcdo", compressible = false, binary = true) + + lazy val `mpeg4-generic`: MediaType = + new MediaType("video", "mpeg4-generic", compressible = false, binary = true) + + lazy val `mp2t`: MediaType = + new MediaType("video", "mp2t", compressible = false, binary = true, List("ts")) + + lazy val `dv`: MediaType = + new MediaType("video", "dv", compressible = false, binary = true) + + lazy val `vnd.motorola.videop`: MediaType = + new MediaType("video", "vnd.motorola.videop", compressible = false, binary = true) + + lazy val `vnd.dvb.file`: MediaType = + new MediaType("video", "vnd.dvb.file", compressible = false, binary = true, List("dvb")) + + lazy val `jpeg2000`: MediaType = + new MediaType("video", "jpeg2000", compressible = false, binary = true) + + lazy val `vp8`: MediaType = + new MediaType("video", "vp8", compressible = false, binary = true) + + lazy val `jpeg`: MediaType = + new MediaType("video", "jpeg", compressible = false, binary = true, List("jpgv")) + + lazy val `x-m4v`: MediaType = + new MediaType("video", "x-m4v", compressible = false, binary = true, List("m4v")) + + lazy val `mp1s`: MediaType = + new MediaType("video", "mp1s", compressible = false, binary = true) + + lazy val `x-ms-wvx`: MediaType = + new MediaType("video", "x-ms-wvx", compressible = false, binary = true, List("wvx")) + + lazy val `x-flv`: MediaType = + new MediaType("video", "x-flv", compressible = false, binary = true, List("flv")) + + lazy val `mp4`: MediaType = + new MediaType("video", "mp4", compressible = false, binary = true, List("mp4", "mp4v", "mpg4")) + + lazy val all: List[MediaType] = List( + `vnd.dlna.mpeg-tts`, + `vnd.dece.video`, `1d-interleaved-parityfec`, - `32kadpcm`, - `3gpp`, - `3gpp2`, - `aac`, - `ac3`, - `adpcm`, - `amr`, - `amr-wb`, - `amr-wb+`, - `aptx`, - `asc`, - `atrac-advanced-lossless`, - `atrac-x`, - `atrac3`, - `basic`, - `bv16`, - `bv32`, - `clearmode`, - `cn`, - `dat12`, - `dls`, - `dsr-es201108`, - `dsr-es202050`, - `dsr-es202211`, - `dsr-es202212`, - `dv`, - `dvi4`, - `eac3`, - `encaprtp`, - `evrc`, - `evrc-qcp`, - `evrc0`, - `evrc1`, - `evrcb`, - `evrcb0`, - `evrcb1`, - `evrcnw`, - `evrcnw0`, - `evrcnw1`, - `evrcwb`, - `evrcwb0`, - `evrcwb1`, - `evs`, - `flexfec`, - `fwdred`, - `g711-0`, - `g719`, - `g722`, - `g7221`, - `g723`, - `g726-16`, - `g726-24`, - `g726-32`, - `g726-40`, - `g728`, - `g729`, - `g7291`, - `g729d`, - `g729e`, - `gsm`, - `gsm-efr`, - `gsm-hr-08`, - `ilbc`, - `ip-mr_v2.5`, - `isac`, - `l16`, - `l20`, - `l24`, - `l8`, - `lpc`, - `melp`, - `melp1200`, - `melp2400`, - `melp600`, - `mhas`, - `midi`, - `mobile-xmf`, - `mp3`, - `mp4`, - `mp4a-latm`, - `mpa`, - `mpa-robust`, + `nv`, + `vnd.directv.mpeg-tts`, + `bmpeg`, + `quicktime`, + `h264`, + `vnd.ms-playready.media.pyv`, + `rtp-enc-aescm128`, + `x-mng`, + `celb`, + `raptorfec`, + `vnd.dece.pd`, `mpeg`, - `mpeg4-generic`, - `musepack`, + `smpte291`, + `vnd.dece.mp4`, + `encaprtp`, + `vnd.dece.hd`, + `h263-2000`, + `vnd.iptvforum.2dparityfec-1010`, + `vnd.mpegurl`, + `jxsv`, + `vnd.nokia.interleaved-multimedia`, + `bt656`, + `x-sgi-movie`, + `x-fli`, + `vnd.youtube.yt`, + `vnd.iptvforum.ttsavc`, + `h261`, + `parityfec`, + `3gpp-tt`, + `3gpp2`, + `x-ms-wmv`, + `vnd.nokia.mp4vr`, + `h265`, + `vnd.dece.sd`, + `x-ms-wm`, + `vnd.iptvforum.ttsmpeg2`, + `vnd.sealedmedia.softseal.mov`, + `vnd.sealed.swf`, + `ffv1`, `ogg`, - `opus`, - `parityfec`, - `pcma`, - `pcma-wb`, - `pcmu`, - `pcmu-wb`, - `prs.sid`, - `qcelp`, - `raptorfec`, - `red`, - `rtp-enc-aescm128`, - `rtp-midi`, - `rtploopback`, + `vnd.cctv`, + `iso.segment`, + `x-ms-vob`, + `vp9`, + `vnd.iptvforum.2dparityfec-2005`, `rtx`, - `s3m`, `scip`, - `silk`, - `smv`, - `smv-qcp`, - `smv0`, - `sofa`, - `sp-midi`, - `speex`, - `t140c`, - `t38`, - `telephone-event`, - `tetra_acelp`, - `tetra_acelp_bb`, - `tone`, - `tsvcis`, - `uemclip`, + `vnd.fvt`, + `mpv`, + `vnd.uvvu.mp4`, `ulpfec`, - `usac`, - `vdvi`, - `vmr-wb`, - `vnd.3gpp.iufp`, - `vnd.4sb`, - `vnd.audiokoz`, - `vnd.celp`, - `vnd.cisco.nse`, - `vnd.cmles.radio-events`, - `vnd.cns.anp1`, - `vnd.cns.inf1`, - `vnd.dece.audio`, - `vnd.digital-winds`, - `vnd.dlna.adts`, - `vnd.dolby.heaac.1`, - `vnd.dolby.heaac.2`, - `vnd.dolby.mlp`, - `vnd.dolby.mps`, - `vnd.dolby.pl2`, - `vnd.dolby.pl2x`, - `vnd.dolby.pl2z`, - `vnd.dolby.pulse.1`, - `vnd.dra`, - `vnd.dts`, - `vnd.dts.hd`, - `vnd.dts.uhd`, - `vnd.dvb.file`, - `vnd.everad.plj`, - `vnd.hns.audio`, - `vnd.lucent.voice`, - `vnd.ms-playready.media.pya`, - `vnd.nokia.mobile-xmf`, - `vnd.nortel.vbk`, - `vnd.nuera.ecelp4800`, - `vnd.nuera.ecelp7470`, - `vnd.nuera.ecelp9600`, - `vnd.octel.sbc`, - `vnd.presonus.multitrack`, - `vnd.qcelp`, - `vnd.rhetorex.32kadpcm`, - `vnd.rip`, - `vnd.rn-realaudio`, - `vnd.sealedmedia.softseal.mpeg`, - `vnd.vmx.cvsd`, - `vnd.wave`, - `vorbis`, - `vorbis-config`, - `wav`, - `wave`, - `webm`, - `x-aac`, - `x-aiff`, - `x-caf`, - `x-flac`, - `x-m4a`, + `av1`, + `vnd.motorola.video`, + `vnd.hns.video`, + `mp2p`, + `h266`, + `rtploopback`, + `h263-1998`, + `vnd.radgamettools.smacker`, + `smpte292m`, `x-matroska`, - `x-mpegurl`, - `x-ms-wax`, - `x-ms-wma`, - `x-pn-realaudio`, - `x-pn-realaudio-plugin`, - `x-realaudio`, - `x-tta`, - `x-wav`, - `xm`, - ) - lazy val any: MediaType = new MediaType("audio", "*") - } - object chemical { - lazy val `x-cdx`: MediaType = - new MediaType("chemical", "x-cdx", Compressible, NotBinary, List("cdx")) - lazy val `x-cif`: MediaType = - new MediaType("chemical", "x-cif", Compressible, NotBinary, List("cif")) - lazy val `x-cmdf`: MediaType = - new MediaType("chemical", "x-cmdf", Compressible, NotBinary, List("cmdf")) - lazy val `x-cml`: MediaType = - new MediaType("chemical", "x-cml", Compressible, NotBinary, List("cml")) - lazy val `x-csml`: MediaType = - new MediaType("chemical", "x-csml", Compressible, NotBinary, List("csml")) - lazy val `x-pdb`: MediaType = new MediaType("chemical", "x-pdb", Compressible, NotBinary) - lazy val `x-xyz`: MediaType = - new MediaType("chemical", "x-xyz", Compressible, NotBinary, List("xyz")) - lazy val all: List[MediaType] = - List(`x-cdx`, `x-cif`, `x-cmdf`, `x-cml`, `x-csml`, `x-pdb`, `x-xyz`) - lazy val any: MediaType = new MediaType("chemical", "*") - } - object font { - lazy val `collection`: MediaType = - new MediaType("font", "collection", Compressible, NotBinary, List("ttc")) - lazy val `otf`: MediaType = new MediaType("font", "otf", Compressible, NotBinary, List("otf")) - lazy val `sfnt`: MediaType = new MediaType("font", "sfnt", Compressible, NotBinary) - lazy val `ttf`: MediaType = new MediaType("font", "ttf", Compressible, NotBinary, List("ttf")) - lazy val `woff`: MediaType = - new MediaType("font", "woff", Compressible, NotBinary, List("woff")) - lazy val `woff2`: MediaType = - new MediaType("font", "woff2", Compressible, NotBinary, List("woff2")) - lazy val all: List[MediaType] = List(`collection`, `otf`, `sfnt`, `ttf`, `woff`, `woff2`) - lazy val any: MediaType = new MediaType("font", "*") - } - object image { - lazy val `aces`: MediaType = new MediaType("image", "aces", Compressible, Binary, List("exr")) - lazy val `apng`: MediaType = - new MediaType("image", "apng", Uncompressible, Binary, List("apng")) - lazy val `avci`: MediaType = new MediaType("image", "avci", Compressible, Binary) - lazy val `avcs`: MediaType = new MediaType("image", "avcs", Compressible, Binary) - lazy val `avif`: MediaType = - new MediaType("image", "avif", Uncompressible, Binary, List("avif")) - lazy val `bmp`: MediaType = new MediaType("image", "bmp", Compressible, Binary, List("bmp")) - lazy val `cgm`: MediaType = new MediaType("image", "cgm", Compressible, Binary, List("cgm")) - lazy val `dicom-rle`: MediaType = - new MediaType("image", "dicom-rle", Compressible, Binary, List("drle")) - lazy val `emf`: MediaType = new MediaType("image", "emf", Compressible, Binary, List("emf")) - lazy val `fits`: MediaType = new MediaType("image", "fits", Compressible, Binary, List("fits")) - lazy val `g3fax`: MediaType = new MediaType("image", "g3fax", Compressible, Binary, List("g3")) - lazy val `gif`: MediaType = new MediaType("image", "gif", Uncompressible, Binary, List("gif")) - lazy val `heic`: MediaType = new MediaType("image", "heic", Compressible, Binary, List("heic")) - lazy val `heic-sequence`: MediaType = - new MediaType("image", "heic-sequence", Compressible, Binary, List("heics")) - lazy val `heif`: MediaType = new MediaType("image", "heif", Compressible, Binary, List("heif")) - lazy val `heif-sequence`: MediaType = - new MediaType("image", "heif-sequence", Compressible, Binary, List("heifs")) - lazy val `hej2k`: MediaType = - new MediaType("image", "hej2k", Compressible, Binary, List("hej2")) - lazy val `hsj2`: MediaType = new MediaType("image", "hsj2", Compressible, Binary, List("hsj2")) - lazy val `ief`: MediaType = new MediaType("image", "ief", Compressible, Binary, List("ief")) - lazy val `jls`: MediaType = new MediaType("image", "jls", Compressible, Binary, List("jls")) - lazy val `jp2`: MediaType = - new MediaType("image", "jp2", Uncompressible, Binary, List("jp2", "jpg2")) - lazy val `jpeg`: MediaType = - new MediaType("image", "jpeg", Uncompressible, Binary, List("jpeg", "jpg", "jpe")) - lazy val `jph`: MediaType = new MediaType("image", "jph", Compressible, Binary, List("jph")) - lazy val `jphc`: MediaType = new MediaType("image", "jphc", Compressible, Binary, List("jhc")) - lazy val `jpm`: MediaType = new MediaType("image", "jpm", Uncompressible, Binary, List("jpm")) - lazy val `jpx`: MediaType = - new MediaType("image", "jpx", Uncompressible, Binary, List("jpx", "jpf")) - lazy val `jxr`: MediaType = new MediaType("image", "jxr", Compressible, Binary, List("jxr")) - lazy val `jxra`: MediaType = new MediaType("image", "jxra", Compressible, Binary, List("jxra")) - lazy val `jxrs`: MediaType = new MediaType("image", "jxrs", Compressible, Binary, List("jxrs")) - lazy val `jxs`: MediaType = new MediaType("image", "jxs", Compressible, Binary, List("jxs")) - lazy val `jxsc`: MediaType = new MediaType("image", "jxsc", Compressible, Binary, List("jxsc")) - lazy val `jxsi`: MediaType = new MediaType("image", "jxsi", Compressible, Binary, List("jxsi")) - lazy val `jxss`: MediaType = new MediaType("image", "jxss", Compressible, Binary, List("jxss")) - lazy val `ktx`: MediaType = new MediaType("image", "ktx", Compressible, Binary, List("ktx")) - lazy val `ktx2`: MediaType = new MediaType("image", "ktx2", Compressible, Binary, List("ktx2")) - lazy val `naplps`: MediaType = new MediaType("image", "naplps", Compressible, Binary) - lazy val `pjpeg`: MediaType = new MediaType("image", "pjpeg", Uncompressible, Binary) - lazy val `png`: MediaType = new MediaType("image", "png", Uncompressible, Binary, List("png")) - lazy val `prs.btif`: MediaType = - new MediaType("image", "prs.btif", Compressible, Binary, List("btif")) - lazy val `prs.pti`: MediaType = - new MediaType("image", "prs.pti", Compressible, Binary, List("pti")) - lazy val `pwg-raster`: MediaType = new MediaType("image", "pwg-raster", Compressible, Binary) - lazy val `sgi`: MediaType = new MediaType("image", "sgi", Compressible, Binary, List("sgi")) - lazy val `svg+xml`: MediaType = - new MediaType("image", "svg+xml", Compressible, Binary, List("svg", "svgz")) - lazy val `t38`: MediaType = new MediaType("image", "t38", Compressible, Binary, List("t38")) - lazy val `tiff`: MediaType = - new MediaType("image", "tiff", Uncompressible, Binary, List("tif", "tiff")) - lazy val `tiff-fx`: MediaType = - new MediaType("image", "tiff-fx", Compressible, Binary, List("tfx")) - lazy val `vnd.adobe.photoshop`: MediaType = - new MediaType("image", "vnd.adobe.photoshop", Compressible, Binary, List("psd")) - lazy val `vnd.airzip.accelerator.azv`: MediaType = - new MediaType("image", "vnd.airzip.accelerator.azv", Compressible, Binary, List("azv")) - lazy val `vnd.cns.inf2`: MediaType = - new MediaType("image", "vnd.cns.inf2", Compressible, Binary) - lazy val `vnd.dece.graphic`: MediaType = new MediaType( - "image", - "vnd.dece.graphic", - Compressible, - Binary, - List("uvi", "uvvi", "uvg", "uvvg"), - ) - lazy val `vnd.djvu`: MediaType = - new MediaType("image", "vnd.djvu", Compressible, Binary, List("djvu", "djv")) - lazy val `vnd.dvb.subtitle`: MediaType = - new MediaType("image", "vnd.dvb.subtitle", Compressible, Binary, List("sub")) - lazy val `vnd.dwg`: MediaType = - new MediaType("image", "vnd.dwg", Compressible, Binary, List("dwg")) - lazy val `vnd.dxf`: MediaType = - new MediaType("image", "vnd.dxf", Compressible, Binary, List("dxf")) - lazy val `vnd.fastbidsheet`: MediaType = - new MediaType("image", "vnd.fastbidsheet", Compressible, Binary, List("fbs")) - lazy val `vnd.fpx`: MediaType = - new MediaType("image", "vnd.fpx", Compressible, Binary, List("fpx")) - lazy val `vnd.fst`: MediaType = - new MediaType("image", "vnd.fst", Compressible, Binary, List("fst")) - lazy val `vnd.fujixerox.edmics-mmr`: MediaType = - new MediaType("image", "vnd.fujixerox.edmics-mmr", Compressible, Binary, List("mmr")) - lazy val `vnd.fujixerox.edmics-rlc`: MediaType = - new MediaType("image", "vnd.fujixerox.edmics-rlc", Compressible, Binary, List("rlc")) - lazy val `vnd.globalgraphics.pgb`: MediaType = - new MediaType("image", "vnd.globalgraphics.pgb", Compressible, Binary) - lazy val `vnd.microsoft.icon`: MediaType = - new MediaType("image", "vnd.microsoft.icon", Compressible, Binary, List("ico")) - lazy val `vnd.mix`: MediaType = new MediaType("image", "vnd.mix", Compressible, Binary) - lazy val `vnd.mozilla.apng`: MediaType = - new MediaType("image", "vnd.mozilla.apng", Compressible, Binary) - lazy val `vnd.ms-dds`: MediaType = - new MediaType("image", "vnd.ms-dds", Compressible, Binary, List("dds")) - lazy val `vnd.ms-modi`: MediaType = - new MediaType("image", "vnd.ms-modi", Compressible, Binary, List("mdi")) - lazy val `vnd.ms-photo`: MediaType = - new MediaType("image", "vnd.ms-photo", Compressible, Binary, List("wdp")) - lazy val `vnd.net-fpx`: MediaType = - new MediaType("image", "vnd.net-fpx", Compressible, Binary, List("npx")) - lazy val `vnd.pco.b16`: MediaType = - new MediaType("image", "vnd.pco.b16", Compressible, Binary, List("b16")) - lazy val `vnd.radiance`: MediaType = - new MediaType("image", "vnd.radiance", Compressible, Binary) - lazy val `vnd.sealed.png`: MediaType = - new MediaType("image", "vnd.sealed.png", Compressible, Binary) - lazy val `vnd.sealedmedia.softseal.gif`: MediaType = - new MediaType("image", "vnd.sealedmedia.softseal.gif", Compressible, Binary) - lazy val `vnd.sealedmedia.softseal.jpg`: MediaType = - new MediaType("image", "vnd.sealedmedia.softseal.jpg", Compressible, Binary) - lazy val `vnd.svf`: MediaType = new MediaType("image", "vnd.svf", Compressible, Binary) - lazy val `vnd.tencent.tap`: MediaType = - new MediaType("image", "vnd.tencent.tap", Compressible, Binary, List("tap")) - lazy val `vnd.valve.source.texture`: MediaType = - new MediaType("image", "vnd.valve.source.texture", Compressible, Binary, List("vtf")) - lazy val `vnd.wap.wbmp`: MediaType = - new MediaType("image", "vnd.wap.wbmp", Compressible, Binary, List("wbmp")) - lazy val `vnd.xiff`: MediaType = - new MediaType("image", "vnd.xiff", Compressible, Binary, List("xif")) - lazy val `vnd.zbrush.pcx`: MediaType = - new MediaType("image", "vnd.zbrush.pcx", Compressible, Binary, List("pcx")) - lazy val `webp`: MediaType = new MediaType("image", "webp", Compressible, Binary, List("webp")) - lazy val `wmf`: MediaType = new MediaType("image", "wmf", Compressible, Binary, List("wmf")) - lazy val `x-3ds`: MediaType = new MediaType("image", "x-3ds", Compressible, Binary, List("3ds")) - lazy val `x-cmu-raster`: MediaType = - new MediaType("image", "x-cmu-raster", Compressible, Binary, List("ras")) - lazy val `x-cmx`: MediaType = new MediaType("image", "x-cmx", Compressible, Binary, List("cmx")) - lazy val `x-freehand`: MediaType = new MediaType( - "image", - "x-freehand", - Compressible, - Binary, - List("fh", "fhc", "fh4", "fh5", "fh7"), - ) - lazy val `x-icon`: MediaType = - new MediaType("image", "x-icon", Compressible, Binary, List("ico")) - lazy val `x-jng`: MediaType = new MediaType("image", "x-jng", Compressible, Binary, List("jng")) - lazy val `x-mrsid-image`: MediaType = - new MediaType("image", "x-mrsid-image", Compressible, Binary, List("sid")) - lazy val `x-ms-bmp`: MediaType = - new MediaType("image", "x-ms-bmp", Compressible, Binary, List("bmp")) - lazy val `x-pcx`: MediaType = new MediaType("image", "x-pcx", Compressible, Binary, List("pcx")) - lazy val `x-pict`: MediaType = - new MediaType("image", "x-pict", Compressible, Binary, List("pic", "pct")) - lazy val `x-portable-anymap`: MediaType = - new MediaType("image", "x-portable-anymap", Compressible, Binary, List("pnm")) - lazy val `x-portable-bitmap`: MediaType = - new MediaType("image", "x-portable-bitmap", Compressible, Binary, List("pbm")) - lazy val `x-portable-graymap`: MediaType = - new MediaType("image", "x-portable-graymap", Compressible, Binary, List("pgm")) - lazy val `x-portable-pixmap`: MediaType = - new MediaType("image", "x-portable-pixmap", Compressible, Binary, List("ppm")) - lazy val `x-rgb`: MediaType = new MediaType("image", "x-rgb", Compressible, Binary, List("rgb")) - lazy val `x-tga`: MediaType = new MediaType("image", "x-tga", Compressible, Binary, List("tga")) - lazy val `x-xbitmap`: MediaType = - new MediaType("image", "x-xbitmap", Compressible, Binary, List("xbm")) - lazy val `x-xcf`: MediaType = new MediaType("image", "x-xcf", Uncompressible, Binary) - lazy val `x-xpixmap`: MediaType = - new MediaType("image", "x-xpixmap", Compressible, Binary, List("xpm")) - lazy val `x-xwindowdump`: MediaType = - new MediaType("image", "x-xwindowdump", Compressible, Binary, List("xwd")) - lazy val all: List[MediaType] = List( - `aces`, - `apng`, - `avci`, - `avcs`, - `avif`, - `bmp`, - `cgm`, - `dicom-rle`, - `emf`, - `fits`, - `g3fax`, - `gif`, - `heic`, - `heic-sequence`, - `heif`, - `heif-sequence`, - `hej2k`, - `hsj2`, - `ief`, - `jls`, - `jp2`, - `jpeg`, - `jph`, - `jphc`, + `vnd.directv.mpeg`, + `x-msvideo`, + `flexfec`, + `webm`, + `raw`, + `vnd.iptvforum.1dparityfec-1010`, + `h264-svc`, + `x-f4v`, + `vnd.radgamettools.bink`, + `vnd.iptvforum.1dparityfec-2005`, + `h263`, + `vnd.sealed.mpeg1`, + `vnd.objectvideo`, + `mj2`, + `x-ms-asf`, + `x-smv`, + `3gpp`, + `vc2`, + `vnd.sealed.mpeg4`, + `vnd.vivo`, + `vnd.dece.mobile`, + `pointer`, + `vnd.nokia.videovoip`, + `vc1`, `jpm`, - `jpx`, - `jxr`, - `jxra`, - `jxrs`, - `jxs`, - `jxsc`, - `jxsi`, - `jxss`, - `ktx`, - `ktx2`, - `naplps`, - `pjpeg`, - `png`, - `prs.btif`, - `prs.pti`, - `pwg-raster`, - `sgi`, - `svg+xml`, - `t38`, - `tiff`, - `tiff-fx`, - `vnd.adobe.photoshop`, - `vnd.airzip.accelerator.azv`, - `vnd.cns.inf2`, - `vnd.dece.graphic`, - `vnd.djvu`, - `vnd.dvb.subtitle`, - `vnd.dwg`, - `vnd.dxf`, - `vnd.fastbidsheet`, - `vnd.fpx`, - `vnd.fst`, - `vnd.fujixerox.edmics-mmr`, - `vnd.fujixerox.edmics-rlc`, - `vnd.globalgraphics.pgb`, - `vnd.microsoft.icon`, - `vnd.mix`, - `vnd.mozilla.apng`, - `vnd.ms-dds`, - `vnd.ms-modi`, - `vnd.ms-photo`, - `vnd.net-fpx`, - `vnd.pco.b16`, - `vnd.radiance`, - `vnd.sealed.png`, - `vnd.sealedmedia.softseal.gif`, - `vnd.sealedmedia.softseal.jpg`, - `vnd.svf`, - `vnd.tencent.tap`, - `vnd.valve.source.texture`, - `vnd.wap.wbmp`, - `vnd.xiff`, - `vnd.zbrush.pcx`, - `webp`, - `wmf`, - `x-3ds`, - `x-cmu-raster`, - `x-cmx`, - `x-freehand`, - `x-icon`, - `x-jng`, - `x-mrsid-image`, - `x-ms-bmp`, - `x-pcx`, - `x-pict`, - `x-portable-anymap`, - `x-portable-bitmap`, - `x-portable-graymap`, - `x-portable-pixmap`, - `x-rgb`, - `x-tga`, - `x-xbitmap`, - `x-xcf`, - `x-xpixmap`, - `x-xwindowdump`, + `mp4v-es`, + `x-ms-wmx`, + `h264-rcdo`, + `mpeg4-generic`, + `mp2t`, + `dv`, + `vnd.motorola.videop`, + `vnd.dvb.file`, + `jpeg2000`, + `vp8`, + `jpeg`, + `x-m4v`, + `mp1s`, + `x-ms-wvx`, + `x-flv`, + `mp4`, ) - lazy val any: MediaType = new MediaType("image", "*") + lazy val any: MediaType = new MediaType("video", "*") } - object message { - lazy val `cpim`: MediaType = new MediaType("message", "cpim", Compressible, NotBinary) - lazy val `delivery-status`: MediaType = - new MediaType("message", "delivery-status", Compressible, NotBinary) - lazy val `disposition-notification`: MediaType = new MediaType( - "message", - "disposition-notification", - Compressible, - NotBinary, - List("disposition-notification"), - ) - lazy val `external-body`: MediaType = - new MediaType("message", "external-body", Compressible, NotBinary) - lazy val `feedback-report`: MediaType = - new MediaType("message", "feedback-report", Compressible, NotBinary) - lazy val `global`: MediaType = - new MediaType("message", "global", Compressible, NotBinary, List("u8msg")) - lazy val `global-delivery-status`: MediaType = - new MediaType("message", "global-delivery-status", Compressible, NotBinary, List("u8dsn")) - lazy val `global-disposition-notification`: MediaType = new MediaType( - "message", - "global-disposition-notification", - Compressible, - NotBinary, - List("u8mdn"), - ) - lazy val `global-headers`: MediaType = - new MediaType("message", "global-headers", Compressible, NotBinary, List("u8hdr")) - lazy val `http`: MediaType = new MediaType("message", "http", Uncompressible, NotBinary) - lazy val `imdn+xml`: MediaType = new MediaType("message", "imdn+xml", Compressible, NotBinary) - lazy val `news`: MediaType = new MediaType("message", "news", Compressible, NotBinary) - lazy val `partial`: MediaType = new MediaType("message", "partial", Uncompressible, NotBinary) - lazy val `rfc822`: MediaType = - new MediaType("message", "rfc822", Compressible, NotBinary, List("eml", "mime")) - lazy val `s-http`: MediaType = new MediaType("message", "s-http", Compressible, NotBinary) - lazy val `sip`: MediaType = new MediaType("message", "sip", Compressible, NotBinary) - lazy val `sipfrag`: MediaType = new MediaType("message", "sipfrag", Compressible, NotBinary) + + object message { + + lazy val `rfc822`: MediaType = + new MediaType("message", "rfc822", compressible = true, binary = false, List("eml", "mime")) + + lazy val `http`: MediaType = + new MediaType("message", "http", compressible = false, binary = true) + + lazy val `disposition-notification`: MediaType = + new MediaType( + "message", + "disposition-notification", + compressible = false, + binary = true, + List("disposition-notification"), + ) + lazy val `tracking-status`: MediaType = - new MediaType("message", "tracking-status", Compressible, NotBinary) - lazy val `vnd.si.simp`: MediaType = - new MediaType("message", "vnd.si.simp", Compressible, NotBinary) - lazy val `vnd.wfa.wsc`: MediaType = - new MediaType("message", "vnd.wfa.wsc", Compressible, NotBinary, List("wsc")) - lazy val all: List[MediaType] = List( - `cpim`, - `delivery-status`, + new MediaType("message", "tracking-status", compressible = false, binary = true) + + lazy val `s-http`: MediaType = + new MediaType("message", "s-http", compressible = false, binary = true) + + lazy val `global-headers`: MediaType = + new MediaType("message", "global-headers", compressible = false, binary = true, List("u8hdr")) + + lazy val `imdn+xml`: MediaType = + new MediaType("message", "imdn+xml", compressible = true, binary = false) + + lazy val `vnd.si.simp`: MediaType = + new MediaType("message", "vnd.si.simp", compressible = false, binary = true) + + lazy val `sip`: MediaType = + new MediaType("message", "sip", compressible = false, binary = true) + + lazy val `feedback-report`: MediaType = + new MediaType("message", "feedback-report", compressible = false, binary = true) + + lazy val `sipfrag`: MediaType = + new MediaType("message", "sipfrag", compressible = false, binary = true) + + lazy val `global-disposition-notification`: MediaType = + new MediaType("message", "global-disposition-notification", compressible = false, binary = true, List("u8mdn")) + + lazy val `delivery-status`: MediaType = + new MediaType("message", "delivery-status", compressible = false, binary = true) + + lazy val `external-body`: MediaType = + new MediaType("message", "external-body", compressible = false, binary = true) + + lazy val `partial`: MediaType = + new MediaType("message", "partial", compressible = false, binary = true) + + lazy val `bhttp`: MediaType = + new MediaType("message", "bhttp", compressible = false, binary = true) + + lazy val `global-delivery-status`: MediaType = + new MediaType("message", "global-delivery-status", compressible = false, binary = true, List("u8dsn")) + + lazy val `vnd.wfa.wsc`: MediaType = + new MediaType("message", "vnd.wfa.wsc", compressible = false, binary = true, List("wsc")) + + lazy val `global`: MediaType = + new MediaType("message", "global", compressible = false, binary = true, List("u8msg")) + + lazy val `cpim`: MediaType = + new MediaType("message", "cpim", compressible = false, binary = true) + + lazy val `news`: MediaType = + new MediaType("message", "news", compressible = false, binary = true) + + lazy val all: List[MediaType] = List( + `rfc822`, + `http`, `disposition-notification`, - `external-body`, - `feedback-report`, - `global`, - `global-delivery-status`, - `global-disposition-notification`, + `tracking-status`, + `s-http`, `global-headers`, - `http`, `imdn+xml`, - `news`, - `partial`, - `rfc822`, - `s-http`, + `vnd.si.simp`, `sip`, + `feedback-report`, `sipfrag`, - `tracking-status`, - `vnd.si.simp`, + `global-disposition-notification`, + `delivery-status`, + `external-body`, + `partial`, + `bhttp`, + `global-delivery-status`, `vnd.wfa.wsc`, + `global`, + `cpim`, + `news`, ) - lazy val any: MediaType = new MediaType("message", "*") - } - object model { - lazy val `3mf`: MediaType = new MediaType("model", "3mf", Compressible, NotBinary, List("3mf")) - lazy val `e57`: MediaType = new MediaType("model", "e57", Compressible, NotBinary) - lazy val `gltf+json`: MediaType = - new MediaType("model", "gltf+json", Compressible, NotBinary, List("gltf")) - lazy val `gltf-binary`: MediaType = - new MediaType("model", "gltf-binary", Compressible, NotBinary, List("glb")) - lazy val `iges`: MediaType = - new MediaType("model", "iges", Uncompressible, NotBinary, List("igs", "iges")) - lazy val `mesh`: MediaType = - new MediaType("model", "mesh", Uncompressible, NotBinary, List("msh", "mesh", "silo")) - lazy val `mtl`: MediaType = new MediaType("model", "mtl", Compressible, NotBinary, List("mtl")) - lazy val `obj`: MediaType = new MediaType("model", "obj", Compressible, NotBinary, List("obj")) - lazy val `stl`: MediaType = new MediaType("model", "stl", Compressible, NotBinary, List("stl")) - lazy val `vnd.collada+xml`: MediaType = - new MediaType("model", "vnd.collada+xml", Compressible, NotBinary, List("dae")) - lazy val `vnd.dwf`: MediaType = - new MediaType("model", "vnd.dwf", Compressible, NotBinary, List("dwf")) - lazy val `vnd.flatland.3dml`: MediaType = - new MediaType("model", "vnd.flatland.3dml", Compressible, NotBinary) - lazy val `vnd.gdl`: MediaType = - new MediaType("model", "vnd.gdl", Compressible, NotBinary, List("gdl")) - lazy val `vnd.gs-gdl`: MediaType = new MediaType("model", "vnd.gs-gdl", Compressible, NotBinary) - lazy val `vnd.gs.gdl`: MediaType = new MediaType("model", "vnd.gs.gdl", Compressible, NotBinary) - lazy val `vnd.gtw`: MediaType = - new MediaType("model", "vnd.gtw", Compressible, NotBinary, List("gtw")) - lazy val `vnd.moml+xml`: MediaType = - new MediaType("model", "vnd.moml+xml", Compressible, NotBinary) - lazy val `vnd.mts`: MediaType = - new MediaType("model", "vnd.mts", Compressible, NotBinary, List("mts")) - lazy val `vnd.opengex`: MediaType = - new MediaType("model", "vnd.opengex", Compressible, NotBinary, List("ogex")) - lazy val `vnd.parasolid.transmit.binary`: MediaType = - new MediaType("model", "vnd.parasolid.transmit.binary", Compressible, NotBinary, List("x_b")) - lazy val `vnd.parasolid.transmit.text`: MediaType = - new MediaType("model", "vnd.parasolid.transmit.text", Compressible, NotBinary, List("x_t")) - lazy val `vnd.pytha.pyox`: MediaType = - new MediaType("model", "vnd.pytha.pyox", Compressible, NotBinary) - lazy val `vnd.rosette.annotated-data-model`: MediaType = - new MediaType("model", "vnd.rosette.annotated-data-model", Compressible, NotBinary) - lazy val `vnd.sap.vds`: MediaType = - new MediaType("model", "vnd.sap.vds", Compressible, NotBinary, List("vds")) - lazy val `vnd.usdz+zip`: MediaType = - new MediaType("model", "vnd.usdz+zip", Uncompressible, NotBinary, List("usdz")) - lazy val `vnd.valve.source.compiled-map`: MediaType = - new MediaType("model", "vnd.valve.source.compiled-map", Compressible, NotBinary, List("bsp")) - lazy val `vnd.vtu`: MediaType = - new MediaType("model", "vnd.vtu", Compressible, NotBinary, List("vtu")) - lazy val `vrml`: MediaType = - new MediaType("model", "vrml", Uncompressible, NotBinary, List("wrl", "vrml")) - lazy val `x3d+binary`: MediaType = - new MediaType("model", "x3d+binary", Uncompressible, NotBinary, List("x3db", "x3dbz")) - lazy val `x3d+fastinfoset`: MediaType = - new MediaType("model", "x3d+fastinfoset", Compressible, NotBinary, List("x3db")) - lazy val `x3d+vrml`: MediaType = - new MediaType("model", "x3d+vrml", Uncompressible, NotBinary, List("x3dv", "x3dvz")) - lazy val `x3d+xml`: MediaType = - new MediaType("model", "x3d+xml", Compressible, NotBinary, List("x3d", "x3dz")) - lazy val `x3d-vrml`: MediaType = - new MediaType("model", "x3d-vrml", Compressible, NotBinary, List("x3dv")) - lazy val all: List[MediaType] = List( - `3mf`, - `e57`, - `gltf+json`, - `gltf-binary`, - `iges`, - `mesh`, - `mtl`, - `obj`, - `stl`, - `vnd.collada+xml`, - `vnd.dwf`, - `vnd.flatland.3dml`, - `vnd.gdl`, - `vnd.gs-gdl`, - `vnd.gs.gdl`, - `vnd.gtw`, - `vnd.moml+xml`, - `vnd.mts`, - `vnd.opengex`, - `vnd.parasolid.transmit.binary`, - `vnd.parasolid.transmit.text`, - `vnd.pytha.pyox`, - `vnd.rosette.annotated-data-model`, - `vnd.sap.vds`, - `vnd.usdz+zip`, - `vnd.valve.source.compiled-map`, - `vnd.vtu`, - `vrml`, - `x3d+binary`, - `x3d+fastinfoset`, - `x3d+vrml`, - `x3d+xml`, - `x3d-vrml`, - ) - lazy val any: MediaType = new MediaType("model", "*") - } - object multipart { - lazy val `alternative`: MediaType = - new MediaType("multipart", "alternative", Uncompressible, NotBinary) - lazy val `appledouble`: MediaType = - new MediaType("multipart", "appledouble", Compressible, NotBinary) - lazy val `byteranges`: MediaType = - new MediaType("multipart", "byteranges", Compressible, NotBinary) - lazy val `digest`: MediaType = new MediaType("multipart", "digest", Compressible, NotBinary) - lazy val `encrypted`: MediaType = - new MediaType("multipart", "encrypted", Uncompressible, NotBinary) - lazy val `form-data`: MediaType = - new MediaType("multipart", "form-data", Uncompressible, NotBinary) - lazy val `header-set`: MediaType = - new MediaType("multipart", "header-set", Compressible, NotBinary) - lazy val `mixed`: MediaType = new MediaType("multipart", "mixed", Compressible, NotBinary) - lazy val `multilingual`: MediaType = - new MediaType("multipart", "multilingual", Compressible, NotBinary) - lazy val `parallel`: MediaType = new MediaType("multipart", "parallel", Compressible, NotBinary) - lazy val `related`: MediaType = new MediaType("multipart", "related", Uncompressible, NotBinary) - lazy val `report`: MediaType = new MediaType("multipart", "report", Compressible, NotBinary) - lazy val `signed`: MediaType = new MediaType("multipart", "signed", Uncompressible, NotBinary) - lazy val `vnd.bint.med-plus`: MediaType = - new MediaType("multipart", "vnd.bint.med-plus", Compressible, NotBinary) - lazy val `voice-message`: MediaType = - new MediaType("multipart", "voice-message", Compressible, NotBinary) - lazy val `x-mixed-replace`: MediaType = - new MediaType("multipart", "x-mixed-replace", Compressible, NotBinary) - lazy val all: List[MediaType] = List( - `alternative`, - `appledouble`, - `byteranges`, - `digest`, - `encrypted`, - `form-data`, - `header-set`, - `mixed`, - `multilingual`, - `parallel`, - `related`, - `report`, - `signed`, - `vnd.bint.med-plus`, - `voice-message`, - `x-mixed-replace`, - ) - lazy val any: MediaType = new MediaType("multipart", "*") + lazy val any: MediaType = new MediaType("message", "*") } - object text { + + object audio { + + lazy val `vnd.4sb`: MediaType = + new MediaType("audio", "vnd.4sb", compressible = false, binary = true) + + lazy val `evrc1`: MediaType = + new MediaType("audio", "evrc1", compressible = false, binary = true) + + lazy val `dsr-es201108`: MediaType = + new MediaType("audio", "dsr-es201108", compressible = false, binary = true) + + lazy val `vnd.everad.plj`: MediaType = + new MediaType("audio", "vnd.everad.plj", compressible = false, binary = true) + + lazy val `vnd.dece.audio`: MediaType = + new MediaType("audio", "vnd.dece.audio", compressible = false, binary = true, List("uva", "uvva")) + + lazy val `rtx`: MediaType = + new MediaType("audio", "rtx", compressible = false, binary = true) + + lazy val `vnd.ms-playready.media.pya`: MediaType = + new MediaType("audio", "vnd.ms-playready.media.pya", compressible = false, binary = true, List("pya")) + + lazy val `evrcnw1`: MediaType = + new MediaType("audio", "evrcnw1", compressible = false, binary = true) + + lazy val `flexfec`: MediaType = + new MediaType("audio", "flexfec", compressible = false, binary = true) + + lazy val `red`: MediaType = + new MediaType("audio", "red", compressible = false, binary = true) + + lazy val `vnd.dolby.heaac.1`: MediaType = + new MediaType("audio", "vnd.dolby.heaac.1", compressible = false, binary = true) + lazy val `1d-interleaved-parityfec`: MediaType = - new MediaType("text", "1d-interleaved-parityfec", Compressible, NotBinary) - lazy val `cache-manifest`: MediaType = - new MediaType("text", "cache-manifest", Compressible, NotBinary, List("appcache", "manifest")) - lazy val `calendar`: MediaType = - new MediaType("text", "calendar", Compressible, NotBinary, List("ics", "ifb")) - lazy val `calender`: MediaType = new MediaType("text", "calender", Compressible, NotBinary) - lazy val `cmd`: MediaType = new MediaType("text", "cmd", Compressible, NotBinary) - lazy val `coffeescript`: MediaType = - new MediaType("text", "coffeescript", Compressible, NotBinary, List("coffee", "litcoffee")) - lazy val `cql`: MediaType = new MediaType("text", "cql", Compressible, NotBinary) - lazy val `cql-expression`: MediaType = - new MediaType("text", "cql-expression", Compressible, NotBinary) - lazy val `cql-identifier`: MediaType = - new MediaType("text", "cql-identifier", Compressible, NotBinary) - lazy val `css`: MediaType = new MediaType("text", "css", Compressible, NotBinary, List("css")) - lazy val `csv`: MediaType = new MediaType("text", "csv", Compressible, NotBinary, List("csv")) - lazy val `csv-schema`: MediaType = new MediaType("text", "csv-schema", Compressible, NotBinary) - lazy val `directory`: MediaType = new MediaType("text", "directory", Compressible, NotBinary) - lazy val `dns`: MediaType = new MediaType("text", "dns", Compressible, NotBinary) - lazy val `ecmascript`: MediaType = new MediaType("text", "ecmascript", Compressible, NotBinary) - lazy val `encaprtp`: MediaType = new MediaType("text", "encaprtp", Compressible, NotBinary) - lazy val `enriched`: MediaType = new MediaType("text", "enriched", Compressible, NotBinary) - lazy val `event-stream`: MediaType = new MediaType("text", "event-stream", Compressible, NotBinary) - lazy val `fhirpath`: MediaType = new MediaType("text", "fhirpath", Compressible, NotBinary) - lazy val `flexfec`: MediaType = new MediaType("text", "flexfec", Compressible, NotBinary) - lazy val `fwdred`: MediaType = new MediaType("text", "fwdred", Compressible, NotBinary) - lazy val `gff3`: MediaType = new MediaType("text", "gff3", Compressible, NotBinary) - lazy val `grammar-ref-list`: MediaType = - new MediaType("text", "grammar-ref-list", Compressible, NotBinary) - lazy val `html`: MediaType = - new MediaType("text", "html", Compressible, NotBinary, List("html", "htm", "shtml")) - lazy val `jade`: MediaType = - new MediaType("text", "jade", Compressible, NotBinary, List("jade")) - lazy val `javascript`: MediaType = new MediaType("text", "javascript", Compressible, NotBinary) - lazy val `jcr-cnd`: MediaType = new MediaType("text", "jcr-cnd", Compressible, NotBinary) - lazy val `jsx`: MediaType = new MediaType("text", "jsx", Compressible, NotBinary, List("jsx")) - lazy val `less`: MediaType = - new MediaType("text", "less", Compressible, NotBinary, List("less")) - lazy val `markdown`: MediaType = - new MediaType("text", "markdown", Compressible, NotBinary, List("markdown", "md")) - lazy val `mathml`: MediaType = - new MediaType("text", "mathml", Compressible, NotBinary, List("mml")) - lazy val `mdx`: MediaType = new MediaType("text", "mdx", Compressible, NotBinary, List("mdx")) - lazy val `mizar`: MediaType = new MediaType("text", "mizar", Compressible, NotBinary) - lazy val `n3`: MediaType = new MediaType("text", "n3", Compressible, NotBinary, List("n3")) - lazy val `parameters`: MediaType = new MediaType("text", "parameters", Compressible, NotBinary) - lazy val `parityfec`: MediaType = new MediaType("text", "parityfec", Compressible, NotBinary) - lazy val `plain`: MediaType = new MediaType( - "text", - "plain", - Compressible, - NotBinary, - List("txt", "text", "conf", "def", "list", "log", "in", "ini"), - ) - lazy val `provenance-notation`: MediaType = - new MediaType("text", "provenance-notation", Compressible, NotBinary) - lazy val `prs.fallenstein.rst`: MediaType = - new MediaType("text", "prs.fallenstein.rst", Compressible, NotBinary) - lazy val `prs.lines.tag`: MediaType = - new MediaType("text", "prs.lines.tag", Compressible, NotBinary, List("dsc")) - lazy val `prs.prop.logic`: MediaType = - new MediaType("text", "prs.prop.logic", Compressible, NotBinary) - lazy val `raptorfec`: MediaType = new MediaType("text", "raptorfec", Compressible, NotBinary) - lazy val `red`: MediaType = new MediaType("text", "red", Compressible, NotBinary) - lazy val `rfc822-headers`: MediaType = - new MediaType("text", "rfc822-headers", Compressible, NotBinary) - lazy val `richtext`: MediaType = - new MediaType("text", "richtext", Compressible, NotBinary, List("rtx")) - lazy val `rtf`: MediaType = new MediaType("text", "rtf", Compressible, NotBinary, List("rtf")) - lazy val `rtp-enc-aescm128`: MediaType = - new MediaType("text", "rtp-enc-aescm128", Compressible, NotBinary) - lazy val `rtploopback`: MediaType = - new MediaType("text", "rtploopback", Compressible, NotBinary) - lazy val `rtx`: MediaType = new MediaType("text", "rtx", Compressible, NotBinary) - lazy val `sgml`: MediaType = - new MediaType("text", "sgml", Compressible, NotBinary, List("sgml", "sgm")) - lazy val `shaclc`: MediaType = new MediaType("text", "shaclc", Compressible, NotBinary) - lazy val `shex`: MediaType = - new MediaType("text", "shex", Compressible, NotBinary, List("shex")) - lazy val `slim`: MediaType = - new MediaType("text", "slim", Compressible, NotBinary, List("slim", "slm")) - lazy val `spdx`: MediaType = - new MediaType("text", "spdx", Compressible, NotBinary, List("spdx")) - lazy val `strings`: MediaType = new MediaType("text", "strings", Compressible, NotBinary) - lazy val `stylus`: MediaType = - new MediaType("text", "stylus", Compressible, NotBinary, List("stylus", "styl")) - lazy val `t140`: MediaType = new MediaType("text", "t140", Compressible, NotBinary) - lazy val `tab-separated-values`: MediaType = - new MediaType("text", "tab-separated-values", Compressible, NotBinary, List("tsv")) - lazy val `troff`: MediaType = new MediaType( - "text", - "troff", - Compressible, - NotBinary, - List("t", "tr", "roff", "man", "me", "ms"), - ) - lazy val `turtle`: MediaType = - new MediaType("text", "turtle", Compressible, NotBinary, List("ttl")) - lazy val `ulpfec`: MediaType = new MediaType("text", "ulpfec", Compressible, NotBinary) - lazy val `uri-list`: MediaType = - new MediaType("text", "uri-list", Compressible, NotBinary, List("uri", "uris", "urls")) - lazy val `vcard`: MediaType = - new MediaType("text", "vcard", Compressible, NotBinary, List("vcard")) - lazy val `vnd.a`: MediaType = new MediaType("text", "vnd.a", Compressible, NotBinary) - lazy val `vnd.abc`: MediaType = new MediaType("text", "vnd.abc", Compressible, NotBinary) - lazy val `vnd.ascii-art`: MediaType = - new MediaType("text", "vnd.ascii-art", Compressible, NotBinary) - lazy val `vnd.curl`: MediaType = - new MediaType("text", "vnd.curl", Compressible, NotBinary, List("curl")) - lazy val `vnd.curl.dcurl`: MediaType = - new MediaType("text", "vnd.curl.dcurl", Compressible, NotBinary, List("dcurl")) - lazy val `vnd.curl.mcurl`: MediaType = - new MediaType("text", "vnd.curl.mcurl", Compressible, NotBinary, List("mcurl")) - lazy val `vnd.curl.scurl`: MediaType = - new MediaType("text", "vnd.curl.scurl", Compressible, NotBinary, List("scurl")) - lazy val `vnd.debian.copyright`: MediaType = - new MediaType("text", "vnd.debian.copyright", Compressible, NotBinary) - lazy val `vnd.dmclientscript`: MediaType = - new MediaType("text", "vnd.dmclientscript", Compressible, NotBinary) - lazy val `vnd.dvb.subtitle`: MediaType = - new MediaType("text", "vnd.dvb.subtitle", Compressible, NotBinary, List("sub")) - lazy val `vnd.esmertec.theme-descriptor`: MediaType = - new MediaType("text", "vnd.esmertec.theme-descriptor", Compressible, NotBinary) - lazy val `vnd.ficlab.flt`: MediaType = - new MediaType("text", "vnd.ficlab.flt", Compressible, NotBinary) - lazy val `vnd.fly`: MediaType = - new MediaType("text", "vnd.fly", Compressible, NotBinary, List("fly")) - lazy val `vnd.fmi.flexstor`: MediaType = - new MediaType("text", "vnd.fmi.flexstor", Compressible, NotBinary, List("flx")) - lazy val `vnd.gml`: MediaType = new MediaType("text", "vnd.gml", Compressible, NotBinary) - lazy val `vnd.graphviz`: MediaType = - new MediaType("text", "vnd.graphviz", Compressible, NotBinary, List("gv")) - lazy val `vnd.hans`: MediaType = new MediaType("text", "vnd.hans", Compressible, NotBinary) - lazy val `vnd.hgl`: MediaType = new MediaType("text", "vnd.hgl", Compressible, NotBinary) - lazy val `vnd.in3d.3dml`: MediaType = - new MediaType("text", "vnd.in3d.3dml", Compressible, NotBinary, List("3dml")) - lazy val `vnd.in3d.spot`: MediaType = - new MediaType("text", "vnd.in3d.spot", Compressible, NotBinary, List("spot")) - lazy val `vnd.iptc.newsml`: MediaType = - new MediaType("text", "vnd.iptc.newsml", Compressible, NotBinary) - lazy val `vnd.iptc.nitf`: MediaType = - new MediaType("text", "vnd.iptc.nitf", Compressible, NotBinary) - lazy val `vnd.latex-z`: MediaType = - new MediaType("text", "vnd.latex-z", Compressible, NotBinary) - lazy val `vnd.motorola.reflex`: MediaType = - new MediaType("text", "vnd.motorola.reflex", Compressible, NotBinary) - lazy val `vnd.ms-mediapackage`: MediaType = - new MediaType("text", "vnd.ms-mediapackage", Compressible, NotBinary) - lazy val `vnd.net2phone.commcenter.command`: MediaType = - new MediaType("text", "vnd.net2phone.commcenter.command", Compressible, NotBinary) - lazy val `vnd.radisys.msml-basic-layout`: MediaType = - new MediaType("text", "vnd.radisys.msml-basic-layout", Compressible, NotBinary) - lazy val `vnd.senx.warpscript`: MediaType = - new MediaType("text", "vnd.senx.warpscript", Compressible, NotBinary) - lazy val `vnd.si.uricatalogue`: MediaType = - new MediaType("text", "vnd.si.uricatalogue", Compressible, NotBinary) - lazy val `vnd.sosi`: MediaType = new MediaType("text", "vnd.sosi", Compressible, NotBinary) - lazy val `vnd.sun.j2me.app-descriptor`: MediaType = - new MediaType("text", "vnd.sun.j2me.app-descriptor", Compressible, NotBinary, List("jad")) - lazy val `vnd.trolltech.linguist`: MediaType = - new MediaType("text", "vnd.trolltech.linguist", Compressible, NotBinary) - lazy val `vnd.wap.si`: MediaType = new MediaType("text", "vnd.wap.si", Compressible, NotBinary) - lazy val `vnd.wap.sl`: MediaType = new MediaType("text", "vnd.wap.sl", Compressible, NotBinary) - lazy val `vnd.wap.wml`: MediaType = - new MediaType("text", "vnd.wap.wml", Compressible, NotBinary, List("wml")) - lazy val `vnd.wap.wmlscript`: MediaType = - new MediaType("text", "vnd.wap.wmlscript", Compressible, NotBinary, List("wmls")) - lazy val `vtt`: MediaType = new MediaType("text", "vtt", Compressible, NotBinary, List("vtt")) - lazy val `x-asm`: MediaType = - new MediaType("text", "x-asm", Compressible, NotBinary, List("s", "asm")) - lazy val `x-c`: MediaType = new MediaType( - "text", - "x-c", - Compressible, - NotBinary, - List("c", "cc", "cxx", "cpp", "h", "hh", "dic"), - ) - lazy val `x-component`: MediaType = - new MediaType("text", "x-component", Compressible, NotBinary, List("htc")) - lazy val `x-fortran`: MediaType = - new MediaType("text", "x-fortran", Compressible, NotBinary, List("f", "for", "f77", "f90")) - lazy val `x-gwt-rpc`: MediaType = new MediaType("text", "x-gwt-rpc", Compressible, NotBinary) - lazy val `x-handlebars-template`: MediaType = - new MediaType("text", "x-handlebars-template", Compressible, NotBinary, List("hbs")) - lazy val `x-java-source`: MediaType = - new MediaType("text", "x-java-source", Compressible, NotBinary, List("java")) - lazy val `x-jquery-tmpl`: MediaType = - new MediaType("text", "x-jquery-tmpl", Compressible, NotBinary) - lazy val `x-lua`: MediaType = - new MediaType("text", "x-lua", Compressible, NotBinary, List("lua")) - lazy val `x-markdown`: MediaType = - new MediaType("text", "x-markdown", Compressible, NotBinary, List("mkd")) - lazy val `x-nfo`: MediaType = - new MediaType("text", "x-nfo", Compressible, NotBinary, List("nfo")) - lazy val `x-opml`: MediaType = - new MediaType("text", "x-opml", Compressible, NotBinary, List("opml")) - lazy val `x-org`: MediaType = - new MediaType("text", "x-org", Compressible, NotBinary, List("org")) - lazy val `x-pascal`: MediaType = - new MediaType("text", "x-pascal", Compressible, NotBinary, List("p", "pas")) - lazy val `x-processing`: MediaType = - new MediaType("text", "x-processing", Compressible, NotBinary, List("pde")) - lazy val `x-sass`: MediaType = - new MediaType("text", "x-sass", Compressible, NotBinary, List("sass")) - lazy val `x-scss`: MediaType = - new MediaType("text", "x-scss", Compressible, NotBinary, List("scss")) - lazy val `x-setext`: MediaType = - new MediaType("text", "x-setext", Compressible, NotBinary, List("etx")) - lazy val `x-sfv`: MediaType = - new MediaType("text", "x-sfv", Compressible, NotBinary, List("sfv")) - lazy val `x-suse-ymp`: MediaType = - new MediaType("text", "x-suse-ymp", Compressible, NotBinary, List("ymp")) - lazy val `x-uuencode`: MediaType = - new MediaType("text", "x-uuencode", Compressible, NotBinary, List("uu")) - lazy val `x-vcalendar`: MediaType = - new MediaType("text", "x-vcalendar", Compressible, NotBinary, List("vcs")) - lazy val `x-vcard`: MediaType = - new MediaType("text", "x-vcard", Compressible, NotBinary, List("vcf")) - lazy val `xml`: MediaType = new MediaType("text", "xml", Compressible, NotBinary, List("xml")) - lazy val `xml-external-parsed-entity`: MediaType = - new MediaType("text", "xml-external-parsed-entity", Compressible, NotBinary) - lazy val `yaml`: MediaType = - new MediaType("text", "yaml", Compressible, NotBinary, List("yaml", "yml")) - lazy val all: List[MediaType] = List( - `1d-interleaved-parityfec`, - `cache-manifest`, - `calendar`, - `calender`, - `cmd`, - `coffeescript`, - `cql`, - `cql-expression`, - `cql-identifier`, - `css`, - `csv`, - `csv-schema`, - `directory`, - `dns`, - `ecmascript`, - `encaprtp`, - `enriched`, - `event-stream`, - `fhirpath`, + new MediaType("audio", "1d-interleaved-parityfec", compressible = false, binary = true) + + lazy val `vnd.nuera.ecelp9600`: MediaType = + new MediaType("audio", "vnd.nuera.ecelp9600", compressible = false, binary = true, List("ecelp9600")) + + lazy val `silk`: MediaType = + new MediaType("audio", "silk", compressible = false, binary = true, List("sil")) + + lazy val `pcmu-wb`: MediaType = + new MediaType("audio", "pcmu-wb", compressible = false, binary = true) + + lazy val `vnd.dts`: MediaType = + new MediaType("audio", "vnd.dts", compressible = false, binary = true, List("dts")) + + lazy val `vnd.dolby.pl2x`: MediaType = + new MediaType("audio", "vnd.dolby.pl2x", compressible = false, binary = true) + + lazy val `encaprtp`: MediaType = + new MediaType("audio", "encaprtp", compressible = false, binary = true) + + lazy val `vnd.dolby.mps`: MediaType = + new MediaType("audio", "vnd.dolby.mps", compressible = false, binary = true) + + lazy val `evrcb1`: MediaType = + new MediaType("audio", "evrcb1", compressible = false, binary = true) + + lazy val `parityfec`: MediaType = + new MediaType("audio", "parityfec", compressible = false, binary = true) + + lazy val `x-matroska`: MediaType = + new MediaType("audio", "x-matroska", compressible = false, binary = true, List("mka")) + + lazy val `x-realaudio`: MediaType = + new MediaType("audio", "x-realaudio", compressible = false, binary = true, List("ra")) + + lazy val `vnd.nuera.ecelp4800`: MediaType = + new MediaType("audio", "vnd.nuera.ecelp4800", compressible = false, binary = true, List("ecelp4800")) + + lazy val `vnd.digital-winds`: MediaType = + new MediaType("audio", "vnd.digital-winds", compressible = false, binary = true, List("eol")) + + lazy val `smv`: MediaType = + new MediaType("audio", "smv", compressible = false, binary = true) + + lazy val `g7221`: MediaType = + new MediaType("audio", "g7221", compressible = false, binary = true) + + lazy val `vmr-wb`: MediaType = + new MediaType("audio", "vmr-wb", compressible = false, binary = true) + + lazy val `vnd.celp`: MediaType = + new MediaType("audio", "vnd.celp", compressible = false, binary = true) + + lazy val `g726-40`: MediaType = + new MediaType("audio", "g726-40", compressible = false, binary = true) + + lazy val `g722`: MediaType = + new MediaType("audio", "g722", compressible = false, binary = true) + + lazy val `vnd.dra`: MediaType = + new MediaType("audio", "vnd.dra", compressible = false, binary = true, List("dra")) + + lazy val `pcmu`: MediaType = + new MediaType("audio", "pcmu", compressible = false, binary = true) + + lazy val `vnd.dolby.pulse.1`: MediaType = + new MediaType("audio", "vnd.dolby.pulse.1", compressible = false, binary = true) + + lazy val `lpc`: MediaType = + new MediaType("audio", "lpc", compressible = false, binary = true) + + lazy val `melp600`: MediaType = + new MediaType("audio", "melp600", compressible = false, binary = true) + + lazy val `x-wav`: MediaType = + new MediaType("audio", "x-wav", compressible = false, binary = true, List("wav")) + + lazy val `l20`: MediaType = + new MediaType("audio", "l20", compressible = false, binary = true) + + lazy val `basic`: MediaType = + new MediaType("audio", "basic", compressible = false, binary = true, List("au", "snd")) + + lazy val `asc`: MediaType = + new MediaType("audio", "asc", compressible = false, binary = true) + + lazy val `speex`: MediaType = + new MediaType("audio", "speex", compressible = false, binary = true) + + lazy val `raptorfec`: MediaType = + new MediaType("audio", "raptorfec", compressible = false, binary = true) + + lazy val `vnd.cns.anp1`: MediaType = + new MediaType("audio", "vnd.cns.anp1", compressible = false, binary = true) + + lazy val `evrcwb1`: MediaType = + new MediaType("audio", "evrcwb1", compressible = false, binary = true) + + lazy val `mpeg`: MediaType = + new MediaType( + "audio", + "mpeg", + compressible = false, + binary = true, + List("mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"), + ) + + lazy val `atrac-x`: MediaType = + new MediaType("audio", "atrac-x", compressible = false, binary = true) + + lazy val `midi`: MediaType = + new MediaType("audio", "midi", compressible = false, binary = true, List("mid", "midi", "kar", "rmi")) + + lazy val `smv-qcp`: MediaType = + new MediaType("audio", "smv-qcp", compressible = false, binary = true) + + lazy val `t38`: MediaType = + new MediaType("audio", "t38", compressible = false, binary = true) + + lazy val `scip`: MediaType = + new MediaType("audio", "scip", compressible = false, binary = true) + + lazy val `rtp-enc-aescm128`: MediaType = + new MediaType("audio", "rtp-enc-aescm128", compressible = false, binary = true) + + lazy val `vnd.nuera.ecelp7470`: MediaType = + new MediaType("audio", "vnd.nuera.ecelp7470", compressible = false, binary = true, List("ecelp7470")) + + lazy val `evrc-qcp`: MediaType = + new MediaType("audio", "evrc-qcp", compressible = false, binary = true) + + lazy val `prs.sid`: MediaType = + new MediaType("audio", "prs.sid", compressible = false, binary = true) + + lazy val `dsr-es202050`: MediaType = + new MediaType("audio", "dsr-es202050", compressible = false, binary = true) + + lazy val `vnd.lucent.voice`: MediaType = + new MediaType("audio", "vnd.lucent.voice", compressible = false, binary = true, List("lvp")) + + lazy val `g726-32`: MediaType = + new MediaType("audio", "g726-32", compressible = false, binary = true) + + lazy val `g7291`: MediaType = + new MediaType("audio", "g7291", compressible = false, binary = true) + + lazy val `webm`: MediaType = + new MediaType("audio", "webm", compressible = false, binary = true, List("weba")) + + lazy val `melp2400`: MediaType = + new MediaType("audio", "melp2400", compressible = false, binary = true) + + lazy val `cn`: MediaType = + new MediaType("audio", "cn", compressible = false, binary = true) + + lazy val `l8`: MediaType = + new MediaType("audio", "l8", compressible = false, binary = true) + + lazy val `vnd.wave`: MediaType = + new MediaType("audio", "vnd.wave", compressible = false, binary = true) + + lazy val `xm`: MediaType = + new MediaType("audio", "xm", compressible = false, binary = true, List("xm")) + + lazy val `atrac3`: MediaType = + new MediaType("audio", "atrac3", compressible = false, binary = true) + + lazy val `pcma`: MediaType = + new MediaType("audio", "pcma", compressible = false, binary = true) + + lazy val `tetra_acelp_bb`: MediaType = + new MediaType("audio", "tetra_acelp_bb", compressible = false, binary = true) + + lazy val `vnd.dts.hd`: MediaType = + new MediaType("audio", "vnd.dts.hd", compressible = false, binary = true, List("dtshd")) + + lazy val `x-caf`: MediaType = + new MediaType("audio", "x-caf", compressible = false, binary = true, List("caf")) + + lazy val `amr`: MediaType = + new MediaType("audio", "amr", compressible = false, binary = true, List("amr")) + + lazy val `gsm`: MediaType = + new MediaType("audio", "gsm", compressible = false, binary = true) + + lazy val `ulpfec`: MediaType = + new MediaType("audio", "ulpfec", compressible = false, binary = true) + + lazy val `aac`: MediaType = + new MediaType("audio", "aac", compressible = false, binary = true, List("adts", "aac")) + + lazy val `wave`: MediaType = + new MediaType("audio", "wave", compressible = false, binary = true, List("wav")) + + lazy val `sp-midi`: MediaType = + new MediaType("audio", "sp-midi", compressible = false, binary = true) + + lazy val `vnd.nortel.vbk`: MediaType = + new MediaType("audio", "vnd.nortel.vbk", compressible = false, binary = true) + + lazy val `uemclip`: MediaType = + new MediaType("audio", "uemclip", compressible = false, binary = true) + + lazy val `mpa`: MediaType = + new MediaType("audio", "mpa", compressible = false, binary = true) + + lazy val `x-flac`: MediaType = + new MediaType("audio", "x-flac", compressible = false, binary = true, List("flac")) + + lazy val `vnd.rn-realaudio`: MediaType = + new MediaType("audio", "vnd.rn-realaudio", compressible = false, binary = true) + + lazy val `g723`: MediaType = + new MediaType("audio", "g723", compressible = false, binary = true) + + lazy val `g726-24`: MediaType = + new MediaType("audio", "g726-24", compressible = false, binary = true) + + lazy val `tsvcis`: MediaType = + new MediaType("audio", "tsvcis", compressible = false, binary = true) + + lazy val `vnd.rip`: MediaType = + new MediaType("audio", "vnd.rip", compressible = false, binary = true, List("rip")) + + lazy val `mpa-robust`: MediaType = + new MediaType("audio", "mpa-robust", compressible = false, binary = true) + + lazy val `vnd.sealedmedia.softseal.mpeg`: MediaType = + new MediaType("audio", "vnd.sealedmedia.softseal.mpeg", compressible = false, binary = true) + + lazy val `s3m`: MediaType = + new MediaType("audio", "s3m", compressible = false, binary = true, List("s3m")) + + lazy val `adpcm`: MediaType = + new MediaType("audio", "adpcm", compressible = false, binary = true, List("adp")) + + lazy val `g711-0`: MediaType = + new MediaType("audio", "g711-0", compressible = false, binary = true) + + lazy val `fwdred`: MediaType = + new MediaType("audio", "fwdred", compressible = false, binary = true) + + lazy val `x-m4a`: MediaType = + new MediaType("audio", "x-m4a", compressible = false, binary = true, List("m4a")) + + lazy val `evs`: MediaType = + new MediaType("audio", "evs", compressible = false, binary = true) + + lazy val `vnd.dolby.mlp`: MediaType = + new MediaType("audio", "vnd.dolby.mlp", compressible = false, binary = true) + + lazy val `vnd.rhetorex.32kadpcm`: MediaType = + new MediaType("audio", "vnd.rhetorex.32kadpcm", compressible = false, binary = true) + + lazy val `vorbis`: MediaType = + new MediaType("audio", "vorbis", compressible = false, binary = true) + + lazy val `dat12`: MediaType = + new MediaType("audio", "dat12", compressible = false, binary = true) + + lazy val `clearmode`: MediaType = + new MediaType("audio", "clearmode", compressible = false, binary = true) + + lazy val `x-mpegurl`: MediaType = + new MediaType("audio", "x-mpegurl", compressible = false, binary = true, List("m3u")) + + lazy val `vnd.audiokoz`: MediaType = + new MediaType("audio", "vnd.audiokoz", compressible = false, binary = true) + + lazy val `musepack`: MediaType = + new MediaType("audio", "musepack", compressible = false, binary = true) + + lazy val `usac`: MediaType = + new MediaType("audio", "usac", compressible = false, binary = true) + + lazy val `vnd.nokia.mobile-xmf`: MediaType = + new MediaType("audio", "vnd.nokia.mobile-xmf", compressible = false, binary = true) + + lazy val `dv`: MediaType = + new MediaType("audio", "dv", compressible = false, binary = true) + + lazy val `g728`: MediaType = + new MediaType("audio", "g728", compressible = false, binary = true) + + lazy val `evrcwb`: MediaType = + new MediaType("audio", "evrcwb", compressible = false, binary = true) + + lazy val `vnd.presonus.multitrack`: MediaType = + new MediaType("audio", "vnd.presonus.multitrack", compressible = false, binary = true) + + lazy val `g726-16`: MediaType = + new MediaType("audio", "g726-16", compressible = false, binary = true) + + lazy val `mpeg4-generic`: MediaType = + new MediaType("audio", "mpeg4-generic", compressible = false, binary = true) + + lazy val `ilbc`: MediaType = + new MediaType("audio", "ilbc", compressible = false, binary = true) + + lazy val `mp4`: MediaType = + new MediaType("audio", "mp4", compressible = false, binary = true, List("m4a", "mp4a")) + + lazy val `x-aiff`: MediaType = + new MediaType("audio", "x-aiff", compressible = false, binary = true, List("aif", "aiff", "aifc")) + + lazy val `x-pn-realaudio`: MediaType = + new MediaType("audio", "x-pn-realaudio", compressible = false, binary = true, List("ram", "ra")) + + lazy val `x-aac`: MediaType = + new MediaType("audio", "x-aac", compressible = false, binary = true, List("aac")) + + lazy val `vnd.dolby.heaac.2`: MediaType = + new MediaType("audio", "vnd.dolby.heaac.2", compressible = false, binary = true) + + lazy val `amr-wb+` : MediaType = + new MediaType("audio", "amr-wb+", compressible = false, binary = true) + + lazy val `dsr-es202211`: MediaType = + new MediaType("audio", "dsr-es202211", compressible = false, binary = true) + + lazy val `smv0`: MediaType = + new MediaType("audio", "smv0", compressible = false, binary = true) + + lazy val `bv16`: MediaType = + new MediaType("audio", "bv16", compressible = false, binary = true) + + lazy val `g729`: MediaType = + new MediaType("audio", "g729", compressible = false, binary = true) + + lazy val `x-tta`: MediaType = + new MediaType("audio", "x-tta", compressible = false, binary = true) + + lazy val `g729e`: MediaType = + new MediaType("audio", "g729e", compressible = false, binary = true) + + lazy val `melp`: MediaType = + new MediaType("audio", "melp", compressible = false, binary = true) + + lazy val `mobile-xmf`: MediaType = + new MediaType("audio", "mobile-xmf", compressible = false, binary = true, List("mxmf")) + + lazy val `dls`: MediaType = + new MediaType("audio", "dls", compressible = false, binary = true) + + lazy val `evrc0`: MediaType = + new MediaType("audio", "evrc0", compressible = false, binary = true) + + lazy val `vorbis-config`: MediaType = + new MediaType("audio", "vorbis-config", compressible = false, binary = true) + + lazy val `gsm-efr`: MediaType = + new MediaType("audio", "gsm-efr", compressible = false, binary = true) + + lazy val `rtp-midi`: MediaType = + new MediaType("audio", "rtp-midi", compressible = false, binary = true) + + lazy val `vnd.dlna.adts`: MediaType = + new MediaType("audio", "vnd.dlna.adts", compressible = false, binary = true) + + lazy val `vnd.vmx.cvsd`: MediaType = + new MediaType("audio", "vnd.vmx.cvsd", compressible = false, binary = true) + + lazy val `vnd.dvb.file`: MediaType = + new MediaType("audio", "vnd.dvb.file", compressible = false, binary = true) + + lazy val `isac`: MediaType = + new MediaType("audio", "isac", compressible = false, binary = true) + + lazy val `telephone-event`: MediaType = + new MediaType("audio", "telephone-event", compressible = false, binary = true) + + lazy val `l16`: MediaType = + new MediaType("audio", "l16", compressible = false, binary = true) + + lazy val `3gpp2`: MediaType = + new MediaType("audio", "3gpp2", compressible = false, binary = true) + + lazy val `melp1200`: MediaType = + new MediaType("audio", "melp1200", compressible = false, binary = true) + + lazy val `vnd.cns.inf1`: MediaType = + new MediaType("audio", "vnd.cns.inf1", compressible = false, binary = true) + + lazy val `wav`: MediaType = + new MediaType("audio", "wav", compressible = false, binary = true, List("wav")) + + lazy val `bv32`: MediaType = + new MediaType("audio", "bv32", compressible = false, binary = true) + + lazy val `pcma-wb`: MediaType = + new MediaType("audio", "pcma-wb", compressible = false, binary = true) + + lazy val `ac3`: MediaType = + new MediaType("audio", "ac3", compressible = false, binary = true) + + lazy val `vnd.qcelp`: MediaType = + new MediaType("audio", "vnd.qcelp", compressible = false, binary = true) + + lazy val `vnd.octel.sbc`: MediaType = + new MediaType("audio", "vnd.octel.sbc", compressible = false, binary = true) + + lazy val `atrac-advanced-lossless`: MediaType = + new MediaType("audio", "atrac-advanced-lossless", compressible = false, binary = true) + + lazy val `qcelp`: MediaType = + new MediaType("audio", "qcelp", compressible = false, binary = true) + + lazy val `x-pn-realaudio-plugin`: MediaType = + new MediaType("audio", "x-pn-realaudio-plugin", compressible = false, binary = true, List("rmp")) + + lazy val `g719`: MediaType = + new MediaType("audio", "g719", compressible = false, binary = true) + + lazy val `tone`: MediaType = + new MediaType("audio", "tone", compressible = false, binary = true) + + lazy val `dvi4`: MediaType = + new MediaType("audio", "dvi4", compressible = false, binary = true) + + lazy val `vnd.hns.audio`: MediaType = + new MediaType("audio", "vnd.hns.audio", compressible = false, binary = true) + + lazy val `x-ms-wax`: MediaType = + new MediaType("audio", "x-ms-wax", compressible = false, binary = true, List("wax")) + + lazy val `g729d`: MediaType = + new MediaType("audio", "g729d", compressible = false, binary = true) + + lazy val `t140c`: MediaType = + new MediaType("audio", "t140c", compressible = false, binary = true) + + lazy val `32kadpcm`: MediaType = + new MediaType("audio", "32kadpcm", compressible = false, binary = true) + + lazy val `mp3`: MediaType = + new MediaType("audio", "mp3", compressible = false, binary = true, List("mp3")) + + lazy val `evrcnw`: MediaType = + new MediaType("audio", "evrcnw", compressible = false, binary = true) + + lazy val `vnd.cisco.nse`: MediaType = + new MediaType("audio", "vnd.cisco.nse", compressible = false, binary = true) + + lazy val `opus`: MediaType = + new MediaType("audio", "opus", compressible = false, binary = true) + + lazy val `evrcb0`: MediaType = + new MediaType("audio", "evrcb0", compressible = false, binary = true) + + lazy val `3gpp`: MediaType = + new MediaType("audio", "3gpp", compressible = false, binary = true, List("3gpp")) + + lazy val `ogg`: MediaType = + new MediaType("audio", "ogg", compressible = false, binary = true, List("oga", "ogg", "spx", "opus")) + + lazy val `vnd.dolby.pl2z`: MediaType = + new MediaType("audio", "vnd.dolby.pl2z", compressible = false, binary = true) + + lazy val `vnd.cmles.radio-events`: MediaType = + new MediaType("audio", "vnd.cmles.radio-events", compressible = false, binary = true) + + lazy val `evrc`: MediaType = + new MediaType("audio", "evrc", compressible = false, binary = true) + + lazy val `vnd.dolby.pl2`: MediaType = + new MediaType("audio", "vnd.dolby.pl2", compressible = false, binary = true) + + lazy val `mhas`: MediaType = + new MediaType("audio", "mhas", compressible = false, binary = true) + + lazy val `l24`: MediaType = + new MediaType("audio", "l24", compressible = false, binary = true) + + lazy val `vnd.dts.uhd`: MediaType = + new MediaType("audio", "vnd.dts.uhd", compressible = false, binary = true) + + lazy val `x-ms-wma`: MediaType = + new MediaType("audio", "x-ms-wma", compressible = false, binary = true, List("wma")) + + lazy val `tetra_acelp`: MediaType = + new MediaType("audio", "tetra_acelp", compressible = false, binary = true) + + lazy val `gsm-hr-08`: MediaType = + new MediaType("audio", "gsm-hr-08", compressible = false, binary = true) + + lazy val `eac3`: MediaType = + new MediaType("audio", "eac3", compressible = false, binary = true) + + lazy val `evrcwb0`: MediaType = + new MediaType("audio", "evrcwb0", compressible = false, binary = true) + + lazy val `vdvi`: MediaType = + new MediaType("audio", "vdvi", compressible = false, binary = true) + + lazy val `dsr-es202212`: MediaType = + new MediaType("audio", "dsr-es202212", compressible = false, binary = true) + + lazy val `rtploopback`: MediaType = + new MediaType("audio", "rtploopback", compressible = false, binary = true) + + lazy val `mp4a-latm`: MediaType = + new MediaType("audio", "mp4a-latm", compressible = false, binary = true) + + lazy val `sofa`: MediaType = + new MediaType("audio", "sofa", compressible = false, binary = true) + + lazy val `amr-wb`: MediaType = + new MediaType("audio", "amr-wb", compressible = false, binary = true) + + lazy val `evrcb`: MediaType = + new MediaType("audio", "evrcb", compressible = false, binary = true) + + lazy val `ip-mr_v2.5`: MediaType = + new MediaType("audio", "ip-mr_v2.5", compressible = false, binary = true) + + lazy val `evrcnw0`: MediaType = + new MediaType("audio", "evrcnw0", compressible = false, binary = true) + + lazy val `vnd.3gpp.iufp`: MediaType = + new MediaType("audio", "vnd.3gpp.iufp", compressible = false, binary = true) + + lazy val `aptx`: MediaType = + new MediaType("audio", "aptx", compressible = false, binary = true) + + lazy val all: List[MediaType] = List( + `vnd.4sb`, + `evrc1`, + `dsr-es201108`, + `vnd.everad.plj`, + `vnd.dece.audio`, + `rtx`, + `vnd.ms-playready.media.pya`, + `evrcnw1`, `flexfec`, - `fwdred`, - `gff3`, - `grammar-ref-list`, - `html`, - `jade`, - `javascript`, - `jcr-cnd`, - `jsx`, - `less`, - `markdown`, - `mathml`, - `mdx`, - `mizar`, - `n3`, - `parameters`, - `parityfec`, - `plain`, - `provenance-notation`, - `prs.fallenstein.rst`, - `prs.lines.tag`, - `prs.prop.logic`, - `raptorfec`, `red`, - `rfc822-headers`, - `richtext`, - `rtf`, - `rtp-enc-aescm128`, - `rtploopback`, - `rtx`, - `sgml`, - `shaclc`, - `shex`, - `slim`, - `spdx`, - `strings`, - `stylus`, - `t140`, - `tab-separated-values`, - `troff`, - `turtle`, - `ulpfec`, - `uri-list`, - `vcard`, - `vnd.a`, - `vnd.abc`, - `vnd.ascii-art`, - `vnd.curl`, - `vnd.curl.dcurl`, - `vnd.curl.mcurl`, - `vnd.curl.scurl`, - `vnd.debian.copyright`, - `vnd.dmclientscript`, - `vnd.dvb.subtitle`, - `vnd.esmertec.theme-descriptor`, - `vnd.ficlab.flt`, - `vnd.fly`, - `vnd.fmi.flexstor`, - `vnd.gml`, - `vnd.graphviz`, - `vnd.hans`, - `vnd.hgl`, - `vnd.in3d.3dml`, - `vnd.in3d.spot`, - `vnd.iptc.newsml`, - `vnd.iptc.nitf`, - `vnd.latex-z`, - `vnd.motorola.reflex`, - `vnd.ms-mediapackage`, - `vnd.net2phone.commcenter.command`, - `vnd.radisys.msml-basic-layout`, - `vnd.senx.warpscript`, - `vnd.si.uricatalogue`, - `vnd.sosi`, - `vnd.sun.j2me.app-descriptor`, - `vnd.trolltech.linguist`, - `vnd.wap.si`, - `vnd.wap.sl`, - `vnd.wap.wml`, - `vnd.wap.wmlscript`, - `vtt`, - `x-asm`, - `x-c`, - `x-component`, - `x-fortran`, - `x-gwt-rpc`, - `x-handlebars-template`, - `x-java-source`, - `x-jquery-tmpl`, - `x-lua`, - `x-markdown`, - `x-nfo`, - `x-opml`, - `x-org`, - `x-pascal`, - `x-processing`, - `x-sass`, - `x-scss`, - `x-setext`, - `x-sfv`, - `x-suse-ymp`, - `x-uuencode`, - `x-vcalendar`, - `x-vcard`, - `xml`, - `xml-external-parsed-entity`, - `yaml`, - ) - lazy val any: MediaType = new MediaType("text", "*") - } - object video { - lazy val `1d-interleaved-parityfec`: MediaType = - new MediaType("video", "1d-interleaved-parityfec", Compressible, Binary) - lazy val `3gpp`: MediaType = - new MediaType("video", "3gpp", Compressible, Binary, List("3gp", "3gpp")) - lazy val `3gpp-tt`: MediaType = new MediaType("video", "3gpp-tt", Compressible, Binary) - lazy val `3gpp2`: MediaType = new MediaType("video", "3gpp2", Compressible, Binary, List("3g2")) - lazy val `av1`: MediaType = new MediaType("video", "av1", Compressible, Binary) - lazy val `bmpeg`: MediaType = new MediaType("video", "bmpeg", Compressible, Binary) - lazy val `bt656`: MediaType = new MediaType("video", "bt656", Compressible, Binary) - lazy val `celb`: MediaType = new MediaType("video", "celb", Compressible, Binary) - lazy val `dv`: MediaType = new MediaType("video", "dv", Compressible, Binary) - lazy val `encaprtp`: MediaType = new MediaType("video", "encaprtp", Compressible, Binary) - lazy val `ffv1`: MediaType = new MediaType("video", "ffv1", Compressible, Binary) - lazy val `flexfec`: MediaType = new MediaType("video", "flexfec", Compressible, Binary) - lazy val `h261`: MediaType = new MediaType("video", "h261", Compressible, Binary, List("h261")) - lazy val `h263`: MediaType = new MediaType("video", "h263", Compressible, Binary, List("h263")) - lazy val `h263-1998`: MediaType = new MediaType("video", "h263-1998", Compressible, Binary) - lazy val `h263-2000`: MediaType = new MediaType("video", "h263-2000", Compressible, Binary) - lazy val `h264`: MediaType = new MediaType("video", "h264", Compressible, Binary, List("h264")) - lazy val `h264-rcdo`: MediaType = new MediaType("video", "h264-rcdo", Compressible, Binary) - lazy val `h264-svc`: MediaType = new MediaType("video", "h264-svc", Compressible, Binary) - lazy val `h265`: MediaType = new MediaType("video", "h265", Compressible, Binary) - lazy val `iso.segment`: MediaType = - new MediaType("video", "iso.segment", Compressible, Binary, List("m4s")) - lazy val `jpeg`: MediaType = new MediaType("video", "jpeg", Compressible, Binary, List("jpgv")) - lazy val `jpeg2000`: MediaType = new MediaType("video", "jpeg2000", Compressible, Binary) - lazy val `jpm`: MediaType = - new MediaType("video", "jpm", Compressible, Binary, List("jpm", "jpgm")) - lazy val `mj2`: MediaType = - new MediaType("video", "mj2", Compressible, Binary, List("mj2", "mjp2")) - lazy val `mp1s`: MediaType = new MediaType("video", "mp1s", Compressible, Binary) - lazy val `mp2p`: MediaType = new MediaType("video", "mp2p", Compressible, Binary) - lazy val `mp2t`: MediaType = new MediaType("video", "mp2t", Compressible, Binary, List("ts")) - lazy val `mp4`: MediaType = - new MediaType("video", "mp4", Uncompressible, Binary, List("mp4", "mp4v", "mpg4")) - lazy val `mp4v-es`: MediaType = new MediaType("video", "mp4v-es", Compressible, Binary) - lazy val `mpeg`: MediaType = new MediaType( - "video", - "mpeg", - Uncompressible, - Binary, - List("mpeg", "mpg", "mpe", "m1v", "m2v"), - ) - lazy val `mpeg4-generic`: MediaType = - new MediaType("video", "mpeg4-generic", Compressible, Binary) - lazy val `mpv`: MediaType = new MediaType("video", "mpv", Compressible, Binary) - lazy val `nv`: MediaType = new MediaType("video", "nv", Compressible, Binary) - lazy val `ogg`: MediaType = new MediaType("video", "ogg", Uncompressible, Binary, List("ogv")) - lazy val `parityfec`: MediaType = new MediaType("video", "parityfec", Compressible, Binary) - lazy val `pointer`: MediaType = new MediaType("video", "pointer", Compressible, Binary) - lazy val `quicktime`: MediaType = - new MediaType("video", "quicktime", Uncompressible, Binary, List("qt", "mov")) - lazy val `raptorfec`: MediaType = new MediaType("video", "raptorfec", Compressible, Binary) - lazy val `raw`: MediaType = new MediaType("video", "raw", Compressible, Binary) - lazy val `rtp-enc-aescm128`: MediaType = - new MediaType("video", "rtp-enc-aescm128", Compressible, Binary) - lazy val `rtploopback`: MediaType = new MediaType("video", "rtploopback", Compressible, Binary) - lazy val `rtx`: MediaType = new MediaType("video", "rtx", Compressible, Binary) - lazy val `scip`: MediaType = new MediaType("video", "scip", Compressible, Binary) - lazy val `smpte291`: MediaType = new MediaType("video", "smpte291", Compressible, Binary) - lazy val `smpte292m`: MediaType = new MediaType("video", "smpte292m", Compressible, Binary) - lazy val `ulpfec`: MediaType = new MediaType("video", "ulpfec", Compressible, Binary) - lazy val `vc1`: MediaType = new MediaType("video", "vc1", Compressible, Binary) - lazy val `vc2`: MediaType = new MediaType("video", "vc2", Compressible, Binary) - lazy val `vnd.cctv`: MediaType = new MediaType("video", "vnd.cctv", Compressible, Binary) - lazy val `vnd.dece.hd`: MediaType = - new MediaType("video", "vnd.dece.hd", Compressible, Binary, List("uvh", "uvvh")) - lazy val `vnd.dece.mobile`: MediaType = - new MediaType("video", "vnd.dece.mobile", Compressible, Binary, List("uvm", "uvvm")) - lazy val `vnd.dece.mp4`: MediaType = - new MediaType("video", "vnd.dece.mp4", Compressible, Binary) - lazy val `vnd.dece.pd`: MediaType = - new MediaType("video", "vnd.dece.pd", Compressible, Binary, List("uvp", "uvvp")) - lazy val `vnd.dece.sd`: MediaType = - new MediaType("video", "vnd.dece.sd", Compressible, Binary, List("uvs", "uvvs")) - lazy val `vnd.dece.video`: MediaType = - new MediaType("video", "vnd.dece.video", Compressible, Binary, List("uvv", "uvvv")) - lazy val `vnd.directv.mpeg`: MediaType = - new MediaType("video", "vnd.directv.mpeg", Compressible, Binary) - lazy val `vnd.directv.mpeg-tts`: MediaType = - new MediaType("video", "vnd.directv.mpeg-tts", Compressible, Binary) - lazy val `vnd.dlna.mpeg-tts`: MediaType = - new MediaType("video", "vnd.dlna.mpeg-tts", Compressible, Binary) - lazy val `vnd.dvb.file`: MediaType = - new MediaType("video", "vnd.dvb.file", Compressible, Binary, List("dvb")) - lazy val `vnd.fvt`: MediaType = - new MediaType("video", "vnd.fvt", Compressible, Binary, List("fvt")) - lazy val `vnd.hns.video`: MediaType = - new MediaType("video", "vnd.hns.video", Compressible, Binary) - lazy val `vnd.iptvforum.1dparityfec-1010`: MediaType = - new MediaType("video", "vnd.iptvforum.1dparityfec-1010", Compressible, Binary) - lazy val `vnd.iptvforum.1dparityfec-2005`: MediaType = - new MediaType("video", "vnd.iptvforum.1dparityfec-2005", Compressible, Binary) - lazy val `vnd.iptvforum.2dparityfec-1010`: MediaType = - new MediaType("video", "vnd.iptvforum.2dparityfec-1010", Compressible, Binary) - lazy val `vnd.iptvforum.2dparityfec-2005`: MediaType = - new MediaType("video", "vnd.iptvforum.2dparityfec-2005", Compressible, Binary) - lazy val `vnd.iptvforum.ttsavc`: MediaType = - new MediaType("video", "vnd.iptvforum.ttsavc", Compressible, Binary) - lazy val `vnd.iptvforum.ttsmpeg2`: MediaType = - new MediaType("video", "vnd.iptvforum.ttsmpeg2", Compressible, Binary) - lazy val `vnd.motorola.video`: MediaType = - new MediaType("video", "vnd.motorola.video", Compressible, Binary) - lazy val `vnd.motorola.videop`: MediaType = - new MediaType("video", "vnd.motorola.videop", Compressible, Binary) - lazy val `vnd.mpegurl`: MediaType = - new MediaType("video", "vnd.mpegurl", Compressible, Binary, List("mxu", "m4u")) - lazy val `vnd.ms-playready.media.pyv`: MediaType = - new MediaType("video", "vnd.ms-playready.media.pyv", Compressible, Binary, List("pyv")) - lazy val `vnd.nokia.interleaved-multimedia`: MediaType = - new MediaType("video", "vnd.nokia.interleaved-multimedia", Compressible, Binary) - lazy val `vnd.nokia.mp4vr`: MediaType = - new MediaType("video", "vnd.nokia.mp4vr", Compressible, Binary) - lazy val `vnd.nokia.videovoip`: MediaType = - new MediaType("video", "vnd.nokia.videovoip", Compressible, Binary) - lazy val `vnd.objectvideo`: MediaType = - new MediaType("video", "vnd.objectvideo", Compressible, Binary) - lazy val `vnd.radgamettools.bink`: MediaType = - new MediaType("video", "vnd.radgamettools.bink", Compressible, Binary) - lazy val `vnd.radgamettools.smacker`: MediaType = - new MediaType("video", "vnd.radgamettools.smacker", Compressible, Binary) - lazy val `vnd.sealed.mpeg1`: MediaType = - new MediaType("video", "vnd.sealed.mpeg1", Compressible, Binary) - lazy val `vnd.sealed.mpeg4`: MediaType = - new MediaType("video", "vnd.sealed.mpeg4", Compressible, Binary) - lazy val `vnd.sealed.swf`: MediaType = - new MediaType("video", "vnd.sealed.swf", Compressible, Binary) - lazy val `vnd.sealedmedia.softseal.mov`: MediaType = - new MediaType("video", "vnd.sealedmedia.softseal.mov", Compressible, Binary) - lazy val `vnd.uvvu.mp4`: MediaType = - new MediaType("video", "vnd.uvvu.mp4", Compressible, Binary, List("uvu", "uvvu")) - lazy val `vnd.vivo`: MediaType = - new MediaType("video", "vnd.vivo", Compressible, Binary, List("viv")) - lazy val `vnd.youtube.yt`: MediaType = - new MediaType("video", "vnd.youtube.yt", Compressible, Binary) - lazy val `vp8`: MediaType = new MediaType("video", "vp8", Compressible, Binary) - lazy val `vp9`: MediaType = new MediaType("video", "vp9", Compressible, Binary) - lazy val `webm`: MediaType = - new MediaType("video", "webm", Uncompressible, Binary, List("webm")) - lazy val `x-f4v`: MediaType = new MediaType("video", "x-f4v", Compressible, Binary, List("f4v")) - lazy val `x-fli`: MediaType = new MediaType("video", "x-fli", Compressible, Binary, List("fli")) - lazy val `x-flv`: MediaType = - new MediaType("video", "x-flv", Uncompressible, Binary, List("flv")) - lazy val `x-m4v`: MediaType = new MediaType("video", "x-m4v", Compressible, Binary, List("m4v")) - lazy val `x-matroska`: MediaType = - new MediaType("video", "x-matroska", Uncompressible, Binary, List("mkv", "mk3d", "mks")) - lazy val `x-mng`: MediaType = new MediaType("video", "x-mng", Compressible, Binary, List("mng")) - lazy val `x-ms-asf`: MediaType = - new MediaType("video", "x-ms-asf", Compressible, Binary, List("asf", "asx")) - lazy val `x-ms-vob`: MediaType = - new MediaType("video", "x-ms-vob", Compressible, Binary, List("vob")) - lazy val `x-ms-wm`: MediaType = - new MediaType("video", "x-ms-wm", Compressible, Binary, List("wm")) - lazy val `x-ms-wmv`: MediaType = - new MediaType("video", "x-ms-wmv", Uncompressible, Binary, List("wmv")) - lazy val `x-ms-wmx`: MediaType = - new MediaType("video", "x-ms-wmx", Compressible, Binary, List("wmx")) - lazy val `x-ms-wvx`: MediaType = - new MediaType("video", "x-ms-wvx", Compressible, Binary, List("wvx")) - lazy val `x-msvideo`: MediaType = - new MediaType("video", "x-msvideo", Compressible, Binary, List("avi")) - lazy val `x-sgi-movie`: MediaType = - new MediaType("video", "x-sgi-movie", Compressible, Binary, List("movie")) - lazy val `x-smv`: MediaType = new MediaType("video", "x-smv", Compressible, Binary, List("smv")) - lazy val all: List[MediaType] = List( + `vnd.dolby.heaac.1`, `1d-interleaved-parityfec`, - `3gpp`, - `3gpp-tt`, - `3gpp2`, - `av1`, - `bmpeg`, - `bt656`, - `celb`, - `dv`, + `vnd.nuera.ecelp9600`, + `silk`, + `pcmu-wb`, + `vnd.dts`, + `vnd.dolby.pl2x`, `encaprtp`, - `ffv1`, - `flexfec`, - `h261`, - `h263`, - `h263-1998`, - `h263-2000`, - `h264`, - `h264-rcdo`, - `h264-svc`, - `h265`, - `iso.segment`, - `jpeg`, - `jpeg2000`, - `jpm`, - `mj2`, - `mp1s`, - `mp2p`, - `mp2t`, - `mp4`, - `mp4v-es`, - `mpeg`, - `mpeg4-generic`, - `mpv`, - `nv`, - `ogg`, + `vnd.dolby.mps`, + `evrcb1`, `parityfec`, - `pointer`, - `quicktime`, + `x-matroska`, + `x-realaudio`, + `vnd.nuera.ecelp4800`, + `vnd.digital-winds`, + `smv`, + `g7221`, + `vmr-wb`, + `vnd.celp`, + `g726-40`, + `g722`, + `vnd.dra`, + `pcmu`, + `vnd.dolby.pulse.1`, + `lpc`, + `melp600`, + `x-wav`, + `l20`, + `basic`, + `asc`, + `speex`, `raptorfec`, - `raw`, - `rtp-enc-aescm128`, - `rtploopback`, - `rtx`, + `vnd.cns.anp1`, + `evrcwb1`, + `mpeg`, + `atrac-x`, + `midi`, + `smv-qcp`, + `t38`, `scip`, - `smpte291`, - `smpte292m`, + `rtp-enc-aescm128`, + `vnd.nuera.ecelp7470`, + `evrc-qcp`, + `prs.sid`, + `dsr-es202050`, + `vnd.lucent.voice`, + `g726-32`, + `g7291`, + `webm`, + `melp2400`, + `cn`, + `l8`, + `vnd.wave`, + `xm`, + `atrac3`, + `pcma`, + `tetra_acelp_bb`, + `vnd.dts.hd`, + `x-caf`, + `amr`, + `gsm`, `ulpfec`, - `vc1`, - `vc2`, - `vnd.cctv`, - `vnd.dece.hd`, - `vnd.dece.mobile`, - `vnd.dece.mp4`, - `vnd.dece.pd`, - `vnd.dece.sd`, - `vnd.dece.video`, - `vnd.directv.mpeg`, - `vnd.directv.mpeg-tts`, - `vnd.dlna.mpeg-tts`, + `aac`, + `wave`, + `sp-midi`, + `vnd.nortel.vbk`, + `uemclip`, + `mpa`, + `x-flac`, + `vnd.rn-realaudio`, + `g723`, + `g726-24`, + `tsvcis`, + `vnd.rip`, + `mpa-robust`, + `vnd.sealedmedia.softseal.mpeg`, + `s3m`, + `adpcm`, + `g711-0`, + `fwdred`, + `x-m4a`, + `evs`, + `vnd.dolby.mlp`, + `vnd.rhetorex.32kadpcm`, + `vorbis`, + `dat12`, + `clearmode`, + `x-mpegurl`, + `vnd.audiokoz`, + `musepack`, + `usac`, + `vnd.nokia.mobile-xmf`, + `dv`, + `g728`, + `evrcwb`, + `vnd.presonus.multitrack`, + `g726-16`, + `mpeg4-generic`, + `ilbc`, + `mp4`, + `x-aiff`, + `x-pn-realaudio`, + `x-aac`, + `vnd.dolby.heaac.2`, + `amr-wb+`, + `dsr-es202211`, + `smv0`, + `bv16`, + `g729`, + `x-tta`, + `g729e`, + `melp`, + `mobile-xmf`, + `dls`, + `evrc0`, + `vorbis-config`, + `gsm-efr`, + `rtp-midi`, + `vnd.dlna.adts`, + `vnd.vmx.cvsd`, `vnd.dvb.file`, - `vnd.fvt`, - `vnd.hns.video`, - `vnd.iptvforum.1dparityfec-1010`, - `vnd.iptvforum.1dparityfec-2005`, - `vnd.iptvforum.2dparityfec-1010`, - `vnd.iptvforum.2dparityfec-2005`, - `vnd.iptvforum.ttsavc`, - `vnd.iptvforum.ttsmpeg2`, - `vnd.motorola.video`, - `vnd.motorola.videop`, - `vnd.mpegurl`, - `vnd.ms-playready.media.pyv`, - `vnd.nokia.interleaved-multimedia`, - `vnd.nokia.mp4vr`, - `vnd.nokia.videovoip`, - `vnd.objectvideo`, - `vnd.radgamettools.bink`, - `vnd.radgamettools.smacker`, - `vnd.sealed.mpeg1`, - `vnd.sealed.mpeg4`, - `vnd.sealed.swf`, - `vnd.sealedmedia.softseal.mov`, - `vnd.uvvu.mp4`, - `vnd.vivo`, - `vnd.youtube.yt`, - `vp8`, - `vp9`, - `webm`, - `x-f4v`, - `x-fli`, - `x-flv`, - `x-m4v`, - `x-matroska`, - `x-mng`, - `x-ms-asf`, - `x-ms-vob`, - `x-ms-wm`, - `x-ms-wmv`, - `x-ms-wmx`, - `x-ms-wvx`, - `x-msvideo`, - `x-sgi-movie`, - `x-smv`, + `isac`, + `telephone-event`, + `l16`, + `3gpp2`, + `melp1200`, + `vnd.cns.inf1`, + `wav`, + `bv32`, + `pcma-wb`, + `ac3`, + `vnd.qcelp`, + `vnd.octel.sbc`, + `atrac-advanced-lossless`, + `qcelp`, + `x-pn-realaudio-plugin`, + `g719`, + `tone`, + `dvi4`, + `vnd.hns.audio`, + `x-ms-wax`, + `g729d`, + `t140c`, + `32kadpcm`, + `mp3`, + `evrcnw`, + `vnd.cisco.nse`, + `opus`, + `evrcb0`, + `3gpp`, + `ogg`, + `vnd.dolby.pl2z`, + `vnd.cmles.radio-events`, + `evrc`, + `vnd.dolby.pl2`, + `mhas`, + `l24`, + `vnd.dts.uhd`, + `x-ms-wma`, + `tetra_acelp`, + `gsm-hr-08`, + `eac3`, + `evrcwb0`, + `vdvi`, + `dsr-es202212`, + `rtploopback`, + `mp4a-latm`, + `sofa`, + `amr-wb`, + `evrcb`, + `ip-mr_v2.5`, + `evrcnw0`, + `vnd.3gpp.iufp`, + `aptx`, ) - lazy val any: MediaType = new MediaType("video", "*") + lazy val any: MediaType = new MediaType("audio", "*") } - object x_conference { - lazy val `x-cooltalk`: MediaType = - new MediaType("x-conference", "x-cooltalk", Compressible, NotBinary, List("ice")) - lazy val all: List[MediaType] = List(`x-cooltalk`) - lazy val any: MediaType = new MediaType("x-conference", "*") + + object multipart { + + lazy val `form-data`: MediaType = + new MediaType("multipart", "form-data", compressible = false, binary = true) + + lazy val `byteranges`: MediaType = + new MediaType("multipart", "byteranges", compressible = false, binary = true) + + lazy val `vnd.bint.med-plus`: MediaType = + new MediaType("multipart", "vnd.bint.med-plus", compressible = false, binary = true) + + lazy val `mixed`: MediaType = + new MediaType("multipart", "mixed", compressible = false, binary = true) + + lazy val `report`: MediaType = + new MediaType("multipart", "report", compressible = false, binary = true) + + lazy val `multilingual`: MediaType = + new MediaType("multipart", "multilingual", compressible = false, binary = true) + + lazy val `x-mixed-replace`: MediaType = + new MediaType("multipart", "x-mixed-replace", compressible = false, binary = true) + + lazy val `encrypted`: MediaType = + new MediaType("multipart", "encrypted", compressible = false, binary = true) + + lazy val `header-set`: MediaType = + new MediaType("multipart", "header-set", compressible = false, binary = true) + + lazy val `voice-message`: MediaType = + new MediaType("multipart", "voice-message", compressible = false, binary = true) + + lazy val `related`: MediaType = + new MediaType("multipart", "related", compressible = false, binary = true) + + lazy val `signed`: MediaType = + new MediaType("multipart", "signed", compressible = false, binary = true) + + lazy val `appledouble`: MediaType = + new MediaType("multipart", "appledouble", compressible = false, binary = true) + + lazy val `alternative`: MediaType = + new MediaType("multipart", "alternative", compressible = false, binary = true) + + lazy val `parallel`: MediaType = + new MediaType("multipart", "parallel", compressible = false, binary = true) + + lazy val `digest`: MediaType = + new MediaType("multipart", "digest", compressible = false, binary = true) + + lazy val all: List[MediaType] = List( + `form-data`, + `byteranges`, + `vnd.bint.med-plus`, + `mixed`, + `report`, + `multilingual`, + `x-mixed-replace`, + `encrypted`, + `header-set`, + `voice-message`, + `related`, + `signed`, + `appledouble`, + `alternative`, + `parallel`, + `digest`, + ) + lazy val any: MediaType = new MediaType("multipart", "*") } - object x_shader { - lazy val `x-fragment`: MediaType = - new MediaType("x-shader", "x-fragment", Compressible, NotBinary) - lazy val `x-vertex`: MediaType = new MediaType("x-shader", "x-vertex", Compressible, NotBinary) - lazy val all: List[MediaType] = List(`x-fragment`, `x-vertex`) - lazy val any: MediaType = new MediaType("x-shader", "*") + + object chemical { + + lazy val `x-cif`: MediaType = + new MediaType("chemical", "x-cif", compressible = false, binary = true, List("cif")) + + lazy val `x-cdx`: MediaType = + new MediaType("chemical", "x-cdx", compressible = false, binary = true, List("cdx")) + + lazy val `x-pdb`: MediaType = + new MediaType("chemical", "x-pdb", compressible = false, binary = true) + + lazy val `x-xyz`: MediaType = + new MediaType("chemical", "x-xyz", compressible = false, binary = true, List("xyz")) + + lazy val `x-cml`: MediaType = + new MediaType("chemical", "x-cml", compressible = false, binary = true, List("cml")) + + lazy val `x-cmdf`: MediaType = + new MediaType("chemical", "x-cmdf", compressible = false, binary = true, List("cmdf")) + + lazy val `x-csml`: MediaType = + new MediaType("chemical", "x-csml", compressible = false, binary = true, List("csml")) + + lazy val all: List[MediaType] = List(`x-cif`, `x-cdx`, `x-pdb`, `x-xyz`, `x-cml`, `x-cmdf`, `x-csml`) + lazy val any: MediaType = new MediaType("chemical", "*") + } + + object x_conference { + + lazy val `x-cooltalk`: MediaType = + new MediaType("x-conference", "x-cooltalk", compressible = false, binary = true, List("ice")) + + lazy val all: List[MediaType] = List(`x-cooltalk`) + lazy val any: MediaType = new MediaType("x-conference", "*") } + } From fd5eb229a76b83bb4479ae18c2b9491243cb2390 Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Fri, 21 Jun 2024 00:25:45 +1000 Subject: [PATCH 32/58] Improve the Client's performance for non-stream bodies (#2919) * Fix memory leak in netty connection pool * Use a forked effect to monitor the close future for client requests * Use Netty's future listener again * fmt * Remove suspendSucceed * Improve non-streaming performance of Client * Cleanups in AsyncBodyReader * One more improvement * Reimplement using buffering within `AsyncBodyReader` * Add benchmarks * Fix url interpolator macro * Re-generate GH workflow * fmt --- .github/workflows/ci.yml | 43 +++++++- .../zhttp.benchmarks/ClientBenchmark.scala | 97 +++++++++++++++++++ .../zio/http/netty/AsyncBodyReader.scala | 85 ++++++++++------ .../main/scala/zio/http/netty/NettyBody.scala | 69 ++++++++----- .../scala-2/zio/http/UrlInterpolator.scala | 17 +--- .../scala-3/zio/http/UrlInterpolator.scala | 16 +-- .../shared/src/main/scala/zio/http/Body.scala | 9 +- 7 files changed, 247 insertions(+), 89 deletions(-) create mode 100644 zio-http-benchmarks/src/main/scala/zhttp.benchmarks/ClientBenchmark.scala diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 098ba8ac81..0d3a10dd5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -285,6 +285,40 @@ jobs: name: Jmh_Main_CachedDateHeaderBenchmark path: Main_CachedDateHeaderBenchmark.txt + Jmh_ClientBenchmark: + name: Jmh ClientBenchmark + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + strategy: + matrix: + os: [ubuntu-latest] + scala: [2.13.14] + java: [temurin@8] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + with: + path: zio-http + + - uses: actions/setup-java@v2 + with: + distribution: temurin + java-version: 11 + + - name: Benchmark_Main + id: Benchmark_Main + env: + GITHUB_TOKEN: ${{secrets.ACTIONS_PAT}} + run: | + cd zio-http + sed -i -e '$aaddSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.7")' project/plugins.sbt + cat > Main_ClientBenchmark.txt + sbt -no-colors -v "zioHttpBenchmarks/jmh:run -i 3 -wi 3 -f1 -t1 ClientBenchmark" | grep -e "thrpt" -e "avgt" >> ../Main_ClientBenchmark.txt + + - uses: actions/upload-artifact@v3 + with: + name: Jmh_Main_ClientBenchmark + path: Main_ClientBenchmark.txt + Jmh_CookieDecodeBenchmark: name: Jmh CookieDecodeBenchmark if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} @@ -627,7 +661,7 @@ jobs: Jmh_cache: name: Cache Jmh benchmarks - needs: [Jmh_CachedDateHeaderBenchmark, Jmh_CookieDecodeBenchmark, Jmh_EndpointBenchmark, Jmh_HttpCollectEval, Jmh_HttpCombineEval, Jmh_HttpNestedFlatMapEval, Jmh_HttpRouteTextPerf, Jmh_ProbeContentTypeBenchmark, Jmh_SchemeDecodeBenchmark, Jmh_ServerInboundHandlerBenchmark, Jmh_UtilBenchmark] + needs: [Jmh_CachedDateHeaderBenchmark, Jmh_ClientBenchmark, Jmh_CookieDecodeBenchmark, Jmh_EndpointBenchmark, Jmh_HttpCollectEval, Jmh_HttpCombineEval, Jmh_HttpNestedFlatMapEval, Jmh_HttpRouteTextPerf, Jmh_ProbeContentTypeBenchmark, Jmh_SchemeDecodeBenchmark, Jmh_ServerInboundHandlerBenchmark, Jmh_UtilBenchmark] if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} strategy: matrix: @@ -643,6 +677,13 @@ jobs: - name: Format_Main_CachedDateHeaderBenchmark run: cat Main_CachedDateHeaderBenchmark.txt >> Main_benchmarks.txt + - uses: actions/download-artifact@v3 + with: + name: Jmh_Main_ClientBenchmark + + - name: Format_Main_ClientBenchmark + run: cat Main_ClientBenchmark.txt >> Main_benchmarks.txt + - uses: actions/download-artifact@v3 with: name: Jmh_Main_CookieDecodeBenchmark diff --git a/zio-http-benchmarks/src/main/scala/zhttp.benchmarks/ClientBenchmark.scala b/zio-http-benchmarks/src/main/scala/zhttp.benchmarks/ClientBenchmark.scala new file mode 100644 index 0000000000..b681ec774b --- /dev/null +++ b/zio-http-benchmarks/src/main/scala/zhttp.benchmarks/ClientBenchmark.scala @@ -0,0 +1,97 @@ +package zhttp.benchmarks + +import java.util.concurrent.TimeUnit + +import scala.annotation.nowarn + +import zio._ + +import zio.http._ + +import org.openjdk.jmh.annotations._ + +@nowarn +@State(org.openjdk.jmh.annotations.Scope.Benchmark) +@BenchmarkMode(Array(Mode.Throughput)) +@OutputTimeUnit(TimeUnit.SECONDS) +@Warmup(iterations = 3, time = 3) +@Measurement(iterations = 3, time = 3) +@Fork(1) +class ClientBenchmark { + private val random = scala.util.Random + random.setSeed(42) + + private implicit val unsafe: Unsafe = Unsafe.unsafe(identity) + + @Param(Array("small", "large")) + var path: String = _ + + private val smallString = "Hello!".getBytes + private val largeString = random.alphanumeric.take(10000).mkString.getBytes + + private val smallRequest = Request(url = url"http://0.0.0.0:8080/small") + private val largeRequest = Request(url = url"http://0.0.0.0:8080/large") + + private val smallResponse = Response(status = Status.Ok, body = Body.fromArray(smallString)) + private val largeResponse = Response(status = Status.Ok, body = Body.fromArray(largeString)) + + private val smallRoute = Route.route(Method.GET / "small")(handler(smallResponse)) + private val largeRoute = Route.route(Method.GET / "large")(handler(largeResponse)) + + private val shutdownResponse = Response.text("shutting down") + + private def shutdownRoute(shutdownSignal: Promise[Nothing, Unit]) = + Route.route(Method.GET / "shutdown")(handler(shutdownSignal.succeed(()).as(shutdownResponse))) + + private def http(shutdownSignal: Promise[Nothing, Unit]) = + Routes(smallRoute, largeRoute, shutdownRoute(shutdownSignal)) + + private val rtm = Runtime.unsafe.fromLayer(ZClient.default) + private val runtime = rtm.unsafe + + private def run(f: RIO[Client, Any]): Any = runtime.run(f).getOrThrow() + + @Setup(Level.Trial) + def setup(): Unit = { + val startServer: Task[Unit] = (for { + shutdownSignal <- Promise.make[Nothing, Unit] + fiber <- Server.serve(http(shutdownSignal)).fork + _ <- shutdownSignal.await *> fiber.interrupt + } yield ()).provideLayer(Server.default) + + val waitForServerStarted: Task[Unit] = (for { + client <- ZIO.service[Client] + _ <- client.request(smallRequest) + } yield ()).provide(ZClient.default, zio.Scope.default) + + run(startServer.forkDaemon *> waitForServerStarted.retry(Schedule.fixed(1.second))) + } + + @TearDown(Level.Trial) + def tearDown(): Unit = { + val stopServer = (for { + client <- ZIO.service[Client] + _ <- client.request(Request(url = url"http://localhost:8080/shutdown")) + } yield ()).provide(ZClient.default, zio.Scope.default) + run(stopServer) + rtm.shutdown0() + } + + @Benchmark + @OperationsPerInvocation(100) + def zhttpChunkBenchmark(): Any = run { + val req = if (path == "small") smallRequest else largeRequest + ZIO.serviceWithZIO[Client] { client => + ZIO.scoped(client.request(req).flatMap(_.body.asChunk)).repeatN(100) + } + } + + @Benchmark + @OperationsPerInvocation(100) + def zhttpStreamToChunkBenchmark(): Any = run { + val req = if (path == "small") smallRequest else largeRequest + ZIO.serviceWithZIO[Client] { client => + ZIO.scoped(client.request(req).flatMap(_.body.asStream.runCollect)).repeatN(100) + } + } +} diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala b/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala index fc97550cd7..eb129f166e 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala @@ -18,10 +18,11 @@ package zio.http.netty import java.io.IOException +import scala.collection.mutable + +import zio.Chunk import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.{Chunk, ChunkBuilder} -import zio.http.netty.AsyncBodyReader.State import zio.http.netty.NettyBody.UnsafeAsync import io.netty.buffer.ByteBufUtil @@ -29,34 +30,38 @@ import io.netty.channel.{ChannelHandlerContext, SimpleChannelInboundHandler} import io.netty.handler.codec.http.{HttpContent, LastHttpContent} abstract class AsyncBodyReader extends SimpleChannelInboundHandler[HttpContent](true) { + import zio.http.netty.AsyncBodyReader._ + + private var state: State = State.Buffering + private val buffer = new mutable.ArrayBuilder.ofByte() + private var previousAutoRead: Boolean = false + private var readingDone: Boolean = false + private var ctx: ChannelHandlerContext = _ - private var state: State = State.Buffering - private val buffer: ChunkBuilder[(Chunk[Byte], Boolean)] = ChunkBuilder.make[(Chunk[Byte], Boolean)]() - private var previousAutoRead: Boolean = false - private var ctx: ChannelHandlerContext = _ + private def result(buffer: mutable.ArrayBuilder.ofByte): Chunk[Byte] = { + val arr = buffer.result() + Chunk.ByteArray(arr, 0, arr.length) + } private[zio] def connect(callback: UnsafeAsync): Unit = { + val buffer0 = buffer // Avoid reading it from the heap in the synchronized block this.synchronized { state match { case State.Buffering => - val result: Chunk[(Chunk[Byte], Boolean)] = buffer.result() - val readingDone: Boolean = result.lastOption match { - case None => false - case Some((_, isLast)) => isLast - } - buffer.clear() // GC - - if (ctx.channel.isOpen || readingDone) { - state = State.Direct(callback) - result.foreach { case (chunk, isLast) => - callback(chunk, isLast) + state = State.Direct(callback) + + if (readingDone) { + callback(result(buffer0), isLast = true) + } else if (ctx.channel().isOpen) { + callback match { + case UnsafeAsync.Aggregating(bufSize) => buffer.sizeHint(bufSize) + case cb => cb(result(buffer0), isLast = false) } ctx.read(): Unit } else { throw new IllegalStateException("Attempting to read from a closed channel, which will never finish") } - - case State.Direct(_) => + case _ => throw new IllegalStateException("Cannot connect twice") } } @@ -76,22 +81,36 @@ abstract class AsyncBodyReader extends SimpleChannelInboundHandler[HttpContent]( ctx: ChannelHandlerContext, msg: HttpContent, ): Unit = { - val isLast = msg.isInstanceOf[LastHttpContent] - val chunk = Chunk.fromArray(ByteBufUtil.getBytes(msg.content())) + val buffer0 = buffer // Avoid reading it from the heap in the synchronized block this.synchronized { + val isLast = msg.isInstanceOf[LastHttpContent] + val content = ByteBufUtil.getBytes(msg.content()) + state match { - case State.Buffering => - buffer += ((chunk, isLast)) - case State.Direct(callback) => - callback(chunk, isLast) - ctx.read() + case State.Buffering => + // `connect` method hasn't been called yet, add all incoming content to the buffer + buffer0.addAll(content) + case State.Direct(callback) if isLast && buffer0.knownSize == 0 => + // Buffer is empty, we can just use the array directly + callback(Chunk.fromArray(content), isLast = true) + case State.Direct(callback: UnsafeAsync.Aggregating) => + // We're aggregating the full response, only call the callback on the last message + buffer0.addAll(content) + if (isLast) callback(result(buffer0), isLast = true) + case State.Direct(callback) => + // We're streaming, emit chunks as they come + callback(Chunk.fromArray(content), isLast) } - } - if (isLast) { - ctx.channel().pipeline().remove(this) - }: Unit + if (isLast) { + readingDone = true + ctx.channel().pipeline().remove(this) + } else { + ctx.read() + } + () + } } override def exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable): Unit = { @@ -125,4 +144,10 @@ object AsyncBodyReader { final case class Direct(callback: UnsafeAsync) extends State } + + // For Scala 2.12. In Scala 2.13+, the methods directly implemented on ArrayBuilder[Byte] are selected over syntax. + private implicit class ByteArrayBuilderOps[A](private val self: mutable.ArrayBuilder[Byte]) extends AnyVal { + def addAll(as: Array[Byte]): Unit = self ++= as + def knownSize: Int = -1 + } } diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala index 86afacdfa1..7e609082d9 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala @@ -18,18 +18,18 @@ package zio.http.netty import java.nio.charset.Charset +import zio._ import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.{Chunk, Task, Trace, Unsafe, ZIO} import zio.stream.ZStream -import zio.http.Body.{UnsafeBytes, UnsafeWriteable} +import zio.http.Body.UnsafeBytes import zio.http.internal.BodyEncoding -import zio.http.{Body, Boundary, Header, Headers, MediaType} +import zio.http.{Body, Boundary, MediaType} import io.netty.buffer.{ByteBuf, ByteBufUtil} -import io.netty.channel.{Channel => JChannel} import io.netty.util.AsciiString + object NettyBody extends BodyEncoding { /** @@ -73,7 +73,6 @@ object NettyBody extends BodyEncoding { override val mediaType: Option[MediaType] = None, override val boundary: Option[Boundary] = None, ) extends Body - with UnsafeWriteable with UnsafeBytes { override def asArray(implicit trace: Trace): Task[Array[Byte]] = ZIO.succeed(asciiString.array()) @@ -101,11 +100,10 @@ object NettyBody extends BodyEncoding { } private[zio] final case class ByteBufBody( - val byteBuf: ByteBuf, + byteBuf: ByteBuf, override val mediaType: Option[MediaType] = None, override val boundary: Option[Boundary] = None, ) extends Body - with UnsafeWriteable with UnsafeBytes { override def asArray(implicit trace: Trace): Task[Array[Byte]] = ZIO.succeed(ByteBufUtil.getBytes(byteBuf)) @@ -137,38 +135,37 @@ object NettyBody extends BodyEncoding { knownContentLength: Option[Long], override val mediaType: Option[MediaType] = None, override val boundary: Option[Boundary] = None, - ) extends Body - with UnsafeWriteable { + ) extends Body { + override def asArray(implicit trace: Trace): Task[Array[Byte]] = asChunk.map(_.toArray) - override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = asStream.runCollect + override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = + ZIO.async { cb => + try { + // Cap at 100kB as a precaution in case the server sends an invalid content length + unsafeAsync(UnsafeAsync.Aggregating(bufferSize(1024 * 100))(cb)) + } catch { + case e: Throwable => cb(ZIO.fail(e)) + } + } override def asStream(implicit trace: Trace): ZStream[Any, Throwable, Byte] = ZStream .async[Any, Throwable, Byte]( emit => try { - unsafeAsync(new UnsafeAsync { - override def apply(message: Chunk[Byte], isLast: Boolean): Unit = { - emit(ZIO.succeed(message)) - if (isLast) { - emit(ZIO.fail(None)) - } - } - override def fail(cause: Throwable): Unit = - emit(ZIO.fail(Some(cause))) - }) + unsafeAsync(new UnsafeAsync.Streaming(emit)) } catch { case e: Throwable => emit(ZIO.fail(Option(e))) }, - streamBufferSize, + bufferSize(4096), ) // No need to create a large buffer when we know the response is small - private[this] def streamBufferSize: Int = { + private[this] def bufferSize(maxSize: Int): Int = { val cl = knownContentLength.getOrElse(4096L) if (cl <= 16L) 16 - else if (cl >= 4096) 4096 + else if (cl >= maxSize) maxSize else Integer.highestOneBit(cl.toInt - 1) << 1 // Round to next power of 2 } @@ -188,4 +185,30 @@ object NettyBody extends BodyEncoding { def apply(message: Chunk[Byte], isLast: Boolean): Unit def fail(cause: Throwable): Unit } + + private[zio] object UnsafeAsync { + private val FailNone = Exit.fail(None) + + final case class Aggregating(bufferInitialSize: Int)(callback: Task[Chunk[Byte]] => Unit)(implicit trace: Trace) + extends UnsafeAsync { + + def apply(message: Chunk[Byte], isLast: Boolean): Unit = { + assert(isLast) + callback(ZIO.succeed(message)) + } + + def fail(cause: Throwable): Unit = + callback(ZIO.fail(cause)) + } + + final class Streaming(emit: ZStream.Emit[Any, Throwable, Byte, Unit])(implicit trace: Trace) extends UnsafeAsync { + def apply(message: Chunk[Byte], isLast: Boolean): Unit = { + if (message.nonEmpty) emit(ZIO.succeed(message)) + if (isLast) emit(FailNone) + } + + def fail(cause: Throwable): Unit = + emit(ZIO.fail(Some(cause))) + } + } } diff --git a/zio-http/shared/src/main/scala-2/zio/http/UrlInterpolator.scala b/zio-http/shared/src/main/scala-2/zio/http/UrlInterpolator.scala index 01aab0a34f..f1a2c2864b 100644 --- a/zio-http/shared/src/main/scala-2/zio/http/UrlInterpolator.scala +++ b/zio-http/shared/src/main/scala-2/zio/http/UrlInterpolator.scala @@ -34,13 +34,8 @@ private[http] object UrlInterpolatorMacro { val result = URL.decode(p) match { case Left(error) => c.abort(c.enclosingPosition, s"Invalid URL: ${error.getMessage}") case Right(url) => - if (url.isAbsolute) { - val uri = url.encode - q"_root_.zio.http.URL.fromAbsoluteURI(new _root_.java.net.URI($uri)).get" - } else { - val uri = url.encode - q"_root_.zio.http.URL.fromRelativeURI(new _root_.java.net.URI($uri)).get" - } + val uri = url.encode + q"_root_.zio.http.URL.fromURI(new _root_.java.net.URI($uri)).get" } c.Expr[URL](result) case Apply(_, List(Apply(_, staticPartLiterals))) => @@ -86,13 +81,7 @@ private[http] object UrlInterpolatorMacro { q"$acc + $part" } - val result = if (url.isAbsolute) { - q"_root_.zio.http.URL.fromAbsoluteURI(new _root_.java.net.URI($concatenated)).get" - } else { - q"_root_.zio.http.URL.fromRelativeURI(new _root_.java.net.URI($concatenated)).get" - } - - c.Expr[URL](result) + c.Expr[URL](q"_root_.zio.http.URL.fromURI(new _root_.java.net.URI($concatenated)).get") } } } diff --git a/zio-http/shared/src/main/scala-3/zio/http/UrlInterpolator.scala b/zio-http/shared/src/main/scala-3/zio/http/UrlInterpolator.scala index 485187d89b..bcd8eba2df 100644 --- a/zio-http/shared/src/main/scala-3/zio/http/UrlInterpolator.scala +++ b/zio-http/shared/src/main/scala-3/zio/http/UrlInterpolator.scala @@ -45,11 +45,7 @@ private[http] object UrlInterpolatorMacro { case Left(error) => errorAndAbort(s"Invalid URL: $error", sc) case Right(url) => val uri = Expr(url.encode) - if (url.isAbsolute) { - '{ URL.fromAbsoluteURI(new java.net.URI($uri)).get } - } else { - '{ URL.fromRelativeURI(new java.net.URI($uri)).get } - } + '{ URL.fromURI(new java.net.URI($uri)).get } } } else { val injectedPartExamples = @@ -96,15 +92,7 @@ private[http] object UrlInterpolatorMacro { '{$acc + $part} } - if (url.isAbsolute) { - '{ - URL.fromAbsoluteURI(new java.net.URI($concatenated)).get - } - } else { - '{ - URL.fromRelativeURI(new java.net.URI($concatenated)).get - } - } + '{ URL.fromURI(new java.net.URI($concatenated)).get } } } diff --git a/zio-http/shared/src/main/scala/zio/http/Body.scala b/zio-http/shared/src/main/scala/zio/http/Body.scala index 119447f33f..3011b369cc 100644 --- a/zio-http/shared/src/main/scala/zio/http/Body.scala +++ b/zio-http/shared/src/main/scala/zio/http/Body.scala @@ -342,8 +342,6 @@ object Body { def fromSocketApp(app: WebSocketApp[Any]): WebsocketBody = WebsocketBody(app) - private[zio] trait UnsafeWriteable extends Body - private[zio] trait UnsafeBytes extends Body { private[zio] def unsafeAsArray(implicit unsafe: Unsafe): Array[Byte] } @@ -352,7 +350,7 @@ object Body { * Helper to create empty Body */ - private[zio] object EmptyBody extends Body with UnsafeWriteable with UnsafeBytes { + private[zio] object EmptyBody extends Body with UnsafeBytes { override def asArray(implicit trace: Trace): Task[Array[Byte]] = zioEmptyArray @@ -383,7 +381,6 @@ object Body { override val mediaType: Option[MediaType] = None, override val boundary: Option[Boundary] = None, ) extends Body - with UnsafeWriteable with UnsafeBytes { self => override def asArray(implicit trace: Trace): Task[Array[Byte]] = ZIO.succeed(data.toArray) @@ -414,7 +411,6 @@ object Body { override val mediaType: Option[MediaType] = None, override val boundary: Option[Boundary] = None, ) extends Body - with UnsafeWriteable with UnsafeBytes { self => override def asArray(implicit trace: Trace): Task[Array[Byte]] = ZIO.succeed(data) @@ -446,8 +442,7 @@ object Body { fileSize: Long, override val mediaType: Option[MediaType] = None, override val boundary: Option[Boundary] = None, - ) extends Body - with UnsafeWriteable { + ) extends Body { override def asArray(implicit trace: Trace): Task[Array[Byte]] = ZIO.attemptBlocking { Files.readAllBytes(file.toPath) From 033ab36380c7b57492093cbaf76356b7965e9a3e Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Fri, 21 Jun 2024 15:59:07 +1000 Subject: [PATCH 33/58] Avoid copying of the underlying array in `AsyncBody#asArray` (#2923) Avoid copying of the underlying array in AsyncBody#asArray --- zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala index 7e609082d9..54e534e39e 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala @@ -137,7 +137,10 @@ object NettyBody extends BodyEncoding { override val boundary: Option[Boundary] = None, ) extends Body { - override def asArray(implicit trace: Trace): Task[Array[Byte]] = asChunk.map(_.toArray) + override def asArray(implicit trace: Trace): Task[Array[Byte]] = asChunk.map { + case b: Chunk.ByteArray => b.array + case other => other.toArray + } override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = ZIO.async { cb => From c7f0598dc514d90ad0ed9cba42fde44330cf0bab Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:25:30 +0200 Subject: [PATCH 34/58] Ignore non-content codecs when building multipart OpenAPI spec (#2745) --- .../http/endpoint/openapi/OpenAPIGenSpec.scala | 12 ++++++++++++ .../zio/http/endpoint/openapi/OpenAPIGen.scala | 17 +++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala index fcc06023b6..1ce4ed605a 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala @@ -2442,6 +2442,18 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "components" : {} |}""".stripMargin)) }, + test("Non content codecs are ignored when building multipart schema") { + // We only test there is no exception when building the schema + val endpoint = + Endpoint(RoutePattern.POST / "post") + .in[Int]("foo") + .in[Boolean]("bar") + .query(QueryCodec.query("q")) + .out[Unit] + + SwaggerUI.routes("docs/openapi", OpenAPIGen.fromEndpoints(endpoint)) + assertCompletes + }, ) } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala index e8595f0656..1617020397 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala @@ -340,6 +340,20 @@ object OpenAPIGen { .nullable(optional(metadata)) .description(description(metadata)) .annotate(annotations) + case (JsonSchema.Object(p, _, r), JsonSchema.Null) => + JsonSchema + .Object(p, Left(false), r) + .deprecated(deprecated(metadata)) + .nullable(optional(metadata)) + .description(description(metadata)) + .annotate(annotations) + case (JsonSchema.Null, JsonSchema.Object(p, _, r)) => + JsonSchema + .Object(p, Left(false), r) + .deprecated(deprecated(metadata)) + .nullable(optional(metadata)) + .description(description(metadata)) + .annotate(annotations) case _ => throw new IllegalArgumentException("Multipart content without name.") } @@ -798,8 +812,7 @@ object OpenAPIGen { ( statusOrDefault, ( - AtomizedMetaCodecs - .flatten(codec), + AtomizedMetaCodecs.flatten(codec), contentAsJsonSchema(codec, referenceType = referenceType) _, ), ) From 0afa589a7a7e44882c09aba2c34fcf4a69f1bdb3 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:26:37 +0200 Subject: [PATCH 35/58] Revert "Ignore non-content codecs when building multipart OpenAPI spec (#2745)" This reverts commit c7f0598dc514d90ad0ed9cba42fde44330cf0bab. --- .../http/endpoint/openapi/OpenAPIGenSpec.scala | 12 ------------ .../zio/http/endpoint/openapi/OpenAPIGen.scala | 17 ++--------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala index 1ce4ed605a..fcc06023b6 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala @@ -2442,18 +2442,6 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "components" : {} |}""".stripMargin)) }, - test("Non content codecs are ignored when building multipart schema") { - // We only test there is no exception when building the schema - val endpoint = - Endpoint(RoutePattern.POST / "post") - .in[Int]("foo") - .in[Boolean]("bar") - .query(QueryCodec.query("q")) - .out[Unit] - - SwaggerUI.routes("docs/openapi", OpenAPIGen.fromEndpoints(endpoint)) - assertCompletes - }, ) } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala index 1617020397..e8595f0656 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala @@ -340,20 +340,6 @@ object OpenAPIGen { .nullable(optional(metadata)) .description(description(metadata)) .annotate(annotations) - case (JsonSchema.Object(p, _, r), JsonSchema.Null) => - JsonSchema - .Object(p, Left(false), r) - .deprecated(deprecated(metadata)) - .nullable(optional(metadata)) - .description(description(metadata)) - .annotate(annotations) - case (JsonSchema.Null, JsonSchema.Object(p, _, r)) => - JsonSchema - .Object(p, Left(false), r) - .deprecated(deprecated(metadata)) - .nullable(optional(metadata)) - .description(description(metadata)) - .annotate(annotations) case _ => throw new IllegalArgumentException("Multipart content without name.") } @@ -812,7 +798,8 @@ object OpenAPIGen { ( statusOrDefault, ( - AtomizedMetaCodecs.flatten(codec), + AtomizedMetaCodecs + .flatten(codec), contentAsJsonSchema(codec, referenceType = referenceType) _, ), ) From 97dc4ae9117f5b801bf88188810a410e5d401eff Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Sat, 22 Jun 2024 18:10:47 +0200 Subject: [PATCH 36/58] Select codec based on response status for endpoint client (#2727) (#2929) --- .../zio/http/endpoint/RoundtripSpec.scala | 103 +----------------- .../main/scala/zio/http/codec/HttpCodec.scala | 26 ++++- .../zio/http/endpoint/EndpointExecutor.scala | 2 +- .../endpoint/internal/EndpointClient.scala | 26 +---- 4 files changed, 34 insertions(+), 123 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala index e8429f6a7f..75339f790a 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala @@ -346,91 +346,6 @@ object RoundtripSpec extends ZIOHttpSpec { "42", ) }, - test("middleware error returned") { - - val alwaysFailingMiddleware = EndpointMiddleware( - authorization, - HttpCodec.empty, - HttpCodec.error[String](Status.Custom(900)), - ) - - val endpoint = - Endpoint(GET / "users" / int("userId")).out[Int] @@ alwaysFailingMiddleware - - val endpointRoute = - endpoint.implementHandler(Handler.identity) - - val routes = endpointRoute.toRoutes - - val app = routes @@ alwaysFailingMiddleware - .implement[Any, Unit](_ => ZIO.fail("FAIL"))(_ => ZIO.unit) - - for { - port <- Server.install(app) - executorLayer = ZLayer(ZIO.serviceWith[Client](makeExecutor(_, port, Authorization.Basic("user", "pass")))) - - out <- ZIO - .serviceWithZIO[EndpointExecutor[alwaysFailingMiddleware.In]] { executor => - executor.apply(endpoint.apply(42)) - } - .provideSome[Client & Scope](executorLayer) - .flip - } yield assert(out)(equalTo("FAIL")) - }, - test("failed middleware deserialization") { - val alwaysFailingMiddleware = EndpointMiddleware( - authorization, - HttpCodec.empty, - HttpCodec.error[String](Status.Custom(900)), - ) - - val endpoint = - Endpoint(GET / "users" / int("userId")).out[Int] @@ alwaysFailingMiddleware - - val alwaysFailingMiddlewareWithAnotherSignature = EndpointMiddleware( - authorization, - HttpCodec.empty, - HttpCodec.error[Long](Status.Custom(900)), - ) - - val endpointWithAnotherSignature = - Endpoint(GET / "users" / int("userId")).out[Int] @@ alwaysFailingMiddlewareWithAnotherSignature - - val endpointRoute = - endpoint.implementHandler(Handler.identity) - - val routes = endpointRoute.toRoutes - - val app = routes @@ alwaysFailingMiddleware.implement[Any, Unit](_ => ZIO.fail("FAIL"))(_ => ZIO.unit) - - for { - port <- Server.install(app) - executorLayer = ZLayer(ZIO.serviceWith[Client](makeExecutor(_, port, Authorization.Basic("user", "pass")))) - - cause <- ZIO - .serviceWithZIO[EndpointExecutor[alwaysFailingMiddleware.In]] { executor => - executor.apply(endpointWithAnotherSignature.apply(42)) - } - .provideSome[Client with Scope](executorLayer) - .cause - } yield assert(cause.prettyPrint)( - containsString( - "java.lang.IllegalStateException: Cannot deserialize using endpoint error codec", - ), - ) && assert(cause.prettyPrint)( - containsString( - "java.lang.IllegalStateException: Cannot deserialize using middleware error codec", - ), - ) && assert(cause.prettyPrint)( - containsString( - "Suppressed: java.lang.IllegalStateException: Trying to decode with Undefined codec.", - ), - ) && assert(cause.prettyPrint)( - containsString( - "Suppressed: zio.http.codec.HttpCodecError$MalformedBody: Malformed request body failed to decode: (expected a number, got F)", - ), - ) - }, test("Failed endpoint deserialization") { val endpoint = Endpoint(GET / "users" / int("userId")).out[Int].outError[Int](Status.Custom(999)) @@ -457,21 +372,9 @@ object RoundtripSpec extends ZIOHttpSpec { } .provideSome[Client with Scope](executorLayer) .cause - } yield assert(cause.prettyPrint)( - containsString( - "java.lang.IllegalStateException: Cannot deserialize using endpoint error codec", - ), - ) && assert(cause.prettyPrint)( - containsString( - "java.lang.IllegalStateException: Cannot deserialize using middleware error codec", - ), - ) && assert(cause.prettyPrint)( - containsString( - "Suppressed: java.lang.IllegalStateException: Trying to decode with Undefined codec.", - ), - ) && assert(cause.prettyPrint)( - containsString( - """Suppressed: zio.http.codec.HttpCodecError$MalformedBody: Malformed request body failed to decode: (expected '"' got '4')""", + } yield assertTrue( + cause.prettyPrint.contains( + """zio.http.codec.HttpCodecError$MalformedBody: Malformed request body failed to decode: (expected '"' got '4')""", ), ) }, diff --git a/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala index 7669c069dd..f595e04d79 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala @@ -29,7 +29,7 @@ import zio.schema.Schema import zio.http.Header.Accept.MediaTypeWithQFactor import zio.http._ import zio.http.codec.HttpCodec.{Annotated, Metadata} -import zio.http.codec.internal.EncoderDecoder +import zio.http.codec.internal.{AtomizedCodecs, EncoderDecoder} /** * A [[zio.http.codec.HttpCodec]] represents a codec for a part of an HTTP @@ -48,6 +48,27 @@ sealed trait HttpCodec[-AtomTypes, Value] { private lazy val encoderDecoder: EncoderDecoder[AtomTypes, Value] = EncoderDecoder(self) + private def statusCodecs: Chunk[SimpleCodec[Status, _]] = + self.asInstanceOf[HttpCodec[_, _]] match { + case HttpCodec.Fallback(left, right, _, _) => left.statusCodecs ++ right.statusCodecs + case HttpCodec.Combine(left, right, _) => left.statusCodecs ++ right.statusCodecs + case HttpCodec.Annotated(codec, _) => codec.statusCodecs + case HttpCodec.TransformOrFail(codec, _, _) => codec.statusCodecs + case HttpCodec.Empty => Chunk.empty + case HttpCodec.Halt => Chunk.empty + case atom: HttpCodec.Atom[_, _] => + atom match { + case HttpCodec.Status(codec, _) => Chunk.single(codec) + case _ => Chunk.empty + } + } + + private lazy val statusCodes: Set[Status] = statusCodecs.collect { case SimpleCodec.Specified(status) => + status + }.toSet + + private lazy val matchesAnyStatus: Boolean = statusCodecs.contains(SimpleCodec.Unspecified[Status]()) + /** * Returns a new codec that is the same as this one, but has attached docs, * which will render whenever docs are generated from the codec. @@ -238,6 +259,9 @@ sealed trait HttpCodec[-AtomTypes, Value] { else Left(s"Expected ${expected} but found ${actual}"), )(_ => expected) + private[http] def matchesStatus(status: Status) = + matchesAnyStatus || statusCodes.contains(status) + def named(name: String): HttpCodec[AtomTypes, Value] = HttpCodec.Annotated(self, Metadata.Named(name)) diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/EndpointExecutor.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/EndpointExecutor.scala index 4b2f03b2ac..6e13648951 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/EndpointExecutor.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/EndpointExecutor.scala @@ -63,7 +63,7 @@ final case class EndpointExecutor[+MI]( alt: Alternator[E, invocation.middleware.Err], ev: MI <:< invocation.middleware.In, trace: Trace, - ): ZIO[Scope, alt.Out, B] = { + ): ZIO[Scope, E, B] = { middlewareInput.flatMap { mi => getClient(invocation.endpoint).orDie.flatMap { endpointClient => endpointClient.execute(client, invocation)(ev(mi)) diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/internal/EndpointClient.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/internal/EndpointClient.scala index ffaf016f07..9f30b2b7fb 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/internal/EndpointClient.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/internal/EndpointClient.scala @@ -29,7 +29,7 @@ private[endpoint] final case class EndpointClient[P, I, E, O, M <: EndpointMiddl ) { def execute(client: Client, invocation: Invocation[P, I, E, O, M])( mi: invocation.middleware.In, - )(implicit alt: Alternator[E, invocation.middleware.Err], trace: Trace): ZIO[Scope, alt.Out, O] = { + )(implicit alt: Alternator[E, invocation.middleware.Err], trace: Trace): ZIO[Scope, E, O] = { val request0 = endpoint.input.encodeRequest(invocation.input) val request = request0.copy(url = endpointRoot ++ request0.url) @@ -44,28 +44,12 @@ private[endpoint] final case class EndpointClient[P, I, E, O, M <: EndpointMiddl ) client.request(withDefaultAcceptHeader).orDie.flatMap { response => - if (response.status.isSuccess) { + if (endpoint.output.matchesStatus(response.status)) { endpoint.output.decodeResponse(response).orDie + } else if (endpoint.error.matchesStatus(response.status)) { + endpoint.error.decodeResponse(response).orDie.flip } else { - // Preferentially decode an error from the handler, before falling back - // to decoding the middleware error: - val handlerError = - endpoint.error - .decodeResponse(response) - .map(e => alt.left(e)) - .mapError(t => new IllegalStateException("Cannot deserialize using endpoint error codec", t)) - - val middlewareError = - invocation.middleware.error - .decodeResponse(response) - .map(e => alt.right(e)) - .mapError(t => new IllegalStateException("Cannot deserialize using middleware error codec", t)) - - handlerError.catchAllCause { handlerCause => - middlewareError.catchAllCause { middlewareCause => - ZIO.failCause(handlerCause ++ middlewareCause) - } - }.orDie.flip + ZIO.die(new IllegalStateException(s"Status code: ${response.status} is not defined in the endpoint")) } } } From 7b5d2a1733176ed336e46432b1902456dbcd9f9a Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Sun, 23 Jun 2024 21:50:47 +1000 Subject: [PATCH 37/58] Fix rare race condition in ZClient causing healthy connections to be discarded (#2924) Fulfill onComplete promise before invoking final callback --- .../scala/zio/http/netty/AsyncBodyReader.scala | 18 +++++++++++------- .../client/ClientResponseStreamHandler.scala | 16 +++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala b/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala index eb129f166e..6425d501a6 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/AsyncBodyReader.scala @@ -77,6 +77,8 @@ abstract class AsyncBodyReader extends SimpleChannelInboundHandler[HttpContent]( val _ = ctx.channel().config().setAutoRead(previousAutoRead) } + protected def onLastMessage(): Unit = () + override def channelRead0( ctx: ChannelHandlerContext, msg: HttpContent, @@ -87,6 +89,12 @@ abstract class AsyncBodyReader extends SimpleChannelInboundHandler[HttpContent]( val isLast = msg.isInstanceOf[LastHttpContent] val content = ByteBufUtil.getBytes(msg.content()) + if (isLast) { + readingDone = true + ctx.channel().pipeline().remove(this) + onLastMessage() + } + state match { case State.Buffering => // `connect` method hasn't been called yet, add all incoming content to the buffer @@ -103,13 +111,7 @@ abstract class AsyncBodyReader extends SimpleChannelInboundHandler[HttpContent]( callback(Chunk.fromArray(content), isLast) } - if (isLast) { - readingDone = true - ctx.channel().pipeline().remove(this) - } else { - ctx.read() - } - () + if (!isLast) ctx.read(): Unit } } @@ -137,6 +139,8 @@ abstract class AsyncBodyReader extends SimpleChannelInboundHandler[HttpContent]( } object AsyncBodyReader { + private val FnUnit = () => () + sealed trait State object State { diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/client/ClientResponseStreamHandler.scala b/zio-http/jvm/src/main/scala/zio/http/netty/client/ClientResponseStreamHandler.scala index b898944d4b..28e704771e 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/client/ClientResponseStreamHandler.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/client/ClientResponseStreamHandler.scala @@ -35,18 +35,16 @@ final class ClientResponseStreamHandler( private implicit val unsafe: Unsafe = Unsafe.unsafe + override def onLastMessage(): Unit = + if (keepAlive) + onComplete.unsafe.done(Exit.succeed(ChannelState.forStatus(status))) + else + onComplete.unsafe.done(Exit.succeed(ChannelState.Invalid)) + override def channelRead0(ctx: ChannelHandlerContext, msg: HttpContent): Unit = { val isLast = msg.isInstanceOf[LastHttpContent] super.channelRead0(ctx, msg) - - if (isLast) { - if (keepAlive) - onComplete.unsafe.done(Exit.succeed(ChannelState.forStatus(status))) - else { - onComplete.unsafe.done(Exit.succeed(ChannelState.Invalid)) - ctx.close(): Unit - } - } + if (isLast && !keepAlive) ctx.close(): Unit } override def exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable): Unit = From 1796e86be1a520f1d43def3882d05e493c563743 Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Sun, 23 Jun 2024 23:10:21 +1000 Subject: [PATCH 38/58] Release Netty requests prior to forking ZIO effects (#2925) Release netty requests prior to forking ZIO effects --- .../main/scala/zio/http/netty/NettyBody.scala | 38 +----- .../zio/http/netty/NettyBodyWriter.scala | 7 +- .../scala/zio/http/netty/NettyResponse.scala | 9 +- .../http/netty/client/NettyClientDriver.scala | 4 +- .../netty/client/NettyRequestEncoder.scala | 22 ++- .../netty/server/ServerInboundHandler.scala | 128 ++++++++---------- .../client/NettyRequestEncoderSpec.scala | 32 +++-- 7 files changed, 93 insertions(+), 147 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala index 54e534e39e..ff868bdc4b 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBody.scala @@ -55,8 +55,11 @@ object NettyBody extends BodyEncoding { * Helper to create Body from ByteBuf */ private[zio] def fromByteBuf(byteBuf: ByteBuf, contentTypeHeader: Option[String]): Body = { - val (mediaType, boundary) = mediaTypeAndBoundary(contentTypeHeader) - ByteBufBody(byteBuf, mediaType, boundary) + if (byteBuf.readableBytes() == 0) Body.EmptyBody + else { + val (mediaType, boundary) = mediaTypeAndBoundary(contentTypeHeader) + Body.ArrayBody(ByteBufUtil.getBytes(byteBuf), mediaType, boundary) + } } private def mediaTypeAndBoundary(contentTypeHeader: Option[String]) = { @@ -99,37 +102,6 @@ object NettyBody extends BodyEncoding { override def knownContentLength: Option[Long] = Some(asciiString.length().toLong) } - private[zio] final case class ByteBufBody( - byteBuf: ByteBuf, - override val mediaType: Option[MediaType] = None, - override val boundary: Option[Boundary] = None, - ) extends Body - with UnsafeBytes { - - override def asArray(implicit trace: Trace): Task[Array[Byte]] = ZIO.succeed(ByteBufUtil.getBytes(byteBuf)) - - override def isComplete: Boolean = true - - override def isEmpty: Boolean = false - - override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = asArray.map(Chunk.fromArray) - - override def asStream(implicit trace: Trace): ZStream[Any, Throwable, Byte] = - ZStream.unwrap(asChunk.map(ZStream.fromChunk(_))) - - override def toString(): String = s"Body.fromByteBuf($byteBuf)" - - override private[zio] def unsafeAsArray(implicit unsafe: Unsafe): Array[Byte] = - ByteBufUtil.getBytes(byteBuf) - - override def contentType(newMediaType: MediaType): Body = copy(mediaType = Some(newMediaType)) - - override def contentType(newMediaType: MediaType, newBoundary: Boundary): Body = - copy(mediaType = Some(newMediaType), boundary = Some(newBoundary)) - - override def knownContentLength: Option[Long] = Some(byteBuf.readableBytes().toLong) - } - private[zio] final case class AsyncBody( unsafeAsync: UnsafeAsync => Unit, knownContentLength: Option[Long], diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBodyWriter.scala b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBodyWriter.scala index 93acabad5a..3a39498cd2 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/NettyBodyWriter.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/NettyBodyWriter.scala @@ -26,12 +26,11 @@ import zio.stream.ZStream import zio.http.Body import zio.http.Body._ -import zio.http.netty.NettyBody.{AsciiStringBody, AsyncBody, ByteBufBody, UnsafeAsync} +import zio.http.netty.NettyBody.{AsciiStringBody, AsyncBody, UnsafeAsync} import io.netty.buffer.Unpooled import io.netty.channel._ import io.netty.handler.codec.http.{DefaultHttpContent, LastHttpContent} -import io.netty.handler.stream.ChunkedNioFile object NettyBodyWriter { @@ -56,10 +55,6 @@ object NettyBodyWriter { } body match { - case body: ByteBufBody => - ctx.write(new DefaultHttpContent(body.byteBuf)) - ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT) - None case body: FileBody => // We need to stream the file when compression is enabled otherwise the response encoding fails val stream = ZStream.fromFile(body.file) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala b/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala index c8e7dffd53..04455169a0 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala @@ -24,17 +24,16 @@ import zio.http.netty.client.ClientResponseStreamHandler import zio.http.netty.model.Conversions import zio.http.{Body, Header, Response} -import io.netty.buffer.Unpooled +import io.netty.buffer.{ByteBufUtil, Unpooled} import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.http.{FullHttpResponse, HttpResponse} object NettyResponse { def apply(jRes: FullHttpResponse)(implicit unsafe: Unsafe): Response = { - val status = Conversions.statusFromNetty(jRes.status()) - val headers = Conversions.headersFromNetty(jRes.headers()) - val copiedBuffer = Unpooled.copiedBuffer(jRes.content()) - val data = NettyBody.fromByteBuf(copiedBuffer, headers.headers.get(Header.ContentType.name)) + val status = Conversions.statusFromNetty(jRes.status()) + val headers = Conversions.headersFromNetty(jRes.headers()) + val data = NettyBody.fromByteBuf(jRes.content(), headers.headers.get(Header.ContentType.name)) Response(status, headers, data) } diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala index f5d815961d..6ca16548a9 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyClientDriver.scala @@ -62,8 +62,8 @@ final case class NettyClientDriver private[netty] ( onComplete: Promise[Throwable, ChannelState], enableKeepAlive: Boolean, )(implicit trace: Trace): RIO[Scope, ChannelInterface] = - NettyRequestEncoder - .encode(req) + ZIO + .succeed(NettyRequestEncoder.encode(req)) .tapSome { case fullReq: FullHttpRequest => Scope.addFinalizer { ZIO.succeed { diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala index fc1466fe7f..2bccb58f3c 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala @@ -17,20 +17,21 @@ package zio.http.netty.client import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.{Task, Trace, ZIO} +import zio.{Task, Trace, Unsafe, ZIO} -import zio.http.Request import zio.http.netty._ import zio.http.netty.model.Conversions +import zio.http.{Body, Request} -import io.netty.buffer.Unpooled +import io.netty.buffer.{ByteBuf, EmptyByteBuf, Unpooled} import io.netty.handler.codec.http.{DefaultFullHttpRequest, DefaultHttpRequest, HttpHeaderNames, HttpRequest} + private[zio] object NettyRequestEncoder { /** * Converts a ZIO HTTP request to a Netty HTTP request. */ - def encode(req: Request)(implicit trace: Trace): Task[HttpRequest] = { + def encode(req: Request): HttpRequest = { val method = Conversions.methodToNetty(req.method) val jVersion = Conversions.versionToNetty(req.version) @@ -48,19 +49,17 @@ private[zio] object NettyRequestEncoder { case _ => } - if (req.body.isComplete) { - req.body.asArray.map { array => + req.body match { + case body: Body.UnsafeBytes => + val array = body.unsafeAsArray(Unsafe.unsafe) val content = Unpooled.wrappedBuffer(array) - val writerIndex = content.writerIndex() - headers.set(HttpHeaderNames.CONTENT_LENGTH, writerIndex.toString) + headers.set(HttpHeaderNames.CONTENT_LENGTH, array.length.toString) val jReq = new DefaultFullHttpRequest(jVersion, method, path, content) jReq.headers().set(headers) jReq - } - } else { - ZIO.attempt { + case _ => req.body.knownContentLength match { case Some(length) => headers.set(HttpHeaderNames.CONTENT_LENGTH, length.toString) @@ -68,7 +67,6 @@ private[zio] object NettyRequestEncoder { headers.set(HttpHeaderNames.TRANSFER_ENCODING, "chunked") } new DefaultHttpRequest(jVersion, method, path, headers) - } } } } diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala b/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala index 65e425cd68..590180e37e 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala @@ -29,6 +29,7 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.http.Body.WebsocketBody import zio.http._ import zio.http.netty._ +import zio.http.netty.client.NettyRequestEncoder import zio.http.netty.model.Conversions import zio.http.netty.socket.NettySocketProtocol @@ -38,6 +39,7 @@ import io.netty.handler.codec.http._ import io.netty.handler.codec.http.websocketx.{WebSocketFrame => JWebSocketFrame, WebSocketServerProtocolHandler} import io.netty.handler.ssl.SslHandler import io.netty.handler.timeout.ReadTimeoutException +import io.netty.util.ReferenceCountUtil @Sharable private[zio] final case class ServerInboundHandler( @@ -52,7 +54,7 @@ private[zio] final case class ServerInboundHandler( private var runtime: NettyRuntime = _ val inFlightRequests: LongAdder = new LongAdder() - val readClientCert = config.sslConfig.exists(_.includeClientCert) + private val readClientCert = config.sslConfig.exists(_.includeClientCert) def refreshApp(): Unit = { val pair = appRef.get() @@ -67,36 +69,31 @@ private[zio] final case class ServerInboundHandler( } } + private val releaseRequest = () => inFlightRequests.decrement() + override def channelRead0(ctx: ChannelHandlerContext, msg: HttpObject): Unit = { msg match { case jReq: HttpRequest => - val req = makeZioRequest(ctx, jReq) inFlightRequests.increment() - - val releaseRequest = { () => - inFlightRequests.decrement() - jReq match { - case jFullReq: FullHttpRequest => - if (jFullReq.refCnt() > 0) { - val _ = jFullReq.release() - } - case _ => - } - () - } - ensureHasApp() - val exit = + + try { if (jReq.decoderResult().isFailure) { val throwable = jReq.decoderResult().cause() - Exit.succeed(Response.fromThrowable(throwable)) - } else - app(req) - if (!attemptImmediateWrite(ctx, exit)) { - writeResponse(ctx, runtime, exit, jReq)(releaseRequest) - } else { - releaseRequest() + attemptFastWrite(ctx, Response.fromThrowable(throwable)) + releaseRequest() + } else { + val req = makeZioRequest(ctx, jReq) + val exit = app(req) + if (attemptImmediateWrite(ctx, exit)) { + releaseRequest() + } else { + writeResponse(ctx, runtime, exit, req)(releaseRequest) + } + } + } finally { + ReferenceCountUtil.safeRelease(jReq) } case msg: HttpContent => @@ -167,11 +164,11 @@ private[zio] final case class ServerInboundHandler( ctx: ChannelHandlerContext, runtime: NettyRuntime, response: Response, - jRequest: HttpRequest, + request: Request, ): Task[Option[Task[Unit]]] = { response.body match { case WebsocketBody(socketApp) if response.status == Status.SwitchingProtocols => - upgradeToWebSocket(ctx, jRequest, socketApp, runtime).as(None) + upgradeToWebSocket(ctx, request, socketApp, runtime).as(None) case _ => ZIO.attempt { val jResponse = NettyResponseEncoder.encode(response) @@ -207,16 +204,6 @@ private[zio] final case class ServerInboundHandler( } } - private def isResponseCompressible(req: HttpRequest): Boolean = { - config.responseCompression match { - case None => false - case Some(cfg) => - val headers = req.headers() - val headerName = Header.AcceptEncoding.name - cfg.options.exists(opt => headers.containsValue(headerName, opt.name, true)) - } - } - private def makeZioRequest(ctx: ChannelHandlerContext, nettyReq: HttpRequest): Request = { val nettyHttpVersion = nettyReq.protocolVersion() val protocolVersion = nettyHttpVersion match { @@ -273,50 +260,41 @@ private[zio] final case class ServerInboundHandler( */ private def upgradeToWebSocket( ctx: ChannelHandlerContext, - jReq: HttpRequest, + request: Request, webSocketApp: WebSocketApp[Any], runtime: NettyRuntime, ): Task[Unit] = { - jReq match { - case jReq: FullHttpRequest => - Queue - .unbounded[WebSocketChannelEvent] - .tap { queue => - ZIO.suspend { - val nettyChannel = NettyChannel.make[JWebSocketFrame](ctx.channel()) - val webSocketChannel = WebSocketChannel.make(nettyChannel, queue) - webSocketApp.handler.runZIO(webSocketChannel).ignoreLogged.forkDaemon - } - } - .flatMap { queue => - ZIO.attempt { - ctx - .channel() - .pipeline() - .addLast( - new WebSocketServerProtocolHandler( - NettySocketProtocol - .serverBuilder(webSocketApp.customConfig.getOrElse(config.webSocketConfig)) - .build(), - ), - ) - .addLast(Names.WebSocketHandler, new WebSocketAppHandler(runtime, queue, None)) - - val retained = jReq.retainedDuplicate() - val _ = ctx.channel().eventLoop().submit { () => ctx.fireChannelRead(retained) } - } - } - case jReq: HttpRequest => + Queue + .unbounded[WebSocketChannelEvent] + .tap { queue => ZIO.suspend { - val fullRequest = new DefaultFullHttpRequest(jReq.protocolVersion(), jReq.method(), jReq.uri()) - fullRequest.headers().setAll(jReq.headers()) - upgradeToWebSocket(ctx: ChannelHandlerContext, fullRequest, webSocketApp, runtime) + val nettyChannel = NettyChannel.make[JWebSocketFrame](ctx.channel()) + val webSocketChannel = WebSocketChannel.make(nettyChannel, queue) + webSocketApp.handler.runZIO(webSocketChannel).ignoreLogged.forkDaemon } - } + } + .flatMap { queue => + ZIO.attempt { + ctx + .channel() + .pipeline() + .addLast( + new WebSocketServerProtocolHandler( + NettySocketProtocol + .serverBuilder(webSocketApp.customConfig.getOrElse(config.webSocketConfig)) + .build(), + ), + ) + .addLast(Names.WebSocketHandler, new WebSocketAppHandler(runtime, queue, None)) + + val jReq = NettyRequestEncoder.encode(request) + ctx.channel().eventLoop().submit { () => ctx.fireChannelRead(jReq) }: Unit + } + } } - private def writeNotFound(ctx: ChannelHandlerContext, jReq: HttpRequest): Unit = { - val response = Response.notFound(jReq.uri()) + private def writeNotFound(ctx: ChannelHandlerContext, req: Request): Unit = { + val response = Response.notFound(req.url.encode) attemptFastWrite(ctx, response): Unit } @@ -324,7 +302,7 @@ private[zio] final case class ServerInboundHandler( ctx: ChannelHandlerContext, runtime: NettyRuntime, exit: ZIO[Any, Response, Response], - jReq: HttpRequest, + req: Request, )(ensured: () => Unit): Unit = { runtime.run(ctx, ensured) { exit.sandbox.catchAll { error => @@ -343,12 +321,12 @@ private[zio] final case class ServerInboundHandler( if (response ne null) { val done = attemptFastWrite(ctx, response) if (!done) - attemptFullWrite(ctx, runtime, response, jReq) + attemptFullWrite(ctx, runtime, response, req) else ZIO.none } else { if (ctx.channel().isOpen) { - writeNotFound(ctx, jReq) + writeNotFound(ctx, req) } ZIO.none } diff --git a/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyRequestEncoderSpec.scala b/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyRequestEncoderSpec.scala index 7b989f3f7e..196c206500 100644 --- a/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyRequestEncoderSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyRequestEncoderSpec.scala @@ -16,11 +16,11 @@ package zio.http.netty.client +import zio.ZIO import zio.test.Assertion._ import zio.test._ import zio.http.internal.HttpGen -import zio.http.netty._ import zio.http.netty.model.Conversions import zio.http.{Body, QueryParams, Request, URL, ZIOHttpSpec} @@ -59,68 +59,72 @@ object NettyRequestEncoderSpec extends ZIOHttpSpec { def spec = suite("EncodeClientParams")( test("method") { check(anyClientParam) { params => - val req = encode(params).map(_.method()) + val req = ZIO.succeed(encode(params)).map(_.method()) assertZIO(req)(equalTo(Conversions.methodToNetty(params.method))) } }, test("method on Body.RandomAccessFile") { check(HttpGen.clientParamsForFileBody()) { params => - val req = encode(params).map(_.method()) + val req = ZIO.succeed(encode(params)).map(_.method()) assertZIO(req)(equalTo(Conversions.methodToNetty(params.method))) } }, suite("uri")( test("uri") { check(anyClientParam) { params => - val req = encode(params).map(_.uri()) + val req = ZIO.succeed(encode(params)).map(_.uri()) assertZIO(req)(equalTo(params.url.relative.addLeadingSlash.encode)) } }, test("uri on Body.RandomAccessFile") { check(HttpGen.clientParamsForFileBody()) { params => - val req = encode(params).map(_.uri()) + val req = ZIO.succeed(encode(params)).map(_.uri()) assertZIO(req)(equalTo(params.url.relative.addLeadingSlash.encode)) } }, ), test("content-length") { check(clientParamWithFiniteData(5)) { params => - val req = encode(params).map( - _.headers().getInt(HttpHeaderNames.CONTENT_LENGTH).toLong, - ) + val req = ZIO + .succeed(encode(params)) + .map( + _.headers().getInt(HttpHeaderNames.CONTENT_LENGTH).toLong, + ) assertZIO(req)(equalTo(5L)) } }, test("host header") { check(anyClientParam) { params => val req = - encode(params).map(i => Option(i.headers().get(HttpHeaderNames.HOST))) + ZIO.succeed(encode(params)).map(i => Option(i.headers().get(HttpHeaderNames.HOST))) assertZIO(req)(equalTo(params.url.hostPort)) } }, test("host header when absolute url") { check(clientParamWithAbsoluteUrl) { params => - val req = encode(params) + val req = ZIO + .succeed(encode(params)) .map(i => Option(i.headers().get(HttpHeaderNames.HOST))) assertZIO(req)(equalTo(params.url.hostPort)) } }, test("only one host header exists") { check(clientParamWithAbsoluteUrl) { params => - val req = encode(params) + val req = ZIO + .succeed(encode(params)) .map(_.headers().getAll(HttpHeaderNames.HOST).size) assertZIO(req)(equalTo(1)) } }, test("http version") { check(anyClientParam) { params => - val req = encode(params).map(i => i.protocolVersion()) + val req = ZIO.succeed(encode(params)).map(i => i.protocolVersion()) assertZIO(req)(equalTo(Conversions.versionToNetty(params.version))) } }, test("url with an empty path and query params") { check(clientParamWithEmptyPathAndQueryParams) { params => - val uri = encode(params).map(_.uri) + val uri = ZIO.succeed(encode(params)).map(_.uri) assertZIO(uri)(not(equalTo(params.url.encode))) && assertZIO(uri)(equalTo(params.url.addLeadingSlash.encode)) } @@ -128,7 +132,7 @@ object NettyRequestEncoderSpec extends ZIOHttpSpec { test("leading slash added to path") { val url = URL.decode("https://api.github.com").toOption.get / "something" / "else" val req = Request(url = url) - val encoded = encode(req).map(_.uri) + val encoded = ZIO.succeed(encode(req)).map(_.uri) assertZIO(encoded)(equalTo("/something/else")) }, ) From 5d57d73bbe24219a4dce099c918c2efab2051817 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Sun, 23 Jun 2024 15:13:24 +0200 Subject: [PATCH 39/58] Alternative literal path segments for route definitions (#2815) (#2920) --- .../test/scala/zio/http/TestServerSpec.scala | 10 +- .../src/test/scala/zio/http/RoutesSpec.scala | 19 ++++ .../src/main/scala/zio/http/HttpApp.scala | 6 +- .../src/main/scala/zio/http/Route.scala | 4 +- .../main/scala/zio/http/RoutePattern.scala | 2 + .../src/main/scala/zio/http/Routes.scala | 6 +- .../main/scala/zio/http/codec/PathCodec.scala | 100 +++++++++++++++++- .../http/endpoint/openapi/OpenAPIGen.scala | 2 + .../src/main/scala/zio/http/package.scala | 15 +-- 9 files changed, 143 insertions(+), 21 deletions(-) diff --git a/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala b/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala index 69c86d2a48..59660c9a77 100644 --- a/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala +++ b/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala @@ -47,10 +47,7 @@ object TestServerSpec extends ZIOHttpSpec { client <- ZIO.service[Client] testRequest <- requestToCorrectPort _ <- TestServer.addRequestResponse(testRequest, Response(Status.Ok)) - finalResponse <- - client( - testRequest, - ) + finalResponse <- client(testRequest) } yield assertTrue(status(finalResponse) == Status.Ok) }, @@ -59,10 +56,7 @@ object TestServerSpec extends ZIOHttpSpec { client <- ZIO.service[Client] testRequest <- requestToCorrectPort _ <- TestServer.addRequestResponse(testRequest, Response(Status.Ok)) - finalResponse <- - client( - testRequest.addHeaders(Headers(Header.ContentLanguage.French)), - ) + finalResponse <- client(testRequest.addHeaders(Headers(Header.ContentLanguage.French))) } yield assertTrue(status(finalResponse) == Status.Ok) }, diff --git a/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala b/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala index b61be9108f..30cc386bf1 100644 --- a/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/RoutesSpec.scala @@ -89,5 +89,24 @@ object RoutesSpec extends ZIOHttpSpec { ) .map(response => assertTrue(response.status == Status.Ok)) }, + test("alternative path segments") { + val app = Routes( + Method.GET / anyOf("foo", "bar", "baz") -> Handler.ok, + ) + + for { + foo <- app.runZIO(Request.get("/foo")) + bar <- app.runZIO(Request.get("/bar")) + baz <- app.runZIO(Request.get("/baz")) + box <- app.runZIO(Request.get("/box")) + } yield { + assertTrue( + extractStatus(foo) == Status.Ok, + extractStatus(bar) == Status.Ok, + extractStatus(baz) == Status.Ok, + extractStatus(box) == Status.NotFound, + ) + } + }, ) } diff --git a/zio-http/shared/src/main/scala/zio/http/HttpApp.scala b/zio-http/shared/src/main/scala/zio/http/HttpApp.scala index e2b97f858c..175abe47dd 100644 --- a/zio-http/shared/src/main/scala/zio/http/HttpApp.scala +++ b/zio-http/shared/src/main/scala/zio/http/HttpApp.scala @@ -19,6 +19,8 @@ package zio.http import zio._ import zio.stacktracer.TracingImplicits.disableAutoTrace +import zio.http.Routes.Tree + /** * An HTTP application is a collection of routes, all of whose errors have been * handled through conversion into HTTP responses. @@ -137,10 +139,10 @@ object HttpApp { Tree(self.tree ++ that.tree) final def add[Env1 <: Env](route: Route[Env1, Response])(implicit trace: Trace): Tree[Env1] = - Tree(self.tree.add(route.routePattern, route.toHandler)) + Tree(self.tree.addAll(route.routePattern.alternatives.map(alt => (alt, route.toHandler)))) final def addAll[Env1 <: Env](routes: Iterable[Route[Env1, Response]])(implicit trace: Trace): Tree[Env1] = - Tree(self.tree.addAll(routes.map(r => (r.routePattern, r.toHandler)))) + Tree[Env1](self.tree.addAll(routes.map(r => r.routePattern.alternatives.map(alt => (alt, r.toHandler))).flatten)) final def get(method: Method, path: Path): Chunk[RequestHandler[Env, Response]] = tree.get(method, path) diff --git a/zio-http/shared/src/main/scala/zio/http/Route.scala b/zio-http/shared/src/main/scala/zio/http/Route.scala index 1a2c2eb5b3..6d60cbe027 100644 --- a/zio-http/shared/src/main/scala/zio/http/Route.scala +++ b/zio-http/shared/src/main/scala/zio/http/Route.scala @@ -345,10 +345,10 @@ object Route { handler: Handler[Env1, Response, In, Response], )(implicit zippable: Zippable.Out[Params, Request, In], trace: Trace): Route[Env1, Nothing] = { val handler2: Handler[Any, Nothing, RoutePattern[_], Handler[Env1, Response, Request, Response]] = { - Handler.fromFunction[RoutePattern[_]] { _ => + Handler.fromFunction[RoutePattern[_]] { pattern => val paramHandler = Handler.fromFunctionZIO[(rpm.Context, Request)] { case (ctx, request) => - rpm.routePattern.decode(request.method, request.path) match { + pattern.asInstanceOf[RoutePattern[rpm.PathInput]].decode(request.method, request.path) match { case Left(error) => ZIO.dieMessage(error) case Right(value) => val params = rpm.zippable.zip(value, ctx) diff --git a/zio-http/shared/src/main/scala/zio/http/RoutePattern.scala b/zio-http/shared/src/main/scala/zio/http/RoutePattern.scala index f54cc50c98..e88062c99d 100644 --- a/zio-http/shared/src/main/scala/zio/http/RoutePattern.scala +++ b/zio-http/shared/src/main/scala/zio/http/RoutePattern.scala @@ -84,6 +84,8 @@ final case class RoutePattern[A](method: Method, pathCodec: PathCodec[A]) { self ): Route.Builder[Env, zippable.Out] = Route.Builder(self, middleware)(zippable) + def alternatives: List[RoutePattern[A]] = pathCodec.alternatives.map(RoutePattern(method, _)) + /** * Reinteprets the type parameter, given evidence it is equal to some other * type. diff --git a/zio-http/shared/src/main/scala/zio/http/Routes.scala b/zio-http/shared/src/main/scala/zio/http/Routes.scala index b53f2d48b4..ebf49865d2 100644 --- a/zio-http/shared/src/main/scala/zio/http/Routes.scala +++ b/zio-http/shared/src/main/scala/zio/http/Routes.scala @@ -20,6 +20,7 @@ import java.io.File import zio._ +import zio.http.HttpApp.Tree import zio.http.Routes.ApplyContextAspect import zio.http.codec.PathCodec @@ -331,10 +332,11 @@ object Routes extends RoutesCompanionVersionSpecific { Tree(self.tree ++ that.tree) final def add[Env1 <: Env](route: Route[Env1, Response])(implicit trace: Trace): Tree[Env1] = - Tree(self.tree.add(route.routePattern, route.toHandler)) + Tree(self.tree.addAll(route.routePattern.alternatives.map(alt => (alt, route.toHandler)))) final def addAll[Env1 <: Env](routes: Iterable[Route[Env1, Response]])(implicit trace: Trace): Tree[Env1] = - Tree(self.tree.addAll(routes.map(r => (r.routePattern, r.toHandler)))) + // only change to flatMap when Scala 2.12 is dropped + Tree(self.tree.addAll(routes.map(r => r.routePattern.alternatives.map(alt => (alt, r.toHandler))).flatten)) final def get(method: Method, path: Path): Chunk[RequestHandler[Env, Response]] = tree.get(method, path) diff --git a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala index 9a8a3c01cd..88756b7fea 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala @@ -16,6 +16,7 @@ package zio.http.codec +import scala.annotation.tailrec import scala.collection.immutable.ListMap import scala.language.implicitConversions @@ -61,6 +62,58 @@ sealed trait PathCodec[A] { self => } } + private[http] def orElse(value: PathCodec[Unit])(implicit ev: A =:= Unit): PathCodec[Unit] = + Fallback(self.asInstanceOf[PathCodec[Unit]], value) + + private def fallbackAlternatives(f: Fallback[_]): List[PathCodec[Any]] = { + @tailrec + def loop(codecs: List[PathCodec[_]], result: List[PathCodec[_]]): List[PathCodec[_]] = + if (codecs.isEmpty) result + else + codecs.head match { + case PathCodec.Annotated(codec, _) => + loop(codec :: codecs.tail, result) + case PathCodec.Segment(SegmentCodec.Literal(_)) => + loop(codecs.tail, result :+ codecs.head) + case PathCodec.Segment(SegmentCodec.Empty) => + loop(codecs.tail, result) + case Fallback(left, right) => + loop(left :: right :: codecs.tail, result) + case other => + throw new IllegalStateException(s"Alternative path segments should only contain literals, found: $other") + } + loop(List(f.left, f.right), List.empty).asInstanceOf[List[PathCodec[Any]]] + } + + final def alternatives: List[PathCodec[A]] = { + var alts = List.empty[PathCodec[Any]] + def loop(codec: PathCodec[_], combiner: Combiner[_, _]): Unit = codec match { + case Concat(left, right, combiner) => + loop(left, combiner) + loop(right, combiner) + case f: Fallback[_] => + if (alts.isEmpty) alts = fallbackAlternatives(f) + else + alts ++= alts.flatMap { alt => + fallbackAlternatives(f).map(fa => + Concat(alt, fa.asInstanceOf[PathCodec[Any]], combiner.asInstanceOf[Combiner.WithOut[Any, Any, Any]]), + ) + } + case Segment(SegmentCodec.Empty) => + alts :+= codec.asInstanceOf[PathCodec[Any]] + case pc => + if (alts.isEmpty) alts :+= pc.asInstanceOf[PathCodec[Any]] + else + alts = alts + .map(l => + Concat(l, pc.asInstanceOf[PathCodec[Any]], combiner.asInstanceOf[Combiner.WithOut[Any, Any, Any]]) + .asInstanceOf[PathCodec[Any]], + ) + } + loop(self, Combiner.leftUnit[Unit]) + alts.asInstanceOf[List[PathCodec[A]]] + } + final def asType[B](implicit ev: A =:= B): PathCodec[B] = self.asInstanceOf[PathCodec[B]] /** @@ -84,7 +137,7 @@ sealed trait PathCodec[A] { self => val opt = instructions(i) opt match { - case Match(value) => + case Match(value) => if (j >= segments.length || segments(j) != value) { fail = "Expected path segment \"" + value + "\" but found end of path" i = instructions.length @@ -92,6 +145,14 @@ sealed trait PathCodec[A] { self => stack.push(()) j = j + 1 } + case MatchAny(values) => + if (j >= segments.length || !values.contains(segments(j))) { + fail = "Expected one of the following path segments: " + values.mkString(", ") + " but found end of path" + i = instructions.length + } else { + stack.push(()) + j = j + 1 + } case Combine(combiner0) => val combiner = combiner0.asInstanceOf[Combiner[Any, Any]] @@ -227,6 +288,7 @@ sealed trait PathCodec[A] { self => case Concat(left, right, _) => left.doc + right.doc case Annotated(codec, annotations) => codec.doc + annotations.collectFirst { case MetaData.Documented(doc) => doc }.getOrElse(Doc.empty) + case Fallback(left, right) => left.doc + right.doc } /** @@ -264,6 +326,8 @@ sealed trait PathCodec[A] { self => case PathCodec.TransformOrFail(api, _, g) => g.asInstanceOf[Any => Either[String, Any]](value).flatMap(loop(api, _)) + case Fallback(left, _) => + loop(left, value) } loop(self, value).map { path => @@ -298,6 +362,9 @@ sealed trait PathCodec[A] { self => case SegmentCodec.Trailing => Opt.TrailingOpt }) + case f: Fallback[_] => + Chunk(Opt.MatchAny(fallbacks(f))) + case Concat(left, right, combiner) => loop(left) ++ loop(right) ++ Chunk(Opt.Combine(combiner)) @@ -310,6 +377,26 @@ sealed trait PathCodec[A] { self => _optimize } + private def fallbacks(f: Fallback[_]): Set[String] = { + @tailrec + def loop(codecs: List[PathCodec[_]], result: Set[String]): Set[String] = + if (codecs.isEmpty) result + else + codecs.head match { + case PathCodec.Annotated(codec, _) => + loop(codec :: codecs.tail, result) + case PathCodec.Segment(SegmentCodec.Literal(value)) => + loop(codecs.tail, result + value) + case PathCodec.Segment(SegmentCodec.Empty) => + loop(codecs.tail, result) + case Fallback(left, right) => + loop(left :: right :: codecs.tail, result) + case other => + throw new IllegalStateException(s"Alternative path segments should only contain literals, found: $other") + } + loop(List(f.left, f.right), Set.empty) + } + /** * Renders the path codec as a string. */ @@ -324,6 +411,9 @@ sealed trait PathCodec[A] { self => case PathCodec.TransformOrFail(api, _, _) => loop(api) + + case PathCodec.Fallback(left, _) => + loop(left) } loop(self) @@ -341,6 +431,8 @@ sealed trait PathCodec[A] { self => case PathCodec.Segment(segment) => segment.render case PathCodec.TransformOrFail(api, _, _) => loop(api) + + case PathCodec.Fallback(left, _) => loop(left) } loop(self) @@ -360,6 +452,9 @@ sealed trait PathCodec[A] { self => case PathCodec.TransformOrFail(api, _, _) => loop(api) + + case PathCodec.Fallback(left, _) => + loop(left) } loop(self) @@ -418,6 +513,8 @@ object PathCodec { def uuid(name: String): PathCodec[java.util.UUID] = Segment(SegmentCodec.uuid(name)) + private[http] final case class Fallback[A](left: PathCodec[Unit], right: PathCodec[Unit]) extends PathCodec[A] + private[http] final case class Segment[A](segment: SegmentCodec[A]) extends PathCodec[A] private[http] final case class Concat[A, B, C]( @@ -458,6 +555,7 @@ object PathCodec { private[http] sealed trait Opt private[http] object Opt { final case class Match(value: String) extends Opt + final case class MatchAny(values: Set[String]) extends Opt final case class Combine(combiner: Combiner[_, _]) extends Opt case object IntOpt extends Opt case object LongOpt extends Opt diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala index e8595f0656..ab0c5784e9 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala @@ -248,6 +248,8 @@ object OpenAPIGen { } }), ) + case PathCodec.Fallback(left, _) => + loop(left, annotations) } loop(codec, annotations).map { case (sc, annotations) => diff --git a/zio-http/shared/src/main/scala/zio/http/package.scala b/zio-http/shared/src/main/scala/zio/http/package.scala index b35a9971fe..6ea5db2bef 100644 --- a/zio-http/shared/src/main/scala/zio/http/package.scala +++ b/zio-http/shared/src/main/scala/zio/http/package.scala @@ -36,12 +36,15 @@ package object http extends UrlInterpolator with MdInterpolator { def withContext[C](fn: => C)(implicit c: WithContext[C]): ZIO[c.Env, c.Err, c.Out] = c.toZIO(fn) - def boolean(name: String): PathCodec[Boolean] = PathCodec.bool(name) - def int(name: String): PathCodec[Int] = PathCodec.int(name) - def long(name: String): PathCodec[Long] = PathCodec.long(name) - def string(name: String): PathCodec[String] = PathCodec.string(name) - val trailing: PathCodec[Path] = PathCodec.trailing - def uuid(name: String): PathCodec[UUID] = PathCodec.uuid(name) + def boolean(name: String): PathCodec[Boolean] = PathCodec.bool(name) + def int(name: String): PathCodec[Int] = PathCodec.int(name) + def long(name: String): PathCodec[Long] = PathCodec.long(name) + def string(name: String): PathCodec[String] = PathCodec.string(name) + val trailing: PathCodec[Path] = PathCodec.trailing + def uuid(name: String): PathCodec[UUID] = PathCodec.uuid(name) + def anyOf(name: String, names: String*): PathCodec[Unit] = + if (names.isEmpty) PathCodec.literal(name) + else names.foldLeft(PathCodec.literal(name))((acc, n) => acc.orElse(PathCodec.literal(n))) val Root: PathCodec[Unit] = PathCodec.empty From cad92d093e1dc60c63572e0a7f3f5a8261b59f0c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 16:23:27 +0200 Subject: [PATCH 40/58] Update README.md (#2898) Co-authored-by: github-actions[bot] --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d50448eb4e..9d5fc16498 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ZIO HTTP is a scala library for building http apps. It is powered by ZIO and [Ne ZIO HTTP is designed in terms of **HTTP as function**, where both server and client are a function from a request to a response, with a focus on type safety, composability, and testability. -[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-http/workflows/Continuous%20Integration/badge.svg) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-http_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-http_2.13/) [![ZIO Http](https://img.shields.io/github/stars/zio/zio-http?style=social)](https://github.com/zio/zio-http) +[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-http/workflows/Continuous%20Integration/badge.svg) [![Sonatype Releases](https://img.shields.io/nexus/r/https/oss.sonatype.org/dev.zio/zio-http_2.13.svg?label=Sonatype%20Release)](https://oss.sonatype.org/content/repositories/releases/dev/zio/zio-http_2.13/) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-http_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-http_2.13/) [![javadoc](https://javadoc.io/badge2/dev.zio/zio-http-docs_2.13/javadoc.svg)](https://javadoc.io/doc/dev.zio/zio-http-docs_2.13) [![ZIO Http](https://img.shields.io/github/stars/zio/zio-http?style=social)](https://github.com/zio/zio-http) Some of the key features of ZIO HTTP are: @@ -43,7 +43,7 @@ Some of the key features of ZIO HTTP are: Setup via `build.sbt`: ```scala -libraryDependencies += "dev.zio" %% "zio-http" % "" +libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC7" ``` **NOTES ON VERSIONING:** From 55f2f5bbcbe3c236e4bf88a17bc5a297e453c234 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Mon, 24 Jun 2024 00:33:50 +0200 Subject: [PATCH 41/58] Generate http-file standard from Endpoint definitions (#2876) (#2931) --- .../main/scala/zio/http/codec/HttpCodec.scala | 13 ++ .../main/scala/zio/http/codec/PathCodec.scala | 18 +- .../scala/zio/http/codec/SegmentCodec.scala | 19 +- .../zio/http/endpoint/http/HttpFile.scala | 91 +++++++++ .../zio/http/endpoint/http/HttpGen.scala | 192 ++++++++++++++++++ .../http/endpoint/openapi/OpenAPIGen.scala | 15 +- .../zio/http/endpoint/http/HttpGenSpec.scala | 191 +++++++++++++++++ 7 files changed, 520 insertions(+), 19 deletions(-) create mode 100644 zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpFile.scala create mode 100644 zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpGen.scala create mode 100644 zio-http/shared/src/test/scala/zio/http/endpoint/http/HttpGenSpec.scala diff --git a/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala index f595e04d79..f194dbcd15 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala @@ -651,6 +651,19 @@ object HttpCodec extends ContentCodecs with HeaderCodecs with MethodCodecs with case Metadata.Documented(doc) => Metadata.Documented(doc) case Metadata.Deprecated(doc) => Metadata.Deprecated(doc) } + + def transformOrFail[Value2](f: Value => Either[String, Value2]): Metadata[Value2] = + this match { + case Metadata.Named(name) => Metadata.Named(name) + case Metadata.Optional() => Metadata.Optional() + case Metadata.Examples(ex) => + Metadata.Examples(ex.collect { + case (k, v) if f(v).isRight => + k -> f(v).toOption.get + }) + case Metadata.Documented(doc) => Metadata.Documented(doc) + case Metadata.Deprecated(doc) => Metadata.Deprecated(doc) + } } object Metadata { diff --git a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala index 88756b7fea..bfcd0ebf6b 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala @@ -400,14 +400,21 @@ sealed trait PathCodec[A] { self => /** * Renders the path codec as a string. */ - def render: String = { + def render: String = + render("{", "}") + + /** + * Renders the path codec as a string. Surrounds the path variables with the + * specified prefix and suffix. + */ + def render(prefix: String, suffix: String): String = { def loop(path: PathCodec[_]): String = path match { case PathCodec.Annotated(codec, _) => loop(codec) case PathCodec.Concat(left, right, _) => loop(left) + loop(right) - case PathCodec.Segment(segment) => segment.render + case PathCodec.Segment(segment) => segment.render(prefix, suffix) case PathCodec.TransformOrFail(api, _, _) => loop(api) @@ -419,7 +426,10 @@ sealed trait PathCodec[A] { self => loop(self) } - private[zio] def renderIgnoreTrailing: String = { + private[zio] def renderIgnoreTrailing: String = + renderIgnoreTrailing("{", "}") + + private[zio] def renderIgnoreTrailing(prefix: String, suffix: String): String = { def loop(path: PathCodec[_]): String = path match { case PathCodec.Annotated(codec, _) => loop(codec) @@ -428,7 +438,7 @@ sealed trait PathCodec[A] { self => case PathCodec.Segment(SegmentCodec.Trailing) => "" - case PathCodec.Segment(segment) => segment.render + case PathCodec.Segment(segment) => segment.render(prefix, suffix) case PathCodec.TransformOrFail(api, _, _) => loop(api) diff --git a/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala index a895610bd0..102d57add9 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala @@ -50,18 +50,21 @@ sealed trait SegmentCodec[A] { self => final def nonEmpty: Boolean = !isEmpty final def render: String = { - if (_render == "") _render = self.asInstanceOf[SegmentCodec[_]] match { + if (_render == "") _render = render("{", "}") + _render + } + + final def render(prefix: String, suffix: String): String = + self.asInstanceOf[SegmentCodec[_]] match { case _: SegmentCodec.Empty.type => s"" case SegmentCodec.Literal(value) => s"/$value" - case SegmentCodec.IntSeg(name) => s"/{$name}" - case SegmentCodec.LongSeg(name) => s"/{$name}" - case SegmentCodec.Text(name) => s"/{$name}" - case SegmentCodec.BoolSeg(name) => s"/{$name}" - case SegmentCodec.UUID(name) => s"/{$name}" + case SegmentCodec.IntSeg(name) => s"/$prefix$name$suffix" + case SegmentCodec.LongSeg(name) => s"/$prefix$name$suffix" + case SegmentCodec.Text(name) => s"/$prefix$name$suffix" + case SegmentCodec.BoolSeg(name) => s"/$prefix$name$suffix" + case SegmentCodec.UUID(name) => s"/$prefix$name$suffix" case _: SegmentCodec.Trailing.type => s"/..." } - _render - } final def transform[A2](f: A => A2)(g: A2 => A): PathCodec[A2] = PathCodec.Segment(self).transform(f)(g) diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpFile.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpFile.scala new file mode 100644 index 0000000000..7efa98e81e --- /dev/null +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpFile.scala @@ -0,0 +1,91 @@ +package zio.http.endpoint.http + +import zio.http._ +import zio.http.endpoint.openapi.JsonSchema + +final case class HttpFile(endpoints: List[HttpEndpoint]) { + def ++(that: HttpFile): HttpFile = HttpFile(endpoints ++ that.endpoints) + + def render: String = endpoints.map(_.render).mkString("\n\n") +} + +final case class HttpEndpoint( + method: Method, + path: String, + headers: Seq[String], + requestBody: Option[JsonSchema], + variables: Seq[HttpVariable], + docString: Option[String], +) { + def render: String = + renderDoc + renderVariables + renderPath + renderHeaders + renderRequestBody + + private def renderRequestBody: String = { + requestBody match { + case None => "" + case Some(schema) => + renderSchema(schema) + } + } + + private def renderSchema(schema: JsonSchema, name: Option[String] = None): String = + schema match { + case JsonSchema.AnnotatedSchema(schema, _) => renderSchema(schema) + case JsonSchema.RefSchema(_) => throw new Exception("RefSchema not supported") + case JsonSchema.OneOfSchema(_) => throw new Exception("OneOfSchema not supported") + case JsonSchema.AllOfSchema(_) => throw new Exception("AllOfSchema not supported") + case JsonSchema.AnyOfSchema(_) => throw new Exception("AnyOfSchema not supported") + case JsonSchema.Number(_) => s""""${getName(name)}": {{${getName(name)}}}""" + case JsonSchema.Integer(_) => s""""${getName(name)}": {{${getName(name)}}}""" + case JsonSchema.String(_, _) => s""""${getName(name)}": {{${getName(name)}}}""" + case JsonSchema.Boolean => s""""${getName(name)}": {{${getName(name)}}}""" + case JsonSchema.ArrayType(_) => s""""${getName(name)}": {{${getName(name)}}}""" + case JsonSchema.Object(properties, _, _) => + if (properties.isEmpty) "" + else { + val fields = properties.map { case (name, schema) => renderSchema(schema, Some(name)) }.mkString(",\n") + // TODO: This has to be removed when we support other content types + if (name.isEmpty) s"\nContent-type: application/json\n\n{\n$fields\n}" + else s""""${getName(name)}": {\n$fields\n}""" + } + case JsonSchema.Enum(_) => s""""${getName(name)}": {{${getName(name)}}}""" + case JsonSchema.Null => "" + case JsonSchema.AnyJson => "" + } + + private def getName(name: Option[String]) = { name.getOrElse(throw new IllegalArgumentException("name is required")) } + + private def renderDoc = + docString match { + case None => + "" + case Some(doc) => + doc.split("\n").map(line => s"# $line").mkString("\n", "\n", "\n") + } + + private def renderVariables = + if (variables.isEmpty) "" + else variables.distinct.map(_.render).mkString("\n", "\n", "\n\n") + + private def renderHeaders = + if (headers.isEmpty) "" + else headers.map(h => s"${h.capitalize}: {{${h.capitalize}}}").mkString("\n", "\n", "") + + private def renderPath = { + if (method == Method.ANY) { + s"POST $path" + } else { + s"${method.render} $path" + } + } +} + +final case class HttpVariable(name: String, value: Option[String], docString: Option[String] = None) { + def render = { + val variable = s"@$name=${value.getOrElse("")}" + if (docString.isDefined) { + docString.get.split("\n").map(line => s"# $line").mkString("", "\n", "\n") + variable + } else variable + } + +} diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpGen.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpGen.scala new file mode 100644 index 0000000000..53314e3f0a --- /dev/null +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/http/HttpGen.scala @@ -0,0 +1,192 @@ +package zio.http.endpoint.http + +import zio.http.MediaType +import zio.http.codec._ +import zio.http.endpoint.Endpoint +import zio.http.endpoint.openapi.OpenAPIGen.{AtomizedMetaCodecs, MetaCodec} +import zio.http.endpoint.openapi.{JsonSchema, OpenAPIGen} + +object HttpGen { + + private val PathWildcard = "pathWildcard" + + def fromEndpoints( + endpoint1: Endpoint[_, _, _, _, _], + endpoints: Endpoint[_, _, _, _, _]*, + ): HttpFile = { + HttpFile((endpoint1 +: endpoints).map(fromEndpoint).toList) + } + + def fromEndpoint(endpoint: Endpoint[_, _, _, _, _]): HttpEndpoint = { + val atomizedInput = AtomizedMetaCodecs.flatten(endpoint.input) + HttpEndpoint( + OpenAPIGen.method(atomizedInput.method), + buildPath(endpoint.input), + headersVariables(atomizedInput).map(_.name), + bodySchema(atomizedInput), + variables(atomizedInput), + doc(endpoint), + ) + } + + private def bodySchema(inAtoms: AtomizedMetaCodecs) = { + // currently only json support. No multipart/form-data or x-www-form-urlencoded + if (inAtoms.content.size != 1) None + else + inAtoms.content.collect { + case MetaCodec(HttpCodec.Content(codec, _, _), _) if codec.choices.contains(MediaType.application.json) => + val schema = codec.choices(MediaType.application.json).schema + val jsonSchema = JsonSchema.fromZSchema(schema) + jsonSchema + }.headOption + } + + private def doc(endpoint: Endpoint[_, _, _, _, _]) = + if (endpoint.doc == Doc.empty) None else Some(endpoint.doc.toPlaintext(color = false)) + + def variables(inAtoms: AtomizedMetaCodecs): Seq[HttpVariable] = + pathVariables(inAtoms) ++ queryVariables(inAtoms) ++ headersVariables(inAtoms) ++ bodyVariables(inAtoms) + + def bodyVariables(inAtoms: AtomizedMetaCodecs): Seq[HttpVariable] = { + val bodySchema0 = bodySchema(inAtoms) + + def loop(schema: JsonSchema, name: Option[String]): Seq[HttpVariable] = schema match { + case JsonSchema.AnnotatedSchema(schema, _) => loop(schema, name) + case JsonSchema.RefSchema(_) => throw new Exception("RefSchema not supported") + case JsonSchema.OneOfSchema(_) => throw new Exception("OneOfSchema not supported") + case JsonSchema.AllOfSchema(_) => throw new Exception("AllOfSchema not supported") + case JsonSchema.AnyOfSchema(_) => throw new Exception("AnyOfSchema not supported") + case JsonSchema.Number(format) => + val typeHint = format match { + case JsonSchema.NumberFormat.Float => "type: Float" + case JsonSchema.NumberFormat.Double => "type: Double" + } + Seq(HttpVariable(getName(name), None, Some(typeHint))) + case JsonSchema.Integer(format) => + val typeHint = format match { + case JsonSchema.IntegerFormat.Int32 => "type: Int" + case JsonSchema.IntegerFormat.Int64 => "type: Long" + case JsonSchema.IntegerFormat.Timestamp => "type: Timestamp in milliseconds" + } + Seq(HttpVariable(getName(name), None, Some(typeHint))) + case JsonSchema.String(format, pattern) => + val formatHint: String = format match { + case Some(value) => s" format: ${value.value}" + case None => "" + } + val patternHint: String = pattern match { + case Some(value) => s" pattern: ${value.value}" + case None => "" + } + Seq(HttpVariable(getName(name), None, Some(s"type: String$formatHint$patternHint"))) + case JsonSchema.Boolean => Seq(HttpVariable(getName(name), None, Some("type: Boolean"))) + case JsonSchema.ArrayType(items) => + val typeHint = + items match { + case Some(schema) => + loop(schema, Some("notUsed")).map(_.render).mkString(";") + case None => + "" + } + + Seq(HttpVariable(getName(name), None, Some(s"type: array of $typeHint"))) + case JsonSchema.Object(properties, _, _) => + properties.flatMap { case (key, value) => loop(value, Some(key)) }.toSeq + case JsonSchema.Enum(values) => Seq(HttpVariable(getName(name), None, Some(s"enum: ${values.mkString(",")}"))) + case JsonSchema.Null => Seq.empty + case JsonSchema.AnyJson => Seq.empty + } + + bodySchema0 match { + case Some(schema) => loop(schema, None) + case None => Seq.empty + } + } + + private def getName(name: Option[String]) = { name.getOrElse(throw new IllegalArgumentException("name is required")) } + + def headersVariables(inAtoms: AtomizedMetaCodecs): Seq[HttpVariable] = + inAtoms.header.collect { case mc @ MetaCodec(HttpCodec.Header(name, codec, _), _) => + HttpVariable( + name.capitalize, + mc.examples.values.headOption.map(e => codec.asInstanceOf[TextCodec[Any]].encode(e)), + ) + } + + def queryVariables(inAtoms: AtomizedMetaCodecs): Seq[HttpVariable] = { + inAtoms.query.collect { case mc @ MetaCodec(HttpCodec.Query(name, _, _, _), _) => + HttpVariable( + name, + mc.examples.values.headOption.map(_.toString), + ) +// OpenAPI.ReferenceOr.Or( +// OpenAPI.Parameter.queryParameter( +// name = name, +// description = mc.docsOpt, +// schema = Some(OpenAPI.ReferenceOr.Or(JsonSchema.fromTextCodec(codec))), +// deprecated = mc.deprecated, +// style = OpenAPI.Parameter.Style.Form, +// explode = false, +// allowReserved = false, +// examples = mc.examples.map { case (name, value) => +// name -> OpenAPI.ReferenceOr.Or(OpenAPI.Example(value = Json.Str(value.toString))) +// }, +// required = mc.required, +// ), +// ) + } + } + + private def pathVariables(inAtoms: AtomizedMetaCodecs) = { + inAtoms.path.collect { + case mc @ MetaCodec(codec, _) if codec != SegmentCodec.Empty && !codec.isInstanceOf[SegmentCodec.Literal] => + HttpVariable( + mc.name.getOrElse(throw new Exception("Path parameter must have a name")), + mc.examples.values.headOption.map(_.toString), + ) + // OpenAPI.ReferenceOr.Or( + // OpenAPI.Parameter.pathParameter( + // name = mc.name.getOrElse(throw new Exception("Path parameter must have a name")), + // description = mc.docsOpt.flatMap(_.flattened.filterNot(_ == pathDoc).reduceOption(_ + _)), + // definition = Some(OpenAPI.ReferenceOr.Or(JsonSchema.fromSegmentCodec(codec))), + // deprecated = mc.deprecated, + // style = OpenAPI.Parameter.Style.Simple, + // examples = mc.examples.map { case (name, value) => + // name -> OpenAPI.ReferenceOr.Or(OpenAPI.Example(segmentToJson(codec, value))) + // }, + // ), + // ) + } + } + + def buildPath(in: HttpCodec[_, _]): String = { + + def pathCodec(in1: HttpCodec[_, _]): Option[HttpCodec.Path[_]] = in1 match { + case atom: HttpCodec.Atom[_, _] => + atom match { + case codec @ HttpCodec.Path(_, _) => Some(codec) + case _ => None + } + case HttpCodec.Annotated(in, _) => pathCodec(in) + case HttpCodec.TransformOrFail(api, _, _) => pathCodec(api) + case HttpCodec.Empty => None + case HttpCodec.Halt => None + case HttpCodec.Combine(left, right, _) => pathCodec(left).orElse(pathCodec(right)) + case HttpCodec.Fallback(left, right, _, _) => pathCodec(left).orElse(pathCodec(right)) + } + + val atomizedInput = AtomizedMetaCodecs.flatten(in) + val queryNames = queryVariables(atomizedInput).map(_.name) + + val pathString = { + val codec = pathCodec(in).getOrElse(throw new Exception("No path found.")).pathCodec + if (codec.render("{{", "}}").endsWith(SegmentCodec.Trailing.render)) + codec.renderIgnoreTrailing("{{", "}}") + s"{{$PathWildcard}}" + else codec.render("{{", "}}") + } + + if (queryNames.nonEmpty) pathString + "?" + queryNames.map(name => s"$name={{$name}}").mkString("&") + else pathString + } + +} diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala index ab0c5784e9..30002be260 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala @@ -213,7 +213,8 @@ object OpenAPIGen { ) case path: HttpCodec.Path[_] => metaCodecFromPathCodec(path.pathCodec, annotations) case atom: HttpCodec.Atom[_, A] => Chunk(MetaCodec(atom, annotations)) - case map: HttpCodec.TransformOrFail[_, _, _] => flattenedAtoms(map.api, annotations) + case map: HttpCodec.TransformOrFail[_, _, _] => + flattenedAtoms(map.api, annotations.map(_.transformOrFail(map.g.asInstanceOf[Any => Either[String, Any]]))) case HttpCodec.Empty => Chunk.empty case HttpCodec.Halt => Chunk.empty case _: HttpCodec.Fallback[_, _, _] => in.alternatives.map(_._1).flatMap(flattenedAtoms(_, annotations)) @@ -222,6 +223,12 @@ object OpenAPIGen { } } + def method(in: Chunk[MetaCodec[SimpleCodec[Method, _]]]): Method = { + if (in.size > 1) throw new Exception("Multiple methods not supported") + in.collectFirst { case MetaCodec(SimpleCodec.Specified(method: Method), _) => method } + .getOrElse(throw new Exception("No method specified")) + } + def metaCodecFromPathCodec( codec: PathCodec[_], annotations: Chunk[HttpCodec.Metadata[_]], @@ -535,12 +542,6 @@ object OpenAPIGen { OpenAPI.Path.fromString(pathString).getOrElse(throw new Exception(s"Invalid path: $pathString")) } - def method(in: Chunk[MetaCodec[SimpleCodec[Method, _]]]): Method = { - if (in.size > 1) throw new Exception("Multiple methods not supported") - in.collectFirst { case MetaCodec(SimpleCodec.Specified(method: Method), _) => method } - .getOrElse(throw new Exception("No method specified")) - } - def operation(endpoint: Endpoint[_, _, _, _, _]): OpenAPI.Operation = { val maybeDoc = Some(endpoint.doc + pathDoc).filter(!_.isEmpty) OpenAPI.Operation( diff --git a/zio-http/shared/src/test/scala/zio/http/endpoint/http/HttpGenSpec.scala b/zio-http/shared/src/test/scala/zio/http/endpoint/http/HttpGenSpec.scala new file mode 100644 index 0000000000..71307a484b --- /dev/null +++ b/zio-http/shared/src/test/scala/zio/http/endpoint/http/HttpGenSpec.scala @@ -0,0 +1,191 @@ +package zio.http.endpoint.http + +import zio.test._ + +import zio.schema._ + +import zio.http._ +import zio.http.codec._ +import zio.http.endpoint._ + +object HttpGenSpec extends ZIOSpecDefault { + case class User(name: String, age: Int) + + object User { + implicit val schema: Schema[User] = DeriveSchema.gen[User] + } + + val spec = suite("HttpGenSpec")( + test("Method and Path") { + val endpoint = Endpoint(Method.GET / "api" / "foo") + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + assertTrue(rendered == "GET /api/foo") + }, + test("POST for Method.ANY") { + val endpoint = Endpoint(Method.ANY / "api" / "foo") + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + assertTrue(rendered == "POST /api/foo") + }, + test("Path with path parameters") { + val endpoint = Endpoint(Method.GET / "api" / "foo" / int("userId")) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@userId= + | + |GET /api/foo/{{userId}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Path with query parameters") { + val endpoint = Endpoint(Method.GET / "api" / "foo").query[Int](QueryCodec.queryInt("userId")) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@userId= + | + |GET /api/foo?userId={{userId}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Path with path and query parameters") { + val endpoint = Endpoint(Method.GET / "api" / "foo" / int("pageId")).query[Int](QueryCodec.queryInt("userId")) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@pageId= + |@userId= + | + |GET /api/foo/{{pageId}}?userId={{userId}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Path with path and query parameter with the same name") { + val endpoint = Endpoint(Method.GET / "api" / "foo" / int("userId")).query[Int](QueryCodec.queryInt("userId")) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@userId= + | + |GET /api/foo/{{userId}}?userId={{userId}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Header") { + val endpoint = Endpoint(Method.GET / "api" / "foo").header(HeaderCodec.authorization) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@Authorization= + | + |GET /api/foo + |Authorization: {{Authorization}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Header with example") { + val endpoint = Endpoint(Method.GET / "api" / "foo") + .header(HeaderCodec.authorization.examples("default" -> Header.Authorization.Basic("admin", "admin"))) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@Authorization=Basic YWRtaW46YWRtaW4= + | + |GET /api/foo + |Authorization: {{Authorization}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Other header with example") { + val endpoint = Endpoint(Method.GET / "api" / "foo") + .header(HeaderCodec.contentType.examples("default" -> Header.ContentType(MediaType.application.json))) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@Content-type=application/json + | + |GET /api/foo + |Content-type: {{Content-type}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Header with path parameters") { + val endpoint = Endpoint(Method.GET / "api" / "foo" / int("userId")).header(HeaderCodec.authorization) + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@userId= + |@Authorization= + | + |GET /api/foo/{{userId}} + |Authorization: {{Authorization}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Endpoint with doc") { + val endpoint = Endpoint(Method.GET / "api" / "foo" / int("userId")) ?? Doc.p("Get user by id") + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |# Get user by id + | + |@userId= + | + |GET /api/foo/{{userId}}""".stripMargin + assertTrue(rendered == expected) + }, + test("Endpoint with json payload") { + val endpoint = Endpoint(Method.POST / "api" / "foo" / int("userId")).in[User] + val httpEndpoint = HttpGen.fromEndpoint(endpoint) + val rendered = httpEndpoint.render + val expected = + """ + |@userId= + |# type: String + |@name= + |# type: Int + |@age= + | + |POST /api/foo/{{userId}} + |Content-type: application/json + | + |{ + |"name": {{name}}, + |"age": {{age}} + |}""".stripMargin + assertTrue(rendered == expected) + }, + test("Multiple endpoints") { + val endpoint1 = Endpoint(Method.GET / "api" / "foo" / int("userId")) ?? Doc.p("Get user by id") + val endpoint2 = Endpoint(Method.POST / "api" / "foo" / int("userId")).in[User] + val httpEndpoint1 = HttpGen.fromEndpoints(endpoint1, endpoint2) + val rendered = httpEndpoint1.render + val expected1 = + """ + |# Get user by id + | + |@userId= + | + |GET /api/foo/{{userId}}""".stripMargin + val expected2 = + """ + |@userId= + |# type: String + |@name= + |# type: Int + |@age= + | + |POST /api/foo/{{userId}} + |Content-type: application/json + | + |{ + |"name": {{name}}, + |"age": {{age}} + |}""".stripMargin + assertTrue(rendered == expected1 + "\n\n" + expected2) + }, + ) +} From 006b171bbd85d74a587fa1789bcb59e2df3ced9c Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Mon, 24 Jun 2024 00:42:30 +0200 Subject: [PATCH 42/58] Accept `octet-stream` as media type for multipart text fields (#2746) (#2926) --- .../src/main/scala/zio/http/endpoint/cli/CliEndpoint.scala | 2 +- .../src/test/scala/zio/http/endpoint/cli/EndpointGen.scala | 2 +- .../src/main/scala/zio/http/codec/HttpContentCodec.scala | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/zio-http-cli/src/main/scala/zio/http/endpoint/cli/CliEndpoint.scala b/zio-http-cli/src/main/scala/zio/http/endpoint/cli/CliEndpoint.scala index 4480248472..0067004bb9 100644 --- a/zio-http-cli/src/main/scala/zio/http/endpoint/cli/CliEndpoint.scala +++ b/zio-http-cli/src/main/scala/zio/http/endpoint/cli/CliEndpoint.scala @@ -57,7 +57,7 @@ private[cli] final case class CliEndpoint( lazy val getOptions: List[HttpOptions] = url ++ headers ++ body - def describeOptions(description: Doc) = + def describeOptions(description: Doc): CliEndpoint = self.copy( body = self.body.map(_ ?? description), headers = self.headers.map(_ ?? description), diff --git a/zio-http-cli/src/test/scala/zio/http/endpoint/cli/EndpointGen.scala b/zio-http-cli/src/test/scala/zio/http/endpoint/cli/EndpointGen.scala index 53e532ef58..9c5bb97b2c 100644 --- a/zio-http-cli/src/test/scala/zio/http/endpoint/cli/EndpointGen.scala +++ b/zio-http-cli/src/test/scala/zio/http/endpoint/cli/EndpointGen.scala @@ -119,7 +119,7 @@ object EndpointGen { ) def withDoc[A] = Mapper[CliReprOf[Codec[A]], Doc]( - (repr, doc) => CliRepr(repr.value ?? doc, repr.repr.copy(body = repr.repr.body.map(_ ?? doc))), + (repr, doc) => CliRepr(repr.value ?? doc, repr.repr.describeOptions(doc)), anyDoc, ) diff --git a/zio-http/shared/src/main/scala/zio/http/codec/HttpContentCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/HttpContentCodec.scala index f654b493cc..88eeac74cf 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/HttpContentCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/HttpContentCodec.scala @@ -284,7 +284,9 @@ object HttpContentCodec { def only[A](implicit schema: Schema[A]): HttpContentCodec[A] = { HttpContentCodec( ListMap( - MediaType.text.`plain` -> + MediaType.text.`plain` -> + BinaryCodecWithSchema(zio.http.codec.internal.TextBinaryCodec.fromSchema[A](schema), schema), + MediaType.application.`octet-stream` -> BinaryCodecWithSchema(zio.http.codec.internal.TextBinaryCodec.fromSchema[A](schema), schema), ), ) From e9f1c02b516d6469d79d49569c7d32c4d565f450 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Mon, 24 Jun 2024 00:43:17 +0200 Subject: [PATCH 43/58] Ignore non-content codecs when building multipart OpenAPI spec (#2745) (#2927) --- .../http/endpoint/openapi/OpenAPIGenSpec.scala | 12 ++++++++++++ .../zio/http/endpoint/openapi/OpenAPIGen.scala | 17 +++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala index fcc06023b6..1ce4ed605a 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala @@ -2442,6 +2442,18 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "components" : {} |}""".stripMargin)) }, + test("Non content codecs are ignored when building multipart schema") { + // We only test there is no exception when building the schema + val endpoint = + Endpoint(RoutePattern.POST / "post") + .in[Int]("foo") + .in[Boolean]("bar") + .query(QueryCodec.query("q")) + .out[Unit] + + SwaggerUI.routes("docs/openapi", OpenAPIGen.fromEndpoints(endpoint)) + assertCompletes + }, ) } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala index 30002be260..3915605cfc 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala @@ -349,6 +349,20 @@ object OpenAPIGen { .nullable(optional(metadata)) .description(description(metadata)) .annotate(annotations) + case (JsonSchema.Object(p, _, r), JsonSchema.Null) => + JsonSchema + .Object(p, Left(false), r) + .deprecated(deprecated(metadata)) + .nullable(optional(metadata)) + .description(description(metadata)) + .annotate(annotations) + case (JsonSchema.Null, JsonSchema.Object(p, _, r)) => + JsonSchema + .Object(p, Left(false), r) + .deprecated(deprecated(metadata)) + .nullable(optional(metadata)) + .description(description(metadata)) + .annotate(annotations) case _ => throw new IllegalArgumentException("Multipart content without name.") } @@ -801,8 +815,7 @@ object OpenAPIGen { ( statusOrDefault, ( - AtomizedMetaCodecs - .flatten(codec), + AtomizedMetaCodecs.flatten(codec), contentAsJsonSchema(codec, referenceType = referenceType) _, ), ) From 4d5c282645159c1027e703432f48334234e9ba88 Mon Sep 17 00:00:00 2001 From: John Sullivan Date: Sun, 23 Jun 2024 17:59:10 -0500 Subject: [PATCH 44/58] some cleanup on recent work serving files and resources (#2928) * some cleanup on recent work serving files and resources 1. Change the default path from "." to "public". 2. Add a restriction that the path does not have "." as a prefix. as discussed in a prior PR, here: https://github.com/zio/zio-http/pull/2887#issuecomment-2159074279 * incorporate @erikvanoosten's suggestions - replace `Handler.forbidden` with `require` - firming up logic for resource prefix limitations - some Scaladoc improvements I also fixed a `resourcePrefix` default value from `"."` to `"public"` that I somehow missed before. --- .../scala/zio/http/StaticFileRoutesSpec.scala | 17 +++++++--- .../src/main/scala/zio/http/Middleware.scala | 34 ++++++++++++------- .../src/main/scala/zio/http/Routes.scala | 23 ++++++++----- 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala b/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala index c0ae4010e1..16da294208 100644 --- a/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/StaticFileRoutesSpec.scala @@ -66,17 +66,17 @@ object StaticFileRoutesSpec extends HttpRunnableSpec { ), suite("serveResources")( test("serve an existing resource") { - val existing = "TestFile.txt" + val existing = "TestFile1.txt" val path = Path.root / "assets" - val routes = Routes.serveResources(path, ".").sandbox.deploy + val routes = Routes.serveResources(path, "TestStatic").sandbox.deploy val request = Request.get(URL(path / existing)) for { response <- routes(request) body <- response.body.asString } yield { assert(response.status)(equalTo(Status.Ok)) && - assert(response.header(Header.ContentLength))(isSome(equalTo(Header.ContentLength(7L)))) && - assert(body)(equalTo("foo\nbar")) && + assert(response.header(Header.ContentLength))(isSome(equalTo(Header.ContentLength(50L)))) && + assert(body)(equalTo("This file is added for testing Static File Server.")) && assert(response.header(Header.ContentType))( isSome(equalTo(Header.ContentType(MediaType.text.plain, charset = Some(Charsets.Utf8)))), ) @@ -85,10 +85,17 @@ object StaticFileRoutesSpec extends HttpRunnableSpec { test("serve a non-existing resource") { val nonExisting = "Nothing.txt" val path = Path.root / "assets" - val routes = Routes.serveResources(path, ".").sandbox.deploy + val routes = Routes.serveResources(path, "TestStatic").sandbox.deploy val request = Request.get(URL(path / nonExisting)) assertZIO(routes(request).map(_.status))(equalTo(Status.NotFound)) }, + test("insecurely serve a resource from \".\"") { + val existing = "TestFile.txt" + val path = Path.root / "assets" + val routes = Routes.serveResources(path, ".") + val request = Request.get(URL(path / existing)) + assertZIO(routes(request).map(_.status))(equalTo(Status.InternalServerError)) + }, ), ) @@ TestAspect.blocking } diff --git a/zio-http/shared/src/main/scala/zio/http/Middleware.scala b/zio-http/shared/src/main/scala/zio/http/Middleware.scala index 62a4f8869b..92073e82a7 100644 --- a/zio-http/shared/src/main/scala/zio/http/Middleware.scala +++ b/zio-http/shared/src/main/scala/zio/http/Middleware.scala @@ -337,7 +337,13 @@ object Middleware extends HandlerAspects { } def fromResource(resourcePrefix: String)(implicit trace: Trace): StaticServe[Any, Throwable] = make { (path, _) => - Handler.fromResource(s"${resourcePrefix}/${path.dropLeadingSlash.encode}") + // validate that resourcePrefix starts with an optional slash, followed by at least 1 java identifier character + val rp = if (resourcePrefix.startsWith("/")) resourcePrefix else "/" + resourcePrefix + if (rp.length < 2 || !Character.isJavaIdentifierStart(rp.charAt(1))) { + Handler.die(new IllegalArgumentException("resourcePrefix must have at least 1 valid character")) + } else { + Handler.fromResource(s"${resourcePrefix}/${path.dropLeadingSlash.encode}") + } } } @@ -391,23 +397,27 @@ object Middleware extends HandlerAspects { toMiddleware(path, StaticServe.fromDirectory(docRoot)) /** - * Creates a middleware for serving static files from resources at the path - * `path`. + * Creates a middleware for serving static files at URL path `path` from + * resources with the given `resourcePrefix`. * - * Example: `val serveResources = Middleware.serveResources(Path.empty / - * "assets")` + * Example: `Middleware.serveResources(Path.empty / "assets", "webapp")` * * With this middleware in place, a request to * `https://www.domain.com/assets/folder/file1.jpg` would serve the file - * `src/main/resources/folder/file1.jpg`. + * `src/main/resources/webapp/folder/file1.jpg`. Note how the URL path is + * removed and the resourcePrefix prepended. * - * Provide a `resourcePrefix` if you want to limit the the resource files - * served. For instance, with `Middleware.serveResources(Path.empty / - * "assets", "public")`, a request to - * `https://www.domain.com/assets/folder/file1.jpg` would serve the file - * `src/main/resources/public/folder/file1.jpg`. + * Most build systems support resources in the `src/main/resources` directory. + * In the above example, the file `src/main/resources/webapp/folder/file1.jpg` + * would be served. + * + * * The `resourcePrefix` defaults to `"public"`. To prevent insecure sharing + * of * resource files, `resourcePrefix` must start with a `/` followed by at + * least 1 * + * [[java.lang.Character.isJavaIdentifierStart(x\$1:Char)* valid java identifier character]]. + * The `/` * will be prepended if it is not present. */ - def serveResources(path: Path, resourcePrefix: String = ".")(implicit trace: Trace): Middleware[Any] = + def serveResources(path: Path, resourcePrefix: String = "public")(implicit trace: Trace): Middleware[Any] = toMiddleware(path, StaticServe.fromResource(resourcePrefix)) /** diff --git a/zio-http/shared/src/main/scala/zio/http/Routes.scala b/zio-http/shared/src/main/scala/zio/http/Routes.scala index ebf49865d2..6a3439bb4a 100644 --- a/zio-http/shared/src/main/scala/zio/http/Routes.scala +++ b/zio-http/shared/src/main/scala/zio/http/Routes.scala @@ -311,20 +311,27 @@ object Routes extends RoutesCompanionVersionSpecific { empty @@ Middleware.serveDirectory(path, docRoot) /** - * Creates routes for serving static files from resources at the path `path`. + * Creates routes for serving static files at URL path `path` from resources + * with the given `resourcePrefix`. * - * Example: `Routes.serveResources(Path.empty / "assets")` + * Example: `Routes.serveResources(Path.empty / "assets", "webapp")` * * With this routes in place, a request to * `https://www.domain.com/assets/folder/file1.jpg` would serve the file - * `src/main/resources/folder/file1.jpg`. + * `src/main/resources/webapp/folder/file1.jpg`. Note how the URL path is + * removed and the resourcePrefix prepended. * - * Provide a `resourcePrefix` if you want to limit the the resource files - * served. For instance, with `Routes.serveResources(Path.empty / "assets", - * "public")`, a request to `https://www.domain.com/assets/folder/file1.jpg` - * would serve the file `src/main/resources/public/folder/file1.jpg`. + * Most build systems support resources in the `src/main/resources` directory. + * In the above example, the file `src/main/resources/webapp/folder/file1.jpg` + * would be served. + * + * The `resourcePrefix` defaults to `"public"`. To prevent insecure sharing of + * resource files, `resourcePrefix` must start with a `/` followed by at least + * 1 + * [[java.lang.Character.isJavaIdentifierStart(x\$1:Char)* valid java identifier character]]. + * The `/` will be prepended if it is not present. */ - def serveResources(path: Path, resourcePrefix: String = ".")(implicit trace: Trace): Routes[Any, Nothing] = + def serveResources(path: Path, resourcePrefix: String = "public")(implicit trace: Trace): Routes[Any, Nothing] = empty @@ Middleware.serveResources(path, resourcePrefix) private[http] final case class Tree[-Env](tree: RoutePattern.Tree[RequestHandler[Env, Response]]) { self => From 9e5cd1ea24774fb993373bab3809d7dfc92ebfea Mon Sep 17 00:00:00 2001 From: Mason Lazalier Edmison <36715397+masonedmison@users.noreply.github.com> Date: Sun, 23 Jun 2024 18:00:22 -0500 Subject: [PATCH 45/58] Call Driver#.start only when Server#.install is first called (#2381) (#2872) * Call Driver#.start only when Server#.install is first called (#2381) * remove R type paramter from `port` --- docs/guides/testing-http-apps.md | 2 +- docs/tutorials/testing-http-apps.md | 2 +- .../src/main/scala/zio/http/TestServer.scala | 2 +- .../scala/zio/http/SocketContractSpec.scala | 7 ++-- .../test/scala/zio/http/TestServerSpec.scala | 2 +- .../zio/http/ResponseCompressionSpec.scala | 9 ++-- .../zio/http/internal/DynamicServer.scala | 2 +- .../src/main/scala/zio/http/Server.scala | 41 +++++++++++++++---- 8 files changed, 47 insertions(+), 20 deletions(-) diff --git a/docs/guides/testing-http-apps.md b/docs/guides/testing-http-apps.md index 178420c5eb..f5ff813ea1 100644 --- a/docs/guides/testing-http-apps.md +++ b/docs/guides/testing-http-apps.md @@ -105,7 +105,7 @@ object TestServerExampleSpec extends ZIOSpecDefault { test("test hello and fallback routes") { for { client <- ZIO.service[Client] - port <- ZIO.serviceWith[Server](_.port) + port <- ZIO.serviceWithZIO[Server](_.port) testRequest = Request .get(url = URL.root.port(port)) .addHeaders(Headers(Header.Accept(MediaType.text.`plain`))) diff --git a/docs/tutorials/testing-http-apps.md b/docs/tutorials/testing-http-apps.md index 178420c5eb..f5ff813ea1 100644 --- a/docs/tutorials/testing-http-apps.md +++ b/docs/tutorials/testing-http-apps.md @@ -105,7 +105,7 @@ object TestServerExampleSpec extends ZIOSpecDefault { test("test hello and fallback routes") { for { client <- ZIO.service[Client] - port <- ZIO.serviceWith[Server](_.port) + port <- ZIO.serviceWithZIO[Server](_.port) testRequest = Request .get(url = URL.root.port(port)) .addHeaders(Headers(Header.Accept(MediaType.text.`plain`))) diff --git a/zio-http-testkit/src/main/scala/zio/http/TestServer.scala b/zio-http-testkit/src/main/scala/zio/http/TestServer.scala index 7f86c52fdd..88551d7fda 100644 --- a/zio-http-testkit/src/main/scala/zio/http/TestServer.scala +++ b/zio-http-testkit/src/main/scala/zio/http/TestServer.scala @@ -109,7 +109,7 @@ final case class TestServer(driver: Driver, bindPort: Int) extends Server { ), ) - override def port: Int = bindPort + override def port: UIO[Int] = ZIO.succeed(bindPort) } object TestServer { diff --git a/zio-http-testkit/src/test/scala/zio/http/SocketContractSpec.scala b/zio-http-testkit/src/test/scala/zio/http/SocketContractSpec.scala index 834a826359..f8a50cfcc7 100644 --- a/zio-http-testkit/src/test/scala/zio/http/SocketContractSpec.scala +++ b/zio-http-testkit/src/test/scala/zio/http/SocketContractSpec.scala @@ -128,9 +128,10 @@ object SocketContractSpec extends ZIOHttpSpec { ): ZIO[Server, Nothing, (RuntimeFlags, Promise[Throwable, Unit])] = ZIO.serviceWithZIO[Server](server => for { - p <- Promise.make[Throwable, Unit] - _ <- server.install(serverApp(p).toRoutes) - } yield (server.port, p), + p <- Promise.make[Throwable, Unit] + _ <- server.install(serverApp(p).toRoutes) + port <- server.port + } yield (port, p), ) private def testServerSetup( diff --git a/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala b/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala index 59660c9a77..084d9197e2 100644 --- a/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala +++ b/zio-http-testkit/src/test/scala/zio/http/TestServerSpec.scala @@ -115,7 +115,7 @@ object TestServerSpec extends ZIOHttpSpec { private def requestToCorrectPort = for { - port <- ZIO.serviceWith[Server](_.port) + port <- ZIO.serviceWithZIO[Server](_.port) } yield Request .get(url = URL.root.port(port)) .addHeaders(Headers(Header.Accept(MediaType.text.`plain`))) diff --git a/zio-http/jvm/src/test/scala/zio/http/ResponseCompressionSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ResponseCompressionSpec.scala index c03957ebbe..5223b33c45 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ResponseCompressionSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ResponseCompressionSpec.scala @@ -88,10 +88,11 @@ object ResponseCompressionSpec extends ZIOHttpSpec { server <- ZIO.service[Server] client <- ZIO.service[Client] _ <- server.install(app) + port <- server.port response <- client.request( Request( method = Method.GET, - url = URL(Path.root / "text", kind = URL.Location.Absolute(Scheme.HTTP, "localhost", Some(server.port))), + url = URL(Path.root / "text", kind = URL.Location.Absolute(Scheme.HTTP, "localhost", Some(port))), ) .addHeader(Header.AcceptEncoding(Header.AcceptEncoding.GZip(), Header.AcceptEncoding.Deflate())), ) @@ -110,10 +111,11 @@ object ResponseCompressionSpec extends ZIOHttpSpec { server <- ZIO.service[Server] client <- ZIO.service[Client] _ <- server.install(app) + port <- server.port response <- client.request( Request( method = Method.GET, - url = URL(Path.root / "file", kind = URL.Location.Absolute(Scheme.HTTP, "localhost", Some(server.port))), + url = URL(Path.root / "file", kind = URL.Location.Absolute(Scheme.HTTP, "localhost", Some(port))), ) .addHeader(Header.AcceptEncoding(Header.AcceptEncoding.GZip(), Header.AcceptEncoding.Deflate())), ) @@ -134,10 +136,11 @@ object ResponseCompressionSpec extends ZIOHttpSpec { server <- ZIO.service[Server] client <- ZIO.service[Client] _ <- server.install(app) + port <- server.port response <- client.request( Request( method = Method.GET, - url = URL(Path.root / endpoint, kind = URL.Location.Absolute(Scheme.HTTP, "localhost", Some(server.port))), + url = URL(Path.root / endpoint, kind = URL.Location.Absolute(Scheme.HTTP, "localhost", Some(port))), ) .addHeader(Header.AcceptEncoding(Header.AcceptEncoding.GZip(), Header.AcceptEncoding.Deflate())), ) diff --git a/zio-http/jvm/src/test/scala/zio/http/internal/DynamicServer.scala b/zio-http/jvm/src/test/scala/zio/http/internal/DynamicServer.scala index 0f1d070b9a..62b2005bc6 100644 --- a/zio-http/jvm/src/test/scala/zio/http/internal/DynamicServer.scala +++ b/zio-http/jvm/src/test/scala/zio/http/internal/DynamicServer.scala @@ -95,7 +95,7 @@ object DynamicServer { def get(id: Id): UIO[Option[Routes[Any, Response]]] = ref.get.map(_.get(id)) - def port: ZIO[Any, Nothing, Int] = start.map(_.port) + def port: ZIO[Any, Nothing, Int] = start.flatMap(_.port) def setStart(s: Server): UIO[Boolean] = pr.complete(ZIO.attempt(s).orDie) diff --git a/zio-http/shared/src/main/scala/zio/http/Server.scala b/zio-http/shared/src/main/scala/zio/http/Server.scala index 29cf6ea61a..c1406afbb6 100644 --- a/zio-http/shared/src/main/scala/zio/http/Server.scala +++ b/zio-http/shared/src/main/scala/zio/http/Server.scala @@ -46,7 +46,7 @@ trait Server { * * @return */ - def port: Int + def port: UIO[Int] } object Server extends ServerPlatformSpecific { @@ -396,7 +396,7 @@ object Server extends ServerPlatformSpecific { @deprecated("Install Routes instead. Will be removed in the next release.", "3.0.0-RC7") def install[R](httpApp: HttpApp[R])(implicit trace: Trace, tag: EnvironmentTag[R]): URIO[R with Server, Int] = { - ZIO.serviceWithZIO[Server](_.install[R](httpApp)) *> ZIO.serviceWith[Server](_.port) + ZIO.serviceWithZIO[Server](_.install[R](httpApp)) *> ZIO.serviceWithZIO[Server](_.port) } def serve[R]( @@ -418,7 +418,7 @@ object Server extends ServerPlatformSpecific { def install[R]( httpApp: Routes[R, Response], )(implicit trace: Trace, tag: EnvironmentTag[R]): URIO[R with Server, Int] = { - ZIO.serviceWithZIO[Server](_.install[R](httpApp)) *> ZIO.serviceWith[Server](_.port) + ZIO.serviceWithZIO[Server](_.install[R](httpApp)) *> ZIO.serviceWithZIO[Server](_.port) } private[http] val base: ZLayer[Driver & Config, Throwable, Server] = { @@ -443,9 +443,23 @@ object Server extends ServerPlatformSpecific { ) }.ignoreLogged, ) - result <- driver.start.catchAllCause(cause => inFlightRequests.failCause(cause) *> ZIO.refailCause(cause)) - _ <- inFlightRequests.succeed(result.inFlightRequests) - } yield ServerLive(driver, result.port) + initialInstall <- Promise.make[Nothing, Unit] + serverStarted <- Promise.make[Throwable, Int] + _ <- + ( + initialInstall.await *> + driver.start.flatMap { result => + inFlightRequests.succeed(result.inFlightRequests) &> + serverStarted.succeed(result.port) + } + .catchAll(serverStarted.fail) + ) + // In the case of failure of `Driver#.start` or interruption while we are waiting to be + // installed for the first time, we should should always fail the `serverStarted` + // promise to allow the finalizers to make progress. + .catchAllCause(cause => inFlightRequests.failCause(cause)) + .forkScoped + } yield ServerLive(driver, initialInstall, serverStarted) } } @@ -469,15 +483,24 @@ object Server extends ServerPlatformSpecific { private final case class ServerLive( driver: Driver, - bindPort: Int, + // A promise used to signal the first time `install` + // is called on this `Server` instance. + private val initialInstall: Promise[Nothing, Unit], + // A promise that represents the port of the "started" driver + // or a throwable if starting the driver failed for any reason. + private val serverStarted: Promise[Throwable, Int], ) extends Server { override def install[R](httpApp: Routes[R, Response])(implicit trace: Trace, tag: EnvironmentTag[R], ): URIO[R, Unit] = - ZIO.environment[R].flatMap(env => driver.addApp(httpApp, env.prune[R])) + for { + _ <- initialInstall.succeed(()) + _ <- serverStarted.await.orDie + _ <- ZIO.environment[R].flatMap(env => driver.addApp(httpApp, env.prune[R])) + } yield () - override def port: Int = bindPort + override def port: UIO[Int] = serverStarted.await.orDie } } From a98ed32a125f9aa12c963c4defcf738aa58e029b Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Mon, 24 Jun 2024 19:19:52 +0200 Subject: [PATCH 46/58] Fix error when extracting examples (#2789) (#2922) HttpCodec fallback always eliminates HttpCodec.Halt (#2789) --- .../endpoint/openapi/OpenAPIGenSpec.scala | 66 ++++++++----------- .../main/scala/zio/http/codec/HttpCodec.scala | 1 + 2 files changed, 27 insertions(+), 40 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala index 1ce4ed605a..ef5e7c550a 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala @@ -714,6 +714,7 @@ object OpenAPIGenSpec extends ZIOSpecDefault { .content[NotFoundError] .examples("not found" -> NotFoundError("not found")), ) + .examplesOut("other" -> Right(NotFoundError("other"))) val generated = OpenAPIGen.fromEndpoints("Simple Endpoint", "1.0", endpoint) val json = toJsonAst(generated) @@ -727,24 +728,20 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "paths" : { | "/static" : { | "get" : { - | "requestBody" : - | { + | "requestBody" : { | "content" : { | "application/json" : { - | "schema" : - | { + | "schema" : { | "$ref" : "#/components/schemas/SimpleInputBody" | }, | "examples" : { - | "john" : - | { + | "john" : { | "value" : { | "name" : "John", | "age" : 42 | } | }, - | "jane" : - | { + | "jane" : { | "value" : { | "name" : "Jane", | "age" : 43 @@ -756,12 +753,10 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "required" : true | }, | "responses" : { - | "default" : - | { + | "default" : { | "content" : { | "application/json" : { - | "schema" : - | { + | "schema" : { | "anyOf" : [ | { | "$ref" : "#/components/schemas/SimpleOutputBody" @@ -773,22 +768,24 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "description" : "" | }, | "examples" : { - | "john" : - | { + | "john" : { | "value" : { | "userName" : "John", | "score" : 42 | } | }, - | "jane" : - | { + | "jane" : { | "value" : { | "userName" : "Jane", | "score" : 43 | } | }, - | "not found" : - | { + | "other" : { + | "value" : { + | "message" : "other" + | } + | }, + | "not found" : { | "value" : { | "message" : "not found" | } @@ -803,32 +800,25 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | }, | "components" : { | "schemas" : { - | "NotFoundError" : - | { - | "type" : - | "object", + | "NotFoundError" : { + | "type" : "object", | "properties" : { | "message" : { - | "type" : - | "string" + | "type" : "string" | } | }, | "required" : [ | "message" | ] | }, - | "SimpleInputBody" : - | { - | "type" : - | "object", + | "SimpleInputBody" : { + | "type" : "object", | "properties" : { | "name" : { - | "type" : - | "string" + | "type" : "string" | }, | "age" : { - | "type" : - | "integer", + | "type" : "integer", | "format" : "int32" | } | }, @@ -837,18 +827,14 @@ object OpenAPIGenSpec extends ZIOSpecDefault { | "age" | ] | }, - | "SimpleOutputBody" : - | { - | "type" : - | "object", + | "SimpleOutputBody" : { + | "type" : "object", | "properties" : { | "userName" : { - | "type" : - | "string" + | "type" : "string" | }, | "score" : { - | "type" : - | "integer", + | "type" : "integer", | "format" : "int32" | } | }, diff --git a/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala index f194dbcd15..cd5175e70c 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/HttpCodec.scala @@ -80,6 +80,7 @@ sealed trait HttpCodec[-AtomTypes, Value] { that: HttpCodec[AtomTypes1, Value2], )(implicit alternator: Alternator[Value, Value2]): HttpCodec[AtomTypes1, alternator.Out] = { if (self eq HttpCodec.Halt) that.asInstanceOf[HttpCodec[AtomTypes1, alternator.Out]] + else if (that eq HttpCodec.Halt) self.asInstanceOf[HttpCodec[AtomTypes1, alternator.Out]] else { HttpCodec .Fallback(self, that, alternator, HttpCodec.Fallback.Condition.IsHttpCodecError) From f5c04110a885d6c79b640665748eadb802a010d8 Mon Sep 17 00:00:00 2001 From: Gilad Hoch Date: Wed, 26 Jun 2024 19:22:37 +0300 Subject: [PATCH 47/58] [openapi] fix incomplete handling (fails on Schema.Lazy) for openapi's fromEndpoints (#2935) * add a failing test * fix code to pass failed test --- .../test/scala/zio/http/gen/model/Data.scala | 6 ++++ .../test/scala/zio/http/gen/model/Meta.scala | 29 +++++++++++++++++++ .../http/gen/openapi/EndpointGenSpec.scala | 8 ++++- .../http/endpoint/openapi/JsonSchema.scala | 1 + 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 zio-http-gen/src/test/scala/zio/http/gen/model/Data.scala create mode 100644 zio-http-gen/src/test/scala/zio/http/gen/model/Meta.scala diff --git a/zio-http-gen/src/test/scala/zio/http/gen/model/Data.scala b/zio-http-gen/src/test/scala/zio/http/gen/model/Data.scala new file mode 100644 index 0000000000..e818d19d4d --- /dev/null +++ b/zio-http-gen/src/test/scala/zio/http/gen/model/Data.scala @@ -0,0 +1,6 @@ +package zio.http.gen.model + +case class Data(name: String, meta: Meta) +object Data { + implicit val codec: zio.schema.Schema[Data] = zio.schema.DeriveSchema.gen[Data] +} diff --git a/zio-http-gen/src/test/scala/zio/http/gen/model/Meta.scala b/zio-http-gen/src/test/scala/zio/http/gen/model/Meta.scala new file mode 100644 index 0000000000..5963a25b0c --- /dev/null +++ b/zio-http-gen/src/test/scala/zio/http/gen/model/Meta.scala @@ -0,0 +1,29 @@ +package zio.http.gen.model + +import zio.schema.annotation.{caseName, discriminatorName} +import zio.schema.{DeriveSchema, Schema} + +@discriminatorName("type") +sealed trait Meta +object Meta { + + implicit val codec: Schema[Meta] = DeriveSchema.gen[Meta] + + @caseName("a") + case class MetaA( + t: String, + i: Int, + ) extends Meta + object MetaA { + implicit val codec: Schema[MetaA] = DeriveSchema.gen[MetaA] + } + + @caseName("b") + case class MetaB( + t: String, + i: Int, + ) extends Meta + object MetaB { + implicit val codec: Schema[MetaB] = DeriveSchema.gen[MetaB] + } +} diff --git a/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala b/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala index a30bde7e70..349aebf543 100644 --- a/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala +++ b/zio-http-gen/src/test/scala/zio/http/gen/openapi/EndpointGenSpec.scala @@ -2,6 +2,8 @@ package zio.http.gen.openapi import java.nio.file._ +import scala.util.Try + import zio._ import zio.test._ @@ -9,7 +11,7 @@ import zio.http._ import zio.http.codec.HeaderCodec import zio.http.codec.HttpCodec.{query, queryInt} import zio.http.endpoint._ -import zio.http.endpoint.openapi.JsonSchema.SchemaStyle.Inline +import zio.http.endpoint.openapi.JsonSchema.SchemaStyle.{Compact, Inline} import zio.http.endpoint.openapi.{OpenAPI, OpenAPIGen} import zio.http.gen.model._ import zio.http.gen.scala.Code @@ -1074,6 +1076,10 @@ object EndpointGenSpec extends ZIOSpecDefault { assertTrue(scala.files.head == expected) }, + test("generates case class for response with compact schema") { + val endpoint = Endpoint(Method.POST / "api" / "v1" / "data").out[Chunk[Data]](status = Status.Ok) + assertTrue(OpenAPIGen.fromEndpoints("", "", Compact, endpoint).components.get.schemas.size == 4) + }, test("generates case class with seq field for request") { val endpoint = Endpoint(Method.POST / "api" / "v1" / "users").in[UserNameArray].out[User] val openAPI = OpenAPIGen.fromEndpoints("", "", endpoint) diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala index df2f34d30a..933c52e130 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala @@ -638,6 +638,7 @@ object JsonSchema { schema match { case enumSchema: Schema.Enum[_] => refForTypeId(enumSchema.id, referenceType) case record: Schema.Record[_] => refForTypeId(record.id, referenceType) + case lazySchema: Schema.Lazy[_] => nominal(lazySchema.schema, referenceType) case _ => None } From 7302676b27b6711788797a47de889f4ca66554ed Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Thu, 27 Jun 2024 22:24:01 +1000 Subject: [PATCH 48/58] Use `Exit.succeed` when body extraction is side-effect free (#2938) * Use `Exit.succeed` wherever possible when extracting body bytes * Change back ChunkBody#asArray --- zio-http/shared/src/main/scala/zio/http/Body.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zio-http/shared/src/main/scala/zio/http/Body.scala b/zio-http/shared/src/main/scala/zio/http/Body.scala index 3011b369cc..c3655f7ce0 100644 --- a/zio-http/shared/src/main/scala/zio/http/Body.scala +++ b/zio-http/shared/src/main/scala/zio/http/Body.scala @@ -389,7 +389,7 @@ object Body { override def isEmpty: Boolean = data.isEmpty - override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = ZIO.succeed(data) + override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = Exit.succeed(data) override def asStream(implicit trace: Trace): ZStream[Any, Throwable, Byte] = ZStream.unwrap(asChunk.map(ZStream.fromChunk(_))) @@ -413,13 +413,13 @@ object Body { ) extends Body with UnsafeBytes { self => - override def asArray(implicit trace: Trace): Task[Array[Byte]] = ZIO.succeed(data) + override def asArray(implicit trace: Trace): Task[Array[Byte]] = Exit.succeed(data) override def isComplete: Boolean = true override def isEmpty: Boolean = data.isEmpty - override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = ZIO.succeed(Chunk.fromArray(data)) + override def asChunk(implicit trace: Trace): Task[Chunk[Byte]] = Exit.succeed(Chunk.fromArray(data)) override def asStream(implicit trace: Trace): ZStream[Any, Throwable, Byte] = ZStream.unwrap(asChunk.map(ZStream.fromChunk(_))) @@ -531,8 +531,8 @@ object Body { } - private val zioEmptyArray = ZIO.succeed(Array.empty[Byte])(Trace.empty) + private val zioEmptyArray = Exit.succeed(Array.emptyByteArray) - private val zioEmptyChunk = ZIO.succeed(Chunk.empty[Byte])(Trace.empty) + private val zioEmptyChunk = Exit.succeed(Chunk.empty[Byte]) } From 3a91fc06359623600be7b0203012c0ecafd47920 Mon Sep 17 00:00:00 2001 From: Jisoo Park Date: Thu, 27 Jun 2024 21:24:29 +0900 Subject: [PATCH 49/58] Override URL's toString with encode (#2939) --- zio-http/shared/src/main/scala/zio/http/URL.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zio-http/shared/src/main/scala/zio/http/URL.scala b/zio-http/shared/src/main/scala/zio/http/URL.scala index 0a4a4aecde..bc26378837 100644 --- a/zio-http/shared/src/main/scala/zio/http/URL.scala +++ b/zio-http/shared/src/main/scala/zio/http/URL.scala @@ -93,6 +93,8 @@ final case class URL( hash } + override def toString(): String = encode + def host: Option[String] = kind match { case URL.Location.Relative => None case abs: URL.Location.Absolute => Option(abs.host) From e6a350604cb1cd2e86cb0f6a21ab1f208e9ea4e9 Mon Sep 17 00:00:00 2001 From: eyal farago Date: Thu, 4 Jul 2024 12:12:41 +0300 Subject: [PATCH 50/58] Reorg driver layers (#2936) * reorg_driver_layers: modify Server's layer such that they expose Driver as well * reorg_driver_layers: fix test code * reorg_driver_layers: fix server's layer to handle uninitialized filed exception * reorg_driver_layers: fmt * dummy --- .../zio/http/ServerPlatformSpecific.scala | 21 ++++++++++++++----- .../zio/http/endpoint/RoundtripSpec.scala | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/ServerPlatformSpecific.scala b/zio-http/jvm/src/main/scala/zio/http/ServerPlatformSpecific.scala index b97eaa0c19..922a522b6a 100644 --- a/zio-http/jvm/src/main/scala/zio/http/ServerPlatformSpecific.scala +++ b/zio-http/jvm/src/main/scala/zio/http/ServerPlatformSpecific.scala @@ -10,14 +10,25 @@ trait ServerPlatformSpecific { private[http] val base: ZLayer[Driver & Config, Throwable, Server] - val customized: ZLayer[Config & NettyConfig, Throwable, Server] = { + val customized: ZLayer[Config & NettyConfig, Throwable, Driver with Server] = { implicit val trace: Trace = Trace.empty - NettyDriver.customized >>> base + + val baseExtra: ZLayer[Driver & Config, Throwable, Server with Driver] = + ZLayer.suspend(base) >+> ZLayer.environment[Driver] + val nettyExtra: ZLayer[Config & NettyConfig, Throwable, Driver with Config] = + NettyDriver.customized ++ ZLayer.environment[Config] + val composed: ZLayer[Config & NettyConfig, Throwable, Server with Driver] = nettyExtra >>> baseExtra + // NettyDriver.customized >>> base + composed } - val live: ZLayer[Config, Throwable, Server] = { - implicit val trace: Trace = Trace.empty - NettyDriver.live >+> base + val live: ZLayer[Config, Throwable, Server with Driver] = { + implicit val trace: Trace = Trace.empty + val baseExtra: ZLayer[Driver & Config, Throwable, Server with Driver] = + ZLayer.suspend(base) >+> ZLayer.environment[Driver] + val nettyExtra: ZLayer[Config, Throwable, Driver with Config] = NettyDriver.live ++ ZLayer.environment[Config] + val res: ZLayer[Config, Throwable, Server with Driver] = nettyExtra >>> baseExtra + res } } diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala index 75339f790a..65ba04bceb 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala @@ -44,7 +44,7 @@ object RoundtripSpec extends ZIOHttpSpec { ZLayer.succeed(Server.Config.default.onAnyOpenPort.enableRequestStreaming), Client.customized.map(env => ZEnvironment(env.get @@ ZClientAspect.debug)), ClientDriver.shared, - NettyDriver.customized, + // NettyDriver.customized, ZLayer.succeed(NettyConfig.defaultWithFastShutdown), ZLayer.succeed(ZClient.Config.default), DnsResolver.default, @@ -458,7 +458,7 @@ object RoundtripSpec extends ZIOHttpSpec { ZLayer.succeed(Server.Config.default.onAnyOpenPort.enableRequestStreaming), Client.customized.map(env => ZEnvironment(env.get @@ clientDebugAspect)), ClientDriver.shared, - NettyDriver.customized, + // NettyDriver.customized, ZLayer.succeed(NettyConfig.defaultWithFastShutdown), ZLayer.succeed(ZClient.Config.default), DnsResolver.default, From e692d785bddd62f56d8c23bf773484b2d3a0a02a Mon Sep 17 00:00:00 2001 From: Milad Khajavi Date: Mon, 8 Jul 2024 23:17:11 +0330 Subject: [PATCH 51/58] Use ZIO Assistant to Update Readme (#2949) --- .github/workflows/site.yml | 50 ++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/.github/workflows/site.yml b/.github/workflows/site.yml index 65b15c12c6..027da47ab4 100644 --- a/.github/workflows/site.yml +++ b/.github/workflows/site.yml @@ -57,40 +57,64 @@ jobs: run: sbt docs/publishToNpm env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - generate-readme: - name: Generate README + update-readme: + name: Update README runs-on: ubuntu-latest - if: ${{ (github.event_name == 'push') || ((github.event_name == 'release') && (github.event.action == 'published')) }} + continue-on-error: false + if: ${{ github.event_name == 'push' }} steps: - name: Git Checkout - uses: actions/checkout@v3.3.0 + uses: actions/checkout@v4 with: - ref: ${{ github.head_ref }} fetch-depth: '0' + - name: Install libuv + run: sudo apt-get update && sudo apt-get install -y libuv1-dev - name: Setup Scala - uses: actions/setup-java@v3.9.0 + uses: actions/setup-java@v4 with: - distribution: temurin - java-version: 17 + distribution: corretto + java-version: '17' check-latest: true + - name: Cache Dependencies + uses: coursier/cache-action@v6 - name: Generate Readme - run: sbt docs/generateReadme + run: sbt docs/generateReadme - name: Commit Changes run: | - git config --local user.email "github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" + git config --local user.email "zio-assistant[bot]@users.noreply.github.com" + git config --local user.name "ZIO Assistant" git add README.md git commit -m "Update README.md" || echo "No changes to commit" + - name: Generate Token + id: generate-token + uses: zio/generate-github-app-token@v1.0.0 + with: + app_id: ${{ secrets.APP_ID }} + app_private_key: ${{ secrets.APP_PRIVATE_KEY }} - name: Create Pull Request - uses: peter-evans/create-pull-request@v4.2.3 + id: cpr + uses: peter-evans/create-pull-request@v6 with: body: |- Autogenerated changes after running the `sbt docs/generateReadme` command of the [zio-sbt-website](https://zio.dev/zio-sbt) plugin. - I will automatically update the README.md file whenever there is new change for README.md, e.g. + I will automatically update the README.md file whenever there is a new change for README.md, e.g. - After each release, I will update the version in the installation section. - After any changes to the "docs/index.md" file, I will update the README.md file accordingly. branch: zio-sbt-website/update-readme commit-message: Update README.md + token: ${{ steps.generate-token.outputs.token }} delete-branch: true title: Update README.md + - name: Approve PR + if: ${{ steps.cpr.outputs.pull-request-number }} + run: gh pr review "$PR_URL" --approve + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ steps.cpr.outputs.pull-request-url }} + - name: Enable Auto-Merge + if: ${{ steps.cpr.outputs.pull-request-number }} + run: gh pr merge --auto --squash "$PR_URL" || gh pr merge --squash "$PR_URL" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ steps.cpr.outputs.pull-request-url }} From ebc5e717e8bdd324e9ce43b366939ca5db0e8ced Mon Sep 17 00:00:00 2001 From: "zio-assistant[bot]" <130037499+zio-assistant[bot]@users.noreply.github.com> Date: Sun, 14 Jul 2024 09:59:13 +0200 Subject: [PATCH 52/58] Update README.md (#2950) Co-authored-by: ZIO Assistant --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d5fc16498..27e69d5183 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Some of the key features of ZIO HTTP are: Setup via `build.sbt`: ```scala -libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC7" +libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC9" ``` **NOTES ON VERSIONING:** From a9db5520ec19e2ae82674d957933cf7851f64d44 Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Mon, 15 Jul 2024 08:48:01 +0300 Subject: [PATCH 53/58] Fix application shutdown issue when `Server#install` is not called (#2966) --- .../test/scala/zio/http/ServerStartSpec.scala | 9 +++++++++ .../src/main/scala/zio/http/Server.scala | 20 +++++++++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/ServerStartSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ServerStartSpec.scala index d2806b0d12..000266f5a0 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ServerStartSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ServerStartSpec.scala @@ -51,6 +51,15 @@ object ServerStartSpec extends HttpRunnableSpec { ZLayer.succeed(NettyConfig.defaultWithFastShutdown), ) }, + test("application can shutdown if server is not started") { + ZIO + .succeed(assertCompletes) + .provide( + Server.customized.unit, + ZLayer.succeed(Server.Config.default.port(8089)), + ZLayer.succeed(NettyConfig.defaultWithFastShutdown), + ) + }, ) override def spec: Spec[TestEnvironment with Scope, Any] = serverStartSpec @@ withLiveClock diff --git a/zio-http/shared/src/main/scala/zio/http/Server.scala b/zio-http/shared/src/main/scala/zio/http/Server.scala index c1406afbb6..2d5912552a 100644 --- a/zio-http/shared/src/main/scala/zio/http/Server.scala +++ b/zio-http/shared/src/main/scala/zio/http/Server.scala @@ -446,18 +446,16 @@ object Server extends ServerPlatformSpecific { initialInstall <- Promise.make[Nothing, Unit] serverStarted <- Promise.make[Throwable, Int] _ <- - ( - initialInstall.await *> - driver.start.flatMap { result => - inFlightRequests.succeed(result.inFlightRequests) &> - serverStarted.succeed(result.port) - } - .catchAll(serverStarted.fail) - ) + (for { + _ <- initialInstall.await.interruptible + result <- driver.start + _ <- inFlightRequests.succeed(result.inFlightRequests) + _ <- serverStarted.succeed(result.port) + } yield ()) // In the case of failure of `Driver#.start` or interruption while we are waiting to be - // installed for the first time, we should should always fail the `serverStarted` - // promise to allow the finalizers to make progress. - .catchAllCause(cause => inFlightRequests.failCause(cause)) + // installed for the first time, we should always fail the `serverStarted` and 'inFlightRequests' + // promises to allow the finalizers to make progress. + .onError(c => inFlightRequests.refailCause(c) *> serverStarted.refailCause(c)) .forkScoped } yield ServerLive(driver, initialInstall, serverStarted) } From 25bd6ff724b3ce99c427fdb342e7797c9b7e1385 Mon Sep 17 00:00:00 2001 From: eyal farago Date: Mon, 15 Jul 2024 08:49:19 +0300 Subject: [PATCH 54/58] Streaming response body content type (#2967) --- .../scala/zio/http/netty/NettyResponse.scala | 7 +- .../zio/http/netty/NettyStreamBodySpec.scala | 80 ++++++++++++++++++- 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala b/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala index 04455169a0..9e68e07a1b 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/NettyResponse.scala @@ -55,6 +55,7 @@ object NettyResponse { onComplete.unsafe.done(Exit.succeed(ChannelState.forStatus(status))) Response(status, headers, Body.empty) } else { + val contentType = headers.get(Header.ContentType) val responseHandler = new ClientResponseStreamHandler(onComplete, keepAlive, status) ctx .pipeline() @@ -64,7 +65,11 @@ object NettyResponse { responseHandler, ): Unit - val data = NettyBody.fromAsync(callback => responseHandler.connect(callback), knownContentLength) + val data = NettyBody.fromAsync( + callback => responseHandler.connect(callback), + knownContentLength, + contentType.map(_.renderedValue), + ) Response(status, headers, data) } } diff --git a/zio-http/jvm/src/test/scala/zio/http/netty/NettyStreamBodySpec.scala b/zio-http/jvm/src/test/scala/zio/http/netty/NettyStreamBodySpec.scala index ad4acef187..5b0e097866 100644 --- a/zio-http/jvm/src/test/scala/zio/http/netty/NettyStreamBodySpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/netty/NettyStreamBodySpec.scala @@ -4,12 +4,14 @@ import zio._ import zio.test.TestAspect.withLiveClock import zio.test.{Spec, TestEnvironment, assertTrue} -import zio.stream.{ZStream, ZStreamAspect} +import zio.stream.{ZPipeline, ZStream, ZStreamAspect} import zio.http.ZClient.Config import zio.http._ import zio.http.internal.HttpRunnableSpec +import zio.http.multipart.mixed.MultipartMixed import zio.http.netty.NettyConfig.LeakDetectionLevel +import zio.http.netty.NettyStreamBodySpec.app object NettyStreamBodySpec extends HttpRunnableSpec { @@ -101,6 +103,82 @@ object NettyStreamBodySpec extends HttpRunnableSpec { ) } }, + test("properly decodes body's boundary") { + def trackablePart(content: String): ZIO[Any, Nothing, (MultipartMixed.Part, Promise[Nothing, Boolean])] = { + zio.Promise.make[Nothing, Boolean].map { p => + MultipartMixed.Part( + Headers(Header.ContentType(MediaType.text.`plain`)), + ZStream(content) + .via(ZPipeline.utf8Encode) + .ensuring(p.succeed(true)), + ) -> + p + } + } + def trackableMultipartMixed( + b: Boundary, + )(partsContents: String*): ZIO[Any, Nothing, (MultipartMixed, Seq[Promise[Nothing, Boolean]])] = { + ZIO + .foreach(partsContents)(trackablePart) + .map { tps => + val (parts, promisises) = tps.unzip + val mpm = MultipartMixed.fromParts(ZStream.fromIterable(parts), b, 1) + (mpm, promisises) + } + } + + def serve(resp: Response): ZIO[Any, Throwable, RuntimeFlags] = { + val app = Routes(Method.GET / "it" -> handler(resp)) + for { + portPromise <- Promise.make[Throwable, Int] + _ <- Server + .install(app) + .intoPromise(portPromise) + .zipRight(ZIO.never) + .provide( + ZLayer.succeed(NettyConfig.defaultWithFastShutdown.leakDetection(LeakDetectionLevel.PARANOID)), + ZLayer.succeed(Server.Config.default.onAnyOpenPort), + Server.customized, + ) + .fork + port <- portPromise.await + } yield port + } + + for { + mpmAndPromises <- trackableMultipartMixed(Boundary("this_is_a_boundary"))( + "this is the boring part 1", + "and this is the boring part two", + ) + (mpm, promises) = mpmAndPromises + resp = Response(body = + Body.fromStreamChunked(mpm.source).contentType(MediaType.multipart.`mixed`, mpm.boundary), + ) + .addHeader(Header.ContentType(MediaType.multipart.`mixed`, Some(mpm.boundary))) + port <- serve(resp) + client <- ZIO.service[Client] + req = Request.get(s"http://localhost:$port/it") + actualResp <- client(req) + actualMpm <- actualResp.body.asMultipartMixed + partsResults <- actualMpm.parts.zipWithIndex.mapZIO { case (part, idx) => + val pr = promises(idx.toInt) + // todo: due to server side buffering can't really expect the promises to be uncompleted BEFORE pulling on the client side + part.toBody.asString <*> + pr.isDone + }.runCollect + } yield { + zio.test.assertTrue { + actualResp.headers(Header.ContentType) == resp.headers(Header.ContentType) && + actualResp.body.boundary == Some(mpm.boundary) && + actualMpm.boundary == mpm.boundary && + partsResults == Chunk( + // todo: due to server side buffering can't really expect the promises to be uncompleted BEFORE pulling on the client side + ("this is the boring part 1", true), + ("and this is the boring part two", true), + ) + } + } + }, ).provide( singleConnectionClient, Scope.default, From df1523e4233994b4301580a366d29e18cf8c6d80 Mon Sep 17 00:00:00 2001 From: Nabil Abdel-Hafeez <7283535+987Nabil@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:47:00 +0300 Subject: [PATCH 55/58] Multi-value segments for PathCodecs (#2959) * First pass on segment codecs * Allocation free path checking (#2679) * Improve API to generate combined segments and enforce structure (#2679) --------- Co-authored-by: Kyri Petrou --- .../zio/http/endpoint/cli/HttpOptions.scala | 17 +- .../zio/http/endpoint/cli/CommandGen.scala | 18 +- .../scala/zio/http/codec/PathCodecSpec.scala | 69 +++ .../main/scala/zio/http/codec/PathCodec.scala | 242 ++++++++-- .../scala/zio/http/codec/SegmentCodec.scala | 436 +++++++++++++++--- .../http/endpoint/openapi/JsonSchema.scala | 17 +- .../http/endpoint/openapi/OpenAPIGen.scala | 17 +- .../src/main/scala/zio/http/package.scala | 14 +- .../zio/http/codec/SegmentCodecSpec.scala | 95 ++++ 9 files changed, 799 insertions(+), 126 deletions(-) create mode 100644 zio-http/shared/src/test/scala/zio/http/codec/SegmentCodecSpec.scala diff --git a/zio-http-cli/src/main/scala/zio/http/endpoint/cli/HttpOptions.scala b/zio-http-cli/src/main/scala/zio/http/endpoint/cli/HttpOptions.scala index 15d94f2642..3be96b5156 100644 --- a/zio-http-cli/src/main/scala/zio/http/endpoint/cli/HttpOptions.scala +++ b/zio-http-cli/src/main/scala/zio/http/endpoint/cli/HttpOptions.scala @@ -312,7 +312,7 @@ private[cli] object HttpOptions { private[cli] def optionsFromSegment(segment: SegmentCodec[_]): Options[String] = { def fromSegment[A](segment: SegmentCodec[A]): Options[String] = segment match { - case SegmentCodec.UUID(name) => + case SegmentCodec.UUID(name) => Options .text(name) .mapOrFail(str => @@ -324,13 +324,14 @@ private[cli] object HttpOptions { }, ) .map(_.toString) - case SegmentCodec.Text(name) => Options.text(name) - case SegmentCodec.IntSeg(name) => Options.integer(name).map(_.toInt).map(_.toString) - case SegmentCodec.LongSeg(name) => Options.integer(name).map(_.toInt).map(_.toString) - case SegmentCodec.BoolSeg(name) => Options.boolean(name).map(_.toString) - case SegmentCodec.Literal(value) => Options.Empty.map(_ => value) - case SegmentCodec.Trailing => Options.none.map(_.toString) - case SegmentCodec.Empty => Options.none.map(_.toString) + case SegmentCodec.Text(name) => Options.text(name) + case SegmentCodec.IntSeg(name) => Options.integer(name).map(_.toInt).map(_.toString) + case SegmentCodec.LongSeg(name) => Options.integer(name).map(_.toInt).map(_.toString) + case SegmentCodec.BoolSeg(name) => Options.boolean(name).map(_.toString) + case SegmentCodec.Literal(value) => Options.Empty.map(_ => value) + case SegmentCodec.Trailing => Options.none.map(_.toString) + case SegmentCodec.Empty => Options.none.map(_.toString) + case SegmentCodec.Combined(_, _, _) => throw new IllegalArgumentException("Combined segment not supported") } fromSegment(segment) diff --git a/zio-http-cli/src/test/scala/zio/http/endpoint/cli/CommandGen.scala b/zio-http-cli/src/test/scala/zio/http/endpoint/cli/CommandGen.scala index 395fab4383..ac69bffc7c 100644 --- a/zio-http-cli/src/test/scala/zio/http/endpoint/cli/CommandGen.scala +++ b/zio-http-cli/src/test/scala/zio/http/endpoint/cli/CommandGen.scala @@ -20,14 +20,16 @@ object CommandGen { def getSegment(segment: SegmentCodec[_]): (String, String) = { def fromSegment[A](segment: SegmentCodec[A]): (String, String) = segment match { - case SegmentCodec.UUID(name) => (name, "text") - case SegmentCodec.Text(name) => (name, "text") - case SegmentCodec.IntSeg(name) => (name, "integer") - case SegmentCodec.LongSeg(name) => (name, "integer") - case SegmentCodec.BoolSeg(name) => (name, "boolean") - case SegmentCodec.Literal(_) => ("", "") - case SegmentCodec.Trailing => ("", "") - case SegmentCodec.Empty => ("", "") + case SegmentCodec.UUID(name) => (name, "text") + case SegmentCodec.Text(name) => (name, "text") + case SegmentCodec.IntSeg(name) => (name, "integer") + case SegmentCodec.LongSeg(name) => (name, "integer") + case SegmentCodec.BoolSeg(name) => (name, "boolean") + case SegmentCodec.Literal(_) => ("", "") + case SegmentCodec.Trailing => ("", "") + case SegmentCodec.Empty => ("", "") + case SegmentCodec.Combined(left, right, combiner) => + ??? } fromSegment(segment) diff --git a/zio-http/jvm/src/test/scala/zio/http/codec/PathCodecSpec.scala b/zio-http/jvm/src/test/scala/zio/http/codec/PathCodecSpec.scala index 68216f7d82..6dfdba639b 100644 --- a/zio-http/jvm/src/test/scala/zio/http/codec/PathCodecSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/codec/PathCodecSpec.scala @@ -24,6 +24,7 @@ import zio._ import zio.test._ import zio.http._ +import zio.http.codec.PathCodec.Segment import zio.http.codec._ object PathCodecSpec extends ZIOHttpSpec { @@ -115,6 +116,67 @@ object PathCodecSpec extends ZIOHttpSpec { ) }, ), + suite("decoding with sub-segment codecs")( + test("int") { + val codec = PathCodec.empty / + string("foo") / + "instances" / + int("a") ~ "_" ~ int("b") / + "bar" / + int("baz") + + assertTrue(codec.decode(Path("/abc/instances/123_13/bar/42")) == Right(("abc", 123, 13, 42))) + }, + test("uuid") { + val codec = PathCodec.empty / + string("foo") / + "foo" / + uuid("a") ~ "__" ~ int("b") / + "bar" / + int("baz") + + val id = UUID.randomUUID() + val p = s"/abc/foo/${id}__13/bar/42" + assertTrue(codec.decode(Path(p)) == Right(("abc", id, 13, 42))) + }, + test("string before literal") { + val codec = PathCodec.empty / + string("foo") / + "foo" / + string("a") ~ "__" ~ int("b") / + "bar" / + int("baz") + assertTrue(codec.decode(Path("/abc/foo/cba__13/bar/42")) == Right(("abc", "cba", 13, 42))) + }, + test("string before int") { + val codec = PathCodec.empty / + string("foo") / + "foo" / + string("a") ~ int("b") / + "bar" / + int("baz") + assertTrue(codec.decode(Path("/abc/foo/cba13/bar/42")) == Right(("abc", "cba", 13, 42))) + }, + test("string before long") { + val codec = PathCodec.empty / + string("foo") / + "foo" / + string("a") ~ long("b") / + "bar" / + int("baz") + assertTrue(codec.decode(Path("/abc/foo/cba133333333333/bar/42")) == Right(("abc", "cba", 133333333333L, 42))) + }, + test("trailing literal") { + val codec = PathCodec.empty / + string("foo") / + "instances" / + int("a") ~ "what" / + "bar" / + int("baz") + + assertTrue(codec.decode(Path("/abc/instances/123what/bar/42")) == Right(("abc", 123, 42))) + }, + ), suite("representation")( test("empty") { val codec = PathCodec.empty @@ -149,6 +211,13 @@ object PathCodecSpec extends ZIOHttpSpec { assertTrue(codec.render == "/users/{user-id}/posts/{post-id}") }, + test("/users/{first-name}_{last-name}") { + val codec = + PathCodec.empty / PathCodec.literal("users") / + string("first-name") ~ "_" ~ string("last-name") + + assertTrue(codec.render == "/users/{first-name}_{last-name}") + }, test("transformed") { val codec = PathCodec.path("/users") / diff --git a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala index bfcd0ebf6b..9df735cecb 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/PathCodec.scala @@ -18,6 +18,7 @@ package zio.http.codec import scala.annotation.tailrec import scala.collection.immutable.ListMap +import scala.collection.mutable import scala.language.implicitConversions import zio._ @@ -209,7 +210,7 @@ sealed trait PathCodec[A] { self => val segment = segments(j) j = j + 1 try { - stack.push(java.util.UUID.fromString(segment.toString)) + stack.push(java.util.UUID.fromString(segment)) } catch { case _: IllegalArgumentException => fail = s"Expected UUID path segment but found ${segment}" @@ -225,9 +226,9 @@ sealed trait PathCodec[A] { self => val segment = segments(j) j = j + 1 - if (segment == "true") { + if (segment.equalsIgnoreCase("true")) { stack.push(true) - } else if (segment == "false") { + } else if (segment.equalsIgnoreCase("false")) { stack.push(false) } else { fail = s"Expected boolean path segment but found ${segment}" @@ -263,6 +264,15 @@ sealed trait PathCodec[A] { self => case Right(value) => stack.push(value) } + + case SubSegmentOpts(ops) => + val error = decodeSubstring(segments(j), ops, stack) + if (error != null) { + fail = error + i = instructions.length + } else { + j += 1 + } } i = i + 1 @@ -278,6 +288,163 @@ sealed trait PathCodec[A] { self => } } + private def decodeSubstring( + value: String, + instructions: Array[Opt], + stack: java.util.Deque[Any], + ): String = { + import Opt._ + + var i = 0 + var j = 0 + val size = value.length + while (i < instructions.length) { + val opt = instructions(i) + opt match { + case Match(toMatch) => + val size0 = toMatch.length + if ((size - j) < size0) { + return "Expected \"" + toMatch + "\" in segment " + value + " but found end of segment" + } else if (value.startsWith(toMatch, j)) { + stack.push(()) + j += size0 + } else { + return "Expected \"" + toMatch + "\" in segment " + value + " but found: " + value.substring(j) + } + case Combine(combiner0) => + val combiner = combiner0.asInstanceOf[Combiner[Any, Any]] + val right = stack.pop() + val left = stack.pop() + stack.push(combiner.combine(left, right)) + case StringOpt => + // Here things get "interesting" (aka annoying). We don't have a way of knowing when a string ends, + // so we have to look ahead to the next operator and figure out where it begins + val end = indexOfNextCodec(value, instructions, i, j) + if (end == -1) { // If this wasn't the last codec, let the error handler of the next codec handle this + stack.push(value.substring(j)) + j = size + } else { + stack.push(value.substring(j, end)) + j = end + } + case IntOpt => + val isNegative = value(j) == '-' + if (isNegative) j += 1 + var end = j + while (end < size && value(end).isDigit) end += 1 + if (end == j) { + return "Expected integer path segment but found end of segment" + } else if (end - j > 10) { + return "Expected integer path segment but found: " + value.substring(j, end) + } else { + + try { + val int = Integer.parseInt(value, j, end, 10) + j = end + if (isNegative) stack.push(-int) else stack.push(int) + } catch { + case _: NumberFormatException => + return "Expected integer path segment but found: " + value.substring(j, end) + } + } + case LongOpt => + val isNegative = value(j) == '-' + if (isNegative) j += 1 + var end = j + while (end < size && value(end).isDigit) end += 1 + if (end == j) { + return "Expected long path segment but found end of segment" + } else if (end - j > 19) { + return "Expected long path segment but found: " + value.substring(j, end) + } else { + try { + val long = java.lang.Long.parseLong(value, j, end, 10) + j = end + if (isNegative) stack.push(-long) else stack.push(long) + } catch { + case _: NumberFormatException => return "Expected long path segment but found: " + value.substring(j, end) + } + } + case UUIDOpt => + if ((size - j) < 36) { + return "Remaining path segment " + value.substring(j) + " is too short to be a UUID" + } else { + val sub = value.substring(j, j + 36) + try { + stack.push(java.util.UUID.fromString(sub)) + } catch { + case _: IllegalArgumentException => return "Expected UUID path segment but found: " + sub + } + j += 36 + } + case BoolOpt => + if (value.regionMatches(true, j, "true", 0, 4)) { + stack.push(true) + j += 4 + } else if (value.regionMatches(true, j, "false", 0, 5)) { + stack.push(false) + j += 5 + } else { + return "Expected boolean path segment but found end of segment" + } + case TrailingOpt => + // TrailingOpt must be invalid, since it wants to extract a path, + // which is not possible in a sub part of a segment. + // The equivalent of trailing here is just StringOpt + throw new IllegalStateException("TrailingOpt is not allowed in a sub segment") + case _ => + throw new IllegalStateException("Unexpected instruction in substring decoder") + } + i += 1 + } + if (j != size) "Expected end of segment but found: " + value.substring(j) + else null + } + + private def indexOfNextCodec(value: String, instructions: Array[Opt], fromI: Int, idx: Int): Int = { + import Opt._ + + var nextOpt = null.asInstanceOf[Opt] + var j1 = fromI + 1 + + while ((nextOpt eq null) && j1 < instructions.length) { + instructions(j1) match { + case op @ (Match(_) | IntOpt | LongOpt | UUIDOpt | BoolOpt) => + nextOpt = op + case _ => + j1 += 1 + } + } + + nextOpt match { + case null => + -1 + case Match(toMatch) => + if (idx + toMatch.length > value.length) -1 + else if (toMatch.length == 1) value.indexOf(toMatch.charAt(0).toInt, idx) + else value.indexOf(toMatch, idx) + case IntOpt | LongOpt => + value.indexWhere(_.isDigit, idx) + case BoolOpt => + val t = value.regionMatches(true, idx, "true", 0, 4) + if (t) idx + 4 else if (value.regionMatches(true, idx, "false", 0, 5)) idx + 5 else -1 + case UUIDOpt => + val until = SegmentCodec.UUID.isUUIDUntil(value, idx) + if (until == -1) -1 else idx + until + case MatchAny(values) => + var end = -1 + val valuesIt = values.iterator + while (valuesIt.hasNext && end == -1) { + val value = valuesIt.next() + val index = value.indexOf(value, idx) + if (index != -1) end = index + } + end + case _ => + throw new IllegalStateException("Unexpected instruction in substring decoder: " + nextOpt) + } + } + /** * Returns the documentation for the path codec, if any. */ @@ -346,33 +513,47 @@ sealed trait PathCodec[A] { self => private var _optimize: Array[Opt] = null.asInstanceOf[Array[Opt]] private[http] def optimize: Array[Opt] = { - def loop(pattern: PathCodec[_]): Chunk[Opt] = + + def loopSegment(segment: SegmentCodec[_], fresh: Boolean)(implicit b: mutable.ArrayBuilder[Opt]): Unit = + segment match { + case SegmentCodec.Empty => b += Opt.Unit + case SegmentCodec.Literal(value) => b += Opt.Match(value) + case SegmentCodec.IntSeg(_) => b += Opt.IntOpt + case SegmentCodec.LongSeg(_) => b += Opt.LongOpt + case SegmentCodec.Text(_) => b += Opt.StringOpt + case SegmentCodec.UUID(_) => b += Opt.UUIDOpt + case SegmentCodec.BoolSeg(_) => b += Opt.BoolOpt + case SegmentCodec.Trailing => b += Opt.TrailingOpt + case SegmentCodec.Combined(left, right, combiner) => + val ab = if (fresh) mutable.ArrayBuilder.make[Opt] else b + loopSegment(left, fresh = false)(ab) + loopSegment(right, fresh = false)(ab) + ab += Opt.Combine(combiner) + if (fresh) b += Opt.SubSegmentOpts(ab.result().asInstanceOf[Array[Opt]]) + } + + def loop(pattern: PathCodec[_])(implicit b: mutable.ArrayBuilder[Opt]): Unit = pattern match { case PathCodec.Annotated(codec, _) => loop(codec) case PathCodec.Segment(segment) => - Chunk(segment.asInstanceOf[SegmentCodec[_]] match { - case SegmentCodec.Empty => Opt.Unit - case SegmentCodec.Literal(value) => Opt.Match(value) - case SegmentCodec.IntSeg(_) => Opt.IntOpt - case SegmentCodec.LongSeg(_) => Opt.LongOpt - case SegmentCodec.Text(_) => Opt.StringOpt - case SegmentCodec.UUID(_) => Opt.UUIDOpt - case SegmentCodec.BoolSeg(_) => Opt.BoolOpt - case SegmentCodec.Trailing => Opt.TrailingOpt - }) - - case f: Fallback[_] => - Chunk(Opt.MatchAny(fallbacks(f))) - + loopSegment(segment, fresh = true) + case f: Fallback[_] => + b += Opt.MatchAny(fallbacks(f)) case Concat(left, right, combiner) => - loop(left) ++ loop(right) ++ Chunk(Opt.Combine(combiner)) - - case TransformOrFail(api, f, _) => - loop(api) :+ Opt.MapOrFail(f.asInstanceOf[Any => Either[String, Any]]) + loop(left) + loop(right) + b += Opt.Combine(combiner) + case TransformOrFail(api, f, _) => + loop(api) + b += Opt.MapOrFail(f.asInstanceOf[Any => Either[String, Any]]) } - if (_optimize eq null) _optimize = loop(self).toArray + if (_optimize eq null) { + val b: mutable.ArrayBuilder[Opt] = mutable.ArrayBuilder.make[Opt] + loop(self)(b) + _optimize = b.result() + } _optimize } @@ -409,17 +590,15 @@ sealed trait PathCodec[A] { self => */ def render(prefix: String, suffix: String): String = { def loop(path: PathCodec[_]): String = path match { - case PathCodec.Annotated(codec, _) => + case PathCodec.Annotated(codec, _) => loop(codec) - case PathCodec.Concat(left, right, _) => + case PathCodec.Concat(left, right, _) => loop(left) + loop(right) - - case PathCodec.Segment(segment) => segment.render(prefix, suffix) - + case PathCodec.Segment(segment) => + segment.render(prefix, suffix) case PathCodec.TransformOrFail(api, _, _) => loop(api) - - case PathCodec.Fallback(left, _) => + case PathCodec.Fallback(left, _) => loop(left) } @@ -517,6 +696,8 @@ object PathCodec { implicit def path(value: String): PathCodec[Unit] = apply(value) + implicit def segment[A](codec: SegmentCodec[A]): PathCodec[A] = Segment(codec) + def string(name: String): PathCodec[String] = Segment(SegmentCodec.string(name)) def trailing: PathCodec[Path] = Segment(SegmentCodec.Trailing) @@ -574,6 +755,7 @@ object PathCodec { case object BoolOpt extends Opt case object TrailingOpt extends Opt case object Unit extends Opt + final case class SubSegmentOpts(ops: Array[Opt]) extends Opt final case class MapOrFail(f: Any => Either[String, Any]) extends Opt } diff --git a/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala b/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala index 102d57add9..d5e17bedd8 100644 --- a/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala +++ b/zio-http/shared/src/main/scala/zio/http/codec/SegmentCodec.scala @@ -15,11 +15,15 @@ */ package zio.http.codec +import scala.annotation.implicitNotFound import scala.language.implicitConversions import zio.Chunk import zio.http.Path +import zio.http.codec.Combiner.WithOut +import zio.http.codec.PathCodec.MetaData +import zio.http.codec.SegmentCodec._ sealed trait SegmentCodec[A] { self => private var _hashCode: Int = 0 @@ -32,6 +36,12 @@ sealed trait SegmentCodec[A] { self => case _ => false } + final def example(name: String, example: A): PathCodec[A] = + PathCodec.segment(self).annotate(MetaData.Examples(Map(name -> example))) + + final def examples(examples: (String, A)*): PathCodec[A] = + PathCodec.segment(self).annotate(MetaData.Examples(examples.toMap)) + def format(value: A): Path override val hashCode: Int = { @@ -44,9 +54,22 @@ sealed trait SegmentCodec[A] { self => case _ => false } + final def ??(doc: Doc): PathCodec[A] = PathCodec.Segment(self).??(doc) + + final def ~[B]( + that: SegmentCodec[B], + )(implicit combiner: Combiner[A, B], combinable: Combinable[B, SegmentCodec[B]]): SegmentCodec[combiner.Out] = + combinable.combine(self, that) + + final def ~(that: String)(implicit combiner: Combiner[A, Unit]): SegmentCodec[combiner.Out] = + self.~(SegmentCodec.literal(that))(combiner, Combinable.combinableLiteral) + // Returns number of segments matched, or -1 if not matched: def matches(segments: Chunk[String], index: Int): Int + // Returns the last index of the subsegment matched, or -1 if not matched + def inSegmentUntil(segment: String, from: Int): Int + final def nonEmpty: Boolean = !isEmpty final def render: String = { @@ -54,17 +77,45 @@ sealed trait SegmentCodec[A] { self => _render } - final def render(prefix: String, suffix: String): String = - self.asInstanceOf[SegmentCodec[_]] match { - case _: SegmentCodec.Empty.type => s"" - case SegmentCodec.Literal(value) => s"/$value" - case SegmentCodec.IntSeg(name) => s"/$prefix$name$suffix" - case SegmentCodec.LongSeg(name) => s"/$prefix$name$suffix" - case SegmentCodec.Text(name) => s"/$prefix$name$suffix" - case SegmentCodec.BoolSeg(name) => s"/$prefix$name$suffix" - case SegmentCodec.UUID(name) => s"/$prefix$name$suffix" - case _: SegmentCodec.Trailing.type => s"/..." + final def render(prefix: String, suffix: String): String = { + val b = new StringBuilder + + def loop(s: SegmentCodec[_]): Unit = { + s match { + case _: SegmentCodec.Empty.type => () + case SegmentCodec.Literal(value) => + b.appendAll(value) + case SegmentCodec.IntSeg(name) => + b.appendAll(prefix) + b.appendAll(name) + b.appendAll(suffix) + case SegmentCodec.LongSeg(name) => + b.appendAll(prefix) + b.appendAll(name) + b.appendAll(suffix) + case SegmentCodec.Text(name) => + b.appendAll(prefix) + b.appendAll(name) + b.appendAll(suffix) + case SegmentCodec.BoolSeg(name) => + b.appendAll(prefix) + b.appendAll(name) + b.appendAll(suffix) + case SegmentCodec.UUID(name) => + b.appendAll(prefix) + b.appendAll(name) + b.appendAll(suffix) + case SegmentCodec.Combined(left, right, _) => + loop(left) + loop(right) + case _: SegmentCodec.Trailing.type => + b.appendAll("...") + } } + if (self ne SegmentCodec.Empty) b.append('/') + loop(self.asInstanceOf[SegmentCodec[_]]) + b.result() + } final def transform[A2](f: A => A2)(g: A2 => A): PathCodec[A2] = PathCodec.Segment(self).transform(f)(g) @@ -79,6 +130,179 @@ sealed trait SegmentCodec[A] { self => PathCodec.Segment(self).transformOrFailRight(f)(g) } object SegmentCodec { + + @implicitNotFound("Segments of type ${B} cannot be appended to a multi-value segment") + sealed trait Combinable[B, S <: SegmentCodec[B]] { + def combine[A](self: SegmentCodec[A], that: SegmentCodec[B])(implicit + combiner: Combiner[A, B], + ): SegmentCodec[combiner.Out] + } + private[codec] object Combinable { + + implicit val combinableString: Combinable[String, SegmentCodec[String]] = + new Combinable[String, SegmentCodec[String]] { + override def combine[A](self: SegmentCodec[A], that: SegmentCodec[String])(implicit + combiner: Combiner[A, String], + ): SegmentCodec[combiner.Out] = { + self match { + case SegmentCodec.Empty => that.asInstanceOf[SegmentCodec[combiner.Out]] + case SegmentCodec.Text(name) => + throw new IllegalArgumentException( + "Cannot combine two string segments. Their names are " + name + " and " + that + .asInstanceOf[SegmentCodec.Text] + .name, + ) + case c: SegmentCodec.Combined[_, _, _] => + val last = c.flattened.last + last match { + case text: SegmentCodec.Text => + throw new IllegalArgumentException( + "Cannot combine two string segments. Their names are" + text.name + " and " + that + .asInstanceOf[Text] + .name, + ) + case _ => + SegmentCodec.Combined(self, that, combiner.asInstanceOf[WithOut[A, String, combiner.Out]]) + } + case _ => + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, String, combiner.Out]]) + } + } + } + implicit val combinableInt: Combinable[Int, SegmentCodec[Int]] = + new Combinable[Int, SegmentCodec[Int]] { + override def combine[A](self: SegmentCodec[A], that: SegmentCodec[Int])(implicit + combiner: Combiner[A, Int], + ): SegmentCodec[combiner.Out] = { + self match { + case SegmentCodec.Empty => that.asInstanceOf[SegmentCodec[combiner.Out]] + case SegmentCodec.IntSeg(name) => + throw new IllegalArgumentException( + "Cannot combine two numeric segments. Their names are " + name + " and " + that + .asInstanceOf[SegmentCodec.IntSeg] + .name, + ) + case SegmentCodec.LongSeg(name) => + throw new IllegalArgumentException( + "Cannot combine two numeric segments. Their names are " + name + " and " + that + .asInstanceOf[SegmentCodec.IntSeg] + .name, + ) + case c: SegmentCodec.Combined[_, _, _] => + val last = c.flattened.last + if (last.isInstanceOf[SegmentCodec.IntSeg] || last.isInstanceOf[SegmentCodec.LongSeg]) { + val lastName = + last match { + case SegmentCodec.IntSeg(name) => name + case SegmentCodec.LongSeg(name) => name + case _ => "" + } + throw new IllegalArgumentException( + "Cannot combine two numeric segments. Their names are " + lastName + " and " + that + .asInstanceOf[SegmentCodec.IntSeg] + .name, + ) + } else { + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, Int, combiner.Out]]) + } + case _ => + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, Int, combiner.Out]]) + } + } + } + implicit val combinableLong: Combinable[Long, SegmentCodec[Long]] = + new Combinable[Long, SegmentCodec[Long]] { + override def combine[A](self: SegmentCodec[A], that: SegmentCodec[Long])(implicit + combiner: Combiner[A, Long], + ): SegmentCodec[combiner.Out] = { + self match { + case SegmentCodec.Empty => that.asInstanceOf[SegmentCodec[combiner.Out]] + case SegmentCodec.IntSeg(name) => + throw new IllegalArgumentException( + "Cannot combine two numeric segments. Their names are " + name + " and " + that + .asInstanceOf[SegmentCodec.LongSeg] + .name, + ) + case SegmentCodec.LongSeg(name) => + throw new IllegalArgumentException( + "Cannot combine two numeric segments. Their names are " + name + " and " + that + .asInstanceOf[SegmentCodec.LongSeg] + .name, + ) + case c: SegmentCodec.Combined[_, _, _] => + val last = c.flattened.last + if (last.isInstanceOf[SegmentCodec.IntSeg] || last.isInstanceOf[SegmentCodec.LongSeg]) { + val lastName = + last match { + case SegmentCodec.IntSeg(name) => name + case SegmentCodec.LongSeg(name) => name + case _ => "" + } + throw new IllegalArgumentException( + "Cannot combine two numeric segments. Their names are " + lastName + " and " + that + .asInstanceOf[SegmentCodec.LongSeg] + .name, + ) + } else { + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, Long, combiner.Out]]) + } + case _ => + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, Long, combiner.Out]]) + } + } + } + implicit val combinableBool: Combinable[Boolean, SegmentCodec[Boolean]] = + new Combinable[Boolean, SegmentCodec[Boolean]] { + override def combine[A](self: SegmentCodec[A], that: SegmentCodec[Boolean])(implicit + combiner: Combiner[A, Boolean], + ): SegmentCodec[combiner.Out] = { + self match { + case SegmentCodec.Empty => that.asInstanceOf[SegmentCodec[combiner.Out]] + case _ => + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, Boolean, combiner.Out]]) + } + } + } + implicit val combinableUUID: Combinable[UUID, SegmentCodec[UUID]] = + new Combinable[UUID, SegmentCodec[UUID]] { + override def combine[A](self: SegmentCodec[A], that: SegmentCodec[UUID])(implicit + combiner: Combiner[A, UUID], + ): SegmentCodec[combiner.Out] = { + self match { + case SegmentCodec.Empty => that.asInstanceOf[SegmentCodec[combiner.Out]] + case _ => + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, UUID, combiner.Out]]) + } + } + } + implicit val combinableLiteral: Combinable[Unit, SegmentCodec[Unit]] = + new Combinable[Unit, SegmentCodec[Unit]] { + override def combine[A](self: SegmentCodec[A], that: SegmentCodec[Unit])(implicit + combiner: Combiner[A, Unit], + ): SegmentCodec[combiner.Out] = { + self match { + case SegmentCodec.Empty => that.asInstanceOf[SegmentCodec[combiner.Out]] + case SegmentCodec.Literal(value) => + SegmentCodec + .Literal(value + that.asInstanceOf[SegmentCodec.Literal].value) + .asInstanceOf[SegmentCodec[combiner.Out]] + case SegmentCodec.Combined(l, r, c) if r.isInstanceOf[SegmentCodec.Literal] => + SegmentCodec + .Combined( + l.asInstanceOf[SegmentCodec[Any]], + SegmentCodec + .Literal(r.asInstanceOf[SegmentCodec.Literal].value + that.asInstanceOf[SegmentCodec.Literal].value) + .asInstanceOf[SegmentCodec[Any]], + c.asInstanceOf[Combiner.WithOut[Any, Any, Any]], + ) + .asInstanceOf[SegmentCodec[combiner.Out]] + case _ => + SegmentCodec.Combined(self, that, combiner.asInstanceOf[Combiner.WithOut[A, Unit, combiner.Out]]) + } + } + } + } + def bool(name: String): SegmentCodec[Boolean] = SegmentCodec.BoolSeg(name) val empty: SegmentCodec[Unit] = SegmentCodec.Empty @@ -101,6 +325,9 @@ object SegmentCodec { def format(unit: Unit): Path = Path(s"") def matches(segments: Chunk[String], index: Int): Int = 0 + + override def inSegmentUntil(segment: String, from: Int): Int = from + } private[http] final case class Literal(value: String) extends SegmentCodec[Unit] { @@ -112,7 +339,13 @@ object SegmentCodec { else if (value == segments(index)) 1 else -1 } + + override def inSegmentUntil(segment: String, from: Int): Int = + if (segment.startsWith(value, from)) from + value.length + else -1 + } + private[http] final case class BoolSeg(name: String) extends SegmentCodec[Boolean] { def format(value: Boolean): Path = Path(s"/$value") @@ -124,29 +357,41 @@ object SegmentCodec { if (segment == "true" || segment == "false") 1 else -1 } + + override def inSegmentUntil(segment: String, from: Int): Int = + if (segment.startsWith("true", from)) from + 4 + else if (segment.startsWith("false", from)) from + 5 + else -1 + } + private[http] final case class IntSeg(name: String) extends SegmentCodec[Int] { def format(value: Int): Path = Path(s"/$value") - def matches(segments: Chunk[String], index: Int): Int = { + def matches(segments: Chunk[String], index: Int): Int = if (index < 0 || index >= segments.length) -1 else { - val SegmentCodec = segments(index) - var i = 0 - var defined = true - if (SegmentCodec.length > 1 && SegmentCodec.charAt(0) == '-') i += 1 - while (i < SegmentCodec.length) { - if (!SegmentCodec.charAt(i).isDigit) { - defined = false - i = SegmentCodec.length - } - i += 1 - } - if (defined && i >= 1) 1 else -1 + val lastIndex = inSegmentUntil(segments(index), 0) + if (lastIndex == -1 || lastIndex + 1 != segments(index).length) -1 + else 1 } - } + + override def inSegmentUntil(segment: String, from: Int): Int = + if (segment.isEmpty || from >= segment.length) { + -1 + } else { + var i = from + val isNegative = segment.charAt(i) == '-' + // 10 digits is the maximum for an Int + val maxDigits = if (isNegative) 11 else 10 + if (segment.length > 1 && isNegative) i += 1 + while (i + 1 < segment.length && i - from < maxDigits && segment.charAt(i).isDigit) i += 1 + i + } + } + private[http] final case class LongSeg(name: String) extends SegmentCodec[Long] { def format(value: Long): Path = Path(s"/$value") @@ -154,20 +399,26 @@ object SegmentCodec { def matches(segments: Chunk[String], index: Int): Int = { if (index < 0 || index >= segments.length) -1 else { - val SegmentCodec = segments(index) - var i = 0 - var defined = true - if (SegmentCodec.length > 1 && SegmentCodec.charAt(0) == '-') i += 1 - while (i < SegmentCodec.length) { - if (!SegmentCodec.charAt(i).isDigit) { - defined = false - i = SegmentCodec.length - } - i += 1 - } - if (defined && i >= 1) 1 else -1 + val lastIndex = inSegmentUntil(segments(index), 0) + if (lastIndex == -1 || lastIndex + 1 != segments(index).length) -1 + else 1 } } + + override def inSegmentUntil(segment: String, from: Int): Int = { + if (segment.isEmpty || from >= segment.length) { + -1 + } else { + var i = from + val isNegative = segment.charAt(i) == '-' + // 19 digits is the maximum for a Long + val maxDigits = if (isNegative) 20 else 19 + if (segment.length > 1 && isNegative) i += 1 + while (i + 1 < segment.length && i - from < maxDigits && segment.charAt(i).isDigit) i += 1 + i + } + } + } private[http] final case class Text(name: String) extends SegmentCodec[String] { @@ -176,6 +427,10 @@ object SegmentCodec { def matches(segments: Chunk[String], index: Int): Int = if (index < 0 || index >= segments.length) -1 else 1 + + override def inSegmentUntil(segment: String, from: Int): Int = + segment.length + } private[http] final case class UUID(name: String) extends SegmentCodec[java.util.UUID] { @@ -184,34 +439,97 @@ object SegmentCodec { def matches(segments: Chunk[String], index: Int): Int = { if (index < 0 || index >= segments.length) -1 else { - val SegmentCodec = segments(index) + val lastIndex = inSegmentUntil(segments(index), 0) + if (lastIndex == -1 || lastIndex + 1 != segments(index).length) -1 + else 1 + } + } - var i = 0 - var defined = true - var group = 0 - var count = 0 - while (i < SegmentCodec.length) { - val char = SegmentCodec.charAt(i) - if ((char >= 48 && char <= 57) || (char >= 65 && char <= 70) || (char >= 97 && char <= 102)) - count += 1 - else if (char == 45) { - if ( - group > 4 || (group == 0 && count != 8) || ((group == 1 || group == 2 || group == 3) && count != 4) || (group == 4 && count != 12) - ) { - defined = false - i = SegmentCodec.length - } - count = 0 - group += 1 - } else { + override def inSegmentUntil(segment: String, from: Int): Int = + UUID.isUUIDUntil(segment, from) + } + + private[http] object UUID { + def isUUIDUntil(segment: String, from: Int): Int = { + var i = from + var defined = true + var group = 0 + var count = 0 + if (segment.length + from < 36) return -1 + while (i < 36 && defined) { + val char = segment.charAt(i) + if ((char >= 48 && char <= 57) || (char >= 65 && char <= 70) || (char >= 97 && char <= 102)) + count += 1 + else if (char == 45) { + if ( + group > 4 || (group == 0 && count != 8) || ((group == 1 || group == 2 || group == 3) && count != 4) || (group == 4 && count != 12) + ) { defined = false - i = SegmentCodec.length + i = segment.length } + count = 0 + group += 1 + } else { + defined = false + i = segment.length + } + i += 1 + } + if (defined && from + 36 == i) i else -1 + } + + } + + private[http] final case class Combined[A, B, C]( + left: SegmentCodec[A], + right: SegmentCodec[B], + combiner: Combiner.WithOut[A, B, C], + ) extends SegmentCodec[C] { self => + val flattened: List[SegmentCodec[_]] = { + def loop(s: SegmentCodec[_]): List[SegmentCodec[_]] = s match { + case SegmentCodec.Combined(l, r, _) => loop(l) ++ loop(r) + case _ => List(s) + } + loop(self) + } + override def format(value: C): Path = { + val (l, r) = combiner.separate(value) + val lf = left.format(l) + val rf = right.format(r) + lf ++ rf + } + + override def matches(segments: Chunk[String], index: Int): Int = + if (index < 0 || index >= segments.length) -1 + else { + val segment = segments(index) + val length = segment.length + var from = 0 + var i = 0 + while (i < flattened.length) { + if (from >= length) return -1 + val codec = flattened(i) + val s = codec.inSegmentUntil(segment, from) + if (s == -1) return -1 + from = s i += 1 } - if (defined && i == 36) 1 else -1 + 1 } + + override def inSegmentUntil(segment: String, from: Int): Int = { + var i = from + var j = 0 + while (j < flattened.length) { + val codec = flattened(j) + val s = codec.inSegmentUntil(segment, i) + if (s == -1) return -1 + i = s + j += 1 + } + i } + } case object Trailing extends SegmentCodec[Path] { self => @@ -219,5 +537,9 @@ object SegmentCodec { def matches(segments: Chunk[String], index: Int): Int = (segments.length - index).max(0) + + override def inSegmentUntil(segment: String, from: Int): Int = + segment.length } + } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala index 933c52e130..5e983c2fbb 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala @@ -307,14 +307,15 @@ object JsonSchema { def fromSegmentCodec(codec: SegmentCodec[_]): JsonSchema = codec match { - case SegmentCodec.BoolSeg(_) => JsonSchema.Boolean - case SegmentCodec.IntSeg(_) => JsonSchema.Integer(JsonSchema.IntegerFormat.Int32) - case SegmentCodec.LongSeg(_) => JsonSchema.Integer(JsonSchema.IntegerFormat.Int64) - case SegmentCodec.Text(_) => JsonSchema.String() - case SegmentCodec.UUID(_) => JsonSchema.String(JsonSchema.StringFormat.UUID) - case SegmentCodec.Literal(_) => throw new IllegalArgumentException("Literal segment is not supported.") - case SegmentCodec.Empty => throw new IllegalArgumentException("Empty segment is not supported.") - case SegmentCodec.Trailing => throw new IllegalArgumentException("Trailing segment is not supported.") + case SegmentCodec.BoolSeg(_) => JsonSchema.Boolean + case SegmentCodec.IntSeg(_) => JsonSchema.Integer(JsonSchema.IntegerFormat.Int32) + case SegmentCodec.LongSeg(_) => JsonSchema.Integer(JsonSchema.IntegerFormat.Int64) + case SegmentCodec.Text(_) => JsonSchema.String() + case SegmentCodec.UUID(_) => JsonSchema.String(JsonSchema.StringFormat.UUID) + case SegmentCodec.Literal(_) => throw new IllegalArgumentException("Literal segment is not supported.") + case SegmentCodec.Empty => throw new IllegalArgumentException("Empty segment is not supported.") + case SegmentCodec.Trailing => throw new IllegalArgumentException("Trailing segment is not supported.") + case SegmentCodec.Combined(_, _, _) => throw new IllegalArgumentException("Combined segment is not supported.") } def fromZSchemaMulti(schema: Schema[_], refType: SchemaStyle = SchemaStyle.Inline): JsonSchemas = { diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala index 3915605cfc..28e57d2783 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/OpenAPIGen.scala @@ -705,14 +705,15 @@ object OpenAPIGen { def segmentToJson(codec: SegmentCodec[_], value: Any): Json = { codec match { - case SegmentCodec.Empty => throw new Exception("Empty segment not allowed") - case SegmentCodec.Literal(_) => throw new Exception("Literal segment not allowed") - case SegmentCodec.BoolSeg(_) => Json.Bool(value.asInstanceOf[Boolean]) - case SegmentCodec.IntSeg(_) => Json.Num(value.asInstanceOf[Int]) - case SegmentCodec.LongSeg(_) => Json.Num(value.asInstanceOf[Long]) - case SegmentCodec.Text(_) => Json.Str(value.asInstanceOf[String]) - case SegmentCodec.UUID(_) => Json.Str(value.asInstanceOf[UUID].toString) - case SegmentCodec.Trailing => throw new Exception("Trailing segment not allowed") + case SegmentCodec.Empty => throw new Exception("Empty segment not allowed") + case SegmentCodec.Literal(_) => throw new Exception("Literal segment not allowed") + case SegmentCodec.BoolSeg(_) => Json.Bool(value.asInstanceOf[Boolean]) + case SegmentCodec.IntSeg(_) => Json.Num(value.asInstanceOf[Int]) + case SegmentCodec.LongSeg(_) => Json.Num(value.asInstanceOf[Long]) + case SegmentCodec.Text(_) => Json.Str(value.asInstanceOf[String]) + case SegmentCodec.UUID(_) => Json.Str(value.asInstanceOf[UUID].toString) + case SegmentCodec.Trailing => throw new Exception("Trailing segment not allowed") + case SegmentCodec.Combined(_, _, _) => throw new Exception("Combined segment not allowed") } } diff --git a/zio-http/shared/src/main/scala/zio/http/package.scala b/zio-http/shared/src/main/scala/zio/http/package.scala index 6ea5db2bef..80d5163612 100644 --- a/zio-http/shared/src/main/scala/zio/http/package.scala +++ b/zio-http/shared/src/main/scala/zio/http/package.scala @@ -18,7 +18,7 @@ package zio import java.util.UUID -import zio.http.codec.PathCodec +import zio.http.codec.{PathCodec, SegmentCodec} package object http extends UrlInterpolator with MdInterpolator { @@ -36,12 +36,12 @@ package object http extends UrlInterpolator with MdInterpolator { def withContext[C](fn: => C)(implicit c: WithContext[C]): ZIO[c.Env, c.Err, c.Out] = c.toZIO(fn) - def boolean(name: String): PathCodec[Boolean] = PathCodec.bool(name) - def int(name: String): PathCodec[Int] = PathCodec.int(name) - def long(name: String): PathCodec[Long] = PathCodec.long(name) - def string(name: String): PathCodec[String] = PathCodec.string(name) - val trailing: PathCodec[Path] = PathCodec.trailing - def uuid(name: String): PathCodec[UUID] = PathCodec.uuid(name) + def boolean(name: String): SegmentCodec[Boolean] = SegmentCodec.bool(name) + def int(name: String): SegmentCodec[Int] = SegmentCodec.int(name) + def long(name: String): SegmentCodec[Long] = SegmentCodec.long(name) + def string(name: String): SegmentCodec[String] = SegmentCodec.string(name) + val trailing: SegmentCodec[Path] = SegmentCodec.trailing + def uuid(name: String): SegmentCodec[UUID] = SegmentCodec.uuid(name) def anyOf(name: String, names: String*): PathCodec[Unit] = if (names.isEmpty) PathCodec.literal(name) else names.foldLeft(PathCodec.literal(name))((acc, n) => acc.orElse(PathCodec.literal(n))) diff --git a/zio-http/shared/src/test/scala/zio/http/codec/SegmentCodecSpec.scala b/zio-http/shared/src/test/scala/zio/http/codec/SegmentCodecSpec.scala new file mode 100644 index 0000000000..09f7d3e1aa --- /dev/null +++ b/zio-http/shared/src/test/scala/zio/http/codec/SegmentCodecSpec.scala @@ -0,0 +1,95 @@ +package zio.http.codec + +import scala.util._ + +import zio._ +import zio.test._ + +import zio.http._ +import zio.http.codec.SegmentCodec.literal + +object SegmentCodecSpec extends ZIOSpecDefault { + override def spec: Spec[TestEnvironment with Scope, Any] = suite("SegmentCodec")( + test("combining literals is simplified to a single literal") { + val combineLitLit = Try( + "prefix" ~ "suffix", + ) + + val combineIntLitLit = Try( + int("anInt") ~ "prefix" ~ "suffix", + ) + + val expectedLit: Try[SegmentCodec[Unit]] = Success(SegmentCodec.Literal("prefixsuffix")) + val expectedIntLit: Try[SegmentCodec[Int]] = Success( + SegmentCodec.Combined( + SegmentCodec.IntSeg("anInt"), + SegmentCodec.Literal("prefixsuffix"), + Combiner.combine[Int, Unit].asInstanceOf[Combiner.WithOut[Int, Unit, Int]], + ), + ) + assertTrue( + combineLitLit == expectedLit, + combineIntLitLit == expectedIntLit, + ) + }, + test("Can't combine two string extracting segments") { + val combineStrStr = Try( + string("aString") ~ string("anotherString"), + ) + val expectedErrorMsg = "Cannot combine two string segments. Their names are aString and anotherString" + assertTrue(combineStrStr.failed.toOption.map(_.getMessage).contains(expectedErrorMsg)) + }, + test("Can't combine two int extracting segments") { + val combineIntInt = Try( + int("anInt") ~ int("anotherInt"), + ) + val combineUUIDIntInt = Try( + uuid("aUUID") ~ int("anInt") ~ int("anotherInt"), + ) + val expectedErrorMsg = "Cannot combine two numeric segments. Their names are anInt and anotherInt" + assertTrue( + combineIntInt.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + combineUUIDIntInt.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + ) + }, + test("Can't combine two long extracting segments") { + val combineLongLong = Try( + long("aLong") ~ long("anotherLong"), + ) + val uuidLongLong = Try( + uuid("aUUID") ~ long("aLong") ~ long("anotherLong"), + ) + val expectedErrorMsg = "Cannot combine two numeric segments. Their names are aLong and anotherLong" + assertTrue( + combineLongLong.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + uuidLongLong.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + ) + }, + test("Can't combine an int and a long extracting segment") { + val combineIntLong = Try( + int("anInt") ~ long("aLong"), + ) + val uuidIntLong = Try( + uuid("aUUID") ~ int("anInt") ~ long("aLong"), + ) + val expectedErrorMsg = "Cannot combine two numeric segments. Their names are anInt and aLong" + assertTrue( + combineIntLong.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + uuidIntLong.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + ) + }, + test("Can't combine a long and an int extracting segment") { + val combineLongInt = Try( + long("aLong") ~ int("anInt"), + ) + val uuidLongInt = Try( + uuid("aUUID") ~ long("aLong") ~ int("anInt"), + ) + val expectedErrorMsg = "Cannot combine two numeric segments. Their names are aLong and anInt" + assertTrue( + combineLongInt.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + uuidLongInt.failed.toOption.map(_.getMessage).contains(expectedErrorMsg), + ) + }, + ) +} From d292daff5dec7645d0624f0da5002242ab045a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20Ra=C3=BDman?= Date: Fri, 19 Jul 2024 14:28:56 +0200 Subject: [PATCH 56/58] Fixes issue #2971 (#2972) * Fixes issue #2971 * Fixes issue #2971, fmt * Renaming variable after review --- .../endpoint/openapi/OpenAPIGenSpec.scala | 132 ++++++++++ .../http/endpoint/openapi/JsonSchema.scala | 229 +++++++++--------- 2 files changed, 253 insertions(+), 108 deletions(-) diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala index ef5e7c550a..26b26f642c 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/openapi/OpenAPIGenSpec.scala @@ -113,6 +113,24 @@ object OpenAPIGenSpec extends ZIOSpecDefault { case class NestedThree(name: String) extends SimpleNestedSealedTrait } + @description("A recursive structure") + case class Recursive( + nestedOption: Option[Recursive], + nestedList: List[Recursive], + nestedMap: Map[String, Recursive], + nestedSet: Set[Recursive], + nestedEither: Either[Recursive, Recursive], + nestedTuple: (Recursive, Recursive), + nestedOverAnother: NestedRecursive, + ) + object Recursive { + implicit val schema: Schema[Recursive] = DeriveSchema.gen[Recursive] + } + case class NestedRecursive(next: Recursive) + object NestedRecursive { + implicit val schema: Schema[NestedRecursive] = DeriveSchema.gen[NestedRecursive] + } + @description("A simple payload") case class Payload(content: String) @@ -2440,6 +2458,120 @@ object OpenAPIGenSpec extends ZIOSpecDefault { SwaggerUI.routes("docs/openapi", OpenAPIGen.fromEndpoints(endpoint)) assertCompletes }, + test("Recursive schema") { + val endpoint = Endpoint(RoutePattern.POST / "folder") + .out[Recursive] + val openApi = OpenAPIGen.fromEndpoints(endpoint) + val json = toJsonAst(openApi) + val expectedJson = + """ + |{ + | "openapi" : "3.1.0", + | "info" : { + | "title" : "", + | "version" : "" + | }, + | "paths" : { + | "/folder" : { + | "post" : { + | "responses" : { + | "200" : + | { + | "content" : { + | "application/json" : { + | "schema" : + | { + | "$ref" : "#/components/schemas/Recursive" + | } + | } + | } + | } + | } + | } + | } + | }, + | "components" : { + | "schemas" : { + | "NestedRecursive" : + | { + | "type" : + | "object", + | "properties" : { + | "next" : { + | "$ref" : "#/components/schemas/Recursive" + | } + | }, + | "required" : [ + | "next" + | ] + | }, + | "Recursive" : + | { + | "type" : + | "object", + | "properties" : { + | "nestedSet" : { + | "type" : + | "array", + | "items" : { + | "$ref" : "#/components/schemas/Recursive" + | } + | }, + | "nestedEither" : { + | "oneOf" : [ + | { + | "$ref" : "#/components/schemas/Recursive" + | }, + | { + | "$ref" : "#/components/schemas/Recursive" + | } + | ] + | }, + | "nestedTuple" : { + | "allOf" : [ + | { + | "$ref" : "#/components/schemas/Recursive" + | }, + | { + | "$ref" : "#/components/schemas/Recursive" + | } + | ] + | }, + | "nestedOption" : { + | "$ref" : "#/components/schemas/Recursive" + | }, + | "nestedList" : { + | "type" : + | "array", + | "items" : { + | "$ref" : "#/components/schemas/Recursive" + | } + | }, + | "nestedOverAnother" : { + | "$ref" : "#/components/schemas/NestedRecursive" + | } + | }, + | "additionalProperties" : + | { + | "$ref" : "#/components/schemas/Recursive" + | }, + | "required" : [ + | "nestedOption", + | "nestedList", + | "nestedMap", + | "nestedSet", + | "nestedEither", + | "nestedTuple", + | "nestedOverAnother" + | ], + | "description" : "A recursive structure" + | } + | } + | } + |} + |""".stripMargin + assertTrue(json == toJsonAst(expectedJson)) + }, ) } diff --git a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala index 5e983c2fbb..22cd74e241 100644 --- a/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala +++ b/zio-http/shared/src/main/scala/zio/http/endpoint/openapi/JsonSchema.scala @@ -1,6 +1,6 @@ package zio.http.endpoint.openapi -import scala.annotation.nowarn +import scala.annotation.{nowarn, tailrec} import zio._ import zio.json.ast.Json @@ -318,120 +318,131 @@ object JsonSchema { case SegmentCodec.Combined(_, _, _) => throw new IllegalArgumentException("Combined segment is not supported.") } - def fromZSchemaMulti(schema: Schema[_], refType: SchemaStyle = SchemaStyle.Inline): JsonSchemas = { + def fromZSchemaMulti( + schema: Schema[_], + refType: SchemaStyle = SchemaStyle.Inline, + seen: Set[java.lang.String] = Set.empty, + ): JsonSchemas = { val ref = nominal(schema, refType) - schema match { - case enum0: Schema.Enum[_] if enum0.cases.forall(_.schema.isInstanceOf[CaseClass0[_]]) => - JsonSchemas(fromZSchema(enum0, SchemaStyle.Inline), ref, Map.empty) - case enum0: Schema.Enum[_] => - JsonSchemas( - fromZSchema(enum0, SchemaStyle.Inline), - ref, - enum0.cases - .filterNot(_.annotations.exists(_.isInstanceOf[transientCase])) - .flatMap { c => - val key = - nominal(c.schema, refType) - .orElse(nominal(c.schema, SchemaStyle.Compact)) + if (ref.exists(seen.contains)) { + JsonSchemas(RefSchema(ref.get), ref, Map.empty) + } else { + val seenWithCurrent = seen ++ ref + schema match { + case enum0: Schema.Enum[_] if enum0.cases.forall(_.schema.isInstanceOf[CaseClass0[_]]) => + JsonSchemas(fromZSchema(enum0, SchemaStyle.Inline), ref, Map.empty) + case enum0: Schema.Enum[_] => + JsonSchemas( + fromZSchema(enum0, SchemaStyle.Inline), + ref, + enum0.cases + .filterNot(_.annotations.exists(_.isInstanceOf[transientCase])) + .flatMap { c => + val key = + nominal(c.schema, refType) + .orElse(nominal(c.schema, SchemaStyle.Compact)) + val nested = fromZSchemaMulti( + c.schema, + refType, + seenWithCurrent, + ) + nested.children ++ key.map(_ -> nested.root) + } + .toMap, + ) + case record: Schema.Record[_] => + val children = record.fields + .filterNot(_.annotations.exists(_.isInstanceOf[transientField])) + .flatMap { field => val nested = fromZSchemaMulti( - c.schema, + field.schema, refType, + seenWithCurrent, ) - nested.children ++ key.map(_ -> nested.root) + nested.rootRef.map(k => nested.children + (k -> nested.root)).getOrElse(nested.children) } - .toMap, - ) - case record: Schema.Record[_] => - val children = record.fields - .filterNot(_.annotations.exists(_.isInstanceOf[transientField])) - .flatMap { field => - val nested = fromZSchemaMulti( - field.schema, - refType, - ) - nested.rootRef.map(k => nested.children + (k -> nested.root)).getOrElse(nested.children) + .toMap + JsonSchemas(fromZSchema(record, SchemaStyle.Inline), ref, children) + case collection: Schema.Collection[_, _] => + collection match { + case Schema.Sequence(elementSchema, _, _, _, _) => + arraySchemaMulti(refType, ref, elementSchema, seenWithCurrent) + case Schema.Map(_, valueSchema, _) => + val nested = fromZSchemaMulti(valueSchema, refType, seenWithCurrent) + if (valueSchema.isInstanceOf[Schema.Primitive[_]]) { + JsonSchemas( + JsonSchema.Object( + Map.empty, + Right(nested.root), + Chunk.empty, + ), + ref, + nested.children, + ) + } else { + JsonSchemas( + JsonSchema.Object( + Map.empty, + Right(nested.root), + Chunk.empty, + ), + ref, + nested.children + (nested.rootRef.get -> nested.root), + ) + } + case Schema.Set(elementSchema, _) => + arraySchemaMulti(refType, ref, elementSchema, seenWithCurrent) } - .toMap - JsonSchemas(fromZSchema(record, SchemaStyle.Inline), ref, children) - case collection: Schema.Collection[_, _] => - collection match { - case Schema.Sequence(elementSchema, _, _, _, _) => - arraySchemaMulti(refType, ref, elementSchema) - case Schema.Map(_, valueSchema, _) => - val nested = fromZSchemaMulti(valueSchema, refType) - if (valueSchema.isInstanceOf[Schema.Primitive[_]]) { - JsonSchemas( - JsonSchema.Object( - Map.empty, - Right(nested.root), - Chunk.empty, - ), - ref, - nested.children, + case Schema.Transform(schema, _, _, _, _) => + fromZSchemaMulti(schema, refType, seenWithCurrent) + case Schema.Primitive(_, _) => + JsonSchemas(fromZSchema(schema, SchemaStyle.Inline), ref, Map.empty) + case Schema.Optional(schema, _) => + fromZSchemaMulti(schema, refType, seenWithCurrent) + case Schema.Fail(_, _) => + throw new IllegalArgumentException("Fail schema is not supported.") + case Schema.Tuple2(left, right, _) => + val leftSchema = fromZSchemaMulti(left, refType, seenWithCurrent) + val rightSchema = fromZSchemaMulti(right, refType, seenWithCurrent) + JsonSchemas( + AllOfSchema(Chunk(leftSchema.root, rightSchema.root)), + ref, + leftSchema.children ++ rightSchema.children, + ) + case Schema.Either(left, right, _) => + val leftSchema = fromZSchemaMulti(left, refType, seenWithCurrent) + val rightSchema = fromZSchemaMulti(right, refType, seenWithCurrent) + JsonSchemas( + OneOfSchema(Chunk(leftSchema.root, rightSchema.root)), + ref, + leftSchema.children ++ rightSchema.children, + ) + case Schema.Fallback(left, right, fullDecode, _) => + val leftSchema = fromZSchemaMulti(left, refType, seenWithCurrent) + val rightSchema = fromZSchemaMulti(right, refType, seenWithCurrent) + val candidates = + if (fullDecode) + Chunk( + AllOfSchema(Chunk(leftSchema.root, rightSchema.root)), + leftSchema.root, + rightSchema.root, ) - } else { - JsonSchemas( - JsonSchema.Object( - Map.empty, - Right(nested.root), - Chunk.empty, - ), - ref, - nested.children + (nested.rootRef.get -> nested.root), + else + Chunk( + leftSchema.root, + rightSchema.root, ) - } - case Schema.Set(elementSchema, _) => - arraySchemaMulti(refType, ref, elementSchema) - } - case Schema.Transform(schema, _, _, _, _) => - fromZSchemaMulti(schema, refType) - case Schema.Primitive(_, _) => - JsonSchemas(fromZSchema(schema, SchemaStyle.Inline), ref, Map.empty) - case Schema.Optional(schema, _) => - fromZSchemaMulti(schema, refType) - case Schema.Fail(_, _) => - throw new IllegalArgumentException("Fail schema is not supported.") - case Schema.Tuple2(left, right, _) => - val leftSchema = fromZSchemaMulti(left, refType) - val rightSchema = fromZSchemaMulti(right, refType) - JsonSchemas( - AllOfSchema(Chunk(leftSchema.root, rightSchema.root)), - ref, - leftSchema.children ++ rightSchema.children, - ) - case Schema.Either(left, right, _) => - val leftSchema = fromZSchemaMulti(left, refType) - val rightSchema = fromZSchemaMulti(right, refType) - JsonSchemas( - OneOfSchema(Chunk(leftSchema.root, rightSchema.root)), - ref, - leftSchema.children ++ rightSchema.children, - ) - case Schema.Fallback(left, right, fullDecode, _) => - val leftSchema = fromZSchemaMulti(left, refType) - val rightSchema = fromZSchemaMulti(right, refType) - val candidates = - if (fullDecode) - Chunk( - AllOfSchema(Chunk(leftSchema.root, rightSchema.root)), - leftSchema.root, - rightSchema.root, - ) - else - Chunk( - leftSchema.root, - rightSchema.root, - ) - JsonSchemas( - OneOfSchema(candidates), - ref, - leftSchema.children ++ rightSchema.children, - ) - case Schema.Lazy(schema0) => - fromZSchemaMulti(schema0(), refType) - case Schema.Dynamic(_) => - JsonSchemas(AnyJson, None, Map.empty) + JsonSchemas( + OneOfSchema(candidates), + ref, + leftSchema.children ++ rightSchema.children, + ) + case Schema.Lazy(schema0) => + fromZSchemaMulti(schema0(), refType, seen) + case Schema.Dynamic(_) => + JsonSchemas(AnyJson, None, Map.empty) + } } } @@ -439,8 +450,9 @@ object JsonSchema { refType: SchemaStyle, ref: Option[java.lang.String], elementSchema: Schema[_], + seen: Set[java.lang.String], ): JsonSchemas = { - val nested = fromZSchemaMulti(elementSchema, refType) + val nested = fromZSchemaMulti(elementSchema, refType, seen) if (elementSchema.isInstanceOf[Schema.Primitive[_]]) { JsonSchemas( JsonSchema.ArrayType(Some(nested.root)), @@ -451,7 +463,7 @@ object JsonSchema { JsonSchemas( JsonSchema.ArrayType(Some(nested.root)), ref, - nested.children ++ (nested.rootRef.map(_ -> nested.root)), + nested.children ++ nested.rootRef.map(_ -> nested.root), ) } } @@ -635,6 +647,7 @@ object JsonSchema { schema.annotations.collectFirst { case fieldDefaultValue(value) => value } .map(toJsonAst(schema.schema, _)) + @tailrec private def nominal(schema: Schema[_], referenceType: SchemaStyle = SchemaStyle.Reference): Option[java.lang.String] = schema match { case enumSchema: Schema.Enum[_] => refForTypeId(enumSchema.id, referenceType) From 33e27ed39b5cf885c6d1085cac6c6a05a1e826a3 Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Fri, 26 Jul 2024 08:52:24 +0300 Subject: [PATCH 57/58] Fix WebSockets when request streaming is enabled (#2978) * Fix websockets when requests are streaming * Move code out of NettyRequestEncoder --- .../netty/client/NettyRequestEncoder.scala | 13 +- .../zio/http/netty/model/Conversions.scala | 7 + .../netty/server/ServerInboundHandler.scala | 9 +- .../test/scala/zio/http/WebSocketSpec.scala | 354 +++++++++--------- 4 files changed, 198 insertions(+), 185 deletions(-) diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala index 2bccb58f3c..f20a8d90fd 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/client/NettyRequestEncoder.scala @@ -16,14 +16,13 @@ package zio.http.netty.client +import zio.Unsafe import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.{Task, Trace, Unsafe, ZIO} -import zio.http.netty._ import zio.http.netty.model.Conversions import zio.http.{Body, Request} -import io.netty.buffer.{ByteBuf, EmptyByteBuf, Unpooled} +import io.netty.buffer.Unpooled import io.netty.handler.codec.http.{DefaultFullHttpRequest, DefaultHttpRequest, HttpHeaderNames, HttpRequest} private[zio] object NettyRequestEncoder { @@ -34,12 +33,7 @@ private[zio] object NettyRequestEncoder { def encode(req: Request): HttpRequest = { val method = Conversions.methodToNetty(req.method) val jVersion = Conversions.versionToNetty(req.version) - - def replaceEmptyPathWithSlash(url: zio.http.URL) = if (url.path.isEmpty) url.addLeadingSlash else url - - // As per the spec, the path should contain only the relative path. - // Host and port information should be in the headers. - val path = replaceEmptyPathWithSlash(req.url).relative.addLeadingSlash.encode + val path = Conversions.urlToNetty(req.url) val headers = Conversions.headersToNetty(req.allHeaders) @@ -69,4 +63,5 @@ private[zio] object NettyRequestEncoder { new DefaultHttpRequest(jVersion, method, path, headers) } } + } diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/model/Conversions.scala b/zio-http/jvm/src/main/scala/zio/http/netty/model/Conversions.scala index 9658e437ef..76ef429a4c 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/model/Conversions.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/model/Conversions.scala @@ -64,6 +64,13 @@ private[netty] object Conversions { case Headers.Empty => new DefaultHttpHeaders() } + def urlToNetty(url: URL): String = { + // As per the spec, the path should contain only the relative path. + // Host and port information should be in the headers. + val url0 = if (url.path.isEmpty) url.addLeadingSlash else url + url0.relative.addLeadingSlash.encode + } + private def nettyHeadersIterator(headers: HttpHeaders): Iterator[Header] = new AbstractIterator[Header] { private val nettyIterator = headers.iteratorCharSequence() diff --git a/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala b/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala index 590180e37e..4df974e941 100644 --- a/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala +++ b/zio-http/jvm/src/main/scala/zio/http/netty/server/ServerInboundHandler.scala @@ -20,7 +20,6 @@ import java.io.IOException import java.net.InetSocketAddress import java.util.concurrent.atomic.LongAdder -import scala.annotation.tailrec import scala.util.control.NonFatal import zio._ @@ -29,7 +28,6 @@ import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.http.Body.WebsocketBody import zio.http._ import zio.http.netty._ -import zio.http.netty.client.NettyRequestEncoder import zio.http.netty.model.Conversions import zio.http.netty.socket.NettySocketProtocol @@ -287,7 +285,12 @@ private[zio] final case class ServerInboundHandler( ) .addLast(Names.WebSocketHandler, new WebSocketAppHandler(runtime, queue, None)) - val jReq = NettyRequestEncoder.encode(request) + val jReq = new DefaultFullHttpRequest( + Conversions.versionToNetty(request.version), + Conversions.methodToNetty(request.method), + Conversions.urlToNetty(request.url), + ) + jReq.headers().setAll(Conversions.headersToNetty(request.allHeaders)) ctx.channel().eventLoop().submit { () => ctx.fireChannelRead(jReq) }: Unit } } diff --git a/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala b/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala index 3f87b59f73..3ea000d991 100644 --- a/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/WebSocketSpec.scala @@ -23,197 +23,205 @@ import zio.test.{TestClock, assertCompletes, assertTrue, assertZIO, testClock} import zio.http.ChannelEvent.UserEvent.HandshakeComplete import zio.http.ChannelEvent.{Read, Unregistered, UserEvent, UserEventTriggered} -import zio.http.internal.{DynamicServer, HttpRunnableSpec, serverTestLayer} +import zio.http.internal.{DynamicServer, HttpRunnableSpec, serverTestLayer, testNettyServerConfig, testServerConfig} object WebSocketSpec extends HttpRunnableSpec { - private val websocketSpec = suite("WebsocketSpec")( - test("channel events between client and server") { - for { - msg <- MessageCollector.make[WebSocketChannelEvent] - url <- DynamicServer.wsURL - id <- DynamicServer.deploy { - Handler.webSocket { channel => + private val websocketSpec = + List( + test("channel events between client and server") { + for { + msg <- MessageCollector.make[WebSocketChannelEvent] + url <- DynamicServer.wsURL + id <- DynamicServer.deploy { + Handler.webSocket { channel => + channel.receiveAll { + case event @ Read(frame) => channel.send(Read(frame)) *> msg.add(event) + case event: Unregistered.type => msg.add(event, isDone = true) + case event => msg.add(event) + } + }.toRoutes + } + + res <- ZIO.scoped { + Handler.webSocket { channel => + channel.receiveAll { + case UserEventTriggered(HandshakeComplete) => + channel.send(Read(WebSocketFrame.text("FOO"))) + case Read(WebSocketFrame.Text("FOO")) => + channel.send(Read(WebSocketFrame.text("BAR"))) + case Read(WebSocketFrame.Text("BAR")) => + channel.shutdown + case _ => + ZIO.unit + } + }.connect(url, Headers(DynamicServer.APP_ID, id)) *> { + for { + events <- msg.await + expected = List( + UserEventTriggered(HandshakeComplete), + Read(WebSocketFrame.text("FOO")), + Read(WebSocketFrame.text("BAR")), + Unregistered, + ) + } yield assertTrue(events == expected) + } + } + } yield res + }, + test("on close interruptibility") { + for { + + // Maintain a flag to check if the close handler was completed + isSet <- Promise.make[Nothing, Unit] + isStarted <- Promise.make[Nothing, Unit] + clock <- testClock + + // Setup websocket server + + serverHttp = Handler.webSocket { channel => channel.receiveAll { - case event @ Read(frame) => channel.send(Read(frame)) *> msg.add(event) - case event: Unregistered.type => msg.add(event, isDone = true) - case event => msg.add(event) + case Unregistered => + isStarted.succeed(()) <&> isSet.succeed(()).delay(5 seconds).withClock(clock) + case _ => + ZIO.unit } - }.toRoutes - } + }.toRoutes.deployWS - res <- ZIO.scoped { - Handler.webSocket { channel => + // Setup Client + // Client closes the connection after 1 second + clientSocket = Handler.webSocket { channel => channel.receiveAll { case UserEventTriggered(HandshakeComplete) => - channel.send(Read(WebSocketFrame.text("FOO"))) - case Read(WebSocketFrame.Text("FOO")) => - channel.send(Read(WebSocketFrame.text("BAR"))) - case Read(WebSocketFrame.Text("BAR")) => - channel.shutdown + channel.send(Read(WebSocketFrame.close(1000))).delay(1 second).withClock(clock) case _ => ZIO.unit } - }.connect(url, Headers(DynamicServer.APP_ID, id)) *> { - for { - events <- msg.await - expected = List( - UserEventTriggered(HandshakeComplete), - Read(WebSocketFrame.text("FOO")), - Read(WebSocketFrame.text("BAR")), - Unregistered, - ) - } yield assertTrue(events == expected) } - } - } yield res - }, - test("on close interruptibility") { - for { - - // Maintain a flag to check if the close handler was completed - isSet <- Promise.make[Nothing, Unit] - isStarted <- Promise.make[Nothing, Unit] - clock <- testClock - - // Setup websocket server - - serverHttp = Handler.webSocket { channel => - channel.receiveAll { - case Unregistered => - isStarted.succeed(()) <&> isSet.succeed(()).delay(5 seconds).withClock(clock) - case _ => - ZIO.unit - } - }.toRoutes.deployWS - - // Setup Client - // Client closes the connection after 1 second - clientSocket = Handler.webSocket { channel => - channel.receiveAll { - case UserEventTriggered(HandshakeComplete) => - channel.send(Read(WebSocketFrame.close(1000))).delay(1 second).withClock(clock) - case _ => - ZIO.unit + + // Deploy the server and send it a socket request + _ <- serverHttp.runZIO(clientSocket) + + // Wait for the close handler to complete + _ <- TestClock.adjust(2 seconds) + _ <- isStarted.await + _ <- TestClock.adjust(5 seconds) + _ <- isSet.await + + // Check if the close handler was completed + } yield assertCompletes + } @@ nonFlaky(25), + test("Multiple websocket upgrades") { + val app = + Handler.webSocket(channel => channel.send(ChannelEvent.Read(WebSocketFrame.text("BAR")))).toRoutes.deployWS + val codes = ZIO + .foreach(1 to 1024)(_ => app.runZIO(WebSocketApp.unit).map(_.status)) + .map(_.count(_ == Status.SwitchingProtocols)) + + assertZIO(codes)(equalTo(1024)) + } @@ ignore, + test("channel events between client and server when the provided URL is HTTP") { + for { + msg <- MessageCollector.make[WebSocketChannelEvent] + url <- DynamicServer.httpURL + id <- DynamicServer.deploy { + Handler.webSocket { channel => + channel.receiveAll { + case event @ Read(frame) => channel.send(Read(frame)) *> msg.add(event) + case event: Unregistered.type => msg.add(event, isDone = true) + case event => msg.add(event) + } + }.toRoutes } - } - - // Deploy the server and send it a socket request - _ <- serverHttp.runZIO(clientSocket) - - // Wait for the close handler to complete - _ <- TestClock.adjust(2 seconds) - _ <- isStarted.await - _ <- TestClock.adjust(5 seconds) - _ <- isSet.await - - // Check if the close handler was completed - } yield assertCompletes - } @@ nonFlaky, - test("Multiple websocket upgrades") { - val app = - Handler.webSocket(channel => channel.send(ChannelEvent.Read(WebSocketFrame.text("BAR")))).toRoutes.deployWS - val codes = ZIO - .foreach(1 to 1024)(_ => app.runZIO(WebSocketApp.unit).map(_.status)) - .map(_.count(_ == Status.SwitchingProtocols)) - - assertZIO(codes)(equalTo(1024)) - } @@ ignore, - test("channel events between client and server when the provided URL is HTTP") { - for { - msg <- MessageCollector.make[WebSocketChannelEvent] - url <- DynamicServer.httpURL - id <- DynamicServer.deploy { - Handler.webSocket { channel => - channel.receiveAll { - case event @ Read(frame) => channel.send(Read(frame)) *> msg.add(event) - case event: Unregistered.type => msg.add(event, isDone = true) - case event => msg.add(event) - } - }.toRoutes - } - res <- ZIO.scoped { - Handler.webSocket { channel => - channel.receiveAll { - case UserEventTriggered(HandshakeComplete) => - channel.send(Read(WebSocketFrame.text("FOO"))) - case Read(WebSocketFrame.Text("FOO")) => - channel.send(Read(WebSocketFrame.text("BAR"))) - case Read(WebSocketFrame.Text("BAR")) => - channel.shutdown - case _ => - ZIO.unit + res <- ZIO.scoped { + Handler.webSocket { channel => + channel.receiveAll { + case UserEventTriggered(HandshakeComplete) => + channel.send(Read(WebSocketFrame.text("FOO"))) + case Read(WebSocketFrame.Text("FOO")) => + channel.send(Read(WebSocketFrame.text("BAR"))) + case Read(WebSocketFrame.Text("BAR")) => + channel.shutdown + case _ => + ZIO.unit + } + }.connect(url, Headers(DynamicServer.APP_ID, id)) *> { + for { + events <- msg.await + expected = List( + UserEventTriggered(HandshakeComplete), + Read(WebSocketFrame.text("FOO")), + Read(WebSocketFrame.text("BAR")), + Unregistered, + ) + } yield assertTrue(events == expected) } - }.connect(url, Headers(DynamicServer.APP_ID, id)) *> { - for { - events <- msg.await - expected = List( - UserEventTriggered(HandshakeComplete), - Read(WebSocketFrame.text("FOO")), - Read(WebSocketFrame.text("BAR")), - Unregistered, - ) - } yield assertTrue(events == expected) } - } - } yield res - }, - test("Client connection is interruptible") { - for { - url <- DynamicServer.httpURL - id <- DynamicServer.deploy { - Handler.webSocket { channel => - ZIO.debug("receiveAll") *> - channel.receiveAll { evt => - println(evt) - evt match { - case ChannelEvent.UserEventTriggered(UserEvent.HandshakeComplete) => - ZIO.debug("registered") *> - ZIO - .foreachDiscard(1 to 100) { idx => - ZIO.debug(s"sending $idx") *> - channel.send(Read(WebSocketFrame.text(idx.toString))) *> ZIO.sleep(100.millis) - } - .forkScoped - case _ => ZIO.unit - } + } yield res + }, + test("Client connection is interruptible") { + for { + url <- DynamicServer.httpURL + id <- DynamicServer.deploy { + Handler.webSocket { channel => + channel.receiveAll { + case ChannelEvent.UserEventTriggered(UserEvent.HandshakeComplete) => + ZIO + .foreachDiscard(1 to 100) { idx => + channel.send(Read(WebSocketFrame.text(idx.toString))) *> ZIO.sleep(100.millis) + } + .forkScoped + case _ => ZIO.unit } - }.toRoutes - } + }.toRoutes + } - queue1 <- Queue.unbounded[String] - queue2 <- Queue.unbounded[String] - _ <- ZIO.scoped { - Handler.webSocket { channel => - channel.receiveAll { - case Read(WebSocketFrame.Text(s)) => - println(s"read $s") - queue1.offer(s) - case _ => - ZIO.unit - }.onInterrupt(ZIO.debug("ws interrupted")) - }.connect(url, Headers(DynamicServer.APP_ID, id)) *> - queue1.take - .tap(s => - ZIO.debug(s"got $s") *> - queue2.offer(s), - ) - .repeatUntil(_ == "5") - .timeout(1.second) - .debug - } - result <- queue2.takeAll - } yield assertTrue(result == Chunk("1", "2", "3", "4", "5")) - }, - ) - - override def spec = suite("Server") { - serve.as(List(websocketSpec)) - } - .provideSome[DynamicServer & Server & Client](Scope.default) - .provideShared(DynamicServer.live, serverTestLayer, Client.default) @@ - diagnose(30.seconds) @@ withLiveClock @@ sequential + queue1 <- Queue.unbounded[String] + queue2 <- Queue.unbounded[String] + _ <- ZIO.scoped { + Handler.webSocket { channel => + channel.receiveAll { + case Read(WebSocketFrame.Text(s)) => + queue1.offer(s) + case _ => + ZIO.unit + } + }.connect(url, Headers(DynamicServer.APP_ID, id)) *> + queue1.take + .tap(s => queue2.offer(s)) + .repeatUntil(_ == "5") + .timeout(1.second) + } + result <- queue2.takeAll + } yield assertTrue(result == Chunk("1", "2", "3", "4", "5")) + }, + ) + + private val withStreamingEnabled = + suite("request streaming enabled")( + serve.as(websocketSpec), + ) + .provideSome[DynamicServer & Server & Client](Scope.default) + .provideShared( + DynamicServer.live, + ZLayer.succeed(Server.Config.default.onAnyOpenPort.enableRequestStreaming), + testNettyServerConfig, + Server.customized, + Client.default, + ) @@ sequential + + private val withStreamingDisabled = + suite("request streaming disabled")( + serve.as(websocketSpec), + ) + .provideSome[DynamicServer & Server & Client](Scope.default) + .provideShared(DynamicServer.live, serverTestLayer, Client.default) @@ sequential + + override def spec = suite("WebSocketSpec")( + withStreamingDisabled, + withStreamingEnabled, + ) @@ diagnose(30.seconds) @@ withLiveClock final class MessageCollector[A](ref: Ref[List[A]], promise: Promise[Nothing, Unit]) { def add(a: A, isDone: Boolean = false): UIO[Unit] = ref.update(_ :+ a) <* promise.succeed(()).when(isDone) From 12f0c263087354ea32cdf6ecb25613da5a04ce12 Mon Sep 17 00:00:00 2001 From: kyri-petrou <67301607+kyri-petrou@users.noreply.github.com> Date: Sun, 28 Jul 2024 10:28:12 +0300 Subject: [PATCH 58/58] Reduce verbosity of test suites (#2979) --- .../scala/zio/http/gen/scala/CodeGenSpec.scala | 2 -- .../scala/zio/http/ClientStreamingSpec.scala | 4 ++-- .../src/test/scala/zio/http/DualSSLSpec.scala | 2 +- .../scala/zio/http/MultipartMixedSpec.scala | 17 +++++++---------- .../zio/http/RequestStreamingServerSpec.scala | 14 ++++++-------- .../jvm/src/test/scala/zio/http/SSLSpec.scala | 2 +- .../scala/zio/http/StaticFileServerSpec.scala | 4 ++-- .../src/test/scala/zio/http/ZIOHttpSpec.scala | 2 +- .../scala/zio/http/endpoint/RoundtripSpec.scala | 2 +- .../http/internal/middlewares/AuthSpec.scala | 6 +++--- .../zio/http/internal/middlewares/WebSpec.scala | 3 +-- .../test/scala/zio/http/internal/package.scala | 2 +- .../netty/client/NettyConnectionPoolSpec.scala | 4 ++-- 13 files changed, 28 insertions(+), 36 deletions(-) diff --git a/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala b/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala index f7575e841f..be1ce84075 100644 --- a/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala +++ b/zio-http-gen/src/test/scala/zio/http/gen/scala/CodeGenSpec.scala @@ -182,7 +182,6 @@ object CodeGenSpec extends ZIOSpecDefault { val code = EndpointGen.fromOpenAPI(openAPI) val tempDir = Files.createTempDirectory("codegen") - println(tempDir) CodeGen.writeFiles(code, java.nio.file.Paths.get(tempDir.toString, "test"), "test", Some(scalaFmtPath)) fileShouldBe( @@ -240,7 +239,6 @@ object CodeGenSpec extends ZIOSpecDefault { val code = EndpointGen.fromOpenAPI(openAPI) val tempDir = Files.createTempDirectory("codegen") - println(tempDir) CodeGen.writeFiles(code, java.nio.file.Paths.get(tempDir.toString, "test"), "test", Some(scalaFmtPath)) fileShouldBe( diff --git a/zio-http/jvm/src/test/scala/zio/http/ClientStreamingSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ClientStreamingSpec.scala index f18338092d..e354b29614 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ClientStreamingSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ClientStreamingSpec.scala @@ -208,7 +208,7 @@ object ClientStreamingSpec extends HttpRunnableSpec { port <- server(streamingServer) client <- ZIO.service[Client] result <- check(Gen.int(1, N)) { chunkSize => - (for { + for { bytes <- Random.nextBytes(N) form = Form( Chunk( @@ -233,7 +233,7 @@ object ClientStreamingSpec extends HttpRunnableSpec { collected.map.contains("file"), collected.map.contains("foo"), collected.get("file").get.asInstanceOf[FormField.Binary].data == bytes, - )).tapErrorCause(cause => ZIO.debug(cause.prettyPrint)) + ) } } yield result } @@ samples(20) @@ TestAspect.ifEnvNotSet("CI"), diff --git a/zio-http/jvm/src/test/scala/zio/http/DualSSLSpec.scala b/zio-http/jvm/src/test/scala/zio/http/DualSSLSpec.scala index 18cf609579..8087f86c69 100644 --- a/zio-http/jvm/src/test/scala/zio/http/DualSSLSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/DualSSLSpec.scala @@ -50,7 +50,7 @@ object DualSSLSpec extends ZIOHttpSpec { includeClientCert = true, ) - val config = Server.Config.default.port(8073).ssl(sslConfigWithTrustedClient) + val config = Server.Config.default.port(8073).ssl(sslConfigWithTrustedClient).logWarningOnFatalError(false) val payload = Gen.alphaNumericStringBounded(10000, 20000) diff --git a/zio-http/jvm/src/test/scala/zio/http/MultipartMixedSpec.scala b/zio-http/jvm/src/test/scala/zio/http/MultipartMixedSpec.scala index 6192a7c028..8a6a4a97c9 100644 --- a/zio-http/jvm/src/test/scala/zio/http/MultipartMixedSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/MultipartMixedSpec.scala @@ -210,7 +210,7 @@ object MultipartMixedSpec extends ZIOHttpSpec { test("property") { check(gens.genTestCase) { testCase => - zio.Console.printLine(testCase) *> testCase.runTests + testCase.runTests } } @@ TestAspect.shrinks(0) @@ -248,8 +248,8 @@ object MultipartMixedSpec extends ZIOHttpSpec { gens.breaker.fixed(512), ) - val innerTests = inner.runTests.map(_.label("inner")).debug("inner") - val outerTests = outer.runTests.map(_.label("outer")).debug("outer") + val innerTests = inner.runTests.map(_.label("inner")) + val outerTests = outer.runTests.map(_.label("outer")) val nestedTests = { val expectedNested = Nested.Multi( @@ -262,7 +262,6 @@ object MultipartMixedSpec extends ZIOHttpSpec { outer.partsToNested.map { collected => zio.test.assert(collected)(Assertion.equalTo(expectedNested)).label("nestedTests") } - .debug("nestedTests") } (innerTests <*> outerTests <*> nestedTests).map { case (i, o, n) => @@ -308,8 +307,8 @@ object MultipartMixedSpec extends ZIOHttpSpec { gens.breaker.fixed(512), ) - val innerTests = inner.runTests.map(_.label("inner")).debug("inner") - val outerTests = outer.runTests.map(_.label("outer")).debug("outer") + val innerTests = inner.runTests.map(_.label("inner")) + val outerTests = outer.runTests.map(_.label("outer")) val nestedTests = { val expectedNested = Nested.Multi( @@ -322,7 +321,6 @@ object MultipartMixedSpec extends ZIOHttpSpec { outer.partsToNested.map { collected => zio.test.assert(collected)(Assertion.equalTo(expectedNested)).label("nestedTests") } - .debug("nestedTests") } (innerTests <*> outerTests <*> nestedTests).map { case (i, o, n) => @@ -364,8 +362,8 @@ object MultipartMixedSpec extends ZIOHttpSpec { gens.breaker.fixed(512), ) - val innerTests = inner.runTests.map(_.label("inner")).debug("inner") - val outerTests = outer.runTests.map(_.label("outer")).debug("outer") + val innerTests = inner.runTests.map(_.label("inner")) + val outerTests = outer.runTests.map(_.label("outer")) val nestedTests = { val expectedNested = Nested.Multi( @@ -379,7 +377,6 @@ object MultipartMixedSpec extends ZIOHttpSpec { outer.partsToNested.map { collected => zio.test.assert(collected)(Assertion.equalTo(expectedNested)).label("nestedTests") } - .debug("nestedTests") } (innerTests <*> outerTests <*> nestedTests).map { case (i, o, n) => diff --git a/zio-http/jvm/src/test/scala/zio/http/RequestStreamingServerSpec.scala b/zio-http/jvm/src/test/scala/zio/http/RequestStreamingServerSpec.scala index 69647acb2a..0a97d09f50 100644 --- a/zio-http/jvm/src/test/scala/zio/http/RequestStreamingServerSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/RequestStreamingServerSpec.scala @@ -78,16 +78,14 @@ object RequestStreamingServerSpec extends HttpRunnableSpec { val host = req.headers.get(Header.Host).get val newRequest = req.copy(url = req.url.path("/2").host(host.hostAddress).port(host.port.getOrElse(80))) - ZIO.debug(s"#1: got response, forwarding") *> - ZIO.serviceWithZIO[Client] { client => - client.request(newRequest) - } + ZIO.serviceWithZIO[Client] { client => + client.request(newRequest) + } }, Method.POST / "2" -> handler { (req: Request) => - ZIO.debug("#2: got response, collecting") *> - req.body.asChunk.map { body => - Response.text(body.length.toString) - } + req.body.asChunk.map { body => + Response.text(body.length.toString) + } }, ).sandbox val sizes = Chunk(0, 8192, 1024 * 1024) diff --git a/zio-http/jvm/src/test/scala/zio/http/SSLSpec.scala b/zio-http/jvm/src/test/scala/zio/http/SSLSpec.scala index 16cb728ef8..80bc8bbd53 100644 --- a/zio-http/jvm/src/test/scala/zio/http/SSLSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/SSLSpec.scala @@ -27,7 +27,7 @@ import zio.http.netty.client.NettyClientDriver object SSLSpec extends ZIOHttpSpec { val sslConfig = SSLConfig.fromResource("server.crt", "server.key") - val config = Server.Config.default.port(8073).ssl(sslConfig) + val config = Server.Config.default.port(8073).ssl(sslConfig).logWarningOnFatalError(false) val clientSSL1 = ClientSSLConfig.FromCertResource("server.crt") val clientSSL2 = ClientSSLConfig.FromCertResource("ss2.crt.pem") diff --git a/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala b/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala index 921e75b712..cddbd2525a 100644 --- a/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/StaticFileServerSpec.scala @@ -66,7 +66,7 @@ object StaticFileServerSpec extends HttpRunnableSpec { assertZIO(res)(equalTo("foo\nbar")) }, test("should have content-type") { - val res = fileOk.run().debug("fileOk").map(_.header(Header.ContentType)) + val res = fileOk.run().map(_.header(Header.ContentType)) assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.plain, charset = Some(Charsets.Utf8))))) }, test("should respond with empty if file not found") { @@ -121,7 +121,7 @@ object StaticFileServerSpec extends HttpRunnableSpec { assertZIO(res)(isSome(equalTo(Header.ContentType(MediaType.text.plain, charset = Some(Charsets.Utf8))))) }, test("should respond with empty if not found") { - val res = resourceNotFound.run().debug("not found").map(_.status) + val res = resourceNotFound.run().map(_.status) assertZIO(res)(equalTo(Status.NotFound)) }, ), diff --git a/zio-http/jvm/src/test/scala/zio/http/ZIOHttpSpec.scala b/zio-http/jvm/src/test/scala/zio/http/ZIOHttpSpec.scala index 2a70d0bd10..29cace4900 100644 --- a/zio-http/jvm/src/test/scala/zio/http/ZIOHttpSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/ZIOHttpSpec.scala @@ -5,5 +5,5 @@ import zio.test._ trait ZIOHttpSpec extends ZIOSpecDefault { override def aspects: Chunk[TestAspectPoly] = - Chunk(TestAspect.timeout(60.seconds), TestAspect.timed) + Chunk(TestAspect.timeout(60.seconds), TestAspect.timed, TestAspect.silentLogging, TestAspect.silent) } diff --git a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala index 65ba04bceb..aef2838f4c 100644 --- a/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/endpoint/RoundtripSpec.scala @@ -42,7 +42,7 @@ object RoundtripSpec extends ZIOHttpSpec { ZLayer.make[Server & Client & Scope]( Server.customized, ZLayer.succeed(Server.Config.default.onAnyOpenPort.enableRequestStreaming), - Client.customized.map(env => ZEnvironment(env.get @@ ZClientAspect.debug)), + Client.customized.map(env => ZEnvironment(env.get)), ClientDriver.shared, // NettyDriver.customized, ZLayer.succeed(NettyConfig.defaultWithFastShutdown), diff --git a/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/AuthSpec.scala b/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/AuthSpec.scala index 4b8179bf62..3242734c33 100644 --- a/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/AuthSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/AuthSpec.scala @@ -119,11 +119,11 @@ object AuthSpec extends ZIOHttpSpec with HttpAppTestExtensions { val app = secureRoutes for { s1 <- app.runZIO(Request.get(URL(Path.root / "a")).copy(headers = successBasicHeader)) - s1Body <- s1.body.asString.debug("s1Body") + s1Body <- s1.body.asString s2 <- app.runZIO(Request.get(URL(Path.root / "b" / "1")).copy(headers = successBasicHeader)) - s2Body <- s2.body.asString.debug("s2Body") + s2Body <- s2.body.asString s3 <- app.runZIO(Request.get(URL(Path.root / "c" / "name")).copy(headers = successBasicHeader)) - s3Body <- s3.body.asString.debug("s3Body") + s3Body <- s3.body.asString resultStatus = s1.status == Status.Ok && s2.status == Status.Ok && s3.status == Status.Ok resultBody = s1Body == "user" && s2Body == "for id: 1: user" && s3Body == "for name: name: user" } yield assertTrue(resultStatus, resultBody) diff --git a/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/WebSpec.scala b/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/WebSpec.scala index 42257b1e41..2237a3bd86 100644 --- a/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/WebSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/internal/middlewares/WebSpec.scala @@ -249,8 +249,7 @@ object WebSpec extends ZIOHttpSpec with HttpAppTestExtensions { self => for { url <- ZIO.fromEither(URL.decode(url)) - response <- app.runZIO(Request.get(url = url)).debug("response") - _ <- ZIO.debug(response.headerOrFail(Header.Location)) + response <- app.runZIO(Request.get(url = url)) } yield assertTrue( extractStatus(response) == status, response.header(Header.Location) == location.map(l => Header.Location(URL.decode(l).toOption.get)), diff --git a/zio-http/jvm/src/test/scala/zio/http/internal/package.scala b/zio-http/jvm/src/test/scala/zio/http/internal/package.scala index af499564de..c0d6d0ee20 100644 --- a/zio-http/jvm/src/test/scala/zio/http/internal/package.scala +++ b/zio-http/jvm/src/test/scala/zio/http/internal/package.scala @@ -25,7 +25,7 @@ import zio.http.netty.client.NettyClientDriver package object internal { val testServerConfig: ZLayer[Any, Nothing, Server.Config] = - ZLayer.succeed(Server.Config.default.onAnyOpenPort) + ZLayer.succeed(Server.Config.default.onAnyOpenPort.logWarningOnFatalError(false)) val testNettyServerConfig: ZLayer[Any, Nothing, NettyConfig] = ZLayer.succeed( diff --git a/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala b/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala index e8f841aa7d..532ba26aab 100644 --- a/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala +++ b/zio-http/jvm/src/test/scala/zio/http/netty/client/NettyConnectionPoolSpec.scala @@ -195,7 +195,7 @@ object NettyConnectionPoolSpec extends HttpRunnableSpec { }.provideSome[Client & Scope]( ZLayer(appKeepAliveEnabled.unit), DynamicServer.live, - ZLayer.succeed(Server.Config.default.idleTimeout(500.millis).onAnyOpenPort), + ZLayer.succeed(Server.Config.default.idleTimeout(500.millis).onAnyOpenPort.logWarningOnFatalError(false)), testNettyServerConfig, Server.customized, ) @@ withLiveClock @@ -211,7 +211,7 @@ object NettyConnectionPoolSpec extends HttpRunnableSpec { }.provideSome[Scope]( ZLayer(appKeepAliveEnabled.unit), DynamicServer.live, - ZLayer.succeed(Server.Config.default.idleTimeout(500.millis).onAnyOpenPort), + ZLayer.succeed(Server.Config.default.idleTimeout(500.millis).onAnyOpenPort.logWarningOnFatalError(false)), testNettyServerConfig, Server.customized, Client.live,