reisub

reisub

HttpCookie - standards-compliant HTTP Cookie implementation for Elixir

I just released version 0.8.0 of HttpCookie, a standards-compliant (client-side) HTTP Cookie implementation.

It’s not a new library, but this release resolves the public suffix dependency mess so I thought it’s a good time to spread the word.

The code is tested against implementation-agnostic IETF test cases so I’m reasonably sure the code is correct and I’ve been using it in prod for about a year without issue.

I tried to make it safe by default:

  • there’s default limits for the cookie size and number of cookies per domain and in total
  • there’s a check to reject ‘supercookies’

It also ships with a Req plugin which makes it easy to use if you already use Req.

So you can really use it at 3 different abstraction levels:

  • as a Req plugin
  • as a cookie jar with any other HTTP client
  • as a cookie string parser (if you have niche needs and/or you want to build you own cookie jar)

Contributions in any form or shape are welcome, and I’d be happy to receive bug reports, feature suggestions and PRs. The standard disclaimers apply - this is a free time project and your contributions might not get noticed/reacted to very quickly.

Backstory

Back in late 2023 I needed to access an API that uses cookies for authentication, so I needed a cookie jar to use with Req.
I found two potential libraries to use: cookie_monster and cookie_jar.

I first tried cookie_jar because it was closer to what I needed, but it failed to parse some cookies I had to deal with and upon further inspection I saw that the cookies were probably following the spec (I didn’t know the spec that well yet at that point).

So then I tried to parse the cookies with cookie_monster and that worked for the most part, except I also found it diverged from the spec when handling unsupported attributes which broke parsing one of the cookies I had to deal with.

I was in time crunch with the functionality that used this so for the time being I ended up with a frankenstein solution of:

  1. preprocessing the cookie string to remove the ‘Version’ attribute that one of the servers was sending
  2. parsing the cookie with cookie_monster
  3. storing/using it with cookie_jar

Though the issue with the unrecognized attribute parsing was later resolved in cookie_monster I still thought the Elixir ecosystem could use a client-side cookie implementation that more closely followed the spec.

This is not a complaint about the existing libraries and I’m grateful they exist, but I chose to start over and treat this as a learning opportunity. I definitely learned a lot reading the 3 existing RFCs that cover this functionality and being able to experiment freely helped me get to something I feel works well.

Future work

A new cookie RFC that will obsolete RFC6265 is in the works.

It standardizes SameSite which is already implemented by browsers and removes the deprecated Cookie2/Set-Cookie2 headers, so apart from any bugfixes that’s what you can expect implemented in the future - though I might wait for the standard to be finalized to start.

Most Liked

reisub

reisub

I’ve released v0.8.1 recently, as someone needed Elixir 1.14 support - now the lib works for Elixir 1.14+ (previously it was 1.15+).

See full changelog.

Please keep the feedback coming - I want to make HttpCookie all you need for cookie handling on the client side in Elixir. I think it’s already feature complete, but I’d like to get more people using it to find any edge cases or missing functionality.

Where Next?

Popular in Libraries Top

josevalim
Hi everyone, We would like to announce that Plataformatec is working on a new MySQL driver called MyXQL. Our goal is to eventually integ...
New
mhanberg
I just released the first version of Temple: an HTML DSL for Elixir and Phoenix! You can read this blog post or the docs for more info...
New
tmbb
I’ve been working on two packages (not on hex.pm yet) to build admin interfaces for phoenix apps: bureaucrat - which contains a bunch ...
New
OvermindDL1
Been making an MLElixir thing (not released yet…) for fun in spare time in the past day. I’m just trying to see how much I can get an ML...
132 13487 106
New
archan937
It is a well-know topic within the Elixir community: “To mock or not to mock? :)” Every alchemist probably has his / her own opinion con...
New
Crowdhailer
I have been updating a library that allows you to pipe between functions that use the erlang result tuple convention. Assuming you have...
New
josevalim
Yes, yet another parser combinator library! Most of the parser combinators in the ecosystem are either compile-time, often using AST tra...
159 18262 141
New
wmnnd
Hi there, for my project DBLSQD, I needed a file storage solution that is a bit more flexible than Arc. Because I thought others might f...
New
OvermindDL1
I created a new library (rather I pulled out a couple files from my big project), it manages an operating system PID file for the BEAM. ...
New
Qqwy
While not as prevalent as in imperative languages, arrays (collections with efficient random element access) are still very useful in Eli...
New

Other popular topics Top

_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New

Sub Categories:

We're in Beta

About us Mission Statement