scamper.http.server

Members list

Type members

Classlikes

Tags lifecycle hook as a critical service.

Tags lifecycle hook as a critical service.

Server creation is halted if a critical service fails to process the start event.

Attributes

See also
Supertypes
class Object
trait Matchable
class Any
Self type
@FunctionalInterface
trait ErrorHandler

Defines utility for handling error during request processing.

Defines utility for handling error during request processing.

Attributes

Companion
object
Supertypes
class Object
trait Matchable
class Any
object ErrorHandler

Provides ErrorHandler utilities.

Provides ErrorHandler utilities.

Attributes

Companion
trait
Supertypes
class Object
trait Matchable
class Any
Self type
trait HttpServer extends AutoCloseable

Defines handle to server instance.

Defines handle to server instance.

Attributes

See also
Companion
object
Supertypes
trait AutoCloseable
class Object
trait Matchable
class Any
object HttpServer

Provides factory for HttpServer.

Provides factory for HttpServer.

Attributes

Companion
trait
Supertypes
class Object
trait Matchable
class Any
Self type
HttpServer.type
enum LifecycleEvent(server: HttpServer) extends EventObject

Defines lifecycle event.

Defines lifecycle event.

Attributes

Supertypes
trait Enum
trait Product
trait Equals
class EventObject
trait Serializable
class Object
trait Matchable
class Any
Show all
Known subtypes
case Start
case Stop
class LifecycleException(message: String, cause: Throwable) extends RuntimeException

Indicates lifecycle exception.

Indicates lifecycle exception.

Value parameters

cause

underlying cause

message

detail message

Attributes

Constructor

Creates exception with supplied message and cause.

Supertypes
class RuntimeException
class Exception
class Throwable
trait Serializable
class Object
trait Matchable
class Any
Show all
@FunctionalInterface
trait LifecycleHook extends EventListener

Defines lifecycle hook.

Defines lifecycle hook.

Attributes

See also
Supertypes
trait EventListener
class Object
trait Matchable
class Any
case class ParameterNotConvertible(name: String, value: String) extends HttpException

Indicates parameter cannot be converted.

Indicates parameter cannot be converted.

Attributes

Supertypes
trait Product
trait Equals
class RuntimeException
class Exception
class Throwable
trait Serializable
class Object
trait Matchable
class Any
Show all
case class ParameterNotFound(name: String) extends HttpException

Indicates parameter is not found.

Indicates parameter is not found.

Attributes

Supertypes
trait Product
trait Equals
class RuntimeException
class Exception
class Throwable
trait Serializable
class Object
trait Matchable
class Any
Show all

Defines access to path parameters.

Defines access to path parameters.

Attributes

Supertypes
class Object
trait Matchable
class Any
@FunctionalInterface

Defines handler for incoming request.

Defines handler for incoming request.

Attributes

Companion
object
Supertypes
class Object
trait Matchable
class Any

Provides RequestHandler utilities.

Provides RequestHandler utilities.

Attributes

Companion
trait
Supertypes
class Object
trait Matchable
class Any
Self type
case class ResponseAborted(message: String) extends HttpException

Indicates response was aborted.

Indicates response was aborted.

A RequestHandler throws ResponseAborted if no response should be sent for the request.

Attributes

Supertypes
trait Product
trait Equals
class RuntimeException
class Exception
class Throwable
trait Serializable
class Object
trait Matchable
class Any
Show all
@FunctionalInterface

Defines filter for outgoing response.

Defines filter for outgoing response.

Attributes

Companion
object
Supertypes
class Object
trait Matchable
class Any

Provides ResponseFilter utilities.

Provides ResponseFilter utilities.

Attributes

Companion
trait
Supertypes
class Object
trait Matchable
class Any
Self type
trait Router

Defines router for request handling.

Defines router for request handling.

import scala.language.implicitConversions

import scamper.http.ResponseStatus.Registry.{ BadRequest, NotFound, Ok }
import scamper.http.server.{ ParameterNotConvertible, ServerApplication, toServerHttpRequest }
import scamper.http.stringToEntity

val app = ServerApplication()

// Mount router to /api
app.route("/api") { router =>
 val messages = Map(1 -> "Hello, world!", 2 -> "Goodbye, cruel world!")

 // Map handler to /api/messages
 router.get("/messages") { req =>
   Ok(messages.mkString("\r\n"))
 }

 // Map handler to /api/messages/:id
 router.get("/messages/:id") { req =>
   val id = req.pathParams.getInt("id")
   messages.get(id)
    .map(Ok(_))
    .getOrElse(NotFound())
 }

 router.recover { req =>
   { case _: ParameterNotConvertible => BadRequest(req.target.toString) }
 }
}

Attributes

Supertypes
class Object
trait Matchable
class Any
Known subtypes
@FunctionalInterface

Defines router application.

Defines router application.

Attributes

Supertypes
class Object
trait Matchable
class Any
class ServerApplication extends Router

Defines server application for creating HttpServer.

Defines server application for creating HttpServer.

Default Configuration

The initial application is constructed with the following default configuration:

Key Value
backlogSize 50
poolSize Runtime.getRuntime().availableProcessors()
queueSize Runtime.getRuntime().availableProcessors() * 4
bufferSize 8192
readTimeout 5000
headerLimit 100
keepAlive (Not configured)
secure (Not configured)
trigger (Not configured)
incoming (Not configured)
outgoing (Not configured)
recover (Sends 500 Internal Server Error)

Building HTTP Server

ServerApplication is a mutable structure. With each applied change, the application is modified and returned. After the desired configuration is applied, a server is created using a factory method.

import java.io.File

import scala.language.implicitConversions

import scamper.http.{ BodyParser, stringToEntity }
import scamper.http.ResponseStatus.Registry.{ NotFound, NoContent, Ok }
import scamper.http.server.{ *, given }

// Get server application
val app = ServerApplication()

// Add request handler to log all requests
app.incoming { req =>
 println(req.startLine)
 req
}

// Add request handler for GET requests at specified path
app.get("/about") { req =>
 Ok("This server is powered by Scamper.")
}

// Add request handler for PUT requests at specified path
app.put("/data/:id") { req =>
 def update(id: Int, data: String): Boolean = ???

 given BodyParser[String] = BodyParser.string()

 // Get path parameter
 val id = req.pathParams.getInt("id")

 update(id, req.as[String]) match
   case true  => NoContent()
   case false => NotFound()
}

// Serve files from file directory
app.files("/main", File("/path/to/public"))

// Gzip response body if not empty
app.outgoing { res =>
 res.body.isKnownEmpty match
   case true  => res
   case false => res.setGzipContentEncoding()
}

// Create server
val server = app.toHttpServer(8080)

try
 printf("Host: %s%n", server.host)
 printf("Port: %d%n", server.port)

 // Run server for 60 seconds
 Thread.sleep(60 * 1000)
finally
 // Close server when done
 server.close()

Attributes

Supertypes
trait Router
class Object
trait Matchable
class Any
final class ServerHttpMessage(message: HttpMessage) extends AnyVal

Adds server extensions to HttpMessage.

Adds server extensions to HttpMessage.

Attributes

Supertypes
class AnyVal
trait Matchable
class Any
final class ServerHttpRequest(request: HttpRequest) extends AnyVal

Adds server extensions to HttpRequest.

Adds server extensions to HttpRequest.

Attributes

Supertypes
class AnyVal
trait Matchable
class Any
final class ServerHttpResponse(response: HttpResponse) extends AnyVal

Adds server extensions to HttpResponse.

Adds server extensions to HttpResponse.

Attributes

Supertypes
class AnyVal
trait Matchable
class Any

Provides factory for upgrading request to WebSocket connection.

Provides factory for upgrading request to WebSocket connection.

import scamper.http.HttpRequest
import scamper.http.ResponseStatus.Registry.Unauthorized
import scamper.http.server.{ ServerApplication, WebSocketUpgrade }

val app = ServerApplication()

app.get("/chat/:roomId") { req =>
 def authorize(req: HttpRequest): Boolean = ...

 authorize(req) match
   case true  =>
     WebSocketUpgrade(req) { session =>
       // Set up session
       ...
       session.open()
     }
   case false => Unauthorized()
}

Attributes

Supertypes
class Object
trait Matchable
class Any
Self type

Givens

Givens

Adds server extensions to HttpMessage.

Adds server extensions to HttpMessage.

Attributes

Adds server extensions to HttpRequest.

Adds server extensions to HttpRequest.

Attributes

Adds server extensions to HttpResponse.

Adds server extensions to HttpResponse.

Attributes