本文整理汇总了Golang中net/http/httputil.ClientConn类的典型用法代码示例。如果您正苦于以下问题:Golang ClientConn类的具体用法?Golang ClientConn怎么用?Golang ClientConn使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ClientConn类的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: doChunkedResponse
func doChunkedResponse(w http.ResponseWriter, resp *http.Response, client *httputil.ClientConn) {
wf, ok := w.(writeFlusher)
if !ok {
http.Error(w, "Error forwarding chunked response body: flush not available", http.StatusInternalServerError)
return
}
w.WriteHeader(resp.StatusCode)
up, remaining := client.Hijack()
defer up.Close()
var err error
chunks := bufio.NewScanner(io.MultiReader(remaining, up))
chunks.Split(splitChunks)
for chunks.Scan() && err == nil {
_, err = wf.Write(chunks.Bytes())
wf.Flush()
}
if err == nil {
err = chunks.Err()
}
if err != nil {
Log.Errorf("Error forwarding chunked response body: %s", err)
}
}
示例2: requestExecute
func requestExecute(conn net.Conn, client *httputil.ClientConn, req *http.Request) (*http.Response, error) {
if Verbose {
fmt.Printf("> %s %s %s\n", req.Method, req.URL.Path, req.Proto)
fmt.Printf("> Socket: %s\n", conn.RemoteAddr())
for k, v := range req.Header {
fmt.Printf("> %s: %s\n", k, v)
}
fmt.Println("> Content-Length:", req.ContentLength)
}
return client.Do(req)
}
示例3: connectToRunServer
func (ctx *runContext) connectToRunServer() (*http.Response, net.Conn, error) {
if ctx.attachURL == "" {
return nil, nil, errgo.New("No attach URL to connect to")
}
req, err := http.NewRequest("CONNECT", ctx.attachURL, nil)
if err != nil {
return nil, nil, errgo.Mask(err, errgo.Any)
}
req.SetBasicAuth("", config.AuthenticatedUser.AuthenticationToken)
url, err := url.Parse(ctx.attachURL)
if err != nil {
return nil, nil, errgo.Mask(err, errgo.Any)
}
dial, err := net.Dial("tcp", url.Host)
if err != nil {
return nil, nil, errgo.Mask(err, errgo.Any)
}
var conn *httputil.ClientConn
if url.Scheme == "https" {
host := strings.Split(url.Host, ":")[0]
config := *config.TlsConfig
config.ServerName = host
tls_conn := tls.Client(dial, &config)
conn = httputil.NewClientConn(tls_conn, nil)
} else if url.Scheme == "http" {
conn = httputil.NewClientConn(dial, nil)
} else {
return nil, nil, errgo.Newf("Invalid scheme format %s", url.Scheme)
}
res, err := conn.Do(req)
if err != httputil.ErrPersistEOF && err != nil {
if err, ok := err.(*net.OpError); ok {
if err.Err.Error() == "record overflow" {
return nil, nil, errgo.Newf(
"Fail to create a secure connection to Scalingo server\n"+
"The encountered error is: %v (ID: CLI-1001)\n"+
"Your firewall or proxy may block the connection to %s",
err, url.Host,
)
}
}
return nil, nil, errgo.Mask(err, errgo.Any)
}
connection, _ := conn.Hijack()
return res, connection, nil
}
示例4: hijack
func hijack(w http.ResponseWriter, client *httputil.ClientConn) (down net.Conn, downBuf *bufio.ReadWriter, up net.Conn, remaining io.Reader, err error) {
hj, ok := w.(http.Hijacker)
if !ok {
err = errors.New("Unable to cast to Hijack")
return
}
down, downBuf, err = hj.Hijack()
if err != nil {
return
}
up, remaining = client.Hijack()
return
}
示例5: enterLoop
func (p *Peer) enterLoop(con *httputil.ClientConn) {
c, rw := con.Hijack()
reader := json.NewDecoder(rw)
writer := json.NewEncoder(c)
log.Printf("################################################################### Entering peer loop for peer: %s\n", p.Name)
for {
/* switch {
case <-p.stopForward:
log.Printf("Peer %s received a stop request\n", p.Name)
o := make(chan bool)
go func(){
p.stopForward <- true
o <- true
}()
<-o
return
default:
*/
execCmd := &ExecuteCommand{}
execCmdReply := &ExecuteCommandReply{}
err := reader.Decode(execCmd)
if err != nil {
log.Printf("############## Peer %s Decoding incoming message failed: %v\n", p.Name, err)
return
} else {
log.Printf("############ Peer %s Decoding incoming message success: %v\n", p.Name, execCmd)
iface, err := p.server.Do(execCmd)
log.Printf("############# Peer %s Executed command. Result: %v, Error: %v\n", p.Name, iface, err)
execCmdReply.Error = err
out, ok := iface.(*sql.Output)
if ok {
execCmdReply.Output = *out
}
}
err = writer.Encode(execCmdReply)
if err != nil {
return
}
// }
}
}
示例6: assertServerResponse
func assertServerResponse(client *httputil.ClientConn, req *http.Request) {
var resp *http.Response
var err error
for i := 0; i < 3; i++ {
resp, err = client.Do(req)
Expect(err).ToNot(HaveOccurred())
Expect(resp).ToNot(BeNil())
resp.Body.Close()
if resp.StatusCode == http.StatusOK {
break
}
time.Sleep(10 * time.Millisecond)
}
Expect(resp.StatusCode).To(Equal(http.StatusOK))
}
示例7: handle
func (s *httpService) handle(req *http.Request, sc *httputil.ServerConn, tls, sticky bool) {
for {
req.Header.Set("X-Request-Start", strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10))
var backend *httputil.ClientConn
var stickyCookie *http.Cookie
if sticky {
backend, stickyCookie = s.getBackendSticky(req)
} else {
backend = s.getBackend()
}
if backend == nil {
log.Println("no backend found")
fail(sc, req, 503, "Service Unavailable")
return
}
if req.Method != "GET" && req.Method != "POST" && req.Method != "HEAD" &&
req.Method != "OPTIONS" && req.Method != "PUT" && req.Method != "DELETE" && req.Method != "TRACE" {
fail(sc, req, 405, "Method not allowed")
return
}
req.Proto = "HTTP/1.1"
req.ProtoMajor = 1
req.ProtoMinor = 1
delete(req.Header, "Te")
delete(req.Header, "Transfer-Encoding")
if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
// If we aren't the first proxy retain prior
// X-Forwarded-For information as a comma+space
// separated list and fold multiple headers into one.
if prior, ok := req.Header["X-Forwarded-For"]; ok {
clientIP = strings.Join(prior, ", ") + ", " + clientIP
}
req.Header.Set("X-Forwarded-For", clientIP)
}
if tls {
req.Header.Set("X-Forwarded-Proto", "https")
} else {
req.Header.Set("X-Forwarded-Proto", "http")
}
// TODO: Set X-Forwarded-Port
if err := backend.Write(req); err != nil {
log.Println("server write err:", err)
return
}
res, err := backend.Read(req)
if res != nil {
if stickyCookie != nil {
res.Header.Add("Set-Cookie", stickyCookie.String())
}
if res.StatusCode == http.StatusSwitchingProtocols {
res.Body = nil
}
if err := sc.Write(req, res); err != nil {
if err != io.EOF && err != httputil.ErrPersistEOF {
log.Println("client write err:", err)
// TODO: log error
}
return
}
}
if err != nil {
if err != io.EOF && err != httputil.ErrPersistEOF {
log.Println("server read err:", err)
// TODO: log error
fail(sc, req, 502, "Bad Gateway")
}
return
}
// TODO: Proxy HTTP CONNECT? (example: Go RPC over HTTP)
if res.StatusCode == http.StatusSwitchingProtocols {
serverW, serverR := backend.Hijack()
clientW, clientR := sc.Hijack()
defer serverW.Close()
done := make(chan struct{})
go func() {
serverR.WriteTo(clientW)
if cw, ok := clientW.(writeCloser); ok {
cw.CloseWrite()
}
close(done)
}()
clientR.WriteTo(serverW)
serverW.(writeCloser).CloseWrite()
<-done
return
}
// close the backend connection, so we don't accidently send to
// a closed socket on the backend
backend.Close()
// TODO: http pipelining
req, err = sc.Read()
if err != nil {
//.........这里部分代码省略.........
示例8: handle
func (s *httpService) handle(req *http.Request, sc *httputil.ServerConn, tls, sticky bool) (done bool) {
req.Header.Set("X-Request-Start", strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10))
req.Header.Set("X-Request-Id", random.UUID())
var backend *httputil.ClientConn
var stickyCookie *http.Cookie
if sticky {
backend, stickyCookie = s.getBackendSticky(req)
} else {
backend = s.getBackend()
}
if backend == nil {
log.Println("no backend found")
fail(sc, req, 503, "Service Unavailable")
return
}
defer backend.Close()
req.Proto = "HTTP/1.1"
req.ProtoMajor = 1
req.ProtoMinor = 1
delete(req.Header, "Te")
delete(req.Header, "Transfer-Encoding")
if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
// If we aren't the first proxy retain prior
// X-Forwarded-For information as a comma+space
// separated list and fold multiple headers into one.
if prior, ok := req.Header["X-Forwarded-For"]; ok {
clientIP = strings.Join(prior, ", ") + ", " + clientIP
}
req.Header.Set("X-Forwarded-For", clientIP)
}
if tls {
req.Header.Set("X-Forwarded-Proto", "https")
} else {
req.Header.Set("X-Forwarded-Proto", "http")
}
// TODO: Set X-Forwarded-Port
// Pass the Request-URI verbatim without any modifications
req.URL.Opaque = strings.Split(strings.TrimPrefix(req.RequestURI, req.URL.Scheme+":"), "?")[0]
if err := backend.Write(req); err != nil {
log.Println("server write err:", err)
// TODO: return error to client here
return true
}
res, err := backend.Read(req)
if res != nil {
if stickyCookie != nil {
res.Header.Add("Set-Cookie", stickyCookie.String())
}
if res.StatusCode == http.StatusSwitchingProtocols {
res.Body = nil
}
if err := sc.Write(req, res); err != nil {
if err != io.EOF && err != httputil.ErrPersistEOF {
log.Println("client write err:", err)
// TODO: log error
}
return true
}
}
if err != nil {
if err != io.EOF && err != httputil.ErrPersistEOF {
log.Println("server read err:", err)
// TODO: log error
fail(sc, req, 502, "Bad Gateway")
}
return
}
// TODO: Proxy HTTP CONNECT? (example: Go RPC over HTTP)
if res.StatusCode == http.StatusSwitchingProtocols {
serverW, serverR := backend.Hijack()
clientW, clientR := sc.Hijack()
defer serverW.Close()
done := make(chan struct{})
go func() {
serverR.WriteTo(clientW)
if cw, ok := clientW.(writeCloser); ok {
cw.CloseWrite()
}
close(done)
}()
clientR.WriteTo(serverW)
serverW.(writeCloser).CloseWrite()
<-done
return true
}
return
}
示例9: testHost
// function to do the actual testing and output the necessary bits
// we don't really care about ordering here otherwise we'd need to do a better job of organizing the output
func (w *Worker) testHost(work *Work) {
// more debug
w.dbg(3, "Ok.. prepping to test %s\n", work.target)
// pre-define myConn/tlsConn/client
var myConn net.Conn
var tlsConn *tls.Conn
var client *httputil.ClientConn
// need a couple of vars for holding ip addresses and default them to being empty
var ip4 string = ""
var ip6 string = ""
// and a var to stash our full host:port combo in
var address string = ""
// create a buffer we'll use later for reading client body
buffer := make([]byte, 1024)
// build our request
request, err := http.NewRequest("GET", work.url, nil)
if err != nil {
w.dbgError("Failed to build request for %s : %s\n", work.url, err)
return
}
if config.ua == "" {
request.Header.Set("User-Agent", version)
} else {
request.Header.Set("User-Agent", config.ua)
}
// debug
w.dbg(3, "Request: %+v\n", request)
// set a timer for the connection
timestart := time.Now()
ipaddr, ierr := net.LookupHost(work.target)
if ierr != nil {
w.dbgError("Failed to lookup %s : %s", work.target, ierr)
return
}
for _, x := range ipaddr {
if len(x) > 16 {
if ip6 == "" {
ip6 = x
}
} else if ip4 == "" {
ip4 = x
}
}
timestop := time.Now()
iplookup := (timestop.Sub(timestart))
// build our address string
if config.tcpfour {
address = fmt.Sprintf("%s:%d", ip4, work.port)
} else {
address = fmt.Sprintf("[%s]:%d", ip6, work.port)
}
// debug
w.dbg(1, "Attempting to connect to %s\n", address)
// since we want some very low level access to bits and pieces, we're going to have to use tcp dial vs the native http client
// create a net.conn
w.dbg(1, "Connecting to %s\n", address)
if config.tcpfour {
myConn, err = net.DialTimeout("tcp4", address, time.Duration(config.timeout)*time.Second)
} else if config.tcpsix {
myConn, err = net.DialTimeout("tcp6", address, time.Duration(config.timeout)*time.Second)
} else {
myConn, err = net.DialTimeout("tcp", address, time.Duration(config.timeout)*time.Second)
}
if err != nil {
w.dbgError("Could not connect to %s : %s\n", address, err)
return
}
w.dbg(2, "Connected to %s\n", address)
// get a time reading on how long it took to connect to the socket
timestop = time.Now()
tcpConnect := (timestop.Sub(timestart))
// defer close
defer myConn.Close()
// need to add some deadlines so we don't sit around indefintely - 5s is more than sufficient
myConn.SetDeadline(time.Now().Add(time.Duration(5 * time.Second)))
// if we're an ssl connection, we need a few extra steps here
if work.ssl {
w.dbg(1, "Starting SSL procedures...\n")
//.........这里部分代码省略.........