Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(gateway): add specification for running the gateway over libp2p #434

Merged
merged 4 commits into from
Oct 6, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions src/http-gateways/libp2p-gateway.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
title: libp2p+HTTP Transport Gateway Specification
description: >
The libp2p Transport Gateway specification describes how HTTP Gateway semantics can be used over libp2p transports.
date: 2023-10-04
maturity: draft
editors:
- name: Adin Schmahmann
github: aschmahmann
affiliation:
name: Protocol Labs
url: https://protocol.ai/
- name: Marcin Rataj
github: lidel
url: https://lidel.org/
affiliation:
name: Protocol Labs
url: https://protocol.ai/
xref:
- path-gateway
- trustless-gateway
tags: ['httpGateways', 'lowLevelHttpGateways', 'exchange', 'transport']
order: 3
---

## Introduction

This specification describes how HTTP Gateway semantics
and APIs can be used over [libp2p](https://github.com/libp2p/specs) transports.

## Specification

The [libp2p+HTTP specification](https://github.com/libp2p/specs/pull/508)
describes how to use HTTP semantics over stream transports, as well as how
to do discovery of what protocols are available (and where they are mounted).

### `.well-known/libp2p`

libp2p application sub-protocols exposed behind `/http/1.1` protocol can be
discovered by the well-known resource (:cite[rfc8615]) at `.well-known/libp2p`.

#### Protocol identifier

In order for a given HTTP Gateway protocol like the :cite[trustless-gateway] to
work in this environment it requires a protocol identifier to act as a key in
the `.well-known/libp2p` mapping file.

The `/http/1.1` sub-protocol identifier for the IPFS Gateway when used over libp2p is:

```
/ipfs/gateway
```

#### Protocol mounting

A reference `.well-known/libp2p` JSON body with mapping that assumes the gateway to be mounted at `/`:

```js
{
"protocols": {
"/ipfs/gateway": {"path": "/"},
}
}
```

## Gateway type detection

The protocol identifier is shared among Gateway specifications.

HTTP server mounted behind the `/ipfs/gateway` identifier MUST expose
:cite[trustless-gateway], but is free to also support other gateway types and
features.

:::note

Signaling Features on HTTP Gateways is wip in [IPIP-425](https://github.com/ipfs/specs/pull/425).

Until the IPIP is finalized, client implementations SHOULD perform feature
detection on their own, or assume only the most basic [block (application/vnd.ipld.raw)](https://specs.ipfs.tech/http-gateways/trustless-gateway/#block-responses-application-vnd-ipld-raw)
response type from :cite[trustless-gateway] is available.

:::