1

I made a really basic chrome extension and set up a simple node.js server to test the auto-update. The server hosts the .crx file so I can install the extension without any trouble simply by visiting localhost:3000/clients/chrome/extension.crx. But when I go to tools->extensions and click on Update extensions now, the server doesn't receive a request. I would have expected chrome to GET localhost:3000/clients/chrome/updates.xml but this is not happening. What am I doing wrong here?


CODE

Let me just walk you through the code to make this reproductible:

$ tree

.
|-- clients
|   `-- chrome
|       |-- extension
|       |   `-- manifest.json
|       |-- extension.crx
|       |-- extension.pem
|       `-- updates.xml
`-- web.js

The extension is really just a manifest file.

manifest.json

{
  "name": "testing auto-updates",
  "version": "1.0",
  "update_url": "localhost:3000/clients/chrome/updates.xml",
  "description": "Version 1.0"
 }

As you can see, I'm referring to an update_url to make auto-updating possible.

updates.xml

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='fkphbmkcjefhhnnlhhjlnkellidponel'>
    <updatecheck codebase='localhost:3000/clients/chrome/extension.crx' version='1.0' />
  </app>
</gupdate>

Packaging the extension creates extension.crx and extension.pem.

I also made a simple node.js server to serve the files:

web.js

var express = require('express');

var app = express.createServer(express.logger());

/* ROUTES */

app.get('/clients/chrome/extension.crx', function(request, response)
{
    response.contentType('application/x-chrome-extension');
    response.sendfile('clients/chrome/extension.crx');
});

app.get('/clients/chrome/updates.xml', function(request, response)
{
    response.sendfile('clients/chrome/updates.xml');
});

/* ROUTES END */

var port = process.env.PORT || 3000;

app.listen(port, function() {
  console.log("Listening on " + port);
});

Ok, let's test this. First, start the server: $ node web.js

Listening on 3000

Install the extension by visiting localhost:3000/clients/chrome/extension.crx. This part works fine on the second try. The server logs both tries:

127.0.0.1 - - [Thu, 26 Apr 2012 22:22:50 GMT] "GET /clients/chrome/extension.crx HTTP/1.1" 200 596 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19"
127.0.0.1 - - [Thu, 26 Apr 2012 22:25:47 GMT] "GET /clients/chrome/extension.crx HTTP/1.1" 304 - "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19"

Next, I go to tools->extensions and click on Update extensions now. I'm expecting chrome to get the updates.xml file to see if anything has changed, but the server doesn't log any requests.

Shawn
  • 10,931
  • 18
  • 81
  • 126
  • Try `http://localhost:3000/clients/chrome/updates.xml` instead. – abraham Apr 26 '12 at 23:07
  • Thanks, that solved that problem. Make it an answer so I can accept it. – Shawn Apr 27 '12 at 00:55
  • If you want more easy rep points, you can have a go at the problem that remains in this situation: now, the server logs a request for `updates.xml`, but not for `extension.crx`, even though `updates.xml` indicates there's a new version. http://stackoverflow.com/questions/10343573/why-isnt-my-chrome-extension-auto-updating-itself – Shawn Apr 27 '12 at 01:22

1 Answers1

1

Try http://localhost:3000/clients/chrome/updates.xml instead.

abraham
  • 46,583
  • 10
  • 100
  • 152