This article is about a PsycZilla feature. See also File Transfer for the generic Builtin webserver approach.

Contents

Introduction

We plan to implement File Transfer via HTTP. A simple throttled httpd will be implemented in JavaScript and links will be shared via PSYC. Files can be dropped in a room to send a notice with the download url (It's not that this was the final plan for PSYC File Sharing, but since we're not living in a world dominated by PSYC clients, this is a start).

Initial Discussion

lynX suggests that we should implement an http server in the client for file sharing. Drop a file on the client window in order to offer the url to a file served locally.

The interface that we implement to support this is: Components.interfaces.nsIServerSocket;

http://xulplanet.com/tutorials/mozsdk/serverpush.php

<lynX> The second bullet in that document should read "The server uses the 'multipart/x-mixed-replace'" instead of "'The client uses the 'multipart/x-mixed-replace'". Server push is powerful, but MSIE never implemented it. But that doesn't matter, as we are not going to do that. We are going for the third option: Server Sockets!

Here's an example code snippet:

function http_server() {

	var serverSocket;

	this.start = function()
	{
	  var listener =
	  {
	    onSocketAccepted : function(socket, transport)
	    {
	      try {
	        var outputString = "HTTP/1.1 200 OK\n" +
                           "Content-type: text/plain\n\n" +
                           "Hello there " + transport.host + "\n";
	        var stream = transport.openOutputStream(0,0,0);
	        stream.write(outputString,outputString.length);
	        stream.close();
	      } catch(ex2){ dlux_debug(ex2); }
	    },

	    onStopListening : function(socket, status){}
	  };

	  try {
	    serverSocket = Components.classes["@mozilla.org/network/server-socket;1"]
                     .createInstance(Components.interfaces.nsIServerSocket);

	    serverSocket.init(7055,false,-1);
	    serverSocket.asyncListen(listener);
	  } catch(ex){ dump(ex); }
	
	  psyc_log("HTTP Server Started");
	}

	this.stop = function()
	{
	  if (serverSocket) serverSocket.close();
	  psyc_log("HTTP Server Stopped");
	}
}

var httpd = new http_server();

Binary Streams in JavaScript

  • XPCOM Interface: nsIBinaryInputStream
  • An example of code that uses it.
  • Thanks to ChatZilla developer Silver for pointing me in the right direction!


the Plain Old Webserver (POW)

Someone else made a web server extension for firefox: https://addons.mozilla.org/firefox/3002/

<lynX> It's neat. Let's integrate it..!?