|
|
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Есть в интернете такая статья: Что такое 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. Вызываю свой web-сервис в браузере, жму кнопку "Refresh". Но вместо ожидаемого Cookie: Name1=Value1; Name2=Value2 я получаю Cookie: Name2=Value2 Это в статье неправильно написано или может быть я что то неправильно делаю или это ошибка SA ? Или может быть в рамках одной HTML-страницы нельзя таким образом задавать разные NAME для cookie ? Попробовал в SP вместо двух 'Set-Cookie' прописать одно Код: plaintext но в браузере получил только Cookie: Name1=Value1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 19:04 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Stalker4Есть в интернете такая статья:Не читай методички, читай RFC 2109 Обрати внимание на главу 4.2.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 19:35 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Почитал RFC, но честно говоря все равно не понял, что я сделал не правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 21:39 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Все неправильно. Во первых, sa_set_http_header() заменяет а не добавляет строку заголовка с одинаковым именем. Код: plaintext 1. Это не ошибка, а фича 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.Обрати внимание на то какую роль играют запятые, а какую точки с запятой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 22:18 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 16:45 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Stalker4 White OwlВсе команды http-заголовка (за некоторым исключением) могут быть только в единственном экземпляре внутри http-посылки.Вот-вот. И переменная "Set-Cookie" как раз и относится к тем переменным, которые могут быть во многих экземплярах. А sa_set_http_header() про это похоже ничего не знает. В одну строку несколько пар NAME=VALUE задать конечно можно, но если мне надо на разных страницах обращаться к разным парам NAME=VALUE, то это уже становиться не удобно.Ну почему же? На мой взгляд наоборот удобнее собирать все куки в одну строку для конкретной страницы. А для другой страницы можно другую строку собрать. Лично мне, то как сделано сейчас, кажется более удобным чем если бы они заставили для разных кук вызывать sa_set_http_header несколько раз. Сейчас я могу сделать например так: Код: plaintext 1. 2. Stalker4За подсказку по поводу запятой большое спасибо. Я переделал вызов Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 18:30 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
White Owl Stalker4За подсказку по поводу запятой большое спасибо. Я переделал вызов Код: plaintext Посмотрел еще раз RFC 2616, главу 4.2. По поводу задания множественного заголовка, там написано в последнем абзаце. Но моего знания английского похоже не хватает, что бы разобраться, где используется запятая, а где точка с запятой. ИМНО там это несколько путано описано. Если тебе не сложно, то напиши пожалуйста пример, как же оно там все таки должно правильно разделятся, при задании нескольких пар Name=Value. P.S. Интересно, а если задавать sa_set_http_header('Set-Cookie', ...) с разными path, Set-Cookie в этом случае тоже будет перекрываться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 20:43 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Stalker4Но моего знания английского похоже не хватает, что бы разобраться, где используется запятая, а где точка с запятой. ИМНО там это несколько путано описано. Если тебе не сложно, то напиши пожалуйста пример, как же оно там все таки должно правильно разделятся, при задании нескольких пар Name=Value. Каждая переменная может имет несколько аттрибутов Аттрибуты отделяются от переменной через точку с запятой Переменные собираются в список через запятую Пробелы перед/после запятой или точки с запятой игнорируются Итого: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 23:28 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
White OwlКаждая переменная может имет несколько аттрибутов Аттрибуты отделяются от переменной через точку с запятой Переменные собираются в список через запятую Пробелы перед/после запятой или точки с запятой игнорируются Итого: Код: plaintext Пробовал я и так задавать множественный 'Set-Cookie'. Только что попробовал еще раз (SA 10.0.1, SA 11.0, IE 6.0.SP2, FF 3.0.3, SM 1.1.12): Код: plaintext Процедура TestWebCook1 (которую я привел в первом сообщении), при обращении к ней через Web-Service все равно выдает только первую пару переменных (Name1=Value1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 12:10 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
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. Вот они, все правила формирования строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 18:39 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
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 нужный сервис (т.е. полный путь) я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2008, 13:55 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Кстати, ошибка с выдачей системным сообщений об ошибке для SA-Web в неправильной кодировке уже исправлена с моей подачи в последних EBF для SA 10 и 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2008, 13:57 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Stalker4Ну и что, что TestWebCook1 серверная процедура ?А то, что она может делать только одно: предлагать куки юзеру. А там уже дело юзера (или вернее юзерского браузера) принимать куки или проигнорировать их. Stalker4Так что серверные процедуры могут и устанавливать и читать кукиНе "устанавливать и читать", а "предлагать и получать". Акцент на том, что куки вещь необязательная и может игнорироваться клиентом. А сервер ни как не сможет прочитать куку с клиента, если клиент ее сам не предложит. Stalker4Кстати по поводу телнета: Запускаю стандартный виндовый telnet, набираю в нем open mysite 80ээээ..... telnet это не ftp. Там другой набор команд и OPEN в нем нету. Из cmd делаешь: telnet mysite 80 . Учти что 80 это всего-лишь порт по умолчанию и может быть изменен в опции сервера -xs. Получишь пустой экран и моргающий курсор. Пишешь (возможно вслепую) Код: plaintext 1. 2. После чего связь с сервером скорее всего будет разорвана. Подробнее как это все работает описано в 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 будет рвать связь после одного запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2008, 17:31 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
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 и сервер мне вернул в telnet Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Но тогда возникает другой вопрос: Почему dbo.http_header('Cookie') возвращает только первую пару значений ? Ведь пути у всех трех пар одинаковые, следовательно должны были вернуться все три пары. И кроме того, когда я задал три пары с одним путем (пусть это и не совсем правильно), возвращались ведь все три пары. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2008, 12:22 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
Stalker4Но тогда возникает другой вопрос: Почему dbo.http_header('Cookie') возвращает только первую пару значений ? Ведь пути у всех трех пар одинаковые, следовательно должны были вернуться все три пары.Скорее всего, браузер предлагает серверу куки в трех отдельных строках. Посмотри что выдаст пример из главы: SQL Anywhere® Server - Programming > SQL Anywhere Web Services > Working with HTTP headers Stalker4И кроме того, когда я задал три пары с одним путем (пусть это и не совсем правильно), возвращались ведь все три пары.Не забывай что у тебя кроме сервера в игре участвует и браузер. А браузеры частенько ... весьма загадочны. Попробуй посмотреть полный заголовок http запроса для разных случаев задания аттрибутов. Потом прогони тот же самый цикл тестов на другом браузере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2008, 17:22 |
|
||
|
Работа с "Cookie" в Web-Сервисе SA 10.
|
|||
|---|---|---|---|
|
#18+
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. Но ничего нового это не дало. Если использовать "c1" (неправильное задание пар переменных), то в результирующей таблице в строке "Cookie" получаю "Name1=Value1, Name2=Value2, Name3=Value3". Если использовать "c2", (правильное задание пар переменных) то в результирующей таблице в строке "Cookie" получаю "Name1=Value1". Может это все таки ошибка SA в функции http_header() для 'Cookie' ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2008, 15:36 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35584054&tid=2011304]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 380ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...