Created
August 29, 2012 23:01
-
-
Save fearofcode/3520032 to your computer and use it in GitHub Desktop.
unable to get Scalamachine to handle post requests (edit: fixed)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.stackmob.posttest.server | |
import java.net.InetSocketAddress | |
import com.twitter.finagle.builder.ServerBuilder | |
import com.twitter.finagle.http.Http | |
import com.stackmob.common.logging.LoggingSugar | |
import scalamachine.finagle.{FinagleWebmachineV3, FinagleWebmachineService} | |
import scalamachine.core.dispatch.Route._ | |
object PosttestStarter extends App { | |
Posttest.start() | |
} | |
// Server Object (TODO: there should be dev and prod versions of this object | |
object Posttest extends PosttestComponents with LoggingSugar { | |
private lazy val logger = getLogger[Posttest.type] | |
lazy val addr = new InetSocketAddress(8080) | |
lazy val server = | |
ServerBuilder() | |
.codec(Http()) | |
.bindTo(addr) | |
.name("Posttest") | |
.build(new FinagleWebmachineService(PosttestDispatch)) | |
def start() { | |
logger.info("Starting Posttest on port %s" format addr.getPort) | |
server | |
} | |
} | |
// Base Cake | |
trait PosttestComponents { | |
// Define Injection Singletons | |
object PosttestDispatch extends FinagleWebmachineV3 { | |
route { | |
pathMatching { | |
"foo" | |
} serve { | |
new FooResource | |
} | |
} | |
} | |
} | |
import scalamachine.core._ | |
import scalamachine.core.Resource._ | |
import scalamachine.core.Res._ | |
import scalamachine.core.HTTPMethods._ | |
import scalaz.{Resource => _} | |
import scalaz.Scalaz._ | |
class FooResource extends Resource { | |
override def allowedMethods(data: ReqRespData): (ReqRespData, Res[List[HTTPMethod]]) = { | |
(data, result(POST :: Nil)) | |
} | |
override def isMalformed(data: ReqRespData): (ReqRespData,Res[Boolean]) = (data, result(false)) | |
override def contentTypesAccepted(data: ReqRespData): (ReqRespData, Res[ContentTypesAccepted]) = { | |
val accepted = (ContentType("application/json"), jarResponse(_: ReqRespData)) :: Nil | |
(data, result(accepted)) | |
} | |
override def postIsCreate(data: ReqRespData): (ReqRespData, Res[Boolean]) = { | |
(data, result(true)) | |
} | |
override def createPath(data: ReqRespData): (ReqRespData, Res[Option[String]]) = { | |
(data, result("".some)) | |
} | |
private def jarResponse(data: ReqRespData): (ReqRespData, Res[Boolean]) = { | |
(data,result(true)) | |
} | |
} |
Author
fearofcode
commented
Aug 29, 2012
The fix here is to just add the right HTTP header:
curl -v -H "Content-type: application/json" -X POST localhost:8080/foo
That then gives the correct 201 Created message back.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment