Частичное чтение из URL-адресов с помощью ЧТЕНИЯ / ЧАСТИ или ЧТЕНИЯ / ПОИСКА

#rebol #rebol3

#rebol #rebol3

Вопрос:

Частичное чтение через HTTP Range -заголовок отлично работает для меня:

 rebol []
client: open tcp://www.apache.org/

client/awake: func [event /local port] [
    port: event/port
    switch event/type [
        lookup [open port]
        connect [
            write port rejoin [
                {GET / HTTP/1.1} crlf
                {User-Agent: curl/7.26.0} crlf
                {Host: www.apache.org} crlf
                {Accept: */*} crlf
                {Range: bytes=0-9} crlf
                crlf
            ]
        ]
        wrote [read port]
        read [
            probe to-string port/data
            probe length? port/data
            clear port/data
        ]        
    ]
    false
]

wait [client 3]
close client
print "Done"
  

Я думаю, что я мог бы использовать READ / PART, чтобы сделать то же самое:

 length? read/part http://www.apache.org/ 10   ;40195
length? read http://www.apache.org/           ;40195
  

но это не работает, все равно получите все байты. То же самое с READ/SEEK .
Почему это было?
(Кстати, это работает в Rebol2.)

Ответ №1:

Вы можете видеть из источника

 https://github.com/rebol/rebol/blob/master/src/mezz/prot-http.r#L424
  

что у read субъекта нет определенных уточнений. Это не означает, что они не могут быть определены, но в настоящее время не принято никакого решения о том, следует ли это делать с помощью уточнений или с помощью диалекта запроса.

Вы можете увидеть, установив trace/net on , что он подделывает его в Rebol2

 >> trace/net on
>> read/part http://www.apache.org 10
URL Parse: none none www.apache.org none none none
Net-log: ["Opening" "tcp" "for" "HTTP"]
connecting to: www.apache.org
Net-log: {GET / HTTP/1.0
Accept: */*
Connection: close
User-Agent: REBOL View 2.7.8.3.1
Host: www.apache.org
}
Net-log: "HTTP/1.1 200 OK"
Net-log: ["low level read of " 2048 "bytes"]
Net-log: ["low level read of " 2048 "bytes"]
.. many lines removed
Net-log: ["low level read of " 2048 "bytes"]
Net-log: ["low level read of " 2048 "bytes"]
Net-log: ["low level read of " 2048 "bytes"]
== "<!DOCTYPE "
  

Комментарии:

1. Итак, в Rebol2 READ / PART просто получает все данные и возвращает их часть? trace это круто!

Ответ №2:

Можно с уверенностью предположить, что это просто не реализовано в текущей версии HTTP scheme. Есть и другие недостающие части, такие как перенаправление, поэтому я бы предположил, что оно еще не поддерживается.