pasteque/using.en.md

5.4 KiB

Paf'Py

TL;DR

Use this bash function:

paf()
{
    curl https://p.afpy.org/ "${@/*/-F&=@&}"
}

it allows to send a file:

$ paf manage.py
- https://p.afpy.org/TaPa/manage.py

or many:

$ paf *.py
- https://p.afpy.org/d6Xd/admin.py
- https://p.afpy.org/d6Xd/context_processors.py
- https://p.afpy.org/d6Xd/__init__.py
- https://p.afpy.org/d6Xd/models.py
- https://p.afpy.org/d6Xd/urls.py
- https://p.afpy.org/d6Xd/utils.py
- https://p.afpy.org/d6Xd/views.py

A more complicated version is provided below.

The projet

Pasteque is a FOSS project implemented by Alexandre Henriet around 2013 under the MIT license, around 2018 Julien Palard took over for https://wyz.fr and finally around 2023 the AFPy took over for https://p.afpy.org.

Source code is here: https://git.afpy.org/AFPy/pasteque

Using with curl

All examples uses curl, feel free to adapt:

Using multipart/form-data HTTP requests it is possible to send a file:

$ curl https://p.afpy.org/ -Fmanage.py=@manage.py
- https://p.afpy.org/TaPa/manage.py

Or multiples files:

$ curl https://p.afpy.org/ -Fmanage.py=@manage.py -Frequirements.txt=@requirements.txt
- https://p.afpy.org/Nz2o/manage.py
- https://p.afpy.org/Nz2o/requirements.txt

The extension is used to determine syntax coloration to be used for each file.

File without extension, or ending with .md are interepreted as Markdown.

Files are always given back raw outside of a browser, typically via curl or wget.

Sending in a request body

It is possible to send a single file as a POST body:

$ cal | curl -XPOST --data-binary @- https://p.afpy.org/
- https://p.afpy.org/mo8X

Without a name, the file has no extension, and will be rendered as Markdown, it may not be what you want.

In this case it is possible to override the syntax coloration using the Content-Type header:

$ cal | curl -XPOST -H "Content-Type: text/plain" --data-binary @- https://p.afpy.org/
- https://p.afpy.org/i3Y2/request.txt

Choosing the URL

It is possible to use a PUT instead of a POST to choose the paste URL:

$ cal | curl -XPUT --data-binary @- https://p.afpy.org/cal
- https://p.afpy.org/cal
$ curl -XPUT --data-binary @manage.py https://p.afpy.org/manage.py
- https://p.afpy.org/manage.py

Overwriting (updating) pasts

When sending a paste, you can assign it a secret using the Authorization header:

$ date | curl -XPUT --data-binary @- -H "Authorization: Secret supersecret" https://p.afpy.org/date
- https://p.afpy.org/date

This secret can now be used to update the same file:

$ date | curl -XPUT --data-binary @- -H "Authorization: Secret supersecret" https://p.afpy.org/date
- https://p.afpy.org/date
$ curl https://p.afpy.org/date
Tue Apr 25 06:22:45 PM CEST 2023
$ date | curl -XPUT --data-binary @- -H "Authorization: Secret supersecret" https://p.afpy.org/date
- https://p.afpy.org/date
$ curl https://p.afpy.org/date
Tue Apr 25 06:23:44 PM CEST 2023

The home page and the robots.txt file of https://p.afpy.org are handled using this method.

Listing own pasts

All pastes sharing the same secret can be listed using the /::/list/ URL:

$ curl https://p.afpy.org/::/list/ -H "Authorization: Secret supersecret"
| filename   |   size | URL                 | paste_time                | access_time               |   viewcount |
|------------|--------|---------------------|---------------------------|---------------------------|-------------|
|            |   5168 | https://p.afpy.org/ | 2023-04-25T16:03:59+00:00 | 2023-04-25T16:26:59+00:00 |           2 |

Advanced usage

With this function (in which the secret have to be changed, I recommend you to use pass but feel free to hardcode the password):

paf()
{
    local SECRET="$(pass paf)"
    local AUTH="-HAuthorization: Secret $SECRET"
    local INSTANCE="https://p.afpy.org/"

    if [[ $1 == "--list" ]]
    then
        curl "$AUTH" $INSTANCE::/list/
        return
    fi

    if [[ $# == 0 ]]
    then
        curl "$AUTH" "$INSTANCE" --data-binary @-
    else
        curl "$AUTH" "$INSTANCE" "${@/*/-F&=@&}"
    fi
}

code-block()
{
    printf '```%s\n' "$1"
    cat
    printf '```\n'
}

It is possible to:

  • send one or many files,
  • send from stdin,
  • list own files.

The code-block function is helpfull to transform non-markdown to a Markdown code-block while piping, like:

$ cal | code-block | paf
- https://p.afpy.org/WrmY

Without the code-block we'll get: https://p.afpy.org/aAkF

If you want to share a complete folder, just paste the list back:

$ paf *.py | paf
- https://p.afpy.org/nnLR

Which gives:

$ curl https://p.afpy.org/nnLR
- https://p.afpy.org/fAqR/admin.py
- https://p.afpy.org/fAqR/context_processors.py
- https://p.afpy.org/fAqR/__init__.py
- https://p.afpy.org/fAqR/models.py
- https://p.afpy.org/fAqR/urls.py
- https://p.afpy.org/fAqR/utils.py
- https://p.afpy.org/fAqR/views.py

And, in a browser, as it's interpreted as Markdown, you can click the links.

To get further

Note to self

To update this (french) page on p.afpy.org I use:

$ curl -H "Authorization: Secret $(pass paf)" -XPUT --data-binary @using.fr.md https://p.afpy.org/