Измените или добавьте строку 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
Глядя на код 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()
.
См. Редактировать ниже
То, что вы хотите, невозможно. Чтобы отправить данные 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 уже поддерживает это.