func()

in apt/method.go [154:228]


func (m *Method) handleAcquire(ctx context.Context, msg *Message) error {
	uri := msg.Get("URI")
	if uri == "" {
		err := errors.New("no URI provided in Acquire message")
		m.writer.Fail(err.Error())
		return err
	}
	filename := msg.Get("Filename")
	if filename == "" {
		err := errors.New("no filename provided in Acquire message")
		m.writer.FailURI(uri, err.Error())
		return err
	}
	ifModifiedSince := msg.Get("Last-Modified")

	if err := m.initClient(ctx); err != nil {
		m.writer.FailURI(uri, err.Error())
		return err
	}

	realuri := strings.Replace(uri, "ar+https", "https", 1)
	req, err := http.NewRequest("GET", realuri, nil)
	if err != nil {
		return err
	}
	if ifModifiedSince != "" {
		// TODO(hopkiw): validate this string is in RFC1123Z format.
		req.Header.Add("If-Modified-Since", ifModifiedSince)
	}

	if m.config.debug {
		if reqDump, dumpErr := httputil.DumpRequest(req, true); dumpErr == nil {
			m.writer.Log(string(reqDump))
		}
	}

	resp, err := m.client.Do(req)

	if m.config.debug && resp != nil {
		if respDump, dumpErr := httputil.DumpResponse(resp, false); dumpErr == nil {
			m.writer.Log(string(respDump))
		}
	}

	if err != nil {
		m.writer.FailURI(uri, err.Error())
		return err
	}

	size := resp.Header.Get("Content-Length")
	lastModified := resp.Header.Get("Last-Modified")
	switch resp.StatusCode {
	case 200:
		// It's weird to send URI Start after we've already contacted
		// the server, but we need to know the size.
		m.writer.URIStart(uri, size, lastModified)
		md5Hash, err := m.dl.download(resp.Body, filename)
		if err != nil {
			m.writer.FailURI(uri, err.Error())
			return err
		}
		m.writer.URIDone(uri, size, lastModified, md5Hash, filename, false)
	case 304:
		// Unchanged since Last-Modified. Respond with "IMS-Hit: true" to
		// indicate the existing file is valid.
		m.writer.URIDone(uri, size, lastModified, "", filename, true)
	default:
		// All other codes including 404, 403, etc.
		err := fmt.Errorf("error downloading: code %v", resp.StatusCode)
		m.writer.FailURI(uri, err.Error())
		return err
	}

	return nil
}