Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 71
- Log:
Start of upgrade to Typo 4.0.0, the latest stable release since
2.6.0. Note test/mocks/themes/azure changes from a file to a
directory, so the file has been removed in this revision and
the directory will be added in the next revision.
- Author:
- adh
- Date:
- Mon Aug 07 22:18:11 +0100 2006
- Size:
- 3219 Bytes
1 | require 'rexml/document' |
2 | |
3 | class Ping < ActiveRecord::Base |
4 | belongs_to :article |
5 | |
6 | class Pinger |
7 | def send_pingback_or_trackback |
8 | begin |
9 | @response = Net::HTTP.get_response(URI.parse(ping.url)) |
10 | send_pingback or send_trackback |
11 | rescue Timeout::Error => err |
12 | return |
13 | rescue => err |
14 | raise err |
15 | # Ignore |
16 | end |
17 | end |
18 | |
19 | def pingback_url |
20 | if @response["X-Pingback"] |
21 | @response["X-Pingback"] |
22 | elsif |
23 | response.body =~ /<link rel="pingback" href="([^"]+)" ?\/?>/ |
24 | $1 |
25 | else |
26 | nil |
27 | end |
28 | end |
29 | |
30 | def origin_url |
31 | @origin_url |
32 | end |
33 | |
34 | def response |
35 | @response |
36 | end |
37 | |
38 | def ping |
39 | @ping |
40 | end |
41 | |
42 | def article |
43 | ping.article |
44 | end |
45 | |
46 | def config |
47 | ping.config |
48 | end |
49 | |
50 | def send_xml_rpc(*args) |
51 | ping.send(:send_xml_rpc, *args) |
52 | end |
53 | |
54 | def trackback_url |
55 | rdfs = response.body.scan(/<rdf:RDF.*?<\/rdf:RDF>/m) |
56 | rdfs.each do |rdf| |
57 | xml = REXML::Document.new(rdf) |
58 | xml.elements.each("//rdf:Description") do |desc| |
59 | if rdfs.size == 1 || desc.attributes["dc:identifier"] == ping.url |
60 | return desc.attributes["trackback:ping"] |
61 | end |
62 | end |
63 | end |
64 | # Didn't find a trackback url, so fall back to the url itself. |
65 | @ping.url |
66 | end |
67 | |
68 | def send_pingback |
69 | if pingback_url |
70 | send_xml_rpc(pingback_url, "pingback.ping", origin_url, ping.url) |
71 | return true |
72 | else |
73 | return false |
74 | end |
75 | end |
76 | |
77 | def send_trackback |
78 | ping.send_trackback(trackback_url, origin_url) |
79 | end |
80 | |
81 | private |
82 | |
83 | def initialize(origin_url, ping) |
84 | @origin_url = origin_url |
85 | @ping = ping |
86 | end |
87 | end |
88 | |
89 | def send_pingback_or_trackback(origin_url) |
90 | t = Thread.start do |
91 | Pinger.new(origin_url, self).send_pingback_or_trackback |
92 | end |
93 | t.join if defined? $TESTING |
94 | end |
95 | |
96 | def send_trackback(trackback_url, origin_url) |
97 | t = Thread.start do |
98 | trackback_uri = URI.parse(trackback_url) |
99 | |
100 | post = "title=#{CGI.escape(article.title)}" |
101 | post << "&excerpt=#{CGI.escape(article.body_html.strip_html[0..254])}" |
102 | post << "&url=#{origin_url}" |
103 | post << "&blog_name=#{CGI.escape(article.blog.blog_name)}" |
104 | |
105 | Net::HTTP.start(trackback_uri.host, trackback_uri.port) do |http| |
106 | path = trackback_uri.path |
107 | path += "?#{trackback_uri.query}" if trackback_uri.query |
108 | http.post(path, post, 'Content-type' => 'application/x-www-form-urlencoded; charset=utf-8') |
109 | end |
110 | end |
111 | t.join if defined? $TESTING |
112 | end |
113 | |
114 | def send_weblogupdatesping(server_url, origin_url) |
115 | t = Thread.start do |
116 | send_xml_rpc(self.url, "weblogUpdates.ping", article.blog.blog_name, server_url, origin_url) |
117 | end |
118 | t.join if defined? $TESTING |
119 | end |
120 | |
121 | protected |
122 | |
123 | def send_xml_rpc(xml_rpc_url, name, *args) |
124 | t = Thread.start do |
125 | begin |
126 | server = XMLRPC::Client.new2(URI.parse(xml_rpc_url).to_s) |
127 | |
128 | begin |
129 | result = server.call(name, *args) |
130 | rescue XMLRPC::FaultException => e |
131 | logger.error(e) |
132 | end |
133 | rescue Exception => e |
134 | logger.error(e) |
135 | end |
136 | end |
137 | t.join if defined? $TESTING |
138 | end |
139 | end |