Skip to content

feat: Add ssl-config module #44

New issue

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

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

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ lazy val root = project
micrometerJmx,
micrometerJmxPureConfig,
micrometerStatsD,
pureConfig
pureConfig,
sslConfig
)
.settings(
name := "scala-server-toolkit",
Expand Down Expand Up @@ -63,7 +64,7 @@ lazy val bundleZioHttp4sBlaze = project

lazy val example = project
.in(file("example"))
.dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig)
.dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig, sslConfig)
.enablePlugins(MdocPlugin)
.settings(commonSettings)
.settings(
Expand All @@ -78,7 +79,6 @@ lazy val example = project

lazy val http4sClientBlaze = project
.in(file("http4s-client-blaze"))
.dependsOn(jvm)
.settings(commonSettings)
.settings(
name := "sst-http4s-client-blaze",
Expand Down Expand Up @@ -197,5 +197,16 @@ lazy val pureConfig = project
libraryDependencies += Dependencies.pureConfig
)

lazy val sslConfig = project
.in(file("ssl-config"))
.settings(commonSettings)
.settings(
name := "sst-ssl-config",
libraryDependencies ++= Seq(
Dependencies.slf4jApi,
Dependencies.sslConfig
)
)

addCommandAlias("check", "; scalafmtSbtCheck; scalafmtCheckAll; compile:scalafix --check; test:scalafix --check")
addCommandAlias("fix", "; scalafmtSbt; scalafmtAll; compile:scalafix; test:scalafix; example/mdoc")
1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
* [Module JVM](jvm.md)
* [Modules Micrometer](micrometer.md)
* [Module PureConfig](pureconfig.md)
* [Module SSL Config](ssl-config.md)

## Getting Started

Expand Down
11 changes: 5 additions & 6 deletions docs/jvm.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
Module `sst-jvm` provides pure implementations of different JVM-related utilities:

* creation of thread pools,
* initialization of SSL context,
* standard in/out/err, random number generation,
* and more.
* standard in/out/err,
* and random number generation.

```scala
import com.avast.sst.jvm.system.console.ConsoleModule
Expand All @@ -24,11 +23,11 @@ val program = for {
console = ConsoleModule.make[Task]
_ <- console.printLine(s"Random number: $randomNumber")
} yield ()
// program: zio.ZIO[Any, Throwable, Unit] = zio.ZIO$FlatMap@5e8684a3
// program: zio.ZIO[Any, Throwable, Unit] = zio.ZIO$FlatMap@51e14cb6

val runtime = new DefaultRuntime {} // this is just needed in example
// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@590ab84 // this is just needed in example
// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@715523b8 // this is just needed in example
runtime.unsafeRun(program)
// Random number: -1698562956
// Random number: 1552919996
```

10 changes: 5 additions & 5 deletions docs/micrometer.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ import zio.interop.catz.implicits._
import zio.Task

implicit val runtime = new DefaultRuntime {} // this is just needed in example
// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@cda144a // this is just needed in example
// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@690677de // this is just needed in example

val dsl = Http4sDsl[Task] // this is just needed in example
// dsl: Http4sDsl[Task] = org.http4s.dsl.Http4sDsl$$anon$1@7a71ebf1 // this is just needed in example
// dsl: Http4sDsl[Task] = org.http4s.dsl.Http4sDsl$$anon$1@446f3a53 // this is just needed in example
import dsl._

for {
Expand All @@ -48,10 +48,10 @@ for {
// res0: Resource[Task, Server[Task]] = Bind(
// Bind(
// Bind(
// Suspend(zio.ZIO$FlatMap@1c5d376c),
// com.avast.sst.jvm.execution.ExecutorModule$$$Lambda$1652/1064414847@51c6e775
// Suspend(zio.ZIO$FlatMap@34ede267),
// com.avast.sst.jvm.execution.ExecutorModule$$$Lambda$1652/815927219@6b92a0d1
// ),
// cats.effect.Resource$$Lambda$1653/1530060977@5feff876
// cats.effect.Resource$$Lambda$1653/888293905@51e0f2eb
// ),
// <function1>
// )
Expand Down
22 changes: 22 additions & 0 deletions docs/ssl-config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Module SSL Config

[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-ssl-config_2.12)](https://repo1.maven.org/maven2/com/avast/sst-ssl-config_2.12/)

`libraryDependencies += "com.avast" %% "sst-ssl-config" % "<VERSION>"`

This module allows you to create SSL context (`javax.net.ssl.SSLContext`) from a configuration file. It uses [SSL Config](https://github.com/lightbend/ssl-config)
library to do so which means that this module is different than others and receives directly `com.typesafe.config.Config` instead of
configuration case classes. See the [documentation of SSL Config](https://lightbend.github.io/ssl-config) for more information.

Loading of SSL context is side-effectful so it is wrapped in `F` which is `Sync`.

```scala
import com.avast.sst.ssl.SslContextModule
import com.typesafe.config.ConfigFactory
import zio.interop.catz._
import zio.Task

val config = ConfigFactory.load().getConfig("ssl-config")
val sslContext = SslContextModule.make[Task](config)
```

1 change: 1 addition & 0 deletions example/mdoc/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
* [Module JVM](jvm.md)
* [Modules Micrometer](micrometer.md)
* [Module PureConfig](pureconfig.md)
* [Module SSL Config](ssl-config.md)

## Getting Started

Expand Down
7 changes: 3 additions & 4 deletions example/mdoc/jvm.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@

Module `sst-jvm` provides pure implementations of different JVM-related utilities:

* creation of thread pools,
* initialization of SSL context,
* standard in/out/err, random number generation,
* and more.
* creation of thread pools,
* standard in/out/err,
* and random number generation.

```scala mdoc
import com.avast.sst.jvm.system.console.ConsoleModule
Expand Down
21 changes: 21 additions & 0 deletions example/mdoc/ssl-config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Module SSL Config

[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-ssl-config_2.12)](https://repo1.maven.org/maven2/com/avast/sst-ssl-config_2.12/)

`libraryDependencies += "com.avast" %% "sst-ssl-config" % "<VERSION>"`

This module allows you to create SSL context (`javax.net.ssl.SSLContext`) from a configuration file. It uses [SSL Config](https://github.com/lightbend/ssl-config)
library to do so which means that this module is different than others and receives directly `com.typesafe.config.Config` instead of
configuration case classes. See the [documentation of SSL Config](https://lightbend.github.io/ssl-config) for more information.

Loading of SSL context is side-effectful so it is wrapped in `F` which is `Sync`.

```scala mdoc:silent
import com.avast.sst.ssl.SslContextModule
import com.typesafe.config.ConfigFactory
import zio.interop.catz._
import zio.Task

val config = ConfigFactory.load().getConfig("ssl-config")
val sslContext = SslContextModule.make[Task](config)
```
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.avast.sst.http4s.client.pureconfig

import cats.syntax.either._
import com.avast.sst.http4s.client.Http4sBlazeClientConfig
import com.avast.sst.jvm.pureconfig.implicits._
import org.http4s.client.blaze.ParserMode
import org.http4s.headers.`User-Agent`
import pureconfig.ConfigReader
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.avast.sst.http4s.client

import java.util.concurrent.TimeUnit

import com.avast.sst.jvm.ssl.SslContextConfig
import org.http4s.BuildInfo
import org.http4s.client.blaze.ParserMode
import org.http4s.client.defaults
Expand All @@ -19,7 +18,6 @@ final case class Http4sBlazeClientConfig(
maxTotalConnections: Int = 10,
maxWaitQueueLimit: Int = 256,
maxConnectionsPerRequestkey: Int = 256,
sslContext: Option[SslContextConfig] = None,
checkEndpointIdentification: Boolean = true,
maxResponseLineSize: Int = 4 * 1024,
maxHeaderLength: Int = 40 * 1024,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.avast.sst.http4s.client

import cats.Traverse
import cats.effect.{ConcurrentEffect, Resource, Sync}
import cats.implicits._
import com.avast.sst.jvm.ssl.{SslContextConfig, SslContextModule}
import cats.effect.{ConcurrentEffect, Resource}
import javax.net.ssl.SSLContext
import org.http4s.client.Client
import org.http4s.client.blaze.BlazeClientBuilder
Expand All @@ -17,34 +14,27 @@ object Http4sBlazeClientModule {
*
* @param executionContext callback handling [[scala.concurrent.ExecutionContext]]
*/
def make[F[_]: ConcurrentEffect](config: Http4sBlazeClientConfig, executionContext: ExecutionContext): Resource[F, Client[F]] = {
for {
maybeSslContext <- Resource.liftF(sslContext(config.sslContext))
client <- {
val builder = BlazeClientBuilder[F](executionContext)
.withResponseHeaderTimeout(config.responseHeaderTimeout)
.withIdleTimeout(config.idleTimeout)
.withRequestTimeout(config.requestTimeout)
.withConnectTimeout(config.connectTimeout)
.withUserAgent(config.userAgent)
.withMaxTotalConnections(config.maxTotalConnections)
.withMaxWaitQueueLimit(config.maxWaitQueueLimit)
.withMaxConnectionsPerRequestKey(Function.const(config.maxConnectionsPerRequestkey))
.withCheckEndpointAuthentication(config.checkEndpointIdentification)
.withMaxResponseLineSize(config.maxResponseLineSize)
.withMaxHeaderLength(config.maxHeaderLength)
.withMaxChunkSize(config.maxChunkSize)
.withChunkBufferMaxSize(config.chunkBufferMaxSize)
.withParserMode(config.parserMode)
.withBufferSize(config.bufferSize)
def make[F[_]: ConcurrentEffect](config: Http4sBlazeClientConfig,
executionContext: ExecutionContext,
sslContext: Option[SSLContext] = None): Resource[F, Client[F]] = {
val builder = BlazeClientBuilder[F](executionContext)
.withResponseHeaderTimeout(config.responseHeaderTimeout)
.withIdleTimeout(config.idleTimeout)
.withRequestTimeout(config.requestTimeout)
.withConnectTimeout(config.connectTimeout)
.withUserAgent(config.userAgent)
.withMaxTotalConnections(config.maxTotalConnections)
.withMaxWaitQueueLimit(config.maxWaitQueueLimit)
.withMaxConnectionsPerRequestKey(Function.const(config.maxConnectionsPerRequestkey))
.withCheckEndpointAuthentication(config.checkEndpointIdentification)
.withMaxResponseLineSize(config.maxResponseLineSize)
.withMaxHeaderLength(config.maxHeaderLength)
.withMaxChunkSize(config.maxChunkSize)
.withChunkBufferMaxSize(config.chunkBufferMaxSize)
.withParserMode(config.parserMode)
.withBufferSize(config.bufferSize)

maybeSslContext.map(builder.withSslContext).getOrElse(builder).resource
}
} yield client
}

private def sslContext[F[_]: Sync](maybeSslContextConfig: Option[SslContextConfig]): F[Option[SSLContext]] = {
Traverse[Option].traverse(maybeSslContextConfig)(SslContextModule.make[F])
sslContext.map(builder.withSslContext).getOrElse(builder).resource
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.avast.sst.jvm.pureconfig

import com.avast.sst.jvm.execution.ForkJoinPoolConfig.TaskPeekingMode
import com.avast.sst.jvm.execution.{ForkJoinPoolConfig, ThreadPoolExecutorConfig}
import com.avast.sst.jvm.ssl.{KeyStoreConfig, KeyStoreType, Protocol, SslContextConfig}
import pureconfig.ConfigReader
import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader}

Expand All @@ -14,12 +13,4 @@ trait ConfigReaders {

implicit val forkJoinPoolConfigReader: ConfigReader[ForkJoinPoolConfig] = deriveReader

implicit val sslProtocolReader: ConfigReader[Protocol] = deriveEnumerationReader

implicit val keyStoreTypeReader: ConfigReader[KeyStoreType] = deriveEnumerationReader

implicit val keyStoreConfigReader: ConfigReader[KeyStoreConfig] = deriveReader

implicit val sslContextConfigReader: ConfigReader[SslContextConfig] = deriveReader

}
5 changes: 0 additions & 5 deletions jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreConfig.scala

This file was deleted.

18 changes: 0 additions & 18 deletions jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreType.scala

This file was deleted.

18 changes: 0 additions & 18 deletions jvm/src/main/scala/com/avast/sst/jvm/ssl/Protocol.scala

This file was deleted.

10 changes: 0 additions & 10 deletions jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextConfig.scala

This file was deleted.

Loading