本文整理汇总了Golang中appengine/urlfetch.Transport.Context方法的典型用法代码示例。如果您正苦于以下问题:Golang Transport.Context方法的具体用法?Golang Transport.Context怎么用?Golang Transport.Context使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类appengine/urlfetch.Transport
的用法示例。
在下文中一共展示了Transport.Context方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: 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
}
示例2: 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
}