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
}