1234567891011121314151617181920212223242526272829303132333435363738 |
- package rcli
- import (
- "fmt"
- "net/http"
- "net/url"
- "path"
- )
- // Use this key to encode an RPC call into an URL,
- // eg. domain.tld/path/to/method?q=get_user&q=gordon
- const ARG_URL_KEY = "q"
- func URLToCall(u *url.URL) (method string, args []string) {
- return path.Base(u.Path), u.Query()[ARG_URL_KEY]
- }
- func ListenAndServeHTTP(addr string, service Service) error {
- return http.ListenAndServe(addr, http.HandlerFunc(
- func(w http.ResponseWriter, r *http.Request) {
- cmd, args := URLToCall(r.URL)
- if err := call(service, r.Body, &AutoFlush{w}, append([]string{cmd}, args...)...); err != nil {
- fmt.Fprintf(w, "Error: "+err.Error()+"\n")
- }
- }))
- }
- type AutoFlush struct {
- http.ResponseWriter
- }
- func (w *AutoFlush) Write(data []byte) (int, error) {
- ret, err := w.ResponseWriter.Write(data)
- if flusher, ok := w.ResponseWriter.(http.Flusher); ok {
- flusher.Flush()
- }
- return ret, err
- }
|