I've figured out how to get around this.
Looks like Amazon S3 won't let you see the whole HTTP header on a head request ... but you can do a GET, retrieve the header and then delete the reply without getting any of the body.
This works:
void MainWindow::requestFileSize(const QString &url)
{
QNetworkRequest req;
m_netmanager = new QNetworkAccessManager(this);
req.setUrl(QUrl(url));
m_reply = m_netmanager->get(req);
connect(m_reply, SIGNAL(metaDataChanged()), this, SLOT(fileSize()));
}
void MainWindow::fileSize()
{
qDebug() << "Content Length: " << m_reply->header(QNetworkRequest::ContentLengthHeader);
m_reply->deleteLater();
m_netmanager->deleteLater();
}