Я загружаю файл, используя функцию get
библиотеки Python requests
. Для хранения файла я бы хотел определить имя файла, которое бы имело веб-браузер для своего диалога "сохранить" или "сохранить как...".
Легко, правда? Я могу просто получить его из HTTP-заголовка Content-Disposition
, доступного для объекта ответа:
import re
d = r.headers['content-disposition']
fname = re.findall("filename=(.+)", d)
Но если присмотреться к этой теме более внимательно, это не так просто:
В соответствии с RFC 6266, раздел 4.3, и грамматикой в , раздел 4.1,, значение может быть токеном без кавычек (например, the_report.pdf
) или строкой в кавычках, которая также может содержать пробел ( например, "the report.pdf"
) и escape-последовательности. Кроме того,
когда и "имя файла", и "имя файла *" присутствуют в одном значении поля заголовка, [мы] ДОЛЖНЫ выбрать "имя файла *" и игнорировать "имя файла".
Однако значение filename*
все же немного сложнее, чем значение filename
.
Кроме того, RFC, кажется, допускает дополнительные пробелы вокруг =
.
Таким образом, для примеров, перечисленных в RFC, я бы хотел получить следующие результаты:
имя файла:Content-Disposition: Attachment; filename=example.html
example.html
имя файла:Content-Disposition: INLINE; FILENAME= "an example.html"
an example.html
имя файла:Content-Disposition: attachment; filename*= UTF-8''%e2%82%ac%20rates
€ rates
имя файла: здесьContent-Disposition: attachment; filename="EURO rates"; filename*=utf-8''%e2%82%ac%20rates
€ rates
тоже (неEURO rates
, так какfilename*
имеет преимущество)
Теперь я мог бы легко адаптировать регулярное выражение для учета переменных пробелов вокруг =
, но иметь его для обработки всех других вариантов тоже было бы довольно громоздко. (С учетом цитирования и экранирования я даже не уверен, что RegEx может охватить все случаи. Может быть, они могут, так как здесь нет вложенных скобок.)
Итак, я должен реализовать полноценный синтаксический анализатор или я могу определить имя файла в соответствии с RFC 6266 с помощью нескольких вызовов HTTP-библиотеки (может быть, самого TG420)? Поскольку RFC 6266 является частью стандарта HTTP, я могу представить, что некоторые библиотеки, специализирующиеся на HTTP, уже охватывают это. (Поэтому я также спрашивал о Рекомендациях по программному обеспечению SE.)