Skip to content

Commit 4d1bf18

Browse files
authored
feat: Add ssl-config module (#44)
BREAKING CHANGE: SslContextModule from jvm was replaced by the new one
1 parent 6cbc9a7 commit 4d1bf18

File tree

24 files changed

+174
-211
lines changed

24 files changed

+174
-211
lines changed

build.sbt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ lazy val root = project
3333
micrometerJmx,
3434
micrometerJmxPureConfig,
3535
micrometerStatsD,
36-
pureConfig
36+
pureConfig,
37+
sslConfig
3738
)
3839
.settings(
3940
name := "scala-server-toolkit",
@@ -63,7 +64,7 @@ lazy val bundleZioHttp4sBlaze = project
6364

6465
lazy val example = project
6566
.in(file("example"))
66-
.dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig)
67+
.dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig, sslConfig)
6768
.enablePlugins(MdocPlugin)
6869
.settings(commonSettings)
6970
.settings(
@@ -78,7 +79,6 @@ lazy val example = project
7879

7980
lazy val http4sClientBlaze = project
8081
.in(file("http4s-client-blaze"))
81-
.dependsOn(jvm)
8282
.settings(commonSettings)
8383
.settings(
8484
name := "sst-http4s-client-blaze",
@@ -197,5 +197,16 @@ lazy val pureConfig = project
197197
libraryDependencies += Dependencies.pureConfig
198198
)
199199

200+
lazy val sslConfig = project
201+
.in(file("ssl-config"))
202+
.settings(commonSettings)
203+
.settings(
204+
name := "sst-ssl-config",
205+
libraryDependencies ++= Seq(
206+
Dependencies.slf4jApi,
207+
Dependencies.sslConfig
208+
)
209+
)
210+
200211
addCommandAlias("check", "; scalafmtSbtCheck; scalafmtCheckAll; compile:scalafix --check; test:scalafix --check")
201212
addCommandAlias("fix", "; scalafmtSbt; scalafmtAll; compile:scalafix; test:scalafix; example/mdoc")

docs/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* [Module JVM](jvm.md)
99
* [Modules Micrometer](micrometer.md)
1010
* [Module PureConfig](pureconfig.md)
11+
* [Module SSL Config](ssl-config.md)
1112

1213
## Getting Started
1314

docs/jvm.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
Module `sst-jvm` provides pure implementations of different JVM-related utilities:
88

99
* creation of thread pools,
10-
* initialization of SSL context,
11-
* standard in/out/err, random number generation,
12-
* and more.
10+
* standard in/out/err,
11+
* and random number generation.
1312

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

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

docs/micrometer.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ import zio.interop.catz.implicits._
2424
import zio.Task
2525

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

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

3333
for {
@@ -48,10 +48,10 @@ for {
4848
// res0: Resource[Task, Server[Task]] = Bind(
4949
// Bind(
5050
// Bind(
51-
// Suspend(zio.ZIO$FlatMap@1c5d376c),
52-
// com.avast.sst.jvm.execution.ExecutorModule$$$Lambda$1652/1064414847@51c6e775
51+
// Suspend(zio.ZIO$FlatMap@34ede267),
52+
// com.avast.sst.jvm.execution.ExecutorModule$$$Lambda$1652/815927219@6b92a0d1
5353
// ),
54-
// cats.effect.Resource$$Lambda$1653/1530060977@5feff876
54+
// cats.effect.Resource$$Lambda$1653/888293905@51e0f2eb
5555
// ),
5656
// <function1>
5757
// )

docs/ssl-config.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Module SSL Config
2+
3+
[![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/)
4+
5+
`libraryDependencies += "com.avast" %% "sst-ssl-config" % "<VERSION>"`
6+
7+
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)
8+
library to do so which means that this module is different than others and receives directly `com.typesafe.config.Config` instead of
9+
configuration case classes. See the [documentation of SSL Config](https://lightbend.github.io/ssl-config) for more information.
10+
11+
Loading of SSL context is side-effectful so it is wrapped in `F` which is `Sync`.
12+
13+
```scala
14+
import com.avast.sst.ssl.SslContextModule
15+
import com.typesafe.config.ConfigFactory
16+
import zio.interop.catz._
17+
import zio.Task
18+
19+
val config = ConfigFactory.load().getConfig("ssl-config")
20+
val sslContext = SslContextModule.make[Task](config)
21+
```
22+

example/mdoc/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* [Module JVM](jvm.md)
99
* [Modules Micrometer](micrometer.md)
1010
* [Module PureConfig](pureconfig.md)
11+
* [Module SSL Config](ssl-config.md)
1112

1213
## Getting Started
1314

example/mdoc/jvm.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66

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

9-
* creation of thread pools,
10-
* initialization of SSL context,
11-
* standard in/out/err, random number generation,
12-
* and more.
9+
* creation of thread pools,
10+
* standard in/out/err,
11+
* and random number generation.
1312

1413
```scala mdoc
1514
import com.avast.sst.jvm.system.console.ConsoleModule

example/mdoc/ssl-config.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Module SSL Config
2+
3+
[![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/)
4+
5+
`libraryDependencies += "com.avast" %% "sst-ssl-config" % "<VERSION>"`
6+
7+
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)
8+
library to do so which means that this module is different than others and receives directly `com.typesafe.config.Config` instead of
9+
configuration case classes. See the [documentation of SSL Config](https://lightbend.github.io/ssl-config) for more information.
10+
11+
Loading of SSL context is side-effectful so it is wrapped in `F` which is `Sync`.
12+
13+
```scala mdoc:silent
14+
import com.avast.sst.ssl.SslContextModule
15+
import com.typesafe.config.ConfigFactory
16+
import zio.interop.catz._
17+
import zio.Task
18+
19+
val config = ConfigFactory.load().getConfig("ssl-config")
20+
val sslContext = SslContextModule.make[Task](config)
21+
```

http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.avast.sst.http4s.client.pureconfig
22

33
import cats.syntax.either._
44
import com.avast.sst.http4s.client.Http4sBlazeClientConfig
5-
import com.avast.sst.jvm.pureconfig.implicits._
65
import org.http4s.client.blaze.ParserMode
76
import org.http4s.headers.`User-Agent`
87
import pureconfig.ConfigReader

http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client/Http4sBlazeClientConfig.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.avast.sst.http4s.client
22

33
import java.util.concurrent.TimeUnit
44

5-
import com.avast.sst.jvm.ssl.SslContextConfig
65
import org.http4s.BuildInfo
76
import org.http4s.client.blaze.ParserMode
87
import org.http4s.client.defaults
@@ -19,7 +18,6 @@ final case class Http4sBlazeClientConfig(
1918
maxTotalConnections: Int = 10,
2019
maxWaitQueueLimit: Int = 256,
2120
maxConnectionsPerRequestkey: Int = 256,
22-
sslContext: Option[SslContextConfig] = None,
2321
checkEndpointIdentification: Boolean = true,
2422
maxResponseLineSize: Int = 4 * 1024,
2523
maxHeaderLength: Int = 40 * 1024,
Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.avast.sst.http4s.client
22

3-
import cats.Traverse
4-
import cats.effect.{ConcurrentEffect, Resource, Sync}
5-
import cats.implicits._
6-
import com.avast.sst.jvm.ssl.{SslContextConfig, SslContextModule}
3+
import cats.effect.{ConcurrentEffect, Resource}
74
import javax.net.ssl.SSLContext
85
import org.http4s.client.Client
96
import org.http4s.client.blaze.BlazeClientBuilder
@@ -17,34 +14,27 @@ object Http4sBlazeClientModule {
1714
*
1815
* @param executionContext callback handling [[scala.concurrent.ExecutionContext]]
1916
*/
20-
def make[F[_]: ConcurrentEffect](config: Http4sBlazeClientConfig, executionContext: ExecutionContext): Resource[F, Client[F]] = {
21-
for {
22-
maybeSslContext <- Resource.liftF(sslContext(config.sslContext))
23-
client <- {
24-
val builder = BlazeClientBuilder[F](executionContext)
25-
.withResponseHeaderTimeout(config.responseHeaderTimeout)
26-
.withIdleTimeout(config.idleTimeout)
27-
.withRequestTimeout(config.requestTimeout)
28-
.withConnectTimeout(config.connectTimeout)
29-
.withUserAgent(config.userAgent)
30-
.withMaxTotalConnections(config.maxTotalConnections)
31-
.withMaxWaitQueueLimit(config.maxWaitQueueLimit)
32-
.withMaxConnectionsPerRequestKey(Function.const(config.maxConnectionsPerRequestkey))
33-
.withCheckEndpointAuthentication(config.checkEndpointIdentification)
34-
.withMaxResponseLineSize(config.maxResponseLineSize)
35-
.withMaxHeaderLength(config.maxHeaderLength)
36-
.withMaxChunkSize(config.maxChunkSize)
37-
.withChunkBufferMaxSize(config.chunkBufferMaxSize)
38-
.withParserMode(config.parserMode)
39-
.withBufferSize(config.bufferSize)
17+
def make[F[_]: ConcurrentEffect](config: Http4sBlazeClientConfig,
18+
executionContext: ExecutionContext,
19+
sslContext: Option[SSLContext] = None): Resource[F, Client[F]] = {
20+
val builder = BlazeClientBuilder[F](executionContext)
21+
.withResponseHeaderTimeout(config.responseHeaderTimeout)
22+
.withIdleTimeout(config.idleTimeout)
23+
.withRequestTimeout(config.requestTimeout)
24+
.withConnectTimeout(config.connectTimeout)
25+
.withUserAgent(config.userAgent)
26+
.withMaxTotalConnections(config.maxTotalConnections)
27+
.withMaxWaitQueueLimit(config.maxWaitQueueLimit)
28+
.withMaxConnectionsPerRequestKey(Function.const(config.maxConnectionsPerRequestkey))
29+
.withCheckEndpointAuthentication(config.checkEndpointIdentification)
30+
.withMaxResponseLineSize(config.maxResponseLineSize)
31+
.withMaxHeaderLength(config.maxHeaderLength)
32+
.withMaxChunkSize(config.maxChunkSize)
33+
.withChunkBufferMaxSize(config.chunkBufferMaxSize)
34+
.withParserMode(config.parserMode)
35+
.withBufferSize(config.bufferSize)
4036

41-
maybeSslContext.map(builder.withSslContext).getOrElse(builder).resource
42-
}
43-
} yield client
44-
}
45-
46-
private def sslContext[F[_]: Sync](maybeSslContextConfig: Option[SslContextConfig]): F[Option[SSLContext]] = {
47-
Traverse[Option].traverse(maybeSslContextConfig)(SslContextModule.make[F])
37+
sslContext.map(builder.withSslContext).getOrElse(builder).resource
4838
}
4939

5040
}

jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/ConfigReaders.scala

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.avast.sst.jvm.pureconfig
22

33
import com.avast.sst.jvm.execution.ForkJoinPoolConfig.TaskPeekingMode
44
import com.avast.sst.jvm.execution.{ForkJoinPoolConfig, ThreadPoolExecutorConfig}
5-
import com.avast.sst.jvm.ssl.{KeyStoreConfig, KeyStoreType, Protocol, SslContextConfig}
65
import pureconfig.ConfigReader
76
import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader}
87

@@ -14,12 +13,4 @@ trait ConfigReaders {
1413

1514
implicit val forkJoinPoolConfigReader: ConfigReader[ForkJoinPoolConfig] = deriveReader
1615

17-
implicit val sslProtocolReader: ConfigReader[Protocol] = deriveEnumerationReader
18-
19-
implicit val keyStoreTypeReader: ConfigReader[KeyStoreType] = deriveEnumerationReader
20-
21-
implicit val keyStoreConfigReader: ConfigReader[KeyStoreConfig] = deriveReader
22-
23-
implicit val sslContextConfigReader: ConfigReader[SslContextConfig] = deriveReader
24-
2516
}

jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreConfig.scala

Lines changed: 0 additions & 5 deletions
This file was deleted.

jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreType.scala

Lines changed: 0 additions & 18 deletions
This file was deleted.

jvm/src/main/scala/com/avast/sst/jvm/ssl/Protocol.scala

Lines changed: 0 additions & 18 deletions
This file was deleted.

jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextConfig.scala

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)