Ну почему софт на PHP всегда такой глючный!
XML-RPC сервер в OpenX всегда возвращает ответ в кодировке UTF-8. Однако среди поддерживаемых OpenX кодировок нет UTF-8. Для русских символом есть koi8r и windows-1251. И когда в описании баннера присутствуют русские символы (в моем случае - в windows-1251), они не преобразовываются в UTF-8. В результате мой XML-RPC клиент от Apache выдает сообщение:
org.apache.xmlrpc.client.XmlRpcClientException: Failed to read servers response: Invalid byte 2 of 2-byte UTF-8 sequence.
at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:179)
at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:145)
at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:94)
...
В списке рассылки Apache XML-RPC пользователи жалуются на похожую проблему, на что разработчики XML-RPC резонно отвечают, что это проблема сервера, и решать ее они в принципе не будут. Но баннеры нужно показать. Поэтому правим немного XML-RPC клиент. В метод
org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponseставим первую строку
InputSource isource = new InputSource(ResponseFilter.filter(pStream));и сам клас ResponseFilter
public class ResponseFilter {
public static InputStream filter(InputStream input) {
StringWriter s = new StringWriter();
try {
InputStreamReader r = new InputStreamReader(input, "windows-1251");
int ch;
while ((ch = r.read()) != -1) {
s.write(ch);
}
input.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
return new ByteArrayInputStream(s.toString().getBytes());
}
}
Теперь работает.
No comments:
Post a Comment