Skip to content

Instantly share code, notes, and snippets.

@fearofcode
Created August 29, 2012 23:01
Show Gist options
  • Save fearofcode/3520032 to your computer and use it in GitHub Desktop.
Save fearofcode/3520032 to your computer and use it in GitHub Desktop.
unable to get Scalamachine to handle post requests (edit: fixed)
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))
}
}
@fearofcode
Copy link
Author

mayhem:posttest warrenhenning$ curl -v -X POST localhost:8080/foo
* About to connect() to localhost port 8080 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /foo HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 415 Unsupported Media Type
< Content-Type: text/html
< Location: http://localhost:8080/foo/
* no chunk, no close, no size. Assume close to signal end
< 
* Closing connection #0
mayhem:posttest warrenhenning$ 

@fearofcode
Copy link
Author

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