0

Has anyone seen a phenomenon where a specific HTTP image URL address cannot be downloaded even though the HTTP address is allowed?

HTTP image addresses of other addresses are displayed well, but there are addresses that do not work.

Here is My code and image URL - http://alivenews.net/data/file/tr_commerce/2303/20230309080756-6546.jpg

    URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
        guard
               let data = data,
               let response = response as? HTTPURLResponse,
               error == nil
           else {
               print("network error:", error ?? "Unknown error")
               return
           }

        guard 200 != response.statusCode else {
            print("invalid status code, expected 2xx, received", response.statusCode)
                return
        }

           guard let image = UIImage(data: data) else {
               print("Not valid image")
               return
           }

        DispatchQueue.main.async {
            self?.newsThumailView.image = image
        }
    }.resume()

Returns nil value in the process of converting data to Image. What could be the problem?

HangarRash
  • 7,314
  • 5
  • 5
  • 32
장주명
  • 43
  • 6

1 Answers1

1

Here is the test code I used and the output I get:

import Foundation
import SwiftUI

struct ContentView: View {
    let urlString = "http://alivenews.net/data/file/tr_commerce/2303/20230309080756-6546.jpg"
    
    var body: some View {
        Text("testing")
            .onAppear {
                getData()
            }
    }
    
    func getData() {
        guard let url = URL(string: urlString) else {
            print("---> bad url")
            return
        }
        
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard
                let data = data,
                let response = response as? HTTPURLResponse,
                error == nil
            else {
                print("network error:", error ?? "Unknown error")
                return
            }
            
            print("\n---> data: \n \(String(data: data, encoding: .utf8) as AnyObject)")
            
            print("\n---> response: \n \(response)")
            
            guard 200 != response.statusCode else {
                print("invalid status code, expected 2xx, received", response.statusCode)
                return
            }
            
            guard let image = UIImage(data: data) else {
                print("\n--> Not valid image")
                return
            }
        }.resume()
    }
    
}

The Info.plist

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
     <key>NSAppTransportSecurity</key>
     <dict>
         <key>NSAllowsArbitraryLoads</key>
         <true/>
     </dict>
 </dict>
 </plist>
 
 

The output prints:

 ---> data:
  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
 <html><head>
 <title>403 Forbidden</title>
 </head><body>
 <h1>Forbidden</h1>
 <p>You don't have permission to access this resource.</p>
 </body></html>


 ---> response:
  <NSHTTPURLResponse: 0x600003ac66c0> { URL: http://alivenews.net/data/file/tr_commerce/2303/20230309080756-6546.jpg } { Status Code: 403, Headers {
     Connection =     (
         "Keep-Alive"
     );
     "Content-Length" =     (
         199
     );
     "Content-Type" =     (
         "text/html; charset=iso-8859-1"
     );
     Date =     (
         "Fri, 10 Mar 2023 10:31:33 GMT"
     );
     "Keep-Alive" =     (
         "timeout=5, max=256"
     );
     Server =     (
         "Apache/2.4.43 (Unix) OpenSSL/1.0.2k-fips PHP/5.3.29"
     );
 } }

 --> Not valid image

 

EDIT-1:

works for me with the following User-Agent in the request, as mentioned in the comments. Not sure what is the most appropriate User-Agent to use:

struct ContentView: View {
    let urlString = "http://alivenews.net/data/file/tr_commerce/2303/20230309080756-6546.jpg"
    
    @State var image = UIImage()
    
    var body: some View {
        Image(uiImage: image)
            .onAppear {
                getData()
            }
    }
    
    func getData() {
        guard let url = URL(string: urlString) else {
            print("---> bad url")
            return
        }
        
        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.addValue("image/png", forHTTPHeaderField: "Content-Type")
        request.addValue("Mickey Mouse", forHTTPHeaderField: "User-Agent")

        URLSession.shared.dataTask(with: request) { data, response, error in
        guard
            let data = data,
            let response = response as? HTTPURLResponse,
            error == nil
        else {
            print("network error:", error ?? "Unknown error")
            return
        }
        
        guard 200 < response.statusCode || 299 > response.statusCode else {
            print("invalid status code, expected 2xx, received", response.statusCode)
            return
        }
            if let img = UIImage(data: data) {
                self.image = img
            }
        }.resume()
    }
    
}

Note, do not use guard 200 != response.statusCode ..., try something like this: guard 200 < response.statusCode || 299 > response.statusCode ...