ethernet shild w5100 символ # в GET запросе

okta
Offline
Зарегистрирован: 10.01.2015

Всем привет.

Впервые решил задать вопрос т.к. два дня гугления, яндексения а также прочие методы научного тыка результата не дали. Правда, вопрос скорее всего не к ардуине, но мало ли, может кто сталкивался с подобным :) У меня фантазия закончилась в какую сторону копать...

Есть arduino mega с ethernet shild w5100, одна из задач которой через RF wireless раздавать получаемые по ethernet команды другим устройствам. Вся логика закладывается в скриптах web интерфейса - ардуина в этой части работает только как интерпретатор/ретранслятор. В какойто момент надоело при каждом изменении html страничек бегать и вручную записывать их на SD карту, потому наваял их перезапись тоже через web интерфейс. И все отлично работало до того момента как я не решил обновить один из css файлов, в котором встретился символ #

Это все была лирика, теперь сама проблема: почему как только в тексте GET запроса встречается символ # - на этом запрос и заканчивается? 

Пример html с запросом:

<!DOCTYPE html>
<html>
    <head>
        <title>Arduino</title>
		<script>
			function SendRequest(){
			zapros="a a#bb"
			nocache = "&=" + Math.random() * 1000000;
				var request = new XMLHttpRequest();
				request.onreadystatechange = function(){
					if (this.readyState == 4) {
						if (this.status == 200) {
							if (this.responseText == 'ok') {
								return true;
							}else{
								return false;
							}
						}
					}
				}
				request.open("get", '*'+zapros+ nocache, false);
				request.send(null);
			}
		</script>
    </head>
    <body>
			<button onclick="SendRequest()">Send</button>
    </body>
</html>

лог полученного запроса на ардуино сервере:

GET /*a%20a HTTP/1.1
Host: 192.168.0.177
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
;q=0.8,en-US;q=0.6,en;q=0.4
 
По идее # должен был перекодироваться в %23 и результат должен быть таким:
GET /*a%20a%23bb&=708188.4185317904 HTTP/1.1
или я что-то пропустил/недоперепрочитал про этот символ?

 

okta
Offline
Зарегистрирован: 10.01.2015

Отвечаю сам - как часто бывает, ответ нашелся сразу после того как отчаялся уже разобраться. При использовании функции encodeURIComponent(zapros) перед отправкой строки, строка кодируется как надо. Остался открытым вопрос: почему поумолчанию все кодируется, кроме этого символа...

PS Можно удалить тему, т.к. к ардуино ни какого отношения проблема не имеет.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Почитайте про обработку URL браузерами - '#' это специальный символ для ссылки внутри страницы без запроса на сервер - называется "якорь" - поэтому все что после будет отбрасываться. лучше использовать другой символ как разделитель.

okta
Offline
Зарегистрирован: 10.01.2015

NeiroN пишет:

Почитайте про обработку URL браузерами - '#' это специальный символ для ссылки внутри страницы без запроса на сервер - называется "якорь" - поэтому все что после будет отбрасываться.

Спасиб :) именно чтение этого + фраза из описания работы с ajax запросами (про то, что заботиться о URL кодировке надо самим) и сложило этот пазл.

NeiroN пишет:

 лучше использовать другой символ как разделитель.

В моем случае это не применимо, т.к. в запросе через URL передается содержимое файла (html,css,js), соответственно должны поддерживаться все символы.

pastry777
Offline
Зарегистрирован: 16.01.2014

Ну может тогда POST запросом,а не GET...

okta
Offline
Зарегистрирован: 10.01.2015

pastry777 пишет:

Ну может тогда POST запросом,а не GET...

Изначально писалось под UNO, нужно было экономить на всем. От обработки POST пришлось отказаться. А сейчас.. по принципу "работает - ну и не трож" :)

Datak
Offline
Зарегистрирован: 09.10.2014

okta пишет:
В моем случае это не применимо, т.к. в запросе через URL передается содержимое файла (html,css,js), соответственно должны поддерживаться все символы.

Не очень в этом разбираюсь, но по-моему "недопустимые" символы в строке запроса кодируются последовательностью из нескольких допустимых. По-моему, символом "%" и шестнадцатеричным кодом. Но могу наврать, лучше уточните у специалистов или у гугла.

okta
Offline
Зарегистрирован: 10.01.2015

да все уже :) Проблема в моем случае решена, решение в посте №2 :) 

Если кому поможет, то да, действительно все "недопустимые" сиволы в URL кодируются в формат %XX или %uXXXX (для unicode), где XX число в шеснадцатеричном коде. Что я и писал в своем вопросе:

okta пишет:

По идее # должен был перекодироваться в %23 и результат должен быть таким:

GET /*a%20a%23bb&=708188.4185317904 HTTP/1.1
 
Поумолчанию браузер сам кодирует запросы в %XX. От браузера к браузеру это "поумолчанию" может несколько отличаться.
Но браузеры (по крайней мере из тех что я протестил) символ '#' не кодируют никогда, как правильно сказал
NeiroN пишет:
'#' это специальный символ для ссылки внутри страницы без запроса на сервер - называется "якорь" - поэтому все что после будет отбрасываться.

потому, при отправке таких специфических GET запросов, необходимо перекодировать его URL формат до отправки зароса. Функция encodeURIComponent() в моем случае решила проблему (правда, насколько я успел почитать, она не для всех браузеров корректно отрабатывает).

Кроме того, есть еще ряд значений строки (и всесьма обширный), которые браузер поумолчанию не кодирует (например, такие как '/t' '/n'). В моем случае, т.к. для html они не важны, я их отбрасывал в самом скрипте, для уменьшения запроса, потому столкнулся с этой проблемой только когда попался символ '#'