Merge pull request #374 from prometheus/beorn7/http

Fix more interface upgrade bugs
This commit is contained in:
Björn Rabenstein 2018-02-03 15:28:15 +01:00 committed by GitHub
commit 9bb6ab929d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 3 deletions

View File

@ -102,10 +102,10 @@ func init() {
return d return d
} }
pickDelegator[closeNotifier] = func(d *responseWriterDelegator) delegator { // 1 pickDelegator[closeNotifier] = func(d *responseWriterDelegator) delegator { // 1
return closeNotifierDelegator{d} return &closeNotifierDelegator{d}
} }
pickDelegator[flusher] = func(d *responseWriterDelegator) delegator { // 2 pickDelegator[flusher] = func(d *responseWriterDelegator) delegator { // 2
return flusherDelegator{d} return &flusherDelegator{d}
} }
pickDelegator[flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 3 pickDelegator[flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 3
return struct { return struct {

View File

@ -28,7 +28,7 @@ func (d *pusherDelegator) Push(target string, opts *http.PushOptions) error {
func init() { func init() {
pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16 pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16
return pusherDelegator{d} return &pusherDelegator{d}
} }
pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17 pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17
return struct { return struct {

View File

@ -281,6 +281,16 @@ func (t *testResponseWriter) ReadFrom(io.Reader) (int64, error) {
return 0, nil return 0, nil
} }
// testFlusher is an http.ResponseWriter that also implements http.Flusher.
type testFlusher struct {
flushCalled bool
}
func (t *testFlusher) Header() http.Header { return nil }
func (t *testFlusher) Write([]byte) (int, error) { return 0, nil }
func (t *testFlusher) WriteHeader(int) {}
func (t *testFlusher) Flush() { t.flushCalled = true }
func TestInterfaceUpgrade(t *testing.T) { func TestInterfaceUpgrade(t *testing.T) {
w := &testResponseWriter{} w := &testResponseWriter{}
d := newDelegator(w, nil) d := newDelegator(w, nil)
@ -299,6 +309,22 @@ func TestInterfaceUpgrade(t *testing.T) {
if _, ok := d.(http.Hijacker); ok { if _, ok := d.(http.Hijacker); ok {
t.Error("delegator unexpectedly implements http.Hijacker") t.Error("delegator unexpectedly implements http.Hijacker")
} }
f := &testFlusher{}
d = newDelegator(f, nil)
if _, ok := d.(http.CloseNotifier); ok {
t.Error("delegator unexpectedly implements http.CloseNotifier")
}
d.(http.Flusher).Flush()
if !w.flushCalled {
t.Error("Flush not called")
}
if _, ok := d.(io.ReaderFrom); ok {
t.Error("delegator unexpectedly implements io.ReaderFrom")
}
if _, ok := d.(http.Hijacker); ok {
t.Error("delegator unexpectedly implements http.Hijacker")
}
} }
func ExampleInstrumentHandlerDuration() { func ExampleInstrumentHandlerDuration() {