2010年4月8日木曜日

LiftでUTF-8以外のレスポンスを返す

現在のLiftは、テンプレートのレスポンスを強制的にUTF-8で返してしまうので、
Shift-jis等の他の文字エンコーディングでレスポンスを返したい場合の方法を紹介

とりあえず、今回はLiftRules.responseTransformersを使用して、NodeResponseの文字エンコーディングを変更する方法紹介します。

1. Responseの定義

import net.liftweb.http.{LiftResponse,InMemoryResponse}
import _root_.scala.xml._
import net.liftweb.util.AltXML

case class MyXHtmlResponse(out : Node,encoding : String) extends LiftResponse{

def xmlDeclare = "\n"

var headers :List[(String,String)] = List()

var code = 200


def toResponse = {

val sb = new StringBuilder(64000)

sb.append(xmlDeclare)

AltXML.toXML(out, _root_.scala.xml.TopScope,
sb, false, false, false)

sb.append(" \n ")
val ret = sb.toString

val h : List[(String,String)] =

("Content-type","application/xhtml+xml;charset=" + encoding) :: headers.filter {
h => h._1.toLowerCase != "content-type"
}

InMemoryResponse(ret.getBytes(encoding), h, List(), code)
}


}



XmlNodeResponseなどは、現在の時点では文字エンコーディングがUTF-8直書きとなっているので、独自に文字コードを変えられるResponseを作成。(なお、ガラケー向けに作る途中のものなので、Cookieなどは無視してます。)

2. Responseの変換メソッドを定義

def convertResponse(response : LiftResponse) : LiftResponse = {
response match {
//
case r : NodeResponse => {
MyXHtmlResponse(r.out,"shift-jis")
}
case _ => response
}

NodeResponseの時のみ変換を行う。

3. 変換メソッドを登録

//Boot時に行う
LiftRules.responseTransformers.append(convertResponse)



Return none utf-8 response with lift framework.

0 件のコメント:

コメントを投稿