Hatena::ブログ(Diary)

仮メモ

2018-01-21

[][]cURL 7.56.0で大きなデータをPOSTするとデータが壊れる

curl_setopt()CURLOPT_POSTFIELDSでデータを設定し送信するときに、16KBあたり以降のデータが先頭からの繰り返しになる。

PHP 7.1.11以降、最新のPHP 7.2.1でも起きる。

cURLのバグのようで、公式WindowsビルドのcURLがPHP 7.1.11から7.56.0にアップデートしたためのようだ。

cURL 7.56.1で修正されているのだが、Windows版PHPのリンクしているcURLが古いままなのでなんともしがたい。

2017-11-23

[]GNU screenで行の折り返しが変になる

GNU screen内のbashvimで画面幅に収まらない長い行を表示しても折り返されず、右端の文字が上書きされるだけになってしまう。

症状として、bashで上下キーなどでhistoryを表示していると長い行を表示した後でその分だけカーソルが上に行ってしまう。vimでは長い行の後で階段状に表示され、しかも改行されない分だけ以降の行が実際より上に表示される。


line-wrapが切れているのが原因なので直すには^arや、^a^r、^a:wrap (:wrap on)で+wrap状態にすればよい。何かのはずみにミスタイプして-wrap状態になったのだろう。

これが起きた環境ではscreenの中のあるウインドウでsshしてさらにscreenを起動しており、外側のscreenで-wrapとなっていた。

内側のscreenが原因かと思いそちらで試行錯誤していてなかなか気づかなかった。

そもそも:wrap offを使ったことがないので.screenrcに

bind r
bind ^r

としてキーを無効化してみた。

2017-11-11

[][]parse_url()の結果が壊れる

parse_url()で日本語URL(IRI状態)を渡すと壊れる。具体的には全角空白が別のUTF-8として無効な文字列になった。(PHP7.1)

調べてみるとphp_replace_controlchars_ex()でiscntrl()を呼び出し、コントロール文字を'_'に置換している。

日本語のWindows環境ではASCIIの\x00-\x1f, \x7fだけでなく\x80も対象になるため、UTF-8の全角空白(U+3000 = \xe3\x80\x80)が壊れたようだ。

バグ報告も昔からされているUNIX系環境のen_US.UTF8で普段作業するせいか知らなかった。回避するにはlocaleを無難なものに設定すればよい。

普通のウェブプログラムではlocale依存の処理はOSに任せずに文字コード系もmbstringのUTF-8一択なので、余計な作用が出ないほうが望ましい。

そこで冒頭で

<?php
setlocale(LC_ALL, 'C');

とした。限定的ならばLC_CTYPEのみを一時的に変更する。

<?php
$oldLocale = setlocale(LC_CTYPE, 0); // Japanese_Japan.932
setlocale(LC_CTYPE, 'C');
parse_url(...);
setlocale(LC_CTYPE, $oldLocale);