// Copyright 2013 gopm authors. // // Licensed under the Apache License, Version 2.0 (the "License"): you may // not use this file except in compliance with the License. You may obtain // a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations // under the License. package doc import ( "flag" "net" "net/http" "time" "github.com/Unknwon/com" ) var ( dialTimeout = flag.Duration("dial_timeout", 10*time.Second, "Timeout for dialing an HTTP connection.") requestTimeout = flag.Duration("request_timeout", 20*time.Second, "Time out for roundtripping an HTTP request.") ) func timeoutDial(network, addr string) (net.Conn, error) { return net.DialTimeout(network, addr, *dialTimeout) } type transport struct { t http.Transport } func (t *transport) RoundTrip(req *http.Request) (*http.Response, error) { timer := time.AfterFunc(*requestTimeout, func() { t.t.CancelRequest(req) com.ColorLog("[WARN] Canceled request for %s, please interrupt the program.\n", req.URL) }) defer timer.Stop() resp, err := t.t.RoundTrip(req) return resp, err } var ( httpTransport = &transport{t: http.Transport{Dial: timeoutDial, ResponseHeaderTimeout: *requestTimeout / 2}} HttpClient = &http.Client{Transport: httpTransport} )