Как установить http куки из работы сервиса Jolie? - PullRequest
0 голосов
/ 02 января 2019

Мне нужно установить cookie для браузера из операции службы Jolie, но я не могу найти информацию о том, как это сделать.

Я проверил документ в https://jolielang.gitbook.io/docs/protocols/httpи https://jolielang.gitbook.io/docs/web-applications/rest-apis-publication-and-integration, но, похоже, представленный мной вариант использования еще не охвачен.

inputPort MyIP {

    Protocol: http {
    ...
    ??? -> myCookie;
    ...
    }
    Interfaces: LoginInterface
}

main {

    [login(credentials)(res) {
    ...  
    myCookie=???  
    ...  
    }]
}

Я ожидаю увидеть файл cookie в хранилище файлов cookie браузера.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Чтение и запись файлов cookie

Вы можете использовать параметр cookies, который сопоставляет имена файлов cookie с полями, присутствующими в сообщениях.

Например, .cookies.auth_token = "token" связывает файл cookie с именемauth_token в поле token в сообщениях (как при чтении, так и при записи).

Вот полный пример, где операция login устанавливает cookie auth_token в браузере.

execution { concurrent }

inputPort Server {
Location: "socket://localhost:8080"
Protocol: http
  // Binds the cookie "auth_token" to the message field "token"
  { .cookies.auth_token = "token" }
RequestResponse: login
}

main
{
  login( request )( response ) {
    if ( request.pwd == "secret" )
      response << "OK" { .token = new }
    else
      response << "Invalid pwd" { .token = "" }
  }
}

Вы можете попробовать это, просмотрев http://localhost:8080/login?pwd=secret.


Бонус: файлы cookie с наборами корреляций

Использование таких файлов cookie позволяет комбинировать их с рабочими процессами для программирования веб-приложения с поддержкой процессов .Вот более подробный пример со следующим рабочим процессом:

  1. Пользователь входит в систему;
  2. Если вход выполнен успешно, операция say может быть вызвана по желанию, до операции logout вызывается;
  3. Пользователь выходит из системы.

Я использую наборы корреляций ниже для отслеживания сеанса.

include "console.iol"

execution { concurrent }

type LoginRequest:void { .token?:string .pwd:string }
type TokenMessage:void { .token:string }
type SayRequest:void { .token:string .msg:string }

interface ServerIface {
RequestResponse:
  login(LoginRequest)(TokenMessage) throws InvalidPwd,
  say(SayRequest)(void),
  logout(TokenMessage)(TokenMessage)
}

inputPort Server {
Location: "socket://localhost:8080"
Protocol: http { .cookies.auth_token = "token" }
Interfaces: ServerIface
}

cset {
  token: SayRequest.token TokenMessage.token
}

main
{
  login( request )( response ) {
    if ( request.pwd == "secret" )
      response.token = csets.token = new
    else
      throw( InvalidPwd )
  };
  provide
    [ say( request )() {
      println@Console( csets.token + " says " + request.msg )()
    } ]
  until
    [ logout()( response ) { response.token = "" } ]
}

Чтобы попробовать это,Вы можете перейти к этим ссылкам (по порядку):

  1. http://localhost:8080/login?pwd=secret
  2. http://localhost:8080/say?msg=Hello
  3. http://localhost:8080/logout

Список литературы:

0 голосов
/ 02 января 2019

Вы находитесь на правильном пути. Настройка файла cookie выполняется с использованием информации заголовка возврата, как показано в MDN Reference .

Чтобы манипулировать заголовком ответа в Jolie, вам нужно работать на узле .addHeader конфигурации http-порта. Вот мой код

interface MyInterface {

    RequestResponse:
     login(undefined)(undefined)
    }

    inputPort MyPort {
    Location: "socket://localhost:8000"
    Protocol: http {
      .debug= true;
      .debug.showContent= true;
      .addHeader.header[0] = "Set-Cookie";
      .addHeader.header[0].value->cookieCommand
    }
    Interfaces: MyInterface
    }

    execution{ concurrent }
    main{
      [login(request)(response){
          //doing something to control my credatiol
          cookieCommand = "yummy_cookie=myCookieValue "
        }]
    }  

Как вы читаете этот код

  .addHeader.header[0] = "Set-Cookie";
  .addHeader.header[0].value->cookieCommand

эта часть добавляет к заголовку ответа заголовок "Set-Cookie", который в качестве значения будет иметь переменную cookieCommand;символ -> является псевдонимом структуры

Теперь ваша переменная cookieCommand может быть установлена ​​в любом поведении операции, в моем примере это операция входа в систему

      [login(request)(response){
          //doing something to control my credatiol
          cookieCommand = "yummy_cookie=myCookieValue "
        }]

Изображениениже показан результат вызова

Response Header

, и это результат в браузере

Application Cookie Value

Теперь давайте посмотрим, как обрабатывать входящие куки.Прежде всего, мы можем определить новую операцию op1

interface MyInterface {
RequestResponse:
 login(undefined)(undefined),
 op1(op1RequestType)(op1ResponseType)
}

в типе запроса, нам нужно добавить новый узел, который будет содержать значение cookie нашего приложения

type op1RequestType:void{
  .cookieValue:string
}

Затем мынеобходимо установить соответствие между значением cookie, полученным Http inputPort и входной переменной операции

inputPort MyPort {
Location: "socket://localhost:8000"
Protocol: http {
  .debug= true;
  .debug.showContent= true;
  .addHeader.header[0] = "Set-Cookie";
  .addHeader.header[0].value->cookieCommand;
  .osc.op1.cookies.yummy_cookie = "cookieValue"
}
Interfaces: MyInterface
}

, параметр конфигурации порта

.osc.op1.cookies.yummy_cookie = "cookieValue"

читается как osc. (nameOperation).cookies.nameCookie = nameNodeInTheType

Давайте посмотрим на звонок из вашего браузера

Sending Cookie

и след от операции (Джоли - след )

Jolie Trace

Надеюсь, это поможет

...