Fix Content-Type Header not improperly being set for stats

This commit is contained in:
Jimmy Zelinskie 2013-11-23 18:04:23 -05:00
parent 493d40da3d
commit 86f8199bef
2 changed files with 58 additions and 50 deletions

View file

@ -5,35 +5,36 @@
package server
import (
"encoding/json"
"net/http"
"sync/atomic"
"time"
"encoding/json"
"net/http"
"sync/atomic"
"time"
"github.com/pushrax/chihaya/config"
"github.com/pushrax/chihaya/config"
)
type stats struct {
Uptime config.Duration `json:"uptime"`
RPM int64 `json:"req_per_min"`
Uptime config.Duration `json:"uptime"`
RPM int64 `json:"req_per_min"`
}
func (s *Server) serveStats(w http.ResponseWriter, r *http.Request) {
stats, _ := json.Marshal(&stats{
config.Duration{time.Now().Sub(s.startTime)},
s.rpm,
})
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Connection", "close")
length, _ := w.Write(stats)
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Content-Length", string(length))
w.Header().Set("Connection", "close")
w.(http.Flusher).Flush()
stats, _ := json.Marshal(&stats{
config.Duration{time.Now().Sub(s.startTime)},
s.rpm,
})
length, _ := w.Write(stats)
w.Header().Set("Content-Length", string(length))
w.(http.Flusher).Flush()
}
func (s *Server) updateStats() {
for _ = range time.NewTicker(time.Minute).C {
s.rpm = s.deltaRequests
atomic.StoreInt64(&s.deltaRequests, 0)
}
for _ = range time.NewTicker(time.Minute).C {
s.rpm = s.deltaRequests
atomic.StoreInt64(&s.deltaRequests, 0)
}
}

View file

@ -5,44 +5,51 @@
package server
import (
"errors"
"net/http"
"net/http/httptest"
"os"
"testing"
"errors"
"net/http"
"net/http/httptest"
"os"
"testing"
"github.com/pushrax/chihaya/config"
"github.com/pushrax/chihaya/config"
_ "github.com/pushrax/chihaya/storage/backend/batter"
_ "github.com/pushrax/chihaya/storage/tracker/redis"
_ "github.com/pushrax/chihaya/storage/backend/batter"
_ "github.com/pushrax/chihaya/storage/tracker/redis"
)
func newTestServer() (*Server, error) {
testConfig, err := config.Open(os.Getenv("TESTCONFIGPATH"))
if err != nil {
return nil, err
}
testConfig, err := config.Open(os.Getenv("TESTCONFIGPATH"))
if err != nil {
return nil, err
}
s, err := New(testConfig)
if err != nil {
return nil, err
}
s, err := New(testConfig)
if err != nil {
return nil, err
}
return s, nil
return s, nil
}
func TestStats(t *testing.T) {
s, err := newTestServer()
if err != nil {
t.Error(err)
}
r, err := http.NewRequest("GET", "127.0.0.1:80/stats", nil)
if err != nil {
t.Error(err)
}
w := httptest.NewRecorder()
s.serveStats(w, r)
if w.Code != 200 {
t.Error(errors.New("/stats did not return HTTP 200"))
}
s, err := newTestServer()
if err != nil {
t.Error(err)
}
r, err := http.NewRequest("GET", "127.0.0.1:80/stats", nil)
if err != nil {
t.Error(err)
}
w := httptest.NewRecorder()
s.serveStats(w, r)
if w.Code != 200 {
t.Error(errors.New("/stats did not return HTTP 200"))
}
if w.Header()["Content-Type"][0] != "application/json" {
t.Error(errors.New("/stats did not return the proper Content-Type header"))
}
}