В ином случае соединение было выполнено успешно. Сокет снова переводится в блокирующий режим и предпринимается попытка отправить соответствующий запрос get на Web-сервер. В случае ошибки записи выдается сообщение об ошибке и возвращается значение undef. В ином случае можно сделать вывод, что запрос был отправлен успешно, и установить значение переменной состояния, равное “reading header”.
Строки 69-74. Метод read() вызывается после перехода сокета объекта HTTPFetch в состояние готовности для чтения, что может указывать на то, что сервер приступил к отправке ответа HTTP. Рассматривается содержимое переменной состояния status. Если эта переменная имеет значение “reading header”, вызывается метод read_header (). В ином случае вызывается метод read_body().
Строки 75-93. Метод read_header (). Этот метод немного сложнее, поскольку необходимо выполнять чтение до тех пор, пока не появятся две пары символов crlf, которые обозначают конец заголовка. Для этого нельзя использовать оператор <>, поскольку он может заблокироваться и, к тому же, безусловно, будет конфликтовать с вызовами функции select () в основной программе. Для этого сокета вызывается функция sysread (), которая запрашивает фрагмент данных длиной 1024 байта. Может быть получен весь фрагмент в одной операции или выполнено частичное чтение, после которого снова придется вызывать операцию чтения после перехода сокета в состояние готовности. В любом случае все полученные данные добавляются к концу внутреннего буфера, обозначенного переменной экземпляра header, и используется функция rindex () для проверки того, не была ли получена пара символов crlf. Функция rindex () возвращает индекс искомой строки в более длинной строке, начиная с крайней правой позиции.