code: func (c *Client) PutObject(ctx context.Context, key, container string, md5 hash.Hash, size int64, body io.Reader) error {
  	req := newReq(ctx, c.keyURL(container, key))
  	req.Method = "PUT"
  	req.ContentLength = size
  	if md5 != nil {
  		b64 := new(bytes.Buffer)
  		encoder := base64.NewEncoder(base64.StdEncoding, b64)
  		encoder.Write(md5.Sum(nil))
  		encoder.Close()
  		req.Header.Set("Content-MD5", b64.String())
  	}
  	req.Header.Set("Content-Length", strconv.Itoa(int(size)))
  	req.Header.Set("x-ms-blob-type", "BlockBlob")
  	c.Auth.SignRequest(req)
  	req.Body = ioutil.NopCloser(body)
  
  	res, err := c.transport().RoundTrip(req)
  	if res != nil && res.Body != nil {
  		defer res.Body.Close()
  	}
  	if err != nil {
  		return err
  	}
  	if res.StatusCode != http.StatusCreated {
  		if res.StatusCode < 500 {
  			aerr := getAzureError("PutObject", res)
  			return aerr
  		}
  		return fmt.Errorf("got response code %d from Azure", res.StatusCode)
  	}
  	return nil
  }
docs: // PutObject puts a blob to the specified container on Azure