Hi,<br><br><br>I've been trying to play with SockJS + Twisted. There's an implementation here: <a href="https://github.com/Fugiman/sockjs-twisted">https://github.com/Fugiman/sockjs-twisted</a><br><br>However, I'm already running a web server, and as the README says sockjs-twisted is *not* intended to be run together with a web server. It doesn't really use any of the mechanics in twisted.web.<br>
<br>So, I tried to make it work using Resources anyway: reconstructing the equivalent bytes in render, and replaying them with the SockJSFactory:<br><br><div class="highlight"><pre><div class="line" id="LC1"><span class="k">class</span> <span class="nc">SockJSResource</span><span class="p">(</span><span class="n">resource</span><span class="o">.</span><span class="n">Resource</span><span class="p">):</span></div>
<div class="line" id="LC2"> <span class="sd">"""</span></div><div class="line" id="LC3"><span class="sd"> A resource that defers to a SockJS factory.</span></div><div class="line" id="LC4"><span class="sd"> """</span></div>
<div class="line" id="LC5"> <span class="n">isLeaf</span> <span class="o">=</span> <span class="bp">True</span></div><div class="line" id="LC6"><br></div><div class="line" id="LC7"> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span></div>
<div class="line" id="LC8"> <span class="bp">self</span><span class="o">.</span><span class="n">_factory</span> <span class="o">=</span> <span class="n">SockJSFactory</span><span class="p">(</span><span class="n">factory</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span></div>
<div class="line" id="LC9"><br></div><div class="line" id="LC10"><br></div><div class="line" id="LC11"> <span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span></div>
<div class="line" id="LC12"> <span class="n">transport</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">transport</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">transport</span><span class="p">,</span> <span class="bp">None</span></div>
<div class="line" id="LC13"> <span class="n">protocol</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_factory</span><span class="o">.</span><span class="n">buildProtocol</span><span class="p">(</span><span class="n">transport</span><span class="o">.</span><span class="n">getPeer</span><span class="p">())</span></div>
<div class="line" id="LC14"> <span class="n">protocol</span><span class="o">.</span><span class="n">makeConnection</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span></div><div class="line" id="LC15">
<br></div><div class="line" id="LC16"> <span class="n">path</span> <span class="o">=</span> <span class="s">"/"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">""</span><span class="p">]</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">postpath</span><span class="p">)</span></div>
<div class="line" id="LC17"> <span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="s">"{0} {1} HTTP/1.1"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">method</span><span class="p">,</span> <span class="n">path</span><span class="p">)]</span></div>
<div class="line" id="LC18"> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">requestHeaders</span><span class="o">.</span><span class="n">getAllRawHeaders</span><span class="p">():</span></div>
<div class="line" id="LC19"> <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"{0}: {1}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">","</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">values</span><span class="p">)))</span></div>
<div class="line" id="LC20"> <span class="n">lines</span> <span class="o">+=</span> <span class="p">[</span><span class="s">""</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">read</span><span class="p">()]</span></div>
<div class="line" id="LC21"><br></div><div class="line" id="LC22"> <span class="n">data</span> <span class="o">=</span> <span class="s">"</span><span class="se">\r\n</span><span class="s">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span></div>
<div class="line" id="LC23"> <span class="n">protocol</span><span class="o">.</span><span class="n">dataReceived</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div><div class="line" id="LC24">
<br></div><div class="line" id="LC25"> <span class="k">return</span> <span class="n">server</span><span class="o">.</span><span class="n">NOT_DONE_YET</span></div></pre></div><br><br>This only kind of works. There's an external sockjs test suite (more like an acceptance test suite): <a href="https://github.com/sockjs/sockjs-protocol">https://github.com/sockjs/sockjs-protocol</a>, that has multiple failing tests. If anyone needs help running these, I'll gladly assist there.<br>
<br>In an attempt to begin debugging this, I've found that basically none of the protocol methods get called on that protocol instance I make on the third line of render. This took me a while to figure out because dataReceived *was* being called -- except then I realized I'm calling it myself in that render method :)<br>
<br>This leads me to believe I'm essentially just screwing up transplanting this transport entirely. Is that the case?<br clear="all"><br>-- <br>cheers<div>lvh</div><br>