tags:

views:

157

answers:

5

I have an API in NETMF C# that I am writing that includes a function to send an HTTP request. For those who are familiar with NETMF, this is a heavily modified version of the "webClient" example, which a simple application that demonstrates how to submit an HTTP request, and recive a response. In the sample, it simply prints the response and returns void,. In my version, however, I need it to return the HTTP response.

For some reason, Visual Studio reports that not all code paths return a value, even though, as far as I can tell, they do.

Here is my code...

  /// <summary>
  /// This is a modified webClient
  /// </summary>
  /// <param name="url"></param>
  private string httpRequest(string url)
  {
   // Create an HTTP Web request.
   HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;

   // Set request.KeepAlive to use a persistent connection. 
   request.KeepAlive = true;

   // Get a response from the server.
    WebResponse resp = request.GetResponse();

   // Get the network response stream to read the page data.
   if (resp != null)
   {
    Stream respStream = resp.GetResponseStream();
    string page = "";
    byte[] byteData = new byte[4096];
    char[] charData = new char[4096];
    int bytesRead = 0;
    Decoder UTF8decoder = System.Text.Encoding.UTF8.GetDecoder();
    int totalBytes = 0;

    // allow 5 seconds for reading the stream
    respStream.ReadTimeout = 5000;

    // If we know the content length, read exactly that amount of 
    // data; otherwise, read until there is nothing left to read.
    if (resp.ContentLength != -1)
    {
     for (int dataRem = (int)resp.ContentLength; dataRem > 0; )
     {
      Thread.Sleep(500);
      bytesRead = respStream.Read(byteData, 0, byteData.Length);

      if (bytesRead == 0)
       throw new Exception("Data laes than expected");

      dataRem -= bytesRead;

      // Convert from bytes to chars, and add to the page 
      // string.
      int byteUsed, charUsed;
      bool completed = false;
      totalBytes += bytesRead;
      UTF8decoder.Convert(byteData, 0, bytesRead, charData, 0,
       bytesRead, true, out byteUsed, out charUsed,
       out completed);
      page = page + new String(charData, 0, charUsed);
     }

     page = new String(System.Text.Encoding.UTF8.GetChars(byteData));
    }
    else
     throw new Exception("No content-Length reported");

    // Close the response stream.  For Keep-Alive streams, the 
    // stream will remain open and will be pushed into the unused 
    // stream list.
    resp.Close();
    return page;
   }
  }

Any ideas? Thanks...

+12  A: 

Clearly, if (resp == null) then you still need to return something...

Mitch Wheat
Ah, thanks. I got my brackets screwed up and didn't notice. I'll accept in 6 min..
chris12892
+2  A: 

If the resp != null test fails, the method ends without returning anything. You need to either return something here or throw an exception that the response stream was null.

In my opinion, this would be a lot clearer to see if you indented a bit more than 1 space.

lc
I am indented to hard tabs. For some reason SO didn't parse them right.
chris12892
+1  A: 

After the page = new String(System.Text.Encoding.UTF8.GetChars(byteData));

page = new String(System.Text.Encoding.UTF8.GetChars(byteData));

---HERE ---

    }
    else
     throw new Exception("No content-Length rep
Preet Sangha
+2  A: 

As far as I can tell, If resp == null the page isn't returning anything

RobS
+2  A: 

You don't have a return on the case that resp == null.

Donnie