태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

달력

06

« 2017/06 »

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  

string url1 = "http://localhost/contents/?registered_date_from=2016-12-26T15%3A00%3A00.000Z&registered_date_to=2016-12-27T15%3A00%3A00.000Z&keywords=%EA%B3%84%ED%9A%8D%EC%84%9C";

string url2 = "http://localhost/contents/?registered_date_from=2016-12-26T15%3A00%3A00.000Z&registered_date_to=2016-12-27T15%3A00%3A00.000Z";


var uri1 = new Uri(url1);

var uri2 = new Uri(url2);


Console.WriteLine(uri1.PathAndQuery);

Console.WriteLine(uri2.PathAndQuery);

// uri1.PathAndQuery

--> /contents/?registered_date_from=2016-12-26T15:00:00.000Z&registered_date_to=2016-12-27T15:00:00.000Z&keywords=%EA%B3%84%ED%9A%8D%EC%84%9C

// uri2.PathAndQuery

--> /contents/?registered_date_from=2016-12-26T15%3A00%3A00.000Z&registered_date_to=2016-12-27T15%3A00%3A00.000Z


쿼리 스트링의 구성에 따라서(현상으로는 UTF-8 한글이 인코딩된 쿼리스트링이 있는지의 여부에 따라) System.Uri 가 쿼리스트링을 이상하게 처리하는 문제다.

System.Uri 는 매우 광범위하게 사용되고 있어서, UriBuilder, HttpClient 도 이 문제의 영향을 받는 것을 확인했다.

OAuth 등 URL hash 해서 서명하는 방식의 경우 바로 문제가 드러나는데, 일단 이번 경우는 query string 파싱을 직접 구현하는 것으로 대체해서 해결은 되기는 했다. 닷넷 소스를 들여다보고 싶긴 한데 지금은 시간이 없어서 보질 못하겠네.

이 문제를 발견한 프로젝트는 닷넷 4.5 를 타겟으로 개발된 프로젝트이고, 닷넷 4.5.1, 4.5.2 설치된 환경에서 이 문제가 발생하는 것을 확인했다.

LINQPad 로 확인해보면 동일 PC에서 Linqpad 4 에서는 아래의 문제가 발생하지 않고, Linqpad 5 에서는 아래의 문제가 재현된다.

registered_date_from, registered_date_to 는 두 경우 모두 동일하게 url encode 되어 있는 상태인데, uri1 번의 PathAndQuery 에 포함된 것은 url decode 되어 버린 상태이고 uri2 번의 경우 그렇지 않다.

uri1 번의 PathAndQuery 의 경우 더더욱 웃긴 건 일부는 url decode 되어 있고 일부는 아니라는 점.

신고
TAG c#
Posted by wafe

댓글을 달아 주세요

C#을 스크립팅 언어로 만들어주기까지 하는 완소 툴이 LINQPad 다. 오늘 JSON 문자열을 복사해서 코드에 붙여넣는 작업을 많이 할 일이 있어서 이것저것 알아보다가... 결국 별다른 팁을 못 찾았는데, 의외로 등잔 밑에 유용한 기능이 숨어 있었다.

이런 JSON 문자열을 C# 코드에 문자열 리터럴로 넣으려면 큰따옴표를 전부 이스케이프 해주는 게 완전 귀찮은데...

{"RequestedUserId":"wafe","TermId":"2017_1","CourseId":"1004","WeekId":"01","UseDept":true}

Edit > Paste as Escaped String 기능을 사용하면 아래와 같이 그대로 코드에 사용할 수 있는 형태로 붙여넣어 준다.

"{\"RequestedUserId\":\"wafe\", \"TermId\":\"2017_1\", \"CourseId\":\"1004\", \"WeekId\":\"01\", \"UseDept\":true}"


신고
TAG c#
Posted by wafe

댓글을 달아 주세요