引用符で囲まれたxmlをjsonpスタイルのコールバックでラップする「単純な」cgiシェルスクリプトプロキシサーバーを作成しているときに、バックスラッシュのエスケープに関する問題が発生しました(これは試行錯誤とOperaの優れたデバッガーによって解決されました)。私はまだバックスラッシュの追加セットが必要な理由を理解しようとしています(8対4)。解析するたびにバックスラッシュの数を2倍にする必要があることを理解していますが、どこかで反復を見落としているように見えるか、処理を誤解しています。ブラウザで2回解析されますか?
これは、なぜそれが機能するのかを理解しようとしている最後の機能するコードです
#!/bin/sh
CB=${QUERY_STRING%%&*}
URL=${QUERY_STRING#*&}
case "$CB" in
callback=*)
printf "Content-type: application/javascript\r\n\r\n${CB##*=}(\""
wget -q --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \
|tr -c [\ -~] " "|sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g"
printf "\")"
;;
*)exit;;
esac
これが私が使用しているテストページです(編集-より単純な非gzipバージョンに置き換えられました)。
<html><head><title>test</title></head><body><div id="notaniframe"></div>
<script>
function dummy(data){document.getElementById("notaniframe").innerHTML=data}
Loaded=0
setTimeout(function(){if(!Loaded)alert("load failed")},30000);
</script>
<script onload='Loaded=1' src="http://localhost/cgi-bin/xml2jsonp.cgi?callback=dummy&http://stackoverflow.com"></script>
</body></html>
これは、stackoverflow.comをdivに詰め込むだけです