tessera

Finishes an upload whose parts went straight to the store.

POST
/api/v1/uploads/{id}/complete

Where the size is checked

Here, and only here. A part URL cannot be limited to a length, so this completes the object and then asks the store for its size. An object that does not match the size the session declared, and was charged against the uploader's quota, is deleted and refused.

Until then the extra bytes sit in the bucket. That is the price of not proxying the bytes, bounded by what a session that already passed the size and quota checks can write before this runs.

Errors

400 when the number of ETags does not match the number of parts, or the object did not come out the declared size. 404 when there is no such session, 409 when this upload cannot take parts directly or already had parts sent through this server, 410 when the session was abandoned.

cookietessera_session<token>

Set by POST /auth/login. A browser sends it automatically; it is HttpOnly, so page scripts cannot read or set it.

id*string

The session

application/json
  1. body

Body of POST /uploads/{id}/complete.

etags*array<string>

The ETag each part's PUT returned, in part order from one.

One per part, as the store sent it, quotes included if it included them.

Response Body

The upload is a file now

application/json
  1. response

A share as the API describes it. Never carries the content.

code*string

The retrieval code, as a person reads it.

copy_count*integer

How many times a client reported it being copied.

Formatint32
Range0 <= value
created_at*string

When it was created, RFC 3339.

disabled*boolean

Whether it has been switched off, by an operator or because the scanner found a threat. A disabled share answers 404 to everyone else.

encryption?|

link or password for an end-to-end encrypted share, null for one the server can read.

expires_at?|

When it stops being served, RFC 3339, or null to live until deleted.

files*array<>

Every file this share holds. Empty for text and for a locked share.

has_password*boolean

Whether a password must be presented to retrieve it.

id*string

Stable identifier.

key_salt?|

The salt a password-derived key was stretched with, for password.

kind*string

text, file or link.

language?|

Syntax-highlighting hint.

last_accessed_at?|

When it was last retrieved, RFC 3339.

Answers the question people ask of their own share: has it been picked up yet?

management_token?|

Token that lets an anonymous uploader delete this share.

Shown once, at creation, and only for an anonymous upload. Only its digest is stored. Without it, a mistaken anonymous upload could never be taken back.

path*string

Where the share lives, relative to this instance's origin.

Relative by design. The server does not know what host it is reached through, and guessing wrong behind a reverse proxy produces broken links. The caller already knows the origin it called.

scan_detail?|

The threat's name for infected; encrypted or too_large for skipped.

scan_state?|

The malware scanner's verdict, the most significant across its files: pending, clean, infected, skipped or deferred. null when it was never sent to a scanner. See docs/scanning.md.

scanning*boolean

Whether it is waiting for the malware scanner. Until it is done, downloads answer 423 with Retry-After.

sealed_details?|

The title and a note's language, sealed, on an encrypted share.

size_bytes*integer

Size of the content in bytes.

Formatint64
Range0 <= value
title?|

Display name.

use_count*integer

How many times it has been retrieved.

Counted by the server on the transfer path, so this is the number to trust. The two below are what a client reported.

Formatint32
Range0 <= value
uses_remaining?|

How many retrievals remain, or null for unlimited.

Formatint32
Range0 <= value
view_count*integer

How many times a client reported showing it.

Formatint32
Range0 <= value
curl -X POST 'https://example.com/api/v1/uploads/string/complete' \  -H 'Content-Type: application/json' \  -d '{  "etags": [    "string"  ]}'
{  "code": "string",  "copy_count": 0,  "created_at": "string",  "disabled": true,  "encryption": "string",  "expires_at": "string",  "files": [    {      "filename": "string",      "position": 0,      "sealed_name": "string",      "size_bytes": 0    }  ],  "has_password": true,  "id": "string",  "key_salt": "string",  "kind": "string",  "language": "string",  "last_accessed_at": "string",  "management_token": "string",  "path": "string",  "scan_detail": "string",  "scan_state": "string",  "scanning": true,  "sealed_details": "string",  "size_bytes": 0,  "title": "string",  "use_count": 0,  "uses_remaining": 0,  "view_count": 0}