summaryrefslogtreecommitdiff
path: root/libsoup/soup-message-server-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-message-server-io.c')
-rw-r--r--libsoup/soup-message-server-io.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/libsoup/soup-message-server-io.c b/libsoup/soup-message-server-io.c
index a53e5b7b..2647b811 100644
--- a/libsoup/soup-message-server-io.c
+++ b/libsoup/soup-message-server-io.c
@@ -11,13 +11,15 @@
#include <string.h>
+#include <glib/gi18n-lib.h>
+
#include "soup.h"
#include "soup-message-private.h"
#include "soup-misc-private.h"
static guint
parse_request_headers (SoupMessage *msg, char *headers, guint headers_len,
- SoupEncoding *encoding, gpointer sock)
+ SoupEncoding *encoding, gpointer sock, GError **error)
{
SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
char *req_method, *req_path, *url;
@@ -31,8 +33,14 @@ parse_request_headers (SoupMessage *msg, char *headers, guint headers_len,
&req_method,
&req_path,
&version);
- if (!SOUP_STATUS_IS_SUCCESSFUL (status))
+ if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
+ if (status == SOUP_STATUS_MALFORMED) {
+ g_set_error_literal (error, SOUP_REQUEST_ERROR,
+ SOUP_REQUEST_ERROR_PARSING,
+ _("Could not parse HTTP request"));
+ }
return status;
+ }
g_object_set (G_OBJECT (msg),
SOUP_MESSAGE_METHOD, req_method,
@@ -90,10 +98,7 @@ parse_request_headers (SoupMessage *msg, char *headers, guint headers_len,
g_free (req_path);
- if (!SOUP_URI_VALID_FOR_HTTP (uri)) {
- /* certainly not "a valid host on the server" (RFC2616 5.2.3)
- * SOUP_URI_VALID_FOR_HTTP also guards against uri == NULL
- */
+ if (!uri || !uri->host) {
if (uri)
soup_uri_free (uri);
return SOUP_STATUS_BAD_REQUEST;
@@ -111,6 +116,7 @@ handle_partial_get (SoupMessage *msg)
SoupRange *ranges;
int nranges;
SoupBuffer *full_response;
+ guint status;
/* Make sure the message is set up right for us to return a
* partial response; it has to be a GET, the status must be
@@ -129,9 +135,15 @@ handle_partial_get (SoupMessage *msg)
/* Oh, and there has to have been a valid Range header on the
* request, of course.
*/
- if (!soup_message_headers_get_ranges (msg->request_headers,
- msg->response_body->length,
- &ranges, &nranges))
+ status = soup_message_headers_get_ranges_internal (msg->request_headers,
+ msg->response_body->length,
+ TRUE,
+ &ranges, &nranges);
+ if (status == SOUP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE) {
+ soup_message_set_status (msg, status);
+ soup_message_body_truncate (msg->response_body);
+ return;
+ } else if (status != SOUP_STATUS_PARTIAL_CONTENT)
return;
full_response = soup_message_body_flatten (msg->response_body);