【IBM Application Gateway】HTTP変換機能（XSLT:Extensible Stylesheet Language Transformation）について

# はじめに
IBM Application Gatewaynでは、XSLTを使ってHTTPのRequest/Responseに対する変換が行えます。
今回は、このXSLT機能を試してみました。
- ①バックエンドサーバーへのHTTP要求にHTTPヘッダを追加
- ②ブラウザへのHTTP応答にHTTPヘッダーを追加

![qiita (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/5739ca54-dba1-a2d3-161e-d2ddb38445dd.png)

（参考）マニュアル
[http_transformations/request](https://docs.verify.ibm.com/gateway/docs/yaml-policies-http_transformations-request#policieshttp_transformationsrequest)、[http_transformations/response](https://docs.verify.ibm.com/gateway/docs/yaml-policies-http_transformations-response#policieshttp_transformationsresponse)



# 1.XSLTとは
IBM Secutity Verify Accessのガイドに日本語の解説があります。
https://www.ibm.com/docs/ja/sva/10.0.1?topic=transformations-extensible-stylesheet-language-transformation-xslt
>Extensible Stylesheet Language (XSL) は、ルールを指定するために使用する言語で、Extensible Markup Language (XML) は、ルールへの入力を形成するデータに使用する言語です。XML と XSL を組み合わせることにより、ルール評価プログラムへの入力およびルール自体の両方を表現する、プラットフォームに依存しない方法が提供されます。

IBM Secutity Verify Accessと同様に、IBM Application GatewayでもHTTP 要求/ HTTP 応答を変更して、HTTPヘッダーや、Cookieの追加・変更が行えます。

# 2.①バックエンドサーバーへのHTTP要求にHTTPヘッダを追加

HTTP要求に対して、ヘッダー名：myuri、値：HTTPリクエストのURI を設定するときのサンプルです。

```
policies:

  http_transformations:
    request:

        #
        # An HTTP transformation policy, applied to all
        # resources, which will add the URI of the request to a header
        # called myuri.
        #
      - name: "AddUriToHeader"
        method: "*"
        paths:
          - "*"
        rule: |
          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

          <xsl:strip-space elements="*" />

          <xsl:variable name="varUriGlobal">
           <xsl:value-of select="//HTTPRequest/RequestLine/URI"/>
          </xsl:variable>

          <xsl:template match="/">
            <HTTPRequestChange>
              <xsl:apply-templates />
            </HTTPRequestChange>
          </xsl:template>

          <xsl:template match="//HTTPRequest/Headers">
          <xsl:choose>
            <xsl:when test="Header/@name='myuri'" />
            <xsl:otherwise>
              <Header action="add" name="myuri"><xsl:value-of select="$varUriGlobal"/></Header>
            </xsl:otherwise>
          </xsl:choose>
          </xsl:template>

          </xsl:stylesheet>
```

IBM Application Gatewayのトレース上も、myuriというHTTPヘッダーが追加されていました。
PD というのは、IBM Application Gatewayを指します。
赤枠がリクエストの向きになります。この図では、IBM Application Gateway （PD）からバックエンドサーバー（BackEnd）へのリクエストということがわかります。

![qiita (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/3c0f3eb3-e55c-0dd3-fdaa-a81137172ddb.png)

# 2.②ブラウザへのHTTP応答にHTTPヘッダーを追加

HTTP応答に対して、ヘッダー名：IAG_HTTP_XFORM_RESP、値：HELLO_WORLDを設定するときのサンプルです。
```
policies:

  http_transformations:
    response:

        #
        # An HTTP transformation policy, applied to all
        # resources, which will add the 'IAG_HTTP_XFORM_RESP: HELLO_WORLD'
        # HTTP header to all responses.
        #
      - name: "AddResponseHeader"
        method: "*"
        paths:
          - "*"
        rule: |
          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

          <xsl:strip-space elements="*" />

          <xsl:template match="/">
            <HTTPResponseChange>
              <xsl:apply-templates />
            </HTTPResponseChange>
          </xsl:template>

          <xsl:template match="//HTTPRequest/Headers">
            <Header action="add" name="IAG_HTTP_XFORM_RESP">HELLO_WORLD</Header>
          </xsl:template>

          </xsl:stylesheet>
```

iag_http_xfrom_respというHTTPヘッダーが追加されていました。
赤枠がリクエストの向きになります。この図では、IBM Application Gateway （PD）からクライアント（Browser）へのリクエストということがわかります。

![qiita (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/19f0a055-d988-2f92-ef56-8bfcb75e4763.png)

# 最後に
今回は、HTTP Transformationについて試してみました。

XSLTについては、IBM Secutity Verify Accessのガイドが参考になります。
[HTTP 変換のシナリオ例](https://www.ibm.com/docs/ja/sva/10.0.1?topic=transformations-example-http-transformation-scenarios)

また、IBM Secutity Verify Access向けですが、Globalサポートチームが作成したサンプルソースも参考となります。
[ IBM-Security /isam-support ](https://github.com/IBM-Security/isam-support/tree/master/config-example/webseal/http-transformations)