Home | History | Annotate | Download | only in http
      1 // Copyright 2011 The Go Authors.  All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // Bridge package to expose http internals to tests in the http_test
      6 // package.
      7 
      8 package http
      9 
     10 import (
     11 	"net"
     12 	"net/url"
     13 	"sync"
     14 	"time"
     15 )
     16 
     17 func init() {
     18 	// We only want to pay for this cost during testing.
     19 	// When not under test, these values are always nil
     20 	// and never assigned to.
     21 	testHookMu = new(sync.Mutex)
     22 }
     23 
     24 func NewLoggingConn(baseName string, c net.Conn) net.Conn {
     25 	return newLoggingConn(baseName, c)
     26 }
     27 
     28 var ExportAppendTime = appendTime
     29 
     30 func (t *Transport) NumPendingRequestsForTesting() int {
     31 	t.reqMu.Lock()
     32 	defer t.reqMu.Unlock()
     33 	return len(t.reqCanceler)
     34 }
     35 
     36 func (t *Transport) IdleConnKeysForTesting() (keys []string) {
     37 	keys = make([]string, 0)
     38 	t.idleMu.Lock()
     39 	defer t.idleMu.Unlock()
     40 	if t.idleConn == nil {
     41 		return
     42 	}
     43 	for key := range t.idleConn {
     44 		keys = append(keys, key.String())
     45 	}
     46 	return
     47 }
     48 
     49 func (t *Transport) IdleConnCountForTesting(cacheKey string) int {
     50 	t.idleMu.Lock()
     51 	defer t.idleMu.Unlock()
     52 	if t.idleConn == nil {
     53 		return 0
     54 	}
     55 	for k, conns := range t.idleConn {
     56 		if k.String() == cacheKey {
     57 			return len(conns)
     58 		}
     59 	}
     60 	return 0
     61 }
     62 
     63 func (t *Transport) IdleConnChMapSizeForTesting() int {
     64 	t.idleMu.Lock()
     65 	defer t.idleMu.Unlock()
     66 	return len(t.idleConnCh)
     67 }
     68 
     69 func (t *Transport) IsIdleForTesting() bool {
     70 	t.idleMu.Lock()
     71 	defer t.idleMu.Unlock()
     72 	return t.wantIdle
     73 }
     74 
     75 func (t *Transport) RequestIdleConnChForTesting() {
     76 	t.getIdleConnCh(connectMethod{nil, "http", "example.com"})
     77 }
     78 
     79 func (t *Transport) PutIdleTestConn() bool {
     80 	c, _ := net.Pipe()
     81 	return t.putIdleConn(&persistConn{
     82 		t:        t,
     83 		conn:     c,                   // dummy
     84 		closech:  make(chan struct{}), // so it can be closed
     85 		cacheKey: connectMethodKey{"", "http", "example.com"},
     86 	})
     87 }
     88 
     89 func SetInstallConnClosedHook(f func()) {
     90 	testHookPersistConnClosedGotRes = f
     91 }
     92 
     93 func SetEnterRoundTripHook(f func()) {
     94 	testHookEnterRoundTrip = f
     95 }
     96 
     97 func SetReadLoopBeforeNextReadHook(f func()) {
     98 	testHookMu.Lock()
     99 	defer testHookMu.Unlock()
    100 	testHookReadLoopBeforeNextRead = f
    101 }
    102 
    103 func NewTestTimeoutHandler(handler Handler, ch <-chan time.Time) Handler {
    104 	f := func() <-chan time.Time {
    105 		return ch
    106 	}
    107 	return &timeoutHandler{handler, f, ""}
    108 }
    109 
    110 func ResetCachedEnvironment() {
    111 	httpProxyEnv.reset()
    112 	httpsProxyEnv.reset()
    113 	noProxyEnv.reset()
    114 }
    115 
    116 var DefaultUserAgent = defaultUserAgent
    117 
    118 func ExportRefererForURL(lastReq, newReq *url.URL) string {
    119 	return refererForURL(lastReq, newReq)
    120 }
    121 
    122 // SetPendingDialHooks sets the hooks that run before and after handling
    123 // pending dials.
    124 func SetPendingDialHooks(before, after func()) {
    125 	prePendingDial, postPendingDial = before, after
    126 }
    127 
    128 var ExportServerNewConn = (*Server).newConn
    129 
    130 var ExportCloseWriteAndWait = (*conn).closeWriteAndWait
    131 
    132 var ExportErrRequestCanceled = errRequestCanceled
    133