issue_comments

14 rows where author_association = "OWNER" and issue = 647095487 sorted by updated_at descending

View and edit SQL

Suggested facets: created_at (date), updated_at (date)

user

issue

  • "datasette -p 0 --root" gives the wrong URL · 14

author_association

  • OWNER · 14
id html_url issue_url node_id user created_at updated_at ▲ author_association body reactions issue performed_via_github_app
675610275 https://github.com/simonw/datasette/issues/873#issuecomment-675610275 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY3NTYxMDI3NQ== simonw 9599 2020-08-18T17:24:05Z 2020-08-18T17:26:10Z OWNER

Maybe I can do this with ASGI after all. Here's the output of /-/asgi-scope with datasette-debug-asgi installed:

{'asgi': {'spec_version': '2.1', 'version': '3.0'},
 'client': ('127.0.0.1', 62035),
 'headers': [(b'host', b'127.0.0.1:62029'),
             (b'user-agent',
              b'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko'
              b'/20100101 Firefox/79.0'),
             (b'accept',
              b'text/html,application/xhtml+xml,application/xml;q=0.9,image/'
              b'webp,*/*;q=0.8'),
             (b'accept-language', b'en-US,en;q=0.5'),
             (b'accept-encoding', b'gzip, deflate'),
             (b'dnt', b'1'),
             (b'connection', b'keep-alive'),
             (b'upgrade-insecure-requests', b'1'),
             (b'cache-control', b'max-age=0')],
 'http_version': '1.1',
 'method': 'GET',
 'path': '/-/asgi-scope',
 'query_string': b'',
 'raw_path': b'/-/asgi-scope',
 'root_path': '',
 'scheme': 'http',
 'server': ('127.0.0.1', 62029),
 'type': 'http'}

That 'server': ('127.0.0.1', 62029) bit has the correct port. Question is, can I access that programmatically on server startup?

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
675609109 https://github.com/simonw/datasette/issues/873#issuecomment-675609109 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY3NTYwOTEwOQ== simonw 9599 2020-08-18T17:21:51Z 2020-08-18T17:21:51Z OWNER

Asked about this on the encode gitter here: https://gitter.im/encode/community?at=5f3c0dcaa8c17801765940c0

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
651203178 https://github.com/simonw/datasette/issues/873#issuecomment-651203178 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MTIwMzE3OA== simonw 9599 2020-06-29T15:44:38Z 2020-06-29T15:44:54Z OWNER

I'm having real trouble figuring out how to gain access to the port that was used to start the server. I'm treating this as a very low priority - it only affects the exact -p 0 --root combination which isn't going to affect many people at all.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
651193594 https://github.com/simonw/datasette/issues/873#issuecomment-651193594 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MTE5MzU5NA== simonw 9599 2020-06-29T15:27:46Z 2020-06-29T15:27:46Z OWNER

Uninstalling datasette-debug-asgi caused the server to startup correctly again.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
651193131 https://github.com/simonw/datasette/issues/873#issuecomment-651193131 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MTE5MzEzMQ== simonw 9599 2020-06-29T15:27:00Z 2020-06-29T15:27:00Z OWNER

Aha! Yes it's not being called, and the reason is this: https://github.com/encode/starlette/issues/486

Short version: by default an exception raised during that phase is silently swallowed! You can avoid the swallowing by adding lifespan="on" to the call to uvicorn.run().

When I did that here:

uvicorn.run(ds.app(), host=host, port=port, log_level="info", lifespan="on")

The server failed to start with this error:

INFO:     Started server process [68849]
INFO:     Waiting for application startup.
ERROR:    Exception in 'lifespan' protocol
Traceback (most recent call last):
  File ".../uvicorn/lifespan/on.py", line 48, in main
    await app(scope, self.receive, self.send)
  File ".../uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File ".../datasette_debug_asgi.py", line 9, in wrapped_app
    if scope["path"] == "/-/asgi-scope":
KeyError: 'path'
{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650910137 https://github.com/simonw/datasette/issues/873#issuecomment-650910137 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkxMDEzNw== simonw 9599 2020-06-29T05:16:32Z 2020-06-29T05:16:32Z OWNER

I'm not convinced that function is ever actually being called - I added a print() statement to it and it's not executing. I don't think the tests cover it.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650909476 https://github.com/simonw/datasette/issues/873#issuecomment-650909476 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwOTQ3Ng== simonw 9599 2020-06-29T05:14:08Z 2020-06-29T05:14:08Z OWNER

I already have a AsgiLifespan class:
https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/app.py#L896-L905

It runs this function: https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/app.py#L890-L894

Could that startup function also output the --root login URL, if needed?

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650909136 https://github.com/simonw/datasette/issues/873#issuecomment-650909136 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwOTEzNg== simonw 9599 2020-06-29T05:12:58Z 2020-06-29T05:12:58Z OWNER

On startup Datasette currently outputs:

INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.

So the ASGI lifespan protocol is almost certainly the right way to solve this.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650908854 https://github.com/simonw/datasette/issues/873#issuecomment-650908854 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwODg1NA== simonw 9599 2020-06-29T05:12:04Z 2020-06-29T05:12:04Z OWNER

Can I detect the port the server is running on from within the regular Datasette ASGI code? If so I could use that ability and maybe output the magic --root link a second after the server starts up somehow.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650908534 https://github.com/simonw/datasette/issues/873#issuecomment-650908534 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwODUzNA== simonw 9599 2020-06-29T05:11:06Z 2020-06-29T05:11:06Z OWNER

Uvicorn's lifespan stuff isn't easy to figure out, but this test suite holds some clues: https://github.com/encode/uvicorn/blob/master/tests/test_lifespan.py

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650907323 https://github.com/simonw/datasette/issues/873#issuecomment-650907323 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwNzMyMw== simonw 9599 2020-06-29T05:07:16Z 2020-06-29T05:07:16Z OWNER

This line is interesting: is this a hook I can attach to somehow?

        await self.lifespan.startup()

From https://github.com/encode/uvicorn/blob/a75fe1381f6b1f78901691c71894f3cf487b5d30/uvicorn/main.py#L475

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650906533 https://github.com/simonw/datasette/issues/873#issuecomment-650906533 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwNjUzMw== simonw 9599 2020-06-29T05:04:44Z 2020-06-29T05:04:44Z OWNER

The challenge is... can we run our own custom code after that line has executed that has access to server and can hence access server.servers[0].sockets[0].getsockname()[1] to find the port?

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650906318 https://github.com/simonw/datasette/issues/873#issuecomment-650906318 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwNjMxOA== simonw 9599 2020-06-29T05:04:04Z 2020-06-29T05:04:12Z OWNER

Within uvicorn it does this:

            if port == 0:
                port = server.sockets[0].getsockname()[1]

That server variable is later stashed here:

self.servers = [server]

Where self is the instance of class Server - which is the class that Uvicorn instantiates and calls .run() on when we do uvicorn.run() here: https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/cli.py#L409

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  
650905399 https://github.com/simonw/datasette/issues/873#issuecomment-650905399 https://api.github.com/repos/simonw/datasette/issues/873 MDEyOklzc3VlQ29tbWVudDY1MDkwNTM5OQ== simonw 9599 2020-06-29T05:01:03Z 2020-06-29T05:01:03Z OWNER

This is a bit tricky to fix. This change to uvicorn is relevant: https://github.com/encode/uvicorn/commit/a75fe1381f6b1f78901691c71894f3cf487b5d30

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
"datasette -p 0 --root" gives the wrong URL 647095487  

Advanced export

JSON shape: default, array, newline-delimited, object

CSV options:

CREATE TABLE [issue_comments] (
   [html_url] TEXT,
   [issue_url] TEXT,
   [id] INTEGER PRIMARY KEY,
   [node_id] TEXT,
   [user] INTEGER REFERENCES [users]([id]),
   [created_at] TEXT,
   [updated_at] TEXT,
   [author_association] TEXT,
   [body] TEXT,
   [reactions] TEXT,
   [issue] INTEGER REFERENCES [issues]([id])
, [performed_via_github_app] TEXT);
CREATE INDEX [idx_issue_comments_issue]
                ON [issue_comments] ([issue]);
CREATE INDEX [idx_issue_comments_user]
                ON [issue_comments] ([user]);
Powered by Datasette · Query took 29.192ms · About: github-to-sqlite