file support
This commit is contained in:
parent
058e0b480d
commit
d5f705ae72
12
README.md
12
README.md
|
@ -15,7 +15,9 @@ Deploying
|
||||||
* `wrangler kv:namespace create KV`
|
* `wrangler kv:namespace create KV`
|
||||||
* `wrangler kv:namespace create AUTH`
|
* `wrangler kv:namespace create AUTH`
|
||||||
* `wrangler kv:key put --binding AUTH "$AUTH_KEY" 1` (or any truthy value you prefer)
|
* `wrangler kv:key put --binding AUTH "$AUTH_KEY" 1` (or any truthy value you prefer)
|
||||||
|
* `wrangler r2 bucket create files`
|
||||||
* Update the namespace IDs in `wrangler.toml` per the two above namespaces. For test namespaces, pass `--preview` to the namespace create commands and update the preview IDs as well
|
* Update the namespace IDs in `wrangler.toml` per the two above namespaces. For test namespaces, pass `--preview` to the namespace create commands and update the preview IDs as well
|
||||||
|
* also add the binding for the r2 bucket, `{ binding = "FILES", bucket_name = "files" }`
|
||||||
* While you're in wrangler.toml, update the custom domain in `routes[0].pattern` and the unauth redirect url in `vars.REDIR_URL` to your desired values
|
* While you're in wrangler.toml, update the custom domain in `routes[0].pattern` and the unauth redirect url in `vars.REDIR_URL` to your desired values
|
||||||
* `wrangler dev -r` to test with provided preview namespaces, or `wrangler deploy`
|
* `wrangler dev -r` to test with provided preview namespaces, or `wrangler deploy`
|
||||||
* Install python3 and python3-requests, then run `DEPLOY_HOST=https://linkie.username.workers.dev AUTH_KEY=$AUTH_KEY python3 test.py` to run tests to ensure linkie is functioning normally. If the script outputs nothing other than `Running on $DEPLOY_HOST`, the tests succeeded.
|
* Install python3 and python3-requests, then run `DEPLOY_HOST=https://linkie.username.workers.dev AUTH_KEY=$AUTH_KEY python3 test.py` to run tests to ensure linkie is functioning normally. If the script outputs nothing other than `Running on $DEPLOY_HOST`, the tests succeeded.
|
||||||
|
@ -26,15 +28,7 @@ Usage
|
||||||
|
|
||||||
`curl -n -d u=http://example.com linkie/path` will make `http://linkie/path` 302 redirect to the provided url. use .netrc to store the auth username/password (inspired by ix.io). Yes it supports emoji
|
`curl -n -d u=http://example.com linkie/path` will make `http://linkie/path` 302 redirect to the provided url. use .netrc to store the auth username/password (inspired by ix.io). Yes it supports emoji
|
||||||
|
|
||||||
`curl -n -F 'u=<-' linkie/path` will make the path 302 redirect to the url provided on stdin. Doesn't support more than one url or anything that's not a url. For instance:
|
`curl -n -F "u=@filename.json" linkie/path` now does file uploading to the connected R2 bucket, so that's neat. just don't forget the `u=`
|
||||||
|
|
||||||
```
|
|
||||||
curl -F 'u=<-' linkie/_ <<EOF
|
|
||||||
http://example.com
|
|
||||||
http://example.com?2
|
|
||||||
EOF
|
|
||||||
linkie/path => http://example.comhttp//example.com?2
|
|
||||||
```
|
|
||||||
|
|
||||||
`curl -n -d u=http://example.com linkie/_`, if you provide an underscore as the path linkie will generate a four character path from a-z0-9. if it has a collision five times in a row it'll return 500.. at that point i'd probably increase the length of the random ids in the function at the top of index.js to 5 or something, and also i should get off the internet because i've generated 36^4 short urls with this service and that's insane
|
`curl -n -d u=http://example.com linkie/_`, if you provide an underscore as the path linkie will generate a four character path from a-z0-9. if it has a collision five times in a row it'll return 500.. at that point i'd probably increase the length of the random ids in the function at the top of index.js to 5 or something, and also i should get off the internet because i've generated 36^4 short urls with this service and that's insane
|
||||||
|
|
||||||
|
|
27
src/index.js
27
src/index.js
|
@ -53,10 +53,10 @@ async function add(request,host,path) {
|
||||||
return new Response(`https://${host}/${path}`, {status:201})
|
return new Response(`https://${host}/${path}`, {status:201})
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof TypeError) {
|
if (e instanceof TypeError) {
|
||||||
// await FILES.put(path, request.body)
|
await FILES.put(path, dest)
|
||||||
// await KV.delete(path)
|
await KV.put(path,dest.type)
|
||||||
// return new Response(`https://${host}/${path}`, {status:201})
|
return new Response(`https://${host}/${path}`, {status:201})
|
||||||
return new Response("No valid URL provided",{status:400});
|
// return new Response("No valid URL provided",{status:400});
|
||||||
}
|
}
|
||||||
else throw e;
|
else throw e;
|
||||||
};
|
};
|
||||||
|
@ -86,17 +86,18 @@ async function get(request,host,path) {
|
||||||
if (!path) return Response.redirect(REDIR_URL,301)
|
if (!path) return Response.redirect(REDIR_URL,301)
|
||||||
path = path.toLowerCase()
|
path = path.toLowerCase()
|
||||||
|
|
||||||
// URL shortening
|
const dest_file = await FILES.get(path)
|
||||||
|
if (dest_file) {
|
||||||
|
const mime = await KV.get(path)
|
||||||
|
const headers = new Headers()
|
||||||
|
dest_file.writeHttpMetadata(headers)
|
||||||
|
headers.set("etag", dest_file.httpEtag)
|
||||||
|
headers.set("content-type", mime)
|
||||||
|
return new Response(dest_file.body, { headers, } )
|
||||||
|
}
|
||||||
const dest = await KV.get(path)
|
const dest = await KV.get(path)
|
||||||
if (dest) return Response.redirect(dest, 302)
|
if (dest) return Response.redirect(dest, 302)
|
||||||
|
return new Response("Path not found", {status:404})
|
||||||
// File uploading
|
|
||||||
const dest_file = await FILES.get(path)
|
|
||||||
if (!dest_file) return new Response("Path not found", {status:404})
|
|
||||||
const headers = new Headers()
|
|
||||||
dest_file.writeHttpMetadata(headers)
|
|
||||||
headers.set("etag", object.httpEtag)
|
|
||||||
return new Response(object.body, { headers, } )
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleRequest(request) {
|
async function handleRequest(request) {
|
||||||
|
|
41
test.py
41
test.py
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
from requests import request,get,put,post,patch,delete
|
from requests import request,get,put,post,patch,delete
|
||||||
from os import environ
|
from os import environ
|
||||||
|
from mimetypes import guess_type
|
||||||
|
|
||||||
host = environ.get("DEPLOY_HOST", "https://linkie.username.workers.dev")
|
host = environ.get("DEPLOY_HOST", "https://linkie.username.workers.dev")
|
||||||
auth = {"Authorization": environ.get("AUTH_KEY", "")}
|
auth = {"Authorization": environ.get("AUTH_KEY", "")}
|
||||||
|
@ -27,26 +28,15 @@ try:
|
||||||
# auth put wo data
|
# auth put wo data
|
||||||
req = put(host + path,data={},headers=auth)
|
req = put(host + path,data={},headers=auth)
|
||||||
assert req.status_code == 400 # auth put wo data
|
assert req.status_code == 400 # auth put wo data
|
||||||
req = post(host + path,data={},headers=auth)
|
|
||||||
assert req.status_code == 400 # auth post wo data
|
|
||||||
req = patch(host + path,data={},headers=auth)
|
|
||||||
assert req.status_code == 400 # auth patch wo data
|
|
||||||
|
|
||||||
# auth put invalid url
|
# # auth put invalid url
|
||||||
req = put(host + path,data={"u": "golf sale"},headers=auth)
|
# req = put(host + path,data={"u": "golf sale"},headers=auth)
|
||||||
assert req.status_code == 400 # auth put invalid url
|
# assert req.status_code == 400 # auth put invalid url
|
||||||
req = post(host + path,data={"u": "golf sale"},headers=auth)
|
# # invalid urls would now be stored as files instead
|
||||||
assert req.status_code == 400 # auth post invalid url
|
|
||||||
req = patch(host + path,data={"u": "golf sale"},headers=auth)
|
|
||||||
assert req.status_code == 400 # auth patch invalid url
|
|
||||||
|
|
||||||
# auth put wo path
|
# auth put wo path
|
||||||
req = put(host,data={"u": "http://www.example.com"},headers=auth)
|
req = put(host,data={"u": "http://www.example.com"},headers=auth)
|
||||||
assert req.status_code == 400 # auth put wo path
|
assert req.status_code == 400 # auth put wo path
|
||||||
req = post(host,data={"u": "http://www.example.com"},headers=auth)
|
|
||||||
assert req.status_code == 400 # auth post wo path
|
|
||||||
req = post(host,data={"u": "http://www.example.com"},headers=auth)
|
|
||||||
assert req.status_code == 400 # auth patch wo path
|
|
||||||
|
|
||||||
# auth put valid
|
# auth put valid
|
||||||
req = put(host + path,data={"u": "http://www.example.com/?put"},headers=auth)
|
req = put(host + path,data={"u": "http://www.example.com/?put"},headers=auth)
|
||||||
|
@ -54,16 +44,6 @@ try:
|
||||||
req = get(host + path, allow_redirects=False)
|
req = get(host + path, allow_redirects=False)
|
||||||
assert req.status_code == 302 and req.headers["location"] == "http://www.example.com/?put"
|
assert req.status_code == 302 and req.headers["location"] == "http://www.example.com/?put"
|
||||||
|
|
||||||
req = post(host + path + "post",data={"u": "http://www.example.com/?post"},headers=auth)
|
|
||||||
assert req.status_code == 201 # auth post valid
|
|
||||||
req = get(host + path + "post", allow_redirects=False)
|
|
||||||
assert req.status_code == 302 and req.headers["location"] == "http://www.example.com/?post"
|
|
||||||
|
|
||||||
req = patch(host + path + "patch",data={"u": "http://www.example.com/?patch"},headers=auth)
|
|
||||||
assert req.status_code == 201 # auth patch valid
|
|
||||||
req = get(host + path + "patch", allow_redirects=False)
|
|
||||||
assert req.status_code == 302 and req.headers["location"] == "http://www.example.com/?patch"
|
|
||||||
|
|
||||||
# auth delete wo path
|
# auth delete wo path
|
||||||
req = delete(host,headers=auth)
|
req = delete(host,headers=auth)
|
||||||
assert req.status_code == 400 # auth delete wo path
|
assert req.status_code == 400 # auth delete wo path
|
||||||
|
@ -73,6 +53,17 @@ try:
|
||||||
assert req.status_code == 200 # auth delete valid
|
assert req.status_code == 200 # auth delete valid
|
||||||
# req = get(host + path, allow_redirects=False)
|
# req = get(host + path, allow_redirects=False)
|
||||||
# assert req.status_code == 404
|
# assert req.status_code == 404
|
||||||
|
|
||||||
|
# auth put file valid
|
||||||
|
fn = "package.json"
|
||||||
|
mime = guess_type(fn)[0]
|
||||||
|
with open(fn, "rb") as f:
|
||||||
|
files = {'u': (fn, f, mime)}
|
||||||
|
req = put(host + path,headers=auth,files=files)
|
||||||
|
assert req.status_code == 201 # auth put file valid
|
||||||
|
req = get(host + path, allow_redirects=False)
|
||||||
|
assert req.status_code == 200 and req.headers["content-type"] == mime
|
||||||
|
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
print(req,req.headers,req.text)
|
print(req,req.headers,req.text)
|
||||||
raise
|
raise
|
||||||
|
|
Loading…
Reference in a new issue