func (t *Transport) RoundTrip(req *http.Request) (res *http.Response, err error) {
	methNum, ok := pb.URLFetchRequest_RequestMethod_value[req.Method]
	if !ok {
		return nil, fmt.Errorf("urlfetch: unsupported HTTP method %q", req.Method)
	}

	method := pb.URLFetchRequest_RequestMethod(methNum)

	freq := &pb.URLFetchRequest{
		Method:                        &method,
		Url:                           proto.String(urlString(req.URL)),
		FollowRedirects:               proto.Bool(false), // http.Client's responsibility
		MustValidateServerCertificate: proto.Bool(!t.AllowInvalidServerCertificate),
	}
	if deadline, ok := t.Context.Deadline(); ok {
		freq.Deadline = proto.Float64(deadline.Sub(time.Now()).Seconds())
	}

	for k, vals := range req.Header {
		for _, val := range vals {
			freq.Header = append(freq.Header, &pb.URLFetchRequest_Header{
				Key:   proto.String(k),
				Value: proto.String(val),
			})
		}
	}
	if methodAcceptsRequestBody[req.Method] && req.Body != nil {
		// Avoid a []byte copy if req.Body has a Bytes method.
		switch b := req.Body.(type) {
		case interface {
			Bytes() []byte
		}:
			freq.Payload = b.Bytes()
		default:
			freq.Payload, err = ioutil.ReadAll(req.Body)
			if err != nil {
				return nil, err
			}
		}
	}

	fres := &pb.URLFetchResponse{}
	if err := internal.Call(t.Context, "urlfetch", "Fetch", freq, fres); err != nil {
		return nil, err
	}

	res = &http.Response{}
	res.StatusCode = int(*fres.StatusCode)
	res.Status = fmt.Sprintf("%d %s", res.StatusCode, statusCodeToText(res.StatusCode))
	res.Header = make(http.Header)
	res.Request = req

	// Faked:
	res.ProtoMajor = 1
	res.ProtoMinor = 1
	res.Proto = "HTTP/1.1"
	res.Close = true

	for _, h := range fres.Header {
		hkey := http.CanonicalHeaderKey(*h.Key)
		hval := *h.Value
		if hkey == "Content-Length" {
			// Will get filled in below for all but HEAD requests.
			if req.Method == "HEAD" {
				res.ContentLength, _ = strconv.ParseInt(hval, 10, 64)
			}
			continue
		}
		res.Header.Add(hkey, hval)
	}

	if req.Method != "HEAD" {
		res.ContentLength = int64(len(fres.Content))
	}

	truncated := fres.GetContentWasTruncated()
	res.Body = &bodyReader{content: fres.Content, truncated: truncated}
	return
}
func (t *Transport) RoundTrip(req *http.Request) (res *http.Response, err error) {
	methNum, ok := pb.URLFetchRequest_RequestMethod_value[req.Method]
	if !ok {
		return nil, fmt.Errorf("urlfetch: unsupported HTTP method %q", req.Method)
	}

	method := pb.URLFetchRequest_RequestMethod(methNum)

	freq := &pb.URLFetchRequest{
		Method:                        &method,
		Url:                           proto.String(urlString(req.URL)),
		FollowRedirects:               proto.Bool(false), 
		MustValidateServerCertificate: proto.Bool(!t.AllowInvalidServerCertificate),
	}
	if deadline, ok := t.Context.Deadline(); ok {
		freq.Deadline = proto.Float64(deadline.Sub(time.Now()).Seconds())
	}

	for k, vals := range req.Header {
		for _, val := range vals {
			freq.Header = append(freq.Header, &pb.URLFetchRequest_Header{
				Key:   proto.String(k),
				Value: proto.String(val),
			})
		}
	}
	if methodAcceptsRequestBody[req.Method] && req.Body != nil {
		
		switch b := req.Body.(type) {
		case interface {
			Bytes() []byte
		}:
			freq.Payload = b.Bytes()
		default:
			freq.Payload, err = ioutil.ReadAll(req.Body)
			if err != nil {
				return nil, err
			}
		}
	}

	fres := &pb.URLFetchResponse{}
	if err := internal.Call(t.Context, "urlfetch", "Fetch", freq, fres); err != nil {
		return nil, err
	}

	res = &http.Response{}
	res.StatusCode = int(*fres.StatusCode)
	res.Status = fmt.Sprintf("%d %s", res.StatusCode, statusCodeToText(res.StatusCode))
	res.Header = make(http.Header)
	res.Request = req

	
	res.ProtoMajor = 1
	res.ProtoMinor = 1
	res.Proto = "HTTP/1.1"
	res.Close = true

	for _, h := range fres.Header {
		hkey := http.CanonicalHeaderKey(*h.Key)
		hval := *h.Value
		if hkey == "Content-Length" {
			
			if req.Method == "HEAD" {
				res.ContentLength, _ = strconv.ParseInt(hval, 10, 64)
			}
			continue
		}
		res.Header.Add(hkey, hval)
	}

	if req.Method != "HEAD" {
		res.ContentLength = int64(len(fres.Content))
	}

	truncated := fres.GetContentWasTruncated()
	res.Body = &bodyReader{content: fres.Content, truncated: truncated}
	return
}
func ( t * Transport ) RoundTrip ( req * http . Request ) ( res * http . Response , err error ) { methNum , ok := pb . URLFetchRequest_RequestMethod_value [ req . Method ] if ! ok { return nil , fmt . Errorf ( " " , req . Method ) } method := pb . URLFetchRequest_RequestMethod ( methNum ) freq := & pb . URLFetchRequest { Method : & method , Url : proto . String ( urlString ( req . URL ) ) , FollowRedirects : proto . Bool ( false ) , // http.Client's responsibility MustValidateServerCertificate : proto . Bool ( ! t . AllowInvalidServerCertificate ) , } if deadline , ok := t . Context . Deadline ( ) ; ok { freq . Deadline = proto . Float64 ( deadline . Sub ( time . Now ( ) ) . Seconds ( ) ) } for k , vals := range req . Header { for _ , val := range vals { freq . Header = append ( freq . Header , & pb . URLFetchRequest_Header { Key : proto . String ( k ) , Value : proto . String ( val ) , } ) } } if methodAcceptsRequestBody [ req . Method ] && req . Body != nil { // Avoid a []byte copy if req.Body has a Bytes method. switch b := req . Body . ( type ) { case interface { Bytes ( ) [ ] byte } : freq . Payload = b . Bytes ( ) default : freq . Payload , err = ioutil . ReadAll ( req . Body ) if err != nil { return nil , err } } } fres := & pb . URLFetchResponse { } if err := internal . Call ( t . Context , " " , " " , freq , fres ) ; err != nil { return nil , err } res = & http . Response { } res . StatusCode = int ( * fres . StatusCode ) res . Status = fmt . Sprintf ( " " , res . StatusCode , statusCodeToText ( res . StatusCode ) ) res . Header = make ( http . Header ) res . Request = req // Faked: res . ProtoMajor = 1 res . ProtoMinor = 1 res . Proto = " " res . Close = true for _ , h := range fres . Header { hkey := http . CanonicalHeaderKey ( * h . Key ) hval := * h . Value if hkey == " " { // Will get filled in below for all but HEAD requests. if req . Method == " " { res . ContentLength , _ = strconv . ParseInt ( hval , 10 , 64 ) } continue } res . Header . Add ( hkey , hval ) } if req . Method != " " { res . ContentLength = int64 ( len ( fres . Content ) ) } truncated := fres . GetContentWasTruncated ( ) res . Body = & bodyReader { content : fres . Content , truncated : truncated } return }
// RoundTrip issues a single HTTP request and returns its response. Per the
// http.RoundTripper interface, RoundTrip only returns an error if there
// was an unsupported request or the URL Fetch proxy fails.
// Note that HTTP response codes such as 5xx, 403, 404, etc are not
// errors as far as the transport is concerned and will be returned
// with err set to nil.
RoundTrip issues a single HTTP request and returns its response . Per the http . RoundTripper interface RoundTrip only returns an error if there was an unsupported request or the URL Fetch proxy fails . Note that HTTP response codes such as 5xx 403 404 etc are not errors as far as the transport is concerned and will be returned with err set to nil .