Browse Source

Fix: failed to explicitly check response status codes for some net.http requests

Rod Hynes 10 years ago
parent
commit
a7bc255256
4 changed files with 31 additions and 0 deletions
  1. 7 0
      psiphon/remoteServerList.go
  2. 8 0
      psiphon/serverApi.go
  3. 6 0
      psiphon/splitTunnel.go
  4. 10 0
      psiphon/upgradeDownload.go

+ 7 - 0
psiphon/remoteServerList.go

@@ -21,6 +21,7 @@ package psiphon
 
 import (
 	"errors"
+	"fmt"
 	"io/ioutil"
 	"net"
 	"net/http"
@@ -94,6 +95,12 @@ func FetchRemoteServerList(config *Config, dialConfig *DialConfig) (err error) {
 	}
 
 	response, err := httpClient.Do(request)
+
+	if err == nil &&
+		(response.StatusCode != http.StatusOK && response.StatusCode != http.StatusNotModified) {
+		response.Body.Close()
+		err = fmt.Errorf("unexpected response status code: %d", response.StatusCode)
+	}
 	if err != nil {
 		return ContextError(err)
 	}

+ 8 - 0
psiphon/serverApi.go

@@ -270,6 +270,10 @@ func (session *Session) doHandshakeRequest() error {
 // doGetRequest makes a tunneled HTTPS request and returns the response body.
 func (session *Session) doGetRequest(requestUrl string) (responseBody []byte, err error) {
 	response, err := session.psiphonHttpsClient.Get(requestUrl)
+	if err == nil && response.StatusCode != http.StatusOK {
+		response.Body.Close()
+		err = fmt.Errorf("unexpected response status code: %d", response.StatusCode)
+	}
 	if err != nil {
 		// Trim this error since it may include long URLs
 		return nil, ContextError(TrimError(err))
@@ -288,6 +292,10 @@ func (session *Session) doGetRequest(requestUrl string) (responseBody []byte, er
 // doPostRequest makes a tunneled HTTPS POST request.
 func (session *Session) doPostRequest(requestUrl string, bodyType string, body io.Reader) (err error) {
 	response, err := session.psiphonHttpsClient.Post(requestUrl, bodyType, body)
+	if err == nil && response.StatusCode != http.StatusOK {
+		response.Body.Close()
+		err = fmt.Errorf("unexpected response status code: %d", response.StatusCode)
+	}
 	if err != nil {
 		// Trim this error since it may include long URLs
 		return ContextError(TrimError(err))

+ 6 - 0
psiphon/splitTunnel.go

@@ -248,6 +248,12 @@ func (classifier *SplitTunnelClassifier) getRoutes(tunnel *Tunnel) (routesData [
 	useCachedRoutes := false
 
 	response, err := httpClient.Do(request)
+
+	if err == nil &&
+		(response.StatusCode != http.StatusOK && response.StatusCode != http.StatusNotModified) {
+		response.Body.Close()
+		err = fmt.Errorf("unexpected response status code: %d", response.StatusCode)
+	}
 	if err != nil {
 		NoticeAlert("failed to request split tunnel routes package: %s", ContextError(err))
 		useCachedRoutes = true

+ 10 - 0
psiphon/upgradeDownload.go

@@ -74,6 +74,16 @@ func DownloadUpgrade(config *Config, clientUpgradeVersion string, tunnel *Tunnel
 	}
 
 	response, err := httpClient.Do(request)
+
+	// The resumeable download may ask for bytes past the resource range
+	// since it doesn't store the "completed download" state. In this case,
+	// the HTTP server returns 416. Otherwise, we expect 206.
+	if err == nil &&
+		(response.StatusCode != http.StatusPartialContent &&
+			response.StatusCode != http.StatusRequestedRangeNotSatisfiable) {
+		response.Body.Close()
+		err = fmt.Errorf("unexpected response status code: %d", response.StatusCode)
+	}
 	if err != nil {
 		return ContextError(err)
 	}