Index: uspace/lib/http/headers.c
===================================================================
--- uspace/lib/http/headers.c	(revision ff364f125938ece58e318df9f0e2415746e266ae)
+++ uspace/lib/http/headers.c	(revision c17469e42264d4df053bb02adb05c2a365e8e922)
@@ -49,29 +49,31 @@
 }
 
-http_header_t *http_header_create(const char *name, const char *value)
+void http_header_init(http_header_t *header)
 {
-	char *dname = str_dup(name);
-	if (dname == NULL)
-		return NULL;
-	
-	char *dvalue = str_dup(value);
-	if (dvalue == NULL) {
-		free(dname);
-		return NULL;
-	}
-
-	return http_header_create_no_copy(dname, dvalue);
+	link_initialize(&header->link);
+	header->name = NULL;
+	header->value = NULL;
 }
 
-http_header_t *http_header_create_no_copy(char *name, char *value)
+http_header_t *http_header_create(const char *name, const char *value)
 {
 	http_header_t *header = malloc(sizeof(http_header_t));
 	if (header == NULL)
 		return NULL;
+	http_header_init(header);
+
+	header->name = str_dup(name);
+	if (header->name == NULL) {
+		free(header);
+		return NULL;
+	}
 	
-	link_initialize(&header->link);
-	header->name = name;
-	header->value = value;
-	
+	header->value = str_dup(value);
+	if (header->value == NULL) {
+		free(header->name);
+		free(header);
+		return NULL;
+	}
+
 	return header;
 }
@@ -84,5 +86,5 @@
 }
 
-ssize_t http_encode_header(char *buf, size_t buf_size, http_header_t *header)
+ssize_t http_header_encode(http_header_t *header, char *buf, size_t buf_size)
 {
 	/* TODO properly split long header values */
@@ -96,5 +98,5 @@
 }
 
-int http_parse_header(const char *line, char **out_name, char **out_value)
+int http_header_parse(const char *line, http_header_t *header)
 {
 	const char *pos = line;
@@ -117,6 +119,6 @@
 	}
 	
-	*out_name = name;
-	*out_value = value;
+	header->name = name;
+	header->value = value;
 	
 	return EOK;
Index: uspace/lib/http/http.h
===================================================================
--- uspace/lib/http/http.h	(revision ff364f125938ece58e318df9f0e2415746e266ae)
+++ uspace/lib/http/http.h	(revision c17469e42264d4df053bb02adb05c2a365e8e922)
@@ -81,7 +81,11 @@
 extern http_t *http_create(const char *, uint16_t);
 extern int http_connect(http_t *);
+
+extern void http_header_init(http_header_t *);
 extern http_header_t *http_header_create(const char *, const char *);
-extern http_header_t *http_header_create_no_copy(char *, char *);
+extern int http_header_parse(const char *, http_header_t *);
+ssize_t http_header_encode(http_header_t *, char *, size_t);
 extern void http_header_destroy(http_header_t *);
+
 extern http_request_t *http_request_create(const char *, const char *);
 extern void http_request_destroy(http_request_t *);
@@ -90,6 +94,4 @@
 extern int http_parse_status(const char *, http_version_t *, uint16_t *,
     char **);
-extern int http_parse_header(const char *, char **, char **);
-ssize_t http_encode_header(char *, size_t, http_header_t *);
 extern int http_receive_response(http_t *, http_response_t **);
 extern int http_receive_body(http_t *, void *, size_t);
Index: uspace/lib/http/request.c
===================================================================
--- uspace/lib/http/request.c	(revision ff364f125938ece58e318df9f0e2415746e266ae)
+++ uspace/lib/http/request.c	(revision c17469e42264d4df053bb02adb05c2a365e8e922)
@@ -105,5 +105,5 @@
 	
 	list_foreach(req->headers, link, http_header_t, header) {
-		ssize_t header_size = http_encode_header(NULL, 0, header);
+		ssize_t header_size = http_header_encode(header, NULL, 0);
 		if (header_size < 0)
 			return header_size;
@@ -127,5 +127,5 @@
 	
 	list_foreach(req->headers, link, http_header_t, header) {
-		written = http_encode_header(pos, pos_size, header);
+		written = http_header_encode(header, pos, pos_size);
 		if (written < 0) {
 			free(buf);
Index: uspace/lib/http/response.c
===================================================================
--- uspace/lib/http/response.c	(revision ff364f125938ece58e318df9f0e2415746e266ae)
+++ uspace/lib/http/response.c	(revision c17469e42264d4df053bb02adb05c2a365e8e922)
@@ -122,17 +122,14 @@
 			break;
 		
-		char *name = NULL;
-		char *value = NULL;
-		rc = http_parse_header(line, &name, &value);
-		if (rc != EOK)
-			goto error;
-		
-		http_header_t *header = http_header_create_no_copy(name, value);
+		http_header_t *header = malloc(sizeof(http_header_t));
 		if (header == NULL) {
-			free(name);
-			free(value);
 			rc = ENOMEM;
 			goto error;
 		}
+		http_header_init(header);
+		
+		rc = http_header_parse(line, header);
+		if (rc != EOK)
+			goto error;
 		
 		list_append(&header->link, &resp->headers);
