Skip to content

Commit

Permalink
Correctly identify socket read/write on Windows.
Browse files Browse the repository at this point in the history
  • Loading branch information
cyfdecyf committed May 21, 2013
1 parent 1545cd6 commit dfcea8c
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 20 deletions.
26 changes: 6 additions & 20 deletions proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@ import (
"io"
"math/rand"
"net"
// "reflect"
"reflect"
"strings"
"time"
)

// var _ = reflect.TypeOf

// As I'm using ReadSlice to read line, it's possible to get
// bufio.ErrBufferFull while reading line, so set it to a large value to
// prevent such problems.
Expand Down Expand Up @@ -406,7 +404,7 @@ func (c *clientConn) handleServerReadError(r *Request, sv *serverConn, err error
sendErrorPage(c, "502 read error", err.Error(), errMsg)
return errPageSent
}
errl.Println("Unhandled server read error:", err, r)
errl.Println(msg+" unhandled server read error:", err, reflect.TypeOf(err), r)
return errShouldClose
}

Expand Down Expand Up @@ -440,20 +438,6 @@ func (c *clientConn) handleClientWriteError(r *Request, err error, msg string) e
return err
}

func isErrOpWrite(err error) bool {
if ne, ok := err.(*net.OpError); ok && ne.Op == "write" {
return true
}
return false
}

func isErrOpRead(err error) bool {
if ne, ok := err.(*net.OpError); ok && ne.Op == "read" {
return true
}
return false
}

func (c *clientConn) readResponse(sv *serverConn, r *Request, rp *Response) (err error) {
sv.initBuf()
defer func() {
Expand Down Expand Up @@ -510,10 +494,12 @@ func (c *clientConn) readResponse(sv *serverConn, r *Request, rp *Response) (err
// Proxy can't send error page here because response header has
// been sent.
errl.Println("unexpected EOF reading body from server", r)
} else if isErrOpRead(err) {
err = c.handleServerReadError(r, sv, err, "Read response body from server.")
} else if isErrOpWrite(err) {
err = c.handleClientWriteError(r, err, "Write to client response body.")
err = c.handleClientWriteError(r, err, "Write response body to client.")
} else {
err = c.handleServerReadError(r, sv, err, "Read response body from server.")
errl.Println("sendBody unknown network op error", reflect.TypeOf(err), r)
}
}
}
Expand Down
16 changes: 16 additions & 0 deletions proxy_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,19 @@ func isDNSError(err error) bool {
}
return false
}

func isErrOpWrite(err error) bool {
ne, ok := err.(*net.OpError)
if !ok {
return false
}
return ne.Op == "write"
}

func isErrOpRead(err error) bool {
ne, ok := err.(*net.OpError)
if !ok {
return false
}
return ne.Op == "read"
}
16 changes: 16 additions & 0 deletions proxy_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,19 @@ func isDNSError(err error) bool {
// reflect.TypeOf(err), err.Error())
return strings.Contains(err.Error(), "No such host")
}

func isErrOpWrite(err error) bool {
ne, ok := err.(*net.OpError)
if !ok {
return false
}
return ne.Op == "WSASend"
}

func isErrOpRead(err error) bool {
ne, ok := err.(*net.OpError)
if !ok {
return false
}
return ne.Op == "WSARecv"
}

0 comments on commit dfcea8c

Please sign in to comment.