haskell / haskell/HTTP

Custom instances of HStream impossible to write

Ouverte
#86 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Haskell
Étoiles
186
Forks
59
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

It would be nice to be able to have an instance of [`HStream`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-TCP.html#t:HStream) that allows to stream without using lazy I/O; in particular, an instance that would allow us to close the connection when we no longer want the rest of the response body.

However, in order to define a custom type with a corresponding `HStream` instance one needs to provide, amongst other things, implementations of

``` haskell
openStream :: String -> Int -> IO (HandleStream bufType)
close :: HandleStream bufType -> IO ()
```

For the implementation of `openStream` we can use

``` haskell
openTCPConnection :: BufferType ty => String -> Int -> IO (HandleStream ty)
```

However, for the implementation of `close` we are stuck; there is no function analogous to `openTCPConnection` that allows us to close a `HandleStream`.

Although we have

``` haskell
hstreamToConnection :: HandleStream String -> Connection
```

and there is a [`Stream`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-Stream.html#t:Stream) instance for [`Connection`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-TCP.html#t:Connection), `hstreamToConnection` works _only_ for `HandleStream String`, so that doesn't help either.

Finally, the [`HandleStream`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-TCP.html#t:HandleStream) type is completely opaque (it does not even satisfy `Functor`) so we cannot define a `HStream` instance for one `bufType` in terms of the `HStream` instance for another. If we had _some_ way of defining new instances in terms of old instances (for instance, reuse the instance for lazy bytestrings, but somehow retain a handle to the corresponding `HandleStream` so that we can close it explicitly) that would be great.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez par HStream, HandleStream, openStream, close et openTCPConnection dans Network.TCP, puis examinez hstreamToConnection et Connection dans Network.Stream. Déterminez une API permettant aux instances HStream personnalisées de fermer leur HandleStream sans I/O paresseuse ni dépendre de la conversion spécifique à String. Le travail est terminé lorsqu’un type de tampon personnalisé peut définir un nettoyage explicite de la connexion.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
haskell
Domaine
networking
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.