pubsub support
This commit is contained in:
parent
aed9125e93
commit
f3c34692d8
6 changed files with 45 additions and 4 deletions
|
|
@ -28,6 +28,12 @@ class PublicsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def hub
|
||||||
|
if params['hub.mode'] == 'subscribe' || params['hub.mode'] == 'unsubscribe'
|
||||||
|
render :text => params['hub.challenge'], :status => 202, :layout => false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def receive
|
def receive
|
||||||
render :nothing => true
|
render :nothing => true
|
||||||
return unless params[:xml]
|
return unless params[:xml]
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ class Person
|
||||||
end
|
end
|
||||||
|
|
||||||
def public_url
|
def public_url
|
||||||
"#{self.url}users/#{self.owner.username}/public"
|
"#{self.url}users/#{self.owner.username}/public.atom"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -167,6 +167,8 @@ class User
|
||||||
target_people = target_people | aspect.people
|
target_people = target_people | aspect.people
|
||||||
}
|
}
|
||||||
|
|
||||||
|
push_to_hub(post) if post.respond_to?(:public) && post.public
|
||||||
|
|
||||||
push_to_people(post, target_people)
|
push_to_people(post, target_people)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -179,10 +181,14 @@ class User
|
||||||
end
|
end
|
||||||
|
|
||||||
def push_to_person( person, xml )
|
def push_to_person( person, xml )
|
||||||
Rails.logger.debug("Adding xml for #{self} to message queue to #{url}")
|
Rails.logger.debug("Adding xml for #{self} to message queue to #{self.url}")
|
||||||
QUEUE.add_post_request( person.receive_url, xml )
|
QUEUE.add_post_request( person.receive_url, xml )
|
||||||
QUEUE.process
|
QUEUE.process
|
||||||
|
end
|
||||||
|
|
||||||
|
def push_to_hub(post)
|
||||||
|
Rails.logger.debug("Pushing update to pubsub server")
|
||||||
|
QUEUE.add_hub_notification(APP_CONFIG[:pubsub_server], self.public_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
def salmon( post )
|
def salmon( post )
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,8 @@ Diaspora::Application.routes.draw do
|
||||||
match 'webfinger', :to => 'publics#webfinger'
|
match 'webfinger', :to => 'publics#webfinger'
|
||||||
match 'hcard/users/:id', :to => 'publics#hcard'
|
match 'hcard/users/:id', :to => 'publics#hcard'
|
||||||
|
|
||||||
|
match 'hub', :to => 'publics#hub'
|
||||||
|
|
||||||
match '.well-known/host-meta',:to => 'publics#host_meta'
|
match '.well-known/host-meta',:to => 'publics#host_meta'
|
||||||
match 'receive/users/:id', :to => 'publics#receive'
|
match 'receive/users/:id', :to => 'publics#receive'
|
||||||
match 'log', :to => "dev_utilities#log"
|
match 'log', :to => "dev_utilities#log"
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,10 @@ class MessageHandler
|
||||||
[*destinations].each{|dest| @queue.push(Message.new(:post, dest, :body => b))}
|
[*destinations].each{|dest| @queue.push(Message.new(:post, dest, :body => b))}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def add_hub_notification(hub_url, feed_url)
|
||||||
|
@queue.push(Message.new(:hub_publish, hub_url, :body => feed_url))
|
||||||
|
end
|
||||||
|
|
||||||
def process
|
def process
|
||||||
@queue.pop{ |query|
|
@queue.pop{ |query|
|
||||||
case query.type
|
case query.type
|
||||||
|
|
@ -29,6 +33,9 @@ class MessageHandler
|
||||||
when :get
|
when :get
|
||||||
http = EventMachine::HttpRequest.new(query.destination).get :timeout => TIMEOUT
|
http = EventMachine::HttpRequest.new(query.destination).get :timeout => TIMEOUT
|
||||||
http.callback {process}
|
http.callback {process}
|
||||||
|
when :hub_publish
|
||||||
|
http = EventMachine::PubSubHubBub.new(query.destination).get :timeout => TIMEOUT
|
||||||
|
http.callback {process}
|
||||||
else
|
else
|
||||||
raise "message is not a type I know!"
|
raise "message is not a type I know!"
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,26 @@ describe MessageHandler do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "Hub publish" do
|
||||||
|
it 'should correctly queue up a pubsubhubbub publish request' do
|
||||||
|
destination = "http://identi.ca/hub/"
|
||||||
|
feed_location = "http://google.com/"
|
||||||
|
|
||||||
|
EventMachine.run {
|
||||||
|
@handler.add_hub_notification(destination, feed_location)
|
||||||
|
q = @handler.instance_variable_get(:@queue)
|
||||||
|
|
||||||
|
message = ""
|
||||||
|
q.pop{|m| message = m}
|
||||||
|
|
||||||
|
message.destination.should == destination
|
||||||
|
message.body.should == feed_location
|
||||||
|
|
||||||
|
EventMachine.stop
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "Mixed Queries" do
|
describe "Mixed Queries" do
|
||||||
|
|
||||||
it 'should process both POST and GET requests in the same queue' do
|
it 'should process both POST and GET requests in the same queue' do
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue