diff --git a/src/buffer.c b/src/buffer.c
index 7148be3..038cb91 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -9,7 +9,7 @@
 * Internal function prototypes
 \*=========================================================================*/
 static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b);
-static int recvline(p_buffer buf, luaL_Buffer *b);
+static int recvline(p_buffer buf, luaL_Buffer *b, int chop);
 static int recvall(p_buffer buf, luaL_Buffer *b);
 static int buffer_get(p_buffer buf, const char **data, size_t *count);
 static void buffer_skip(p_buffer buf, size_t count);
@@ -117,10 +117,21 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) {
     luaL_addlstring(&b, part, size);
     /* receive new patterns */
     if (!lua_isnumber(L, 2)) {
-        const char *p= luaL_optstring(L, 2, "*l");
-        if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b);
-        else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b);
-        else luaL_argcheck(L, 0, 2, "invalid receive pattern");
+        const char *p = luaL_optstring(L, 2, "l");
+        if (*p == '*') p++;  /* skip optional '*' (for compatibility) */
+        switch (*p) {
+            case 'l':  /* line */
+                err = recvline(buf, &b, 1);
+                break;
+            case 'L':  /* line with \n */
+                err = recvline(buf, &b, 0);
+                break;
+            case 'a':  /* all */
+                err = recvall(buf, &b);
+                break;
+            default:
+                luaL_argcheck(L, 0, 2, "invalid receive pattern");
+        }
     /* get a fixed number of bytes (minus what was already partially
      * received) */
     } else {
@@ -222,7 +233,7 @@ static int recvall(p_buffer buf, luaL_Buffer *b) {
 * Reads a line terminated by a CR LF pair or just by a LF. The CR and LF
 * are not returned by the function and are discarded from the buffer
 \*-------------------------------------------------------------------------*/
-static int recvline(p_buffer buf, luaL_Buffer *b) {
+static int recvline(p_buffer buf, luaL_Buffer *b, int chop) {
     int err = IO_DONE;
     while (err == IO_DONE) {
         size_t count, pos; const char *data;
@@ -234,6 +245,8 @@ static int recvline(p_buffer buf, luaL_Buffer *b) {
             pos++;
         }
         if (pos < count) { /* found '\n' */
+            if (!chop)
+                luaL_addchar(b, '\n');
             buffer_skip(buf, pos+1); /* skip '\n' too */
             break; /* we are done */
         } else /* reached the end of the buffer */