powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Работа с "Cookie" в Web-Сервисе SA 10.
16 сообщений из 16, страница 1 из 1
Работа с "Cookie" в Web-Сервисе SA 10.
    #35579005
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть в интернете такая статья:
Что такое cookies и как с ними работать
(Более лучшей или свежей статьи по этой теме найти не удалось)

В ней есть такой момент:
В случае, если cookie принимает новое значение при имеющемся уже в браузере
cookie с совпадающими параметрами NAME, domain и path, то старое значение
заменяется новым. В остальных случаях новые значения cookie добавляются к
старым.
Создаю web-сервис и SP для проверки как работает задание cookie с разными
NAME, то есть как новые значения cookie добавляются к старым.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROCEDURE "DBA"."TestWebCook1"()
result (html_document long varchar)
BEGIN

 declare res long varchar;

 call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1;');
 call dbo.sa_set_http_header('Set-Cookie', 'Name2=Value2;');

 set res = '<html><head>\n';
 set res = res || '<title>Test page Russian text</title>\n';
 set res = res || '</head>\n<body>\n';
 set res = res || 'Cookie: ' || http_header('Cookie') || '\n';
 set res = res || '</body>\n</html>';

 call dbo.sa_set_http_header('Content-Type', 'text/html; charset=windows-1251');
 call dbo.sa_set_http_header('Pragma', 'no-cache');
 call dbo.sa_set_http_header('Cache-Control', 'no-cache');

 select res;

END

Вызываю свой web-сервис в браузере, жму кнопку "Refresh".
Но вместо ожидаемого

Cookie: Name1=Value1; Name2=Value2

я получаю

Cookie: Name2=Value2

Это в статье неправильно написано или может быть я что то неправильно
делаю или это ошибка SA ?


Или может быть в рамках одной HTML-страницы нельзя таким образом задавать
разные NAME для cookie ?

Попробовал в SP вместо двух 'Set-Cookie' прописать одно
Код: plaintext
call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1; Name2=Value2; Name3=Value3; path=/');

но в браузере получил только
Cookie: Name1=Value1
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35579048
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalker4Есть в интернете такая статья:Не читай методички, читай RFC 2109
Обрати внимание на главу 4.2.2
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35579187
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитал RFC, но честно говоря все равно не понял, что я сделал не правильно.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35579225
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все неправильно.
Во первых, sa_set_http_header() заменяет а не добавляет строку заголовка с одинаковым именем.
Код: plaintext
1.
 call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1;');
 call dbo.sa_set_http_header('Set-Cookie', 'Name2=Value2;');
Здесь вторая команда отменяет действие первой.
Это не ошибка, а фича SA. Все команды http-заголовка (за некоторым исключением) могут быть только в единственном экземпляре внутри http-посылки. А те которые могут быть не в единственном (куки например), могут комбинироваться одну строку. Правила этой комбинации описаны в RFC 2616 глава 4.2
В статье про это ничего не говорится, потому что статья не учитывает кто и как будет создавать http-загловок. И вообще, как я уже говорил, не читайте методички, они плохому научить могут запросто и они всегда упускают кучу важных вещей...

Во вторых, задавать несколько кук в одной строке надо по другим правилам, которые перечислены в том самом RFC, в главе 4.2.2:
rfcthe Set-Cookie response header comprises the token Set-Cookie:, followed by a comma-separated list of one or more cookies. Each cookie begins with a NAME=VALUE pair, followed by zero or more semi-colon-separated attribute-value pairs.Обрати внимание на то какую роль играют запятые, а какую точки с запятой.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35583703
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlВо первых, sa_set_http_header() заменяет а не добавляет строку заголовка с одинаковым именем.Теперь я это понял. Но ведь в описании процедуры sa_set_http_header() в хелпе про это ничего не сказано. Там просто говорится, что sa_set_http_header() устанавливает заданную переменую заголовка.

White OwlЭто не ошибка, а фича SA.Я бы сказал, что это не очень хорошая фича, которая больше похоже на баг или на недоделку возведенную в ранг фичи.
Попробую по этому поводу отписать в sybase, может поправят.

White OwlВсе команды http-заголовка (за некоторым исключением) могут быть только в единственном экземпляре внутри http-посылки.Вот-вот. И переменная "Set-Cookie" как раз и относится к тем переменным, которые могут быть во многих экземплярах.
А sa_set_http_header() про это похоже ничего не знает.
В одну строку несколько пар NAME=VALUE задать конечно можно, но если мне надо на разных страницах обращаться к разным парам NAME=VALUE, то это уже становиться не удобно.

За подсказку по поводу запятой большое спасибо. Я переделал вызов
Код: plaintext
call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1, Name2=Value2, Name3=Value3; path=/');
и все сработало нормально.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35584054
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalker4 White OwlВсе команды http-заголовка (за некоторым исключением) могут быть только в единственном экземпляре внутри http-посылки.Вот-вот. И переменная "Set-Cookie" как раз и относится к тем переменным, которые могут быть во многих экземплярах.
А sa_set_http_header() про это похоже ничего не знает.
В одну строку несколько пар NAME=VALUE задать конечно можно, но если мне надо на разных страницах обращаться к разным парам NAME=VALUE, то это уже становиться не удобно.Ну почему же? На мой взгляд наоборот удобнее собирать все куки в одну строку для конкретной страницы. А для другой страницы можно другую строку собрать. Лично мне, то как сделано сейчас, кажется более удобным чем если бы они заставили для разных кук вызывать sa_set_http_header несколько раз.
Сейчас я могу сделать например так:
Код: plaintext
1.
2.
call sa_set_http_header('Set-Cookie',
      (select list(cookie_name ||"="|| cookie_value ||";path="||cookie_path) from cookie_table where html_page_id=@current_html)
     );
А с отдельными вызовами придется делать курсор...

Stalker4За подсказку по поводу запятой большое спасибо. Я переделал вызов
Код: plaintext
call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1, Name2=Value2, Name3=Value3; path=/');
и все сработало нормально.Читай RFC внимательнее. У тебя сейчас path задан только для Name3.... Name1 и Name2 получили путь по умолчанию, который равняется корню, но если понадобиться задать не корневой путь, то... будешь долго искать ошибку :)
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35605357
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl Stalker4За подсказку по поводу запятой большое спасибо. Я переделал вызов
Код: plaintext
call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1, Name2=Value2, Name3=Value3; path=/');
и все сработало нормально.Читай RFC внимательнее. У тебя сейчас path задан только для Name3.... Name1 и Name2 получили путь по умолчанию, который равняется корню, но если понадобиться задать не корневой путь, то... будешь долго искать ошибку :)
Посмотрел еще раз RFC 2616, главу 4.2. По поводу задания множественного заголовка, там написано в последнем абзаце. Но моего знания английского похоже не хватает, что бы разобраться, где используется запятая, а где точка с запятой. ИМНО там это несколько путано описано.

Если тебе не сложно, то напиши пожалуйста пример, как же оно там все таки должно правильно разделятся, при задании нескольких пар Name=Value.

P.S. Интересно, а если задавать sa_set_http_header('Set-Cookie', ...) с разными path, Set-Cookie в этом случае тоже будет перекрываться ?
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35605516
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalker4Но моего знания английского похоже не хватает, что бы разобраться, где используется запятая, а где точка с запятой. ИМНО там это несколько путано описано.

Если тебе не сложно, то напиши пожалуйста пример, как же оно там все таки должно правильно разделятся, при задании нескольких пар Name=Value.
Каждая переменная может имет несколько аттрибутов

Аттрибуты отделяются от переменной через точку с запятой

Переменные собираются в список через запятую

Пробелы перед/после запятой или точки с запятой игнорируются
Итого:
Код: plaintext
sa_set_http_header('Set-Cookie', 'name1=aaa;path=/path1, name2=bbb;path=/path2, name3=ccc; path=/')
Три переменных, каждая со своим путем. Точно так же можно и время жизни задавать.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35606243
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlКаждая переменная может имет несколько аттрибутов

Аттрибуты отделяются от переменной через точку с запятой

Переменные собираются в список через запятую

Пробелы перед/после запятой или точки с запятой игнорируются
Итого:
Код: plaintext
sa_set_http_header('Set-Cookie', 'name1=aaa;path=/path1, name2=bbb;path=/path2, name3=ccc; path=/')
Три переменных, каждая со своим путем. Точно так же можно и время жизни задавать.

Пробовал я и так задавать множественный 'Set-Cookie'. Только что попробовал еще раз (SA 10.0.1, SA 11.0, IE 6.0.SP2, FF 3.0.3, SM 1.1.12):
Код: plaintext
call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1;path=/, Name2=Value2;path=/, Name3=Value3;path=/');

Процедура TestWebCook1 (которую я привел в первом сообщении), при обращении к ней через Web-Service все равно выдает только первую пару переменных (Name1=Value1).
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35607612
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalker4Пробовал я и так задавать множественный 'Set-Cookie'.
....
Процедура TestWebCook1 (которую я привел в первом сообщении), при обращении к ней через Web-Service все равно выдает только первую пару переменных (Name1=Value1).Вообще-то, это серверная процедура которая должна отсылать список кук на клиента. То есть зайдя на свой веб-сервер телнетом и запросив страничку ты должен увидеть свою Set-Cookie строку в заголовке ответа. SA не должен ее модифицировать вообще, как ты строку задал, так он ее и должен отдать клиенту. Потом уже браузер должен будет эту строку расшифровать и в дальнейшем использовать.

RFC 2109, глава 4.2.2 Informally, the Set-Cookie response header comprises the token Set-Cookie:, followed by a comma-separated list of one or more cookies. Each cookie begins with a NAME=VALUE pair, followed by zero or more semi-colon-separated attribute-value pairs.
......
The NAME=VALUE attribute-value pair must come first in each cookie. The others, if present, can occur in any order. If an attribute appears more than once in a cookie, the behavior is undefined.
Вот они, все правила формирования строки.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35617893
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlStalker4Пробовал я и так задавать множественный 'Set-Cookie'.
....
Процедура TestWebCook1 (которую я привел в первом сообщении), при обращении к ней через Web-Service все равно выдает только первую пару переменных (Name1=Value1).Вообще-то, это серверная процедура которая должна отсылать список кук на клиента. Ну и что, что TestWebCook1 серверная процедура ? Если я не ошибаюсь, для того куки и существуют, что бы Web-Сервер (или точнее конкретный сайт) мог взаимодействовать с пользователем, для персонализации работы с ним. Так что серверные процедуры могут и устанавливать и читать куки (иначе зачем бы в SA была системная процедура http_header() с параметром 'Cookie'.
Но почему то, мой последний вариант задания куков (с запятыми) не работает. Хотя он вроде бы уже сделан в соответствии с рекомендациями RFC 2616.

White Owl
То есть зайдя на свой веб-сервер телнетом и запросив страничку ты должен увидеть свою Set-Cookie строку в заголовке ответа.
Кстати по поводу телнета: Запускаю стандартный виндовый telnet, набираю в нем
open mysite 80
telnet некоторое время думает, а потом выдает html с текстом "408 Request Time-out".
Так что, запросить страницу из telnet не получается, а как указать telnet нужный сервис (т.е. полный путь) я не знаю.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35617897
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, ошибка с выдачей системным сообщений об ошибке для SA-Web в неправильной кодировке уже исправлена с моей подачи в последних EBF для SA 10 и 11.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35618565
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalker4Ну и что, что TestWebCook1 серверная процедура ?А то, что она может делать только одно: предлагать куки юзеру. А там уже дело юзера (или вернее юзерского браузера) принимать куки или проигнорировать их.

Stalker4Так что серверные процедуры могут и устанавливать и читать кукиНе "устанавливать и читать", а "предлагать и получать". Акцент на том, что куки вещь необязательная и может игнорироваться клиентом. А сервер ни как не сможет прочитать куку с клиента, если клиент ее сам не предложит.

Stalker4Кстати по поводу телнета: Запускаю стандартный виндовый telnet, набираю в нем
open mysite 80ээээ..... telnet это не ftp. Там другой набор команд и OPEN в нем нету.
Из cmd делаешь: telnet mysite 80 . Учти что 80 это всего-лишь порт по умолчанию и может быть изменен в опции сервера -xs.
Получишь пустой экран и моргающий курсор. Пишешь (возможно вслепую)
Код: plaintext
1.
2.
GET /<CR>
<CR>
(<CR> Это перевод строки.) И получишь корень своего сервера, тот самый html который ты увидел бы написав в адресной строке браузера http://mysite/ .
После чего связь с сервером скорее всего будет разорвана.
Подробнее как это все работает описано в RFC 2616.

Stalker4Так что, запросить страницу из telnet не получается, а как указать telnet нужный сервис (т.е. полный путь) я не знаю.Чтобы узнать что браузер получает при запросе http://mysite/somepath/my_document.html
Ты должен во первых открыть коннект: telnet mysite 80
Потом запросить документ: GET /somepath/my_document.html HTTP/1.1
После первой строки с GET можешь написать кучу разных других строк (в том числе и Cookie). Завершая запрос пустой строкой.
После этого http сервер подумает и выдаст тебе ответ какой-нибудь. И разорвет связь либо будет ждать следющего запроса (это зависит от настроек сервера), но кажется SA будет рвать связь после одного запроса.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35620056
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlStalker4Кстати по поводу телнета: Запускаю стандартный виндовый telnet, набираю в нем open mysite 80ээээ..... telnet это не ftp. Там другой набор команд и OPEN в нем нету.Ну в общем то OPEN все же там есть (запускаешь из CMD команду telnet, набираешь нем знак вопроса "?" и видишь перечень команд в числе которых есть и OPEN, по крайней мере так в XP SP2), но это не важно.

White OwlТы должен во первых открыть коннект: telnet mysite 80
Потом запросить документ: GET /somepath/my_document.html HTTP/1.1
После первой строки с GET можешь написать кучу разных других строк (в том числе и Cookie). Завершая запрос пустой строкой.Получилось, спасибо за подсказку. Действительно, я увидел в telnet, что сервер вернул на клиента правильные куки.
Я задал:
Код: plaintext
call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1;path=/, Name2=Value2;path=/, Name3=Value3;path=/');

и сервер мне вернул в telnet
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
HTTP/ 1 . 1   200  OK
Set-Cookie: Name1=Value1;path=/, Name2=Value2;path=/, Name3=Value3;path=/
Date: Tue,  28  Oct  2008   08 : 49 : 51  GMT
Pragma: no-cache
Connection: close
Expires: Tue,  28  Oct  2008   08 : 49 : 51  GMT
Content-Type: text/html; charset=windows- 1251 
Server: SQLAnywhere/ 11 . 0 . 0 . 1509 
Cache-Control: no-cache
То есть получается, что dbo.sa_set_http_header() работает нормально.

Но тогда возникает другой вопрос: Почему dbo.http_header('Cookie') возвращает только первую пару значений ? Ведь пути у всех трех пар одинаковые, следовательно должны были вернуться все три пары.
И кроме того, когда я задал три пары с одним путем (пусть это и не совсем правильно), возвращались ведь все три пары.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35621161
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalker4Но тогда возникает другой вопрос: Почему dbo.http_header('Cookie') возвращает только первую пару значений ? Ведь пути у всех трех пар одинаковые, следовательно должны были вернуться все три пары.Скорее всего, браузер предлагает серверу куки в трех отдельных строках. Посмотри что выдаст пример из главы: SQL Anywhere® Server - Programming > SQL Anywhere Web Services > Working with HTTP headers

Stalker4И кроме того, когда я задал три пары с одним путем (пусть это и не совсем правильно), возвращались ведь все три пары.Не забывай что у тебя кроме сервера в игре участвует и браузер. А браузеры частенько ... весьма загадочны. Попробуй посмотреть полный заголовок http запроса для разных случаев задания аттрибутов. Потом прогони тот же самый цикл тестов на другом браузере.
...
Рейтинг: 0 / 0
Работа с "Cookie" в Web-Сервисе SA 10.
    #35633482
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlStalker4Но тогда возникает другой вопрос: Почему dbo.http_header('Cookie') возвращает только первую пару значений ? Ведь пути у всех трех пар одинаковые, следовательно должны были вернуться все три пары.Скорее всего, браузер предлагает серверу куки в трех отдельных строках. Посмотри что выдаст пример из главы: SQL Anywhere® Server - Programming > SQL Anywhere Web Services > Working with HTTP headers
Нашел эту SP HTTPHeaderExample.

Немного переделал свою тестовую SP:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ALTER PROCEDURE "DBA"."TestWebCook1"()
result (html_document long varchar)
BEGIN

 call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1, Name2=Value2, Name3=Value3; path=/'); //c1
// call dbo.sa_set_http_header('Set-Cookie', 'Name1=Value1;path=/, Name2=Value2;path=/, Name3=Value3;path=/'); //c2

 call dbo.sa_set_http_header('Content-Type', 'text/html; charset=windows-1251');
 call dbo.sa_set_http_header('Pragma', 'no-cache');
 call dbo.sa_set_http_header('Cache-Control', 'no-cache');

 call HTTPHeaderExample();

END

Но ничего нового это не дало.
Если использовать "c1" (неправильное задание пар переменных), то в результирующей таблице в строке "Cookie" получаю "Name1=Value1, Name2=Value2, Name3=Value3".
Если использовать "c2", (правильное задание пар переменных) то в результирующей таблице в строке "Cookie" получаю "Name1=Value1".

Может это все таки ошибка SA в функции http_header() для 'Cookie' ?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Работа с "Cookie" в Web-Сервисе SA 10.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]