TSMimeHdrFieldValueStringGet

Get HTTP MIME header values.

概要

#include <ts/ts.h>
const char *TSMimeHdrFieldValueStringGet(TSMBuffer bufp, TSMLoc hdr, TSMLoc field, int idx, int *value_len_ptr)
int TSMimeHdrFieldValueIntGet(TSMBuffer bufp, TSMLoc hdr, TSMLoc field, int idx)
int64_t TSMimeHdrFieldValueInt64Get(TSMBuffer bufp, TSMLoc hdr, TSMLoc field, int idx)
unsigned int TSMimeHdrFieldValueUintGet(TSMBuffer bufp, TSMLoc hdr, TSMLoc field, int idx)
time_t TSMimeHdrFieldValueDateGet(TSMBuffer bufp, TSMLoc hdr, TSMLoc field)

解説

MIME ヘッダーとフィールドはリクエストヘッダーやレスポンスヘッダー、または Traffic Server プラグイン中で作られたスタンドアローンヘッダーを構成することができます。この関数は全て特定の型のヘッダーの値にアクセスするために使用されますが、ヘッダーが API の使用に適切な意味を持つかどうかは呼び出し元によります。 TSMimeHdrFieldValueStringGet() 以外では適切なデータ変換アルゴリズムがヘッダーフィールド文字列に適用されます。

全ての API は TSMBuffer 型のマーシャルバッファー引数 bufp と HTTP ヘッダーの場所を指し示す TSMLoc 型の引数 hdr を受け取ります。必須の field 引数は TSMimeHdrFieldFind() のようなアクセッサ関数から返される特定のヘッダーの値を保管するものです。

ヘッダーフィールドの中で、コンマで分けられた値は 0 からこの値のフィールドの最大値の間のインデックス ( idx ) で取得することができます。この最大値は TSMimeHdrFieldValuesCount() で取得されます。 -1idx 値はコンマで分けられた値がいくつあるかを考慮せずに、全てのヘッダーの値を取得する意味を持ちます。ヘッダーがコンマで分けられていない場合、 0-1idx は同じですが、後者が好ましいです。

TSMimeHdrFieldValueStringGet() はヘッダーの値へのポインターとバイト単位での値の長さで満たされた value_len_ptr を返します。返されたヘッダーの値は NUL 終端ではありません

In addition to all the predefined constants for Well-Known header strings, you can also do a lookup for a header string using TSMimeHdrStringToWKS(). If a lookup fails, this function returns a nullptr

Return Values

全ての関数はヘッダーの値をそれぞれの関数名にマッチした型で返します。 date-time セマンティクスを持たないヘッダーでの TSMimeHdrFieldValueDateGet() の使用は常に 0 を返します。

この例はどのように特定のヘッダーを取得しコピーするかを示しています。:

#include <string.h>
#include <ts/ts.h>

int
get_content_type(TSHttpTxn txnp, char* buf, size_t buf_size)
{
  TSMBuffer bufp;
  TSMLoc hdrs;
  TSMLoc ctype_field;
  int len = -1;

  if (TS_SUCCESS == TSHttpTxnServerRespGet(txnp, &bufp, &hdrs)) {
    ctype_field = TSMimeHdrFieldFind(bufp, hdrs, TS_MIME_FIELD_CONTENT_TYPE, TS_MIME_LEN_CONTENT_TYPE);

    if (TS_NULL_MLOC != ctype_field) {
      const char* str = TSMimeHdrFieldValueStringGet(bufp, hdrs, ctype_field, -1, &len);

      if (len > buf_size)
        len = buf_size;
      memcpy(buf, str, len);
      TSHandleMLocRelease(bufp, hdrs, ctype_field);
    }
    TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdrs);
  }

  return len;
}

See Also

TSAPI(3ts), TSMBufferCreate(3ts), TSMimeHdrFieldValuesCount(3ts)