Search code examples
c#.netunit-testinghttpwebrequesthttp-status-code-401

Using Created HttpWebResponse Interface Returns 401 Unauthorized Error


So I originally had this code for the web request:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.UseDefaultCredentials = true;
WebResponse response = request.GetResponse();

which I changed to this in order to add unit tests:

IHttpWebRequest request = IHttpWebRequestFactory.Create(uri);
request.UseDefaultCredentials = true;
IWebResponse response = request.GetResponse();

IHttpWebRequest:

public interface IHttpWebRequest
{
    bool UseDefaultCredentials { get; set; }
    IWebResponse GetResponse();
}

MyHttpWebRequest:

public class MyHttpWebRequest : IHttpWebRequest
{
    private readonly HttpWebRequest httpWebRequest;
    private bool useDefaultCredentials;

    public MyHttpWebRequest(HttpWebRequest httpWebRequest)
    {
        this.httpWebRequest = httpWebRequest;
    }

    public bool UseDefaultCredentials
    {
        get { return useDefaultCredentials;  }
        set { useDefaultCredentials = value; }
    }

    public IWebResponse GetResponse()
    {
        return new MyWebResponse((HttpWebResponse)httpWebRequest.GetResponse());
    }
}

IHttpWebRequestFactory:

public interface IHttpWebRequestFactory
{
    IHttpWebRequest Create(string Uri);
}

HttpWebRequestFactory:

public class HttpWebRequestFactory : IHttpWebRequestFactory
{
    public IHttpWebRequest Create(string Uri)
    {
        return new MyHttpWebRequest((HttpWebRequest)WebRequest.Create(Uri));
    }
}

IWebResponse:

public interface IWebResponse
{
    Stream GetResponseStream();
}

MyWebResponse:

public class MyWebResponse : IWebResponse
{
    private WebResponse webResponse;

    public MyWebResponse(HttpWebResponse webResponse)
    {
        this.webResponse = webResponse;
    }

    public Stream GetResponseStream()
    {
        return webResponse.GetResponseStream();
    }
}

But the website now returns a HTTP Error 401 Unauthorized. Using Fiddler works though. I also tried setting request.Credentials = CredentialCache.DefaultNetworkCredentials, request.PreAuthenticate = true, etc. but to no avail. :(

I also tried supplying my username and password to Credentials but the unauthorized error still appears, which is odd since the original code above works. :(


Solution

  • You are not using useDefaultCredentials correctly, try this:

    MyHttpWebRequest:

    public class MyHttpWebRequest : IHttpWebRequest
    {
        private readonly HttpWebRequest httpWebRequest;
    
        public MyHttpWebRequest(HttpWebRequest httpWebRequest)
        {
            this.httpWebRequest = httpWebRequest;
        }
    
        public bool UseDefaultCredentials
        {
            get { return this.httpWebRequest.UseDefaultCredentials;  }
            set { this.httpWebRequest.UseDefaultCredentials = value; }
        }
    
        public IWebResponse GetResponse()
        {
            return new MyWebResponse((HttpWebResponse)httpWebRequest.GetResponse());
        }
    }