diff --git a/IPython/html/services/kernels/handlers.py b/IPython/html/services/kernels/handlers.py
index 147e2a7..c5bdec1 100644
--- a/IPython/html/services/kernels/handlers.py
+++ b/IPython/html/services/kernels/handlers.py
@@ -45,7 +45,8 @@ class MainKernelHandler(IPythonHandler):
km = self.kernel_manager
kernel_id = km.start_kernel()
model = km.kernel_model(kernel_id, self.ws_url)
- self.set_header('Location', '{0}kernels/{1}'.format(self.base_kernel_url, kernel_id))
+ self.set_header('Location', '{0}api/kernels/{1}'.format(self.base_kernel_url, kernel_id))
+ self.set_status(201)
self.finish(jsonapi.dumps(model))
@@ -57,6 +58,7 @@ class KernelHandler(IPythonHandler):
@json_errors
def get(self, kernel_id):
km = self.kernel_manager
+ km._check_kernel_id(kernel_id)
model = km.kernel_model(kernel_id, self.ws_url)
self.finish(jsonapi.dumps(model))
diff --git a/IPython/html/services/kernels/kernelmanager.py b/IPython/html/services/kernels/kernelmanager.py
index 787abd1..3da9399 100644
--- a/IPython/html/services/kernels/kernelmanager.py
+++ b/IPython/html/services/kernels/kernelmanager.py
@@ -66,16 +66,19 @@ class MappingKernelManager(MultiKernelManager):
'dead',
)
else:
+ self._check_kernel_id(kernel_id)
self.log.info("Using existing kernel: %s" % kernel_id)
return kernel_id
def shutdown_kernel(self, kernel_id, now=False):
"""Shutdown a kernel by kernel_id"""
+ self._check_kernel_id(kernel_id)
super(MappingKernelManager, self).shutdown_kernel(kernel_id, now=now)
def kernel_model(self, kernel_id, ws_url):
"""Return a dictionary of kernel information described in the
JSON standard model."""
+ self._check_kernel_id(kernel_id)
model = {"id":kernel_id, "ws_url": ws_url}
return model
diff --git a/IPython/html/services/kernels/tests/test_kernels_api.py b/IPython/html/services/kernels/tests/test_kernels_api.py
index 894717f..0dc6ccb 100644
--- a/IPython/html/services/kernels/tests/test_kernels_api.py
+++ b/IPython/html/services/kernels/tests/test_kernels_api.py
@@ -31,24 +31,70 @@ class KernelAPITest(NotebookTestBase):
# POST request
r = requests.post(self.base_url())
data = r.json()
+ status = r.status_code
+ header = r.headers
+ self.assertIn('location', header)
+ self.assertEquals(header['location'], '/api/kernels/' + data['id'])
+ self.assertEquals(status, 201)
assert isinstance(data, dict)
# GET request
r = requests.get(self.base_url())
+ status = r.status_code
+ self.assertEquals(status, 200)
assert isinstance(r.json(), list)
self.assertEqual(r.json()[0]['id'], data['id'])
+
+ # create another kernel and check that they both are added to the
+ # list of kernels from a GET request
+ data2 = self.mkkernel()
+ assert isinstance(data2, dict)
+ r = requests.get(self.base_url())
+ kernels = r.json()
+ status = r.status_code
+ self.assertEquals(status, 200)
+ assert isinstance(kernels, list)
+ self.assertEquals(len(kernels), 2)
def test_kernel_handler(self):
- # GET kernel with id
+ # GET kernel with given id
data = self.mkkernel()
url = self.base_url() +'/' + data['id']
r = requests.get(url)
- assert isinstance(r.json(), dict)
- self.assertIn('id', r.json())
- self.assertEqual(r.json()['id'], data['id'])
+ data1 = r.json()
+ status = r.status_code
+ self.assertEquals(status, 200)
+ assert isinstance(data1, dict)
+ self.assertIn('id', data1)
+ self.assertIn('ws_url', data1)
+ self.assertEqual(data1['id'], data['id'])
+
+ # Request a bad kernel id and check that a JSON
+ # message is returned!
+ bad_id = '111-111-111-111-111'
+ bad_url = self.base_url() + '/' + bad_id
+ r = requests.get(bad_url)
+ status = r.status_code
+ message = r.json()
+ self.assertEquals(status, 404)
+ assert isinstance(message, dict)
+ self.assertIn('message', message)
+ self.assertEquals(message['message'], 'Kernel does not exist: ' + bad_id)
# DELETE kernel with id
r = requests.delete(url)
self.assertEqual(r.status_code, 204)
r = requests.get(self.base_url())
self.assertEqual(r.json(), [])
+
+ # Request to delete a non-existent kernel id
+ bad_id = '111-111-111-111-111'
+ bad_url = self.base_url() + '/' + bad_id
+ r = requests.delete(bad_url)
+ status = r.status_code
+ message = r.json()
+ self.assertEquals(status, 404)
+ assert isinstance(message, dict)
+ self.assertIn('message', message)
+ self.assertEquals(message['message'], 'Kernel does not exist: ' + bad_id)
+
\ No newline at end of file
diff --git a/IPython/html/services/sessions/handlers.py b/IPython/html/services/sessions/handlers.py
index 4db1004..a72ed5e 100644
--- a/IPython/html/services/sessions/handlers.py
+++ b/IPython/html/services/sessions/handlers.py
@@ -47,15 +47,15 @@ class SessionRootHandler(IPythonHandler):
km = self.kernel_manager
model = self.get_json_body()
if model is None:
- raise HTTPError(400, "No JSON data provided")
+ raise web.HTTPError(400, "No JSON data provided")
try:
name = model['notebook']['name']
except KeyError:
- raise HTTPError(400, "Missing field in JSON data: name")
+ raise web.HTTPError(400, "Missing field in JSON data: name")
try:
path = model['notebook']['path']
except KeyError:
- raise HTTPError(400, "Missing field in JSON data: path")
+ raise web.HTTPError(400, "Missing field in JSON data: path")
# Check to see if session exists
if sm.session_exists(name=name, path=path):
model = sm.get_session(name=name, path=path)