Skip to content

Commit 87326b9

Browse files
committed
Many small improvements
1 parent d6cbafb commit 87326b9

File tree

5 files changed

+49
-25
lines changed

5 files changed

+49
-25
lines changed

pom.xml

+1-7
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,8 @@
5454
<dependency>
5555
<groupId>com.typesafe.akka</groupId>
5656
<artifactId>akka-testkit</artifactId>
57-
<scope>test</scope>
5857
<version>${akka.version}</version>
59-
</dependency>
60-
61-
<dependency>
62-
<groupId>ch.qos.logback</groupId>
63-
<artifactId>logback-classic</artifactId>
64-
<version>1.0.3</version>
58+
<scope>test</scope>
6559
</dependency>
6660

6761
<dependency>

src/main/scala/com/thenewmotion/akka/http/AsyncActor.scala

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.thenewmotion.akka.http
22

3-
import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
3+
44
import akka.actor._
55
import akka.util.duration._
6-
import javax.servlet.{ServletRequest, ServletResponse, AsyncContext}
76
import Endpoints._
87
import Async._
8+
import ext.Response
9+
import javax.servlet.{ServletRequest, ServletResponse, AsyncContext}
10+
import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
11+
import HttpServletResponse.SC_INTERNAL_SERVER_ERROR
12+
913

1014
/**
1115
* @author Yaroslav Klymko
@@ -55,8 +59,8 @@ class AsyncActor extends Actor with LoggingFSM[State, Data] {
5559
val res = async.getResponse
5660
try doComplete(completing(res)) catch {
5761
case e: Exception =>
58-
log.error("Exception while responding for '{}'", url)
59-
res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)
62+
log.error(e, "Exception while responding for '{}'", url)
63+
res.sendError(SC_INTERNAL_SERVER_ERROR, e.getMessage)
6064
doComplete(DummyCallback)
6165
}
6266
stop()
@@ -79,11 +83,7 @@ class AsyncActor extends Actor with LoggingFSM[State, Data] {
7983
def InternalErrorOnException(url: String): PartialFunction[Throwable, Unit] = {
8084
case e: Exception =>
8185
log.error(e, "Exception while serving request for '{}'", url)
82-
val internalError = (res: HttpServletResponse) => {
83-
res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)
84-
DummyCallback
85-
}
86-
self ! Complete(internalError)
86+
self ! Complete(Response(SC_INTERNAL_SERVER_ERROR, e.getMessage))
8787
}
8888

8989
def safeProcess(endpoint: Processing, async: Context): State = {

src/main/scala/com/thenewmotion/akka/http/Endpoints.scala

+4-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.thenewmotion.akka.http
22

33
import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
44
import akka.actor.{ActorRef, ActorLogging, Actor}
5+
import ext.Response
56

67
/**
78
* @author Yaroslav Klymko
@@ -17,14 +18,9 @@ object Endpoints {
1718
type Processing = (HttpServletRequest => Completing)
1819
val DummyProcessing: Processing = (_ => DummyCompleting)
1920

20-
val NotFound: Processing = (req: HttpServletRequest) => (res: HttpServletResponse) => {
21-
res.setStatus(HttpServletResponse.SC_NOT_FOUND)
22-
val writer = res.getWriter
23-
writer.write("No endpoint available for [" + req.getPathInfo + "]")
24-
writer.close()
25-
res.flushBuffer()
26-
DummyCallback
27-
}
21+
val NotFound: Processing = (req: HttpServletRequest) => Response.apply(
22+
HttpServletResponse.SC_NOT_FOUND,
23+
"No endpoint available for [" + req.getPathInfo + "]")
2824

2925
type Provider = PartialFunction[String, Endpoint]
3026

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.thenewmotion.akka.http
2+
package ext
3+
4+
import javax.servlet.http.HttpServletResponse
5+
import Endpoints.{Completing, DummyCallback}
6+
7+
/**
8+
* @author Yaroslav Klymko
9+
*/
10+
object Response {
11+
12+
def apply(statusCode: Int, msg: String, headers: (String, String)*): Completing =
13+
(res: HttpServletResponse) => {
14+
headers.foreach {
15+
case (name, value) => res.setHeader(name, value)
16+
}
17+
res.setStatus(statusCode)
18+
val writer = res.getWriter
19+
writer.write(msg)
20+
writer.close()
21+
res.flushBuffer()
22+
DummyCallback
23+
}
24+
25+
def apply(statusCode: Int, headers: (String, String)*): Completing = {
26+
(res: HttpServletResponse) => {
27+
headers.foreach {
28+
case (name, value) => res.setHeader(name, value)
29+
}
30+
res.sendError(statusCode)
31+
DummyCallback
32+
}
33+
}
34+
}

src/test/scala/com/thenewmotion/akka/http/AsyncActorSpec.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class AsyncActorSpec extends SpecificationWithJUnit with Mockito {
151151
expectMsgType[Find]
152152
actorRef ! Found(Endpoint(_ => responseException))
153153

154-
there was one(res).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)
154+
there was one(res).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, null)
155155
there was one(asyncContext).complete()
156156
}
157157
"pass to enpoint true if completed successfully" >> new HttpContext {

0 commit comments

Comments
 (0)