本文整理汇总了Golang中appengine/urlfetch.Transport类的典型用法代码示例。如果您正苦于以下问题:Golang Transport类的具体用法?Golang Transport怎么用?Golang Transport使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Transport类的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: timeGet
func timeGet(u string) (rec *record) {
rec = new(record)
transport := urlfetch.Transport{
Context: context,
Deadline: urlFetchTimeout,
}
req, err := http.NewRequest("POST", u, nil)
if err != nil {
rec.Err = err
return rec
}
start := time.Now()
resp, err := transport.RoundTrip(req)
end := time.Now()
if err != nil {
rec.Err = err
return rec
}
defer resp.Body.Close()
rec.Duration = end.Sub(start).Seconds()
rec.Status = resp.Status
return rec
}
示例2: handler
func handler(w http.ResponseWriter, r *http.Request) {
context = appengine.NewContext(r)
fr, err := copyRequest(r)
if err != nil {
context.Errorf("copyRequest: %s", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
transport := urlfetch.Transport{
Context: context,
// Despite the name, Transport.Deadline is really a timeout and
// not an absolute deadline as used in the net package. In
// other words it is a time.Duration, not a time.Time.
Deadline: urlFetchTimeout,
}
resp, err := transport.RoundTrip(fr)
if err != nil {
context.Errorf("RoundTrip: %s", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer resp.Body.Close()
for _, key := range reflectedHeaderFields {
value := resp.Header.Get(key)
if value != "" {
w.Header().Add(key, value)
}
}
w.WriteHeader(resp.StatusCode)
n, err := io.Copy(w, resp.Body)
if err != nil {
context.Errorf("io.Copy after %d bytes: %s", n, err)
}
}
示例3: fetch
func fetch(c appengine.Context, key string) error {
s, ok := Sources[key]
if !ok {
return fmt.Errorf("%q not found", key)
}
c.Debugf("fetching %s data", key)
transport := urlfetch.Transport{Context: c, Deadline: 60 * time.Second}
req, err := http.NewRequest("GET", s.URL, strings.NewReader(""))
if err != nil {
return err
}
resp, err := transport.RoundTrip(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("fetch: bad status %d for %s", resp.StatusCode, s.URL)
}
contents, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
item := &memcache.Item{
Key: key,
Value: contents,
Expiration: s.Expiration,
}
if err := memcache.Set(c, item); err != nil {
return err
}
// We keep the last updated time in memcache. It's not
// updated atomically with the page, so it's only used to
// limit the rate of fetches from the data servers. Don't use
// it for display; use the data creation times in the data
// instead. It doesn't matter to the user that we fetched a
// weather forecast 3 minutes ago if the forecast is 48
// minutes old.
item = &memcache.Item{
Key: key + "_fresh",
Value: []byte(strconv.FormatInt(time.Now().Unix(), 10)),
}
if err := memcache.Set(c, item); err != nil {
return err
}
c.Infof("cached %d bytes of %s data", len(contents), key)
return nil
}
示例4: fetch
func fetch(context appengine.Context, ev *event.HTTPRequestEvent) event.Event {
errorResponse := new(event.NotifyEvent)
errorResponse.SetId(ev.GetId())
req, err := ev.ToRequest("")
if nil != err {
errorResponse.Code = event.ErrInvalidHttpRequest
errorResponse.Reason = fmt.Sprintf("Invalid fetch url:%s with err:%v", ev.URL, err)
return errorResponse
}
var t urlfetch.Transport
t.Context = context
t.Deadline, _ = time.ParseDuration("10s")
t.AllowInvalidServerCertificate = true
retryCount := 2
for retryCount > 0 {
resp, err := t.RoundTrip(req)
if err == nil {
res := event.NewHTTPResponseEvent(resp)
for nil != resp.Body {
buffer := make([]byte, 8192)
n, er := resp.Body.Read(buffer)
if nil != er {
context.Errorf("Failed to read body for reason:%v", er)
break
}
res.Content = append(res.Content, buffer[0:n]...)
}
if resp.ContentLength != int64(len(res.Content)) {
context.Errorf("Failed to read body %d %d", resp.ContentLength, len(res.Content))
}
context.Errorf("%v %d %d", resp.Header.Get("Content-Length"), resp.ContentLength, len(res.Content))
return res
}
context.Errorf("Failed to fetch URL[%s] for reason:%v", ev.URL, err)
retryCount--
if strings.EqualFold(req.Method, "GET") && strings.Contains(err.Error(), "RESPONSE_TOO_LARGE") {
errorResponse.Code = event.ErrTooLargeResponse
return errorResponse
}
}
errorResponse.Code = event.ErrRemoteProxyTimeout
errorResponse.Reason = fmt.Sprintf("Fetch timeout for url:%s", ev.URL)
return errorResponse
}
示例5: fetch
func fetch(url string, c appengine.Context) ([]byte, error) {
transport := urlfetch.Transport{
Context: c,
Deadline: time.Duration(20) * time.Second,
AllowInvalidServerCertificate: false,
}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
resp, err := transport.RoundTrip(req)
if err != nil {
return nil, err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
resp.Body.Close()
return body, nil
}
示例6: Fetch
func Fetch(context appengine.Context, ev *event.HTTPRequestEvent) event.Event {
errorResponse := new(event.HTTPResponseEvent)
if Cfg.IsMaster == 1 {
fillErrorResponse(errorResponse, "Proxy service is no enable in snova master node.")
return errorResponse
}
if isInBlacklist(ev.GetHeader("Host")) {
fillErrorResponse(errorResponse, "Current site is in blacklist.")
return errorResponse
}
req := buildHTTPRequest(ev)
if req == nil {
errorResponse.Status = 400
fillErrorResponse(errorResponse, "Invalid fetch url:"+ev.Url)
return errorResponse
}
var t urlfetch.Transport
t.Context = context
t.Deadline, _ = time.ParseDuration("10s")
t.AllowInvalidServerCertificate = true
//t := &transport
//t := &urlfetch.Transport{context, 0, true}
retryCount := Cfg.RetryFetchCount
for retryCount > 0 {
resp, err := t.RoundTrip(req)
if err == nil {
res := buildHTTPResponseEvent(resp)
if res.Status == 302 {
rangeHeader := req.Header.Get("Range")
if len(rangeHeader) > 0 {
res.AddHeader("X-Range", rangeHeader)
}
}
return res
}
context.Errorf("Failed to fetch URL[%s] for reason:%v", ev.Url, err)
retryCount--
if strings.EqualFold(req.Method, "GET") && strings.Contains(err.Error(), "RESPONSE_TOO_LARGE") {
rangeLimit := Cfg.RangeFetchLimit
rangestart := 0
rangeheader := req.Header.Get("Range")
if len(rangeheader) > 0 {
rangestart, _ = util.ParseRangeHeaderValue(rangeheader)
}
req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", rangestart, rangeLimit-1))
}
if strings.Contains(err.Error(), "RESPONSE_TOO_LARGE") {
time.Sleep(1 * time.Second)
return Fetch(context, ev)
}
}
errorResponse.Status = 408
fillErrorResponse(errorResponse, "Fetch timeout for url:"+ev.Url)
rangeHeader := req.Header.Get("Range")
if len(rangeHeader) > 0 {
errorResponse.SetHeader("X-Range", rangeHeader)
}
return errorResponse
}
示例7: UrlGetter
// UrlGetter universal http getter for app engine and standalone go programs.
// Previously response was returned. Forgot why. Dropped it.
func UrlGetter(gaeReq *http.Request, options Options) (
[]byte, Info, error,
) {
options.LogLevel = 2
var err error
var inf Info = Info{}
if options.LogLevel > 0 {
if options.Req != nil {
inf.Msg += fmt.Sprintf("orig req url: %#v\n", options.Req.URL.String())
} else {
inf.Msg += fmt.Sprintf("orig str url: %#v\n", options.URL)
}
}
//
// Either take provided request
// Or build one from options.URL
if options.Req == nil {
ourl, err := URLFromString(options.URL) // Normalize
if err != nil {
return nil, inf, err
}
options.URL = ourl.String()
options.Req, err = http.NewRequest("GET", options.URL, nil)
if err != nil {
return nil, inf, err
}
} else {
if options.Req.URL.Scheme == "" {
options.Req.URL.Scheme = "https"
}
}
r := options.Req
if len(options.KnownProtocol) > 1 {
if strings.HasSuffix(options.KnownProtocol, ":") {
options.KnownProtocol = strings.TrimSuffix(options.KnownProtocol, ":")
}
if options.KnownProtocol == "http" || options.KnownProtocol == "https" {
r.URL.Scheme = options.KnownProtocol
inf.Msg += fmt.Sprintf("Using known protocol %q\n", options.KnownProtocol)
}
}
//
// Unifiy appengine plain http.client
client := &http.Client{}
if gaeReq == nil {
client.Timeout = time.Duration(5 * time.Second) // GAE does not allow
} else {
c := util_appengine.SafelyExtractGaeContext(gaeReq)
if c != nil {
ctxOld := oldAE.NewContext(gaeReq)
client = oldFetch.Client(ctxOld)
// this does not prevent urlfetch: SSL_CERTIFICATE_ERROR
// it merely leads to err = "DEADLINE_EXCEEDED"
tr := oldFetch.Transport{Context: ctxOld, AllowInvalidServerCertificate: true}
// thus
tr = oldFetch.Transport{Context: ctxOld, AllowInvalidServerCertificate: false}
tr.Deadline = 20 * time.Second // only possible on aeOld
client.Transport = &tr
// client.Timeout = 20 * time.Second // also not in google.golang.org/appengine/urlfetch
} else {
return nil, inf, ErrNoContext
}
// appengine dev server => always fallback to http
if c != nil && appengine.IsDevAppServer() && !options.ForceHTTPSEvenOnDevelopmentServer {
r.URL.Scheme = "http"
}
}
inf.URL = r.URL
if options.RedirectHandling == 1 {
client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
if len(via) == 1 && req.URL.Path == via[0].URL.Path+"/" {
// allow redirect from /gesundheit to /gesundheit/
return nil
}
spath := "\n"
for _, v := range via {
spath += v.URL.Path + "\n"
}
spath += req.URL.Path + "\n"
return fmt.Errorf("%v %v", MsgNoRdirects, spath)
}
}
//.........这里部分代码省略.........