Не-не-не, все так и должно быть: read тупо пытается прочесть по кускам контент веб-страницы с сокета. Если сервак пока еще не кинул ошибку соединения, и контент отсутствует - в сокете ничего свеженького не будет, и read выдаст пустую строку. Если соединение говеное, то сокет закрывается, и read выдает nil с причиной. А если URL валидная, то и содержимое будет выдано практически мгновенно, поэтому никаких пустых строк замечено не бывает - либо бывает, но крайне редко.
Потому что sleep в опеноси работает через цикл:
function os.sleep(timeout)
checkArg(1, timeout, "number", "nil")
local deadline = computer.uptime() + (timeout or 0)
repeat
event.pull(deadline - computer.uptime())
until computer.uptime() >= deadline
end
В твоем случае достаточно спокойно ждать, пока содержимое соединения прочтется - и забить болт на всякие пустые строки. Всяко будет быстрее, чем статичный sleep в каждом запросе