¿Cómo puedo usar curl para probar un server de gancho post-recepción de Github?

Github admite ganchos post-recepción para la notificación de cambios de código, documentados aquí . Ahora, para probar un server hook necesito publicar un poco de json y me gustaría usar curl para hacerlo. Ya he hecho esto antes, pero es tan infrecuente que tiendo a olvidar mi solución.

Según recuerdo, ha sido tedioso cada vez.

La gente de Github proporciona este documento JSON como un ejemplo de los datos que se PUBLICARÁN en la payload parámetro:

 { "before": "5aef35982fb2d34e9d9d4502f6ede1072793222d", "repository": { "url": "http://github.com/defunkt/github", "name": "github", "description": "You're lookin' at it.", "watchers": 5, "forks": 2, "private": 1, "owner": { "email": "chris@ozmm.org", "name": "defunkt" } }, "commits": [ { "id": "41a212ee83ca127e3c8cf465891ab7216a705f59", "url": "http://github.com/defunkt/github/commit/41a212ee83ca127e3c8cf465891ab7216a705f59", "author": { "email": "chris@ozmm.org", "name": "Chris Wanstrath" }, "message": "okay i give in", "timestamp": "2008-02-15T14:57:17-08:00", "added": ["filepath.rb"] }, { "id": "de8251ff97ee194a289832576287d6f8ad74e3d0", "url": "http://github.com/defunkt/github/commit/de8251ff97ee194a289832576287d6f8ad74e3d0", "author": { "email": "chris@ozmm.org", "name": "Chris Wanstrath" }, "message": "update pricing a tad", "timestamp": "2008-02-15T14:36:34-08:00" } ], "after": "de8251ff97ee194a289832576287d6f8ad74e3d0", "ref": "refs/heads/master" } 

Guardando eso como /tmp/example.json , pensé que

  $ curl -XPOST -F "payload=@/tmp/example.json" http://localhost:3000/ 

habría sido la invocación correcta de curl, pero no estaba en lo cierto. El uso de mi proyecto de ejemplo engancha los resultados anteriores en:

 127.0.0.1 - - [17/Nov/2011 22:20:51] "POST HTTP/1.1" 200 - 0.0295 {:filename=>"example.json", :type=>"application/octet-stream", :name=>"payload", :tempfile=>#<File:/tmp/RackMultipart20111117-11639-1ecu4i1>, :head=>"Content-Disposition: form-data; name=\"payload\"; filename=\"example.json\"\r\nContent-Type: application/octet-stream\r\n"} 

que, dada la definición de la acción para ese punto final:

 class HomeAction < Cramp::Action def start puts params[:payload] render 'thanks' finish end end 

no es del todo esperado. Entonces, ¿cómo puedo usar la versión de línea de command de curl para publicar un poco de JSON como datos, en la payload parameters?

Me las arreglé para hacer que esto funcione con lo siguiente:

  1. Guarde los datos json en un file.
  2. Eliminar nuevas líneas del file json. (Comando Vim = :%s/\n//g )
  3. curl --data-urlencode payload@json_data.txt [URL]

Parecía proporcionar resultados idénticos al publicar en Postbin a través de GitHub & Curl.