Потоковые данные для отдыха с использованием труб Unix

Измените или добавьте строку PEERDNS=no в конфигурационный файл, соответствующий вашему сетевому интерфейсу в директории /etc/sysconfig/network-scripts/.

Если ваше сетевое устройство - eth0, файл для изменения будет иметь имя ifcfg-eth0.

Чтобы узнать имя вашего сетевого интерфейса, используйте команду ip address show для вывода списка ваших сетевых интерфейсов и их адресов.

Кроме того, вы можете указать записи DNS, которые вы хотите видеть в /etc/resolv.conf, добавив строки DNS1= и DNS2= в файл конфигурации сети.

https://www.suse.com/documentation/sled11/book_sle_admin/data/sec_basicnet_manconf.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s1-networkscripts-interfaces.html

2
13.09.2018, 17:43
2 ответа

Глядя на код curl transfer.c кажется, что программа способна переупаковывать данные запроса (из curl на сервер )с использованием протокола фрагментации, где каждый фрагмент данных с префиксом длины фрагмента в шестнадцатеричном формате ascii и с суффиксом \r\n.

Кажется, способ заставить его использовать это в потоковом режиме после подключения к серверу — с помощью -T -. Рассмотрим этот пример:

for i in $(seq 5)
do date
   sleep 1
done | 
dd conv=block cbs=512 |
strace -t -e sendto,read -o /tmp/e \
 curl --trace-ascii - \
 -H "Transfer-Encoding: chunked" \
 -H "Content-Type: application/json" \
 -X POST -T -  http://localhost/...

Этот скрипт отправляет 5 блоков данных, каждый из которых начинается с даты и дополняется до 512 байт с помощью dd, в канал, где straceзапускает curl -T -для чтения канала. В терминале видим

== Info: Connected to localhost (::1) port 80 (#0)
=> Send header, 169 bytes (0xa9)
0000: POST /... HTTP/1.1
001e: Host: localhost
002f: User-Agent: curl/7.47.1
0048: Accept: */*
0055: Transfer-Encoding: chunked
0071: Content-Type: application/json
0091: Expect: 100-continue
00a7: 
<= Recv header, 23 bytes (0x17)
0000: HTTP/1.1 100 Continue

, который показывает соединение и отправленные заголовки. В частности, curlпредоставил не заголовок Content-length:, а заголовок Expect:, на который сервер (apache )ответил Continue. Сразу после идут первые 512 байт (200 в шестнадцатеричном формате )данных:

=> Send data, 519 bytes (0x207)
0000: 200
0005: Fri Sep 14 15:58:15 CEST 2018                                   
0045:                                                                 
0085:                                                                 
00c5:                                                                 
0105:                                                                 
0145:                                                                 
0185:                                                                 
01c5:                                                                 
=> Send data, 519 bytes (0x207)

Глядя в выходной файл strace, мы видим каждую отметку времени readиз канала и sendtoзапись в соединение:

16:00:00 read(0, "Fri Sep 14 16:00:00 CEST 2018   "..., 16372) = 512
16:00:00 sendto(3, "200\r\nFri Sep 14 16:00:00 CEST 20"..., 519,...) = 519
16:00:00 read(0, "Fri Sep 14 16:00:01 CEST 2018   "..., 16372) = 512
16:00:01 sendto(3, "200\r\nFri Sep 14 16:00:01 CEST 20"..., 519,...) = 519
16:00:01 read(0, "Fri Sep 14 16:00:02 CEST 2018   "..., 16372) = 512
16:00:02 sendto(3, "200\r\nFri Sep 14 16:00:02 CEST 20"..., 519,...) = 519
16:00:02 read(0, "Fri Sep 14 16:00:03 CEST 2018   "..., 16372) = 512
16:00:03 sendto(3, "200\r\nFri Sep 14 16:00:03 CEST 20"..., 519,...) = 519
16:00:03 read(0, "Fri Sep 14 16:00:04 CEST 2018   "..., 16372) = 512
16:00:04 sendto(3, "200\r\nFri Sep 14 16:00:04 CEST 20"..., 519,...) = 519
16:00:04 read(0, "", 16372)             = 0
16:00:05 sendto(3, "0\r\n\r\n", 5,...) = 5

Как вы можете видеть, они разделены интервалом в 1 секунду, показывая, что данные отправляются по мере их получения. У вас должно быть не менее 512 байт для отправки, так как данные считываются fread().

8
27.01.2020, 21:53

См. Редактировать ниже

То, что вы хотите, невозможно. Чтобы отправить данные POST, длина должна быть известна, поэтому curlдолжен сначала прочитать все ваши данные, чтобы определить длину.

Transfer-Encoding: chunked— это способ обойти это ограничение, но только для ответа от сервера.

Причина в том, что chunkedподдерживается только в HTTP/1.1, но при отправке запроса клиент не может знать, понимает ли сервер HTTP/1.1 или нет. Эта информация приходит с ответом, но уже слишком поздно для отправки запроса.

Редактировать

Похоже, это ограничение в wget, из руководства по wget:

Please be aware that Wget needs to know the size of the POST data in advance. Therefore the argument to --post-file must be a regular file; specifying a FIFO or something like /dev/stdin won’t work. It’s not quite clear how to work around this limitation inherent in HTTP/1.0. Although HTTP/1.1 introduces chunked transfer that doesn’t require knowing the request length in advance, a client can’t use chunked unless it knows it’s talking to an HTTP/1.1 server. And it can’t know that until it receives a response, which in turn requires the request to have been completed – a chicken-and-egg problem.

Хотя проблема существует, она признана в RFC 7230 :

.

A client MUST NOT send a request containing Transfer-Encoding unless it knows the server will handle HTTP/1.1 (or later) requests; such knowledge might be in the form of specific user configuration or by remembering the version of a prior received response.

Таким образом, отправка данных POST по частям возможна, и, как показывает другой ответ, curl уже поддерживает это.

1
27.01.2020, 21:53

Теги

Похожие вопросы