티스토리 뷰

Unity 가지고 AWS S3에서 받아온 presigned URL로 업로드하는데, 문제 발생!

Unity 에서 기본으로 제공하는 WWW 개체는 POST, GET 만 할 수 있다. PUT 불가!!
https://docs.unity3d.com/ScriptReference/WWW.html
뭐 이런 것이 다 있어 싶지만...

물론 PUT 안 쓰고도, 아니면, S3 의 REST API 를 이용해도 된다.
혹은 아래처럼 POST 로 PUT 대신 쓸 방법도 있긴하단다.
http://answers.unity3d.com/questions/785798/put-with-wwwform.html

    var headers = new Dictionary<string, string>();
    headers.Add("X-HTTP-Method-Override", "PUT");

    var request = new UnityEngine.WWW(_uri, _putBytes, headers);
    yield return request;

    Debug.Log(request.text);

잘 되나? 테스트할 때에 헤더 파라미터 문제로 잘 안되어 시그니처가 맞지 않는다 했다. -_-;
더 알아보기 싫었다.
일단, 쓸데없이 헤더가 많이 붙어서 싫고...
유니티에선 한계가 좀 많군. HTTP 프로토콜상 별 것 없는 건데 왜 안되나?!
어쨌든 나는 PUT을 쓰고 싶으니...

잘 안되나? 헤더쪽에 문제인데 귀찮다. 일단 PUT을 알아보고 싶다.
http://stackoverflow.com/questions/29668059/unity-use-http-put-in-unity3d

위에거랑 같은 답변이 나오는데, 좀 더 내려 보면, 이유도 나온다.

.Net 의 오픈소스 버전이라 할 수 있는 Mono 플랫폼이 2.0 이라 지원을 못한단다. 그럼 다른 것을 써보자.
HTTP 클라이언트 라이브러리를 만들수도 있지만, 너무 귀찮다.
그래 뭔가 추가 안하고서 할 수 있는 것을 찾자.
http://blog.naver.com/PostView.nhn?blogId=sonmg&logNo=220510568356
[출처] [Unity3d] Http (GET, POST, PUT, DELETE) example|작성자 슈퍼베리코더

...
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    httpWebRequest.ContentType = "text/json";
    httpWebRequest.Method = "PUT";
    HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

    using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        string responseText = streamReader.ReadToEnd();
        Debug.Log(responseText);
    }  

...

PUT은 되지만, HTTPS 에서는 오동작한다.

문제는 HTTPS 인증서의 신뢰 문제 때문인데, 다음과 같은 방법으로 대략 해결할 수 있긴 하다.
http://lhh3520.tistory.com/318

위에 내용인즉, 내가 접속할 서버의 인증서를 신뢰하는 인증서로 직접 등록하겠다는 것인데, 깨림직하니까 아래처럼 푸는 것이 좋겠다.
http://stackoverflow.com/questions/12224602/a-method-for-making-http-requests-on-unity-ios

    public bool MyRemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        bool isOk = true;
        // If there are errors in the certificate chain, look at each error to determine the cause.
        if (sslPolicyErrors != SslPolicyErrors.None) {
            for (int i=0; i<chain.ChainStatus.Length; i++) {
                if (chain.ChainStatus [i].Status != X509ChainStatusFlags.RevocationStatusUnknown) {
                    chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
                    chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
                    chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan (0, 1, 0);
                    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
                    bool chainIsValid = chain.Build ((X509Certificate2)certificate);
                    if (!chainIsValid) {
                        isOk = false;
                    }
                }
            }
        }
        return isOk;
    }

    void Start()
    {
        ...
        ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
        ...
    }

이런 문제를 유니티쪽에서도 알고, UnityWebRequest를 내 놓았으니(진작 내놓지...)
https://docs.unity3d.com/Manual/UnityWebRequest.html

위에 문서를 보니
    Supported Platforms

    The UnityWebRequest system supports most Unity platforms.

    Platforms supported in 5.2:

        All versions of the Editor & Standalone players
        WebGL

    Platforms supported in 5.3:

        Mobile Platforms: iOS, Android, Windows Phone 8
        Windows Store Apps
        PS3
        Xbox 360

    Additional platform support will be rolled out in further 5.x releases:

        PS4, PS Vita, and PS Mobile
        Xbox One
        Wii U

이 게시물 올리는 지금은 숫자상으로 5.4 는 넘었으니, 결국 모든 플렛폼을 다 지원한다는 이야기겠지?

일단 끝? 어떻게 사용하지.
메뉴얼은 위에 있으니까, 다른 사용예도 살펴볼까?
http://blog.applibot.co.jp/blog/2016/07/20/unity-webrequest/
잘 설명했네~ 메뉴얼 번역이니...

http://qiita.com/mattak/items/d01926bc57f8ab1f569a
이건 뭐 그냥...

2016년 7월 20일이라고, 그런데 찾아보니 우리나라 것은 잘 안보이네?!

요기 하나 있긴하다.
http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&no=4324

과거 자료는 많은데 최신 자료가 없구나...

혹시나 굳이 이런 것을 사용하기 싫다면, HTTP라이브러리도 여럿 있는듯 하다.
https://github.com/andyburke/UnityHTTP

위에서 여러번 언급된 상용 라이브러리도 있다.
https://www.assetstore.unity3d.com/en/#!/content/10872


누군가는 더 유익하게 시간을 보낼 수 있기를...

댓글