]> Cypherpunks repositories - gostls13.git/commitdiff
http: add Hijacker type; remove Hijack from ResponseWriter
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 7 Mar 2011 02:59:50 +0000 (18:59 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 7 Mar 2011 02:59:50 +0000 (18:59 -0800)
The Hijack functionality wasn't removed, but now you have
to test if your ResponseWriter is also a Hijacker:

func ServeHTTP(rw http.ResponseWriter, req *http.Request) {
    if hj, ok := rw.(http.Hijacker); ok {
        hj.Hijack(..)
    }
}

R=rsc
CC=golang-dev
https://golang.org/cl/4245064

src/pkg/http/httptest/recorder.go
src/pkg/http/server.go
src/pkg/rpc/server.go
src/pkg/websocket/server.go

index 44571ddd2bc1314764dea233f752eceea737308c..ec7bde8aae281ae4c60d89d52e1e146e5b41087c 100644 (file)
@@ -6,17 +6,13 @@
 package httptest
 
 import (
-       "bufio"
        "bytes"
        "http"
-       "io"
        "os"
 )
 
 // ResponseRecorder is an implementation of http.ResponseWriter that
 // records its mutations for later inspection in tests.
-//
-// Note that Hijack is not implemented and simply panics.
 type ResponseRecorder struct {
        Code    int           // the HTTP response code from WriteHeader
        Header  http.Header   // if non-nil, the headers to populate
@@ -81,8 +77,3 @@ func (rw *ResponseRecorder) WriteHeader(code int) {
 func (rw *ResponseRecorder) Flush() {
        rw.Flushed = true
 }
-
-// Hijack is not implemented in ResponseRecorder and instead panics.
-func (rw *ResponseRecorder) Hijack() (io.ReadWriteCloser, *bufio.ReadWriter, os.Error) {
-       panic("Hijack not implemented in ResponseRecorder")
-}
index 977c8c2297a10b09dbdc0b041efb3664860b4f23..a2a0e14246de08f03093bd1d544143854330bc8b 100644 (file)
@@ -81,7 +81,10 @@ type ResponseWriter interface {
 
        // Flush sends any buffered data to the client.
        Flush()
+}
 
+// A Hijacker is an HTTP request which be taken over by an HTTP handler.
+type Hijacker interface {
        // Hijack lets the caller take over the connection.
        // After a call to Hijack(), the HTTP server library
        // will not do anything else with the connection.
index 9dcda41480785faec736fdf071bdde64847e4530..f185cd16e5a045452c46c1eccab9e300432a9f32 100644 (file)
@@ -527,7 +527,7 @@ func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
                io.WriteString(w, "405 must CONNECT\n")
                return
        }
-       conn, _, err := w.Hijack()
+       conn, _, err := w.(http.Hijacker).Hijack()
        if err != nil {
                log.Print("rpc hijacking ", w.RemoteAddr(), ": ", err.String())
                return
index 25f057ba5b0b4d7763aad84b97b9be9dc1262469..37149f044d45325275fff2ce6695809d0aa4fbcb 100644 (file)
@@ -58,7 +58,7 @@ func getKeyNumber(s string) (r uint32) {
 
 // ServeHTTP implements the http.Handler interface for a Web Socket
 func (f Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-       rwc, buf, err := w.Hijack()
+       rwc, buf, err := w.(http.Hijacker).Hijack()
        if err != nil {
                panic("Hijack failed: " + err.String())
                return
@@ -184,7 +184,7 @@ func (f Draft75Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
                return
        }
 
-       rwc, buf, err := w.Hijack()
+       rwc, buf, err := w.(http.Hijacker).Hijack()
        if err != nil {
                panic("Hijack failed: " + err.String())
                return