Что определяет стандарт cgi
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
CGI (Common Gateway Interface)
CGI (англ. Common Gateway Interface — «общий интерфейс шлюза») — стандарт интерфейса, используемого для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» (сценарий) или «CGI-программа». Обычно гипертекстовые документы, извлекаемые из www (world wide web) серверов, содержат статические данные. С помощью CGI можно создавать CGI-программы, называемые шлюзами, которые во взаимодействии с такими прикладными системами, как система управления базой данных, электронная таблица, деловая графика и др., смогут выдать на экран пользователя динамическую информацию. Программа-шлюз запускается www сервером в реальном масштабе времени. www сервер обеспечивает передачу запроса пользователя шлюзу, а она в свою очередь, используя средства прикладной системы, возвращает результат обработки запроса на экран пользователя. [1]
Содержание
Главное назначение CGI
Обеспечение единообразного потока данных между сервером и прикладной программой, которая запускается из-под сервера. CGI определяет протокол обмена данными между сервером и программой.
Такие понятия, как метод доступа, переменные заголовка, MIME, типы данных, заимствованы из HTTP и делают спецификацию прозрачной для тех, кто знаком с самим протоколом.
При описании различных программ, которые вызываются сервером HTTP и реализованы в стандарте CGI, используют следующую терминологию:
Общий шлюзовый интерфейс CGI
CGI (Common Gateway Interface) — механизм доступа к программам на стороне веб-сервера. Спецификация CGI была разработана для расширения возможностей сервиса www за счет подключения различного внешнего программного обеспечения. При использовании CGI веб-сервер представляет браузеру доступ к исполнимым программам, запускаемым на его (серверной) стороне через стандартные потоки ввода и вывода.
Интерфейс CGI применяется для создания динамических веб-сайтов, например, когда веб-страницы формируются из результатов запроса к базе данных. Сейчас популярность CGI снизилась, т.к. появились более совершенные альтернативные решения (например, модульные расширения веб-серверов).
Веб-серверы
Веб-сервер — это сетевое приложение, обслуживающее HTTP-запросы от клиентов, обычно веб-браузеров. Веб-сервер принимает запросы и возвращает ответы, обычно вместе с HTML-страницей, изображением, файлом, медиа-потоком или другими данными. Веб-серверы — основа Всемирной паутины. С расширением спектра сетевых сервисов веб-серверы все чаще используются в качестве шлюзов для серверов приложений или сами представляют такие функции (например, Apache Tomcat).
Созданием программного обеспечения веб-серверов занимаются многие разработчики, но наибольшую популярность имеют такие программные продукты, как Apache (Apache Software Foundation), IIS (Microsoft), Google Web Server (GWS, Google Inc.) и nginx.
Первые HTTP-клиенты были консольными и работали в текстовом режиме, позволяя читать гипертекст и перемещаться по ссылкам. Сейчас консольные браузеры (такие, как lynx, w3m или links) практически не используются рядовыми посетителями веб-сайтов. Тем не менее такие браузеры весьма полезны для веб-разработчиков, так как позволяют «увидеть» веб-страницу «глазами» поискового робота.
Исторически первым браузером в современном понимании (т.е. с графическим интерфейсом и т.д.) была программа NCSA Mosaic, разработанная Марком Андерисеном и Эриком Бина. Mosaic имел довольно ограниченные возможности, но его открытый исходный код стал основой для многих последующих разработок. [3]
Принцип работы CGI
Обобщенный алгоритм работы через CGI можно представить в следующем виде:
Механизмы обмена данными
Переменные окружения
При запуске внешней программы сервер создает специфические переменные окружения, через которые передает приложению как служебную информацию, так и данные. Все переменные можно разделить на общие переменные окружения, которые генерируются при любой форме запроса, и запрос-ориентированные переменные.
Общие переменные окружения
Запрос-ориентированные окружения
Идентификация пользователя и его машины
Переменные, определяющие тип и длину передаваемой информации от клиента к серверу
Возможна передача и других переменных окружения. В этом случае перед именем указывается префикс «HTTP_». Отдельный случай представляют переменные, порожденные в заголовке HTML-документа в тагах META. Они передаются в заголовке сообщения и некоторые серверы могут порождать переменные окружения из этих полей заголовка.
Опции командной строки
Формат стандартного ввода
Формат стандартного вывода
Content-type
Указывается в том случае, когда скрипт сам генерирует документ «на лету» и возвращает его клиенту. В этом случае реального документа в файловой системе сервера не остается. При использовании такого сорта скриптов следует учитывать, что не все серверы и клиенты отрабатывают так, как представляется разработчику скрипта. Так, при указании Content-type: text/html, некоторые клиенты не реализуют сканирования полученного текста на предмет наличия в нем встроенной графики. Обычно в Content-type указывают текстовые типы text/plain и text/html.
Location
Используется для переадресации. Иногда переадресация помогает преодолеть ограничения сервера или клиента на обработку встроенной графики или серверной предобработки. В этом случае скрипт создает файл на диске и указывает его адрес в Location. Сервер, таким образом, передает реально существующий файл. В последнее время серверы стали буферизовать возвращаемые клиентам данные, что приводит к решению вопросов, связанных с повторным запуском скриптов для встраивания графики и разгрузки компьютера с сервером HTTP. [4]
Области применения CGI
Наиболее частая задача, для решения которой применяется CGI — создание интерактивных страниц, содержание которых зависит от действий пользователя. Типичными примерами таких веб-страниц являются форма регистрации на сайте или форма для отправки комментария. Другая область применения CGI, остающаяся за кулисами взаимодействия с пользователем, связана со сбором и обработкой информации о клиенте: установка и чтение «cookies»; получение данных о браузере и операционной системе; подсчет количества посещений веб-страницы; мониторинг веб-трафика и т. п.
Эти возможности обеспечиваются тем, что CGI-скрипт может быть подключен к базе данных или обращаться к файловой системе сервера. Таким образом CGI-скрипт может сохранять информацию в таблицах БД или файлах и получать ее оттуда по запросу, чего нельзя сделать средствами HTML.
Преимущества CGI
Многие возможности CGI сейчас дублируются такими технологиями, как например DHTML, ActiveX или Java-апплетами. Основными преимуществами использования серверных скриптов является то, что вы можете быть уверены, что все клиенты (за редким исключением, как правило связанным с блокировкой доступа к определенным ресурсам на уровне файрвола) смогут работать с серверным приложением. Клиентские-же программы могут быть просто отключены в браузере, или вовсе не поддерживаться.
Недостатки CGI
Самым большим недостатком этой технологии являются повышенные требования к производительности веб-сервера. Дело в том, что каждое обращение к CGI-приложению вызывает порождение нового процесса, со всеми вытекающими отсюда накладными расходами. Если же приложение написано с ошибками, то возможна ситуация, когда оно, например, зациклится. Браузер прервет соединение по истечении тайм-аута, но на серверной стороне процесс будет продолжаться, пока администратор не снимет его принудительно. В этом отношении клиентские скрипты имеют существенное преимущество, т. к. они выполняются локально.
Другим недостатком CGI является меньшая, по сравнению с другими решениями, защищенность веб-сервера. Неправильная настройка прав доступа к серверным ресурсам из CGI-приложения может поставить под угрозу не только работоспособность веб-сервера, но и информационную безопасность. Впрочем, любую сетевую технологию можно считать потенциально небезопасной уже по определению. [5]
CGI: что это такое и зачем дизайнеру
Поговорим о скилле, который может сделать из обычного дизайнера профи и привлечь клиентов, — технологии CGI.
CGI — что это
CGI (computer-generated imagery, или «изображения, сгенерированные компьютером») — это изображения, которые сделали с помощью компьютерной графики. Они могут быть статичными и подвижными, двухмерными и трехмерными — хотя сам термин CGI используют чаще всего для последних.
Сегодня CGI ассоциируется прежде всего с кино и спецэффектами. И это понятно: создатели фильмов охотно раскрывают секреты создания блокбастеров. Вспомните шумиху вокруг «Войны бесконечности» — доля компьютерной графики там просто заоблачная.
Недавно команда по спецэффектам поделилась роликом, в котором показала, как эффекты накладываются на отснятые кадры. А бой Железного человека и Паука против Калла Обсидиана, кстати, — чистое CGI.
Однако дело не ограничивается масштабными картинами. CGI можно встретить везде: в изобразительном искусстве, печати, на телевидении, в видеоиграх — и, конечно же, в рекламе.
Важно!
Внутриигровую графику обычно не причисляют к CGI, хотя технически это не что иное, как покадровый рендеринг изображений, происходящий в реальном времени. Однако ролик внутри игры можно считать продуктом CGI, а графику самой игры — нет.
Для чего используется компьютерная графика в рекламе
Как и везде, CGI в рекламе служит двум целям: сделать картинку красивой и показать что угодно как угодно. Представьте типовую рекламу мужского дезодоранта в стиле боевика девяностых. Мускулистый мачо в течение двадцати секунд спасает мир, уворачиваясь от крылатых ракет. Вертолет взрывается в кадре, а рубашка на герое сухая и совсем не пахнет. Все это было бы невозможно показать на экране без CGI.
И речь не только о видеороликах. По сути, все красивые картинки вокруг нас создаются при помощи CGI — и где использовать это, как не в рекламе? Промостраницы, ролики по телевизору, полиграфия, наружка и все остальное не обходятся без компьютерной графики.
Красивые картинки — CGI в изображениях
В основе рекламного лоска лежат три направления визуализации, которые могут использоваться вместе и по отдельности. Все зависит от цели и вида рекламы, а также скиллов дизайнера.
1. Изображения людей
Ретушь фотографий — пожалуй, самый востребованный навык при работе с рекламными иллюстрациями.
2. Предметная иллюстрация
Сделать продукт привлекательным, добавить правильное освещение и тени, поправить композицию — такую визуализацию чаще всего можно увидеть в рекламе автомобилей и алкоголя.
3. Ландшафты и пейзажи
Ну и создать для всего этого великолепия красивый фон.
В зависимости от того, какие задачи стоят перед дизайнером, все вышеперечисленное можно сделать в 2D-редакторах (например, Photoshop) или в 3D (3ds Max). Скажем, если нам нужно создать из двух ландшафтов один, Photoshop будет достаточно.
Но в рекламной графике часто не обойтись без 3D, ведь не все можно найти на стоках — и не все можно сфотографировать. Например, вам нужно создать изображение звездолета на поле для гольфа. На фоне звездного неба. С двумя последними пунктами проблем, конечно, не будет, а для звездолета как раз и понадобится 3D.
3D в CGI
В 3D-редакторах можно сделать фотореалистичную картинку всего — и это будет дешевле, чем устраивать фотосессии с модными фотографами или искать подходящее изображение и покупать его. А иногда без 3D просто не справиться — особенно, когда нужно визуализировать объекты, существующие только в фантазии автора.
Вернемся к звездолету или возьмем любой другой предмет и разберем главные шаги по созданию его в 3D-редакторе. В общих чертах процесс будет выглядеть примерно так:
Делаем форму нашего предмета. Чаще всего для этого используют полигональную сетку: создают и изменяют ее, пока не получится нужная форма. Объект будет выглядеть как геометрическая фигура, у которой много граней.
Создаем реалистичную поверхность объекта с помощью текстур и материалов.
Настраиваем освещение для финального изображения. Основные пункты на этом заканчиваются, но если мы делаем видео, то вот еще:
Дизайнер, который занимается CGI-графикой, получает сегодня лучших клиентов и большую часть заказов на рекламном рынке. Выйти на новый уровень, прокачать скиллы, освоить современные техники и инструменты поможет курс «Рекламная графика».
Пишет о digital с 2011 г. Руководитель и шеф-редактор контент-агентства Morze. Готовит коммерческие тексты для Skillbox.
Что определяет стандарт cgi
CGI (от англ. Common Gateway Interface — «общий интерфейс шлюза») — стандарт интерфейса, используемого для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» (сценарий) или «CGI-программа».
Упрощенная модель, иллюстрирующая работу CGI:
Сам интерфейс разработан таким образом, чтобы можно было использовать любой язык программирования, который может работать со стандартными устройствами ввода-вывода. Такими возможностями обладают даже скрипты для встроенных командных интерпретаторов операционных систем, поэтому в простых случаях могут использоваться даже командные скрипты.
Как работает CGI?¶
Обобщенный алгоритм работы через CGI можно представить в следующем виде:
Области применения CGI¶
Наиболее частая задача, для решения которой применяется CGI — создание интерактивных страниц, содержание которых зависит от действий пользователя. Типичными примерами таких веб-страниц является форма регистрации на сайте или форма для отправки комментария. Другая область применения CGI, остающаяся за кулисами взаимодействия с пользователем, связана со сбором и обработкой информации о клиенте: установка и чтение «печенюшек»-cookies; получение данных о браузере и операционной системе; подсчет количества посещений веб-страницы; мониторинг веб-трафика и т.п.
Это обеспечивается возможностью подключения CGI-скрипта к базе данных, а также возможностью обращаться к файловой системе сервера. Таким образом CGI-скрипт может сохранять информацию в таблицах БД или файлах и получать ее оттуда по запросу, чего нельзя сделать средствами HTML.
CGI — это не язык программирования! Это простой протокол, позволяющий веб-серверу передавать данные через stdin и читать их из stdout. Поэтому в качестве CGI-обработчика может использоваться любая серверная программа, способная работать со стандартными потоками ввода-вывода.
CGI-программирование на ассемблере. – Легко!
Статья гуляет в интернете уже довольно давно, но, как автор думаю имею право на ее перепост здесь. Многое (если не все) написаное здесь устарело, и может показаться бесполезным с первого взгляда, однако пройдя этот путь, спустя 6 лет могу сказать, это не оказалось лишним. Итак.
В этой статье я хочу рассказать о CGI интерфейсе вообще, его реализации для windows и использовании при написании CGI-программ языка ассемблер в частности. В рамки этой статьи не входит полное описание CGI, так-как в Интернете материала по этому вопросу просто море и пересказывать все это здесь я просто не вижу смысла.
Теория CGI
CGI – (Common Gateway Interface) – Общий Шлюзовый Интерфейс. Как не трудно догадаться интерфейс этот служит шлюзом между сервером (здесь я подразумеваю программу — сервер) и какой-либо внешней программой написанной для ОС на которой этот самый сервер запущен. Таким образом CGI отвечает за то, каким именно образом данные будут переданы от программы-сервера к CGI-программе и обратно. Интерфейс не накладывает никаких ограничений на то, на чем должна быть написана CGI-программа, это может быть как обычный исполнимый файл, так и любой другой файл – главное, чтобы сервер смог его запустить (в среде windows это например может быть файл с расширением, привязанным к какой-либо программе).
С момента когда Вы вызвали (например нажали кнопку формы, к которой привязан вызов CGI-программы) CGI-программу до получения вами результата в окно браузера происходит следующее:
— Вэб-клиент (например браузер) создает подключение к серверу, указанному в URL;
— Вэб-клиент посылает запрос серверу, запрос этот обычно делается с помощью двух методов GET или POST;
— Данные из запроса клиента (например значения полей формы) передаются сервером, используя CGI-интерфейс, CGI-программе, указанной в URL;
— CGI-программа обрабатывает данные клиента, полученные от сервера и генерирует на основе этой обработки ответ клиенту, который она передает по все тому же CGI-интерфейсу серверу, а он в свою очередь передает его уже непосредственно клиенту;
— Сервер разрывает соединение с клиентом.
В стандартной спецификации CGI принято, что сервер может обмениваться с программой следующими способами:
— Переменные окружения – они могут быть установлены сервером при запуске программы;
— Стандартный поток ввода (STDIN) – с его помощью сервер может передать данные программе;
— Стандартный поток вывода (STDOUT) – программа может писать в него свой вывод, передающийся серверу;
— Командная строка – в ней сервер может передать некоторые параметры программе.
Стандартные потоки ввода/вывода весьма удобны и широко используются на UNIX-системах, чего не скажешь о windows, поэтому существует спецификация CGI, разработанная специально для windows-систем так и называемая «Windows CGI». Но, естественно, и стандартные потоки ввода/вывода так же можно использовать в windows CGI программировании. Здесь я не буду затрагивать стандарт «Windows CGI», и на это существует по крайней мере две причины – первая, и самая главная – на данный момент не все http-сервера под windows поддерживают эту спецификацию (в частности мой любимый Apache 1.3.19). Вторую причину вы можете наблюдать набрав в любой поисковой системе строчку «Windows CGI». Отмечу относительно этого интерфейса лишь общие детали – все данные от сервера к клиенту передаются посредством обычного для windows *.ini файла, имя которого передается программе в командной строке. При этом все данные в файле уже заботливо разбиты по секциям сервером и вам лишь остается используя функции «GetPrivateProfile*» извлечь их оттуда. Ответ серверу передается опять же посредством файла, имя которого указано в соответствующей записи ini-файла.
Какие же данные могут быть переданы клиентом CGI-программе? – практически любые. В общем случае программе передаются значения полей формы, которые заполняет клиент, но это также могут быть и какие-либо двоичные данные, например файл с картинкой или музыкой. Данные могут быть переданы на сервер двумя различными методами – это метод GET и метод POST. Когда мы создаем форму для заполнения на нашей страничке мы явно указываем каким из приведенных методов мы хотим отправить введенные пользователем данные, делается это в основном тэге формы примерно так:
При отправке данных методом GET, данные браузером считываются из формы и помещаются следом за URL скрипта, за знаком вопроса, если значимых полей в форме несколько, то они передаются все через значёк «&», имя поля и его значение пишутся в URL через знак «=». Например запрос, сгенерированный браузером из формы при нажатии на кнопку, к которой привязан скрипт «/cgi-bin/test.exe», при учете что первое поле формы называется «your_name», второе – «your_age», может выглядеть так:
GET /cgi-bin/test.exe?your_name=Pupkin&your_age=90 HTTP/1.0
Использование метода GET имеет сразу несколько слабых сторон – первое и самое главное – т.к. данные передаются в URL то он имеет ограничение на количество этих самых передаваемых данных. Вторая слабость опять же вытекает из URL – это конфиденциальность, при такой передаче данные остаются абсолютно открытыми. Итак, хорошо если у нас в форме 2-3 небольших поля… встает вопрос что же делать если данных больше? Ответ – использовать метод POST!
При использовании метода POST данные передаются серверу как блок данных, а не в URL, что несколько развязывает нам руки для увеличения объема передаваемой информации, для вышеприведенного примера формы POST блок, посылаемый серверу будет примерно такой:
POST /cgi-bin/test.exe HTTP/1.0
Accept: text/plain
Accept: text/html
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-length: 36
your_name=Pupkin&your_age=90
Как уже говорилось выше, после получения данных сервер должен преобразовать их и передать CGI программе. В стандартной спецификации CGI введенные клиентом данные при запросе GET помещаются сервером в переменную среды программы «QUERY_STRING». При запросе POST данные помещаются в стандартный поток ввода приложения, откуда могут быть им считаны. Кроме того, при таком запросе сервером устанавливаются еще две переменные среды — CONTENT_LENGTH и CONTENT_TYPE, по которым можно судить о длине запроса в байтах и о его содержании.
Помимо самих данных сервером устанавливаются и другие переменные окружения вызываемой программы, приведу некоторые из них:
REQUEST_METHOD
Описывает каким именно методом получены данные
Пример:REQUEST_METHOD=GET
QUERY_STRING
Строка запроса, если использовался метод GET
Пример:QUERY_STRING= your_name=Pupkin&your_age=90&hobby=asm
CONTENT_LENGTH
Длина в байтах тела запроса
Пример:CONTENT_LENGTH=31
CONTENT_TYPE
Тип тела запроса
GATEWAY_INTERFACE
Версия протокола CGI
Пример:GATEWAY_INTERFACE=CGI/1.1
REMOTE_ADDR
IP-Адрес удаленного хоста, то бишь клиента, нажавшего кнопочку в форме
Пример:REMOTE_ADDR=10.21.23.10
REMOTE_HOST
Имя удаленного хоста, это может быть его доменное имя или например имя компьютера в среде Windows, если таковые получены быть не могут, то поле содержит его IP
Пример:REMOTE_HOST=wasm.ru
SCRIPT_NAME
Имя скрипта, использованное в запросе.
Пример:SCRIPT_NAME=/cgi-bin/gols.pl
SCRIPT_FILENAME
Имя файла скрипта на сервере.
Пример:SCRIPT_FILENAME=c:/page/cgi-bin/gols.pl
SERVER_SOFTWARE
Программное обеспечение сервера
Пример:Apache/1.3.19 (WIN32)
Вызываемая CGI-программа может прочитать любую из переменных своего окружения, установленных сервером и использовать ее в своих интересах.
В общем-то это вкратце все, для получения более подробной информации о Общем Шлюзовом Интерфейсе смотрите специализированную документацию, это описание я сделал для того, чтобы напомнить вам, а если не знали то ввести в курс дела. Давайте попробуем что-нибудь сделать на практике.
Практическая часть
Для практики нам понадобятся как минимум 3 вещи – какой-нибудь http-сервер для Windows, все примеры я пробовал на Apache 1.3.19 для Windows, сервер бесплатный, скачать его можно с i
Да, и сервер нам понадобится не абы – какой, а настроенный для запуска cgi-скриптов! Как это делается для сервера используемого вами смотрите документацию. Вторая вещь, которая нам понадобится это, естественно, ассемблер, так же необходимо, чтобы компилятор поддерживал создание консольных WIN32 приложений, я использую Tasm, но прекрасно подойдут и Fasm и Masm и множество других *asm’ов. Ну и наконец самое главное, что потребуется это желание.
Итак, я допускаю, что сервер был вами благополучно поставлен и настроен, так, что в корневой директории документов сервера лежит файлик index.html, который замечательно показывается в браузере, когда вы набираете адрес 127.0.0.1. Так же я учту, что где-то в дебрях папок сервера существует папочка «cgi-bin», в которой разрешен запуск скриптов.
Давайте проверим настройку сервера, а заодно и напишем небольшой скрипт. Скрипт наш будет обычным *.bat файлом. Предвижу вопросы – как? неужели? Да, это обычный командный файл, как уже говорилось выше спецификация CGI не делает различий между типами файлов, главное, чтобы сервер мог его запустить, а он в свою очередь, имел доступ к stdin/stdout и переменным окружения, bat-файл, пусть и не в полной мере, но для примера нас вполне устроит. Создадим файл примерно такого содержания:
@echo off
rem Заголовок апроса
echo Content-type: text/html
echo.
rem Тело запроса
echo «Привет!
echo «С запросом GET пришли данные: %QUERY_STRING%
Файл назовем test.bat и поместим его в директорию для запуска скриптов, скорее всего это будет директория «cgi-bin». Следующее, что нам нужно будет сделать, это каким либо образом вызвать этот скрипт, в принципе, сделать это можно напрямую набрав в окошке адреса браузера примерно следующее «http://127.0.0.1/cgi-bin/test.bat», но давайте сделаем его вызов с нашей главной странички, заодно проверим работу метода GET. Создадим в корне сервера файл index.html со следующим содержанием:
Функция возвратит необходимый нам для операций чтения/записи хэндл. Следующее что нам необходимо делать это писать/читать эти потоки. Делается это обычными операциями чтения/записи файлов, т.е. ReadFile и WriteFile. Тут есть одна тонкость, можно подумать, что для этих целей можно использовать WriteConsole/ReadConsole, да это действительно справедливо для консоли и будет прекрасно работать, результаты, так же как и с WriteFile будут выводиться на консоль, но продолжаться это будет пока мы не запустим нашу программу как скрипт на сервере. Происходит это потому что, когда нашу программу запускает сервер хндлы, возвращаемые функцией «GetStdHandle» уже не будут хндлами консоли как таковыми, они будут хэндлами pipe, что необходимо для связи двух приложений.
Вот небольшой пример того, как должна выглядеть CGI-программа на ассемблере:
xor ebx,ebx
call GetStdHandle,STD_OUTPUT_HANDLE
mov hStdout,eax
call GetStdHandle,STD_INPUT_HANDLE
mov hStdin,eax
call write_stdout, offset header
call write_stdout, offset start_html
call VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE
mov hMem,eax
mov edi,eax
call GetEnvironmentStringsA
mov esi,eax
next_symbol:
mov al,[esi]
or al,al
jz end_string
mov [edi],al
next_string:
cmpsb
jmp short next_symbol
end_string:
mov [edi],’>rb